From a7747ed2b95183e1aa12cae55c0181781b9a6d51 Mon Sep 17 00:00:00 2001 From: Antonio Terceiro <terceiro@debian.org> Date: Mon, 14 Sep 2020 15:27:00 -0300 Subject: [PATCH] New upstream version 0.1.20200714 --- MANIFEST.in | 8 + PKG-INFO | 2110 +- README | 18 - README.rst | 1063 + docs/Features.html | 255 +- docs/Features.rst | 1227 +- ...deProperties.txt => UnicodeProperties.rst} | 0 regex.egg-info/PKG-INFO | 1086 + regex.egg-info/SOURCES.txt | 27 + regex.egg-info/dependency_links.txt | 1 + regex.egg-info/top_level.txt | 1 + regex_2/{regex => }/__init__.py | 0 regex_2/_regex.c | 1096 +- regex_2/_regex.h | 46 +- regex_2/{regex => }/_regex_core.py | 105 +- regex_2/_regex_unicode.c | 42122 ++++++++++------ regex_2/_regex_unicode.h | 459 +- regex_2/{regex => }/regex.py | 86 +- regex_2/regex/test/__init__.py | 0 regex_2/{regex/test => }/test_regex.py | 139 +- regex_3/{regex => }/__init__.py | 0 regex_3/_regex.c | 1237 +- regex_3/_regex.h | 46 +- regex_3/{regex => }/_regex_core.py | 105 +- regex_3/_regex_unicode.c | 42122 ++++++++++------ regex_3/_regex_unicode.h | 459 +- regex_3/{regex => }/regex.py | 86 +- regex_3/regex/test/__init__.py | 0 regex_3/{regex/test => }/test_regex.py | 140 +- setup.cfg | 4 + setup.py | 42 +- tools/build_regex_unicode.py | 4129 +- 32 files changed, 58186 insertions(+), 40033 deletions(-) create mode 100644 MANIFEST.in delete mode 100644 README create mode 100644 README.rst rename docs/{UnicodeProperties.txt => UnicodeProperties.rst} (100%) create mode 100644 regex.egg-info/PKG-INFO create mode 100644 regex.egg-info/SOURCES.txt create mode 100644 regex.egg-info/dependency_links.txt create mode 100644 regex.egg-info/top_level.txt rename regex_2/{regex => }/__init__.py (100%) rename regex_2/{regex => }/_regex_core.py (98%) rename regex_2/{regex => }/regex.py (92%) delete mode 100644 regex_2/regex/test/__init__.py rename regex_2/{regex/test => }/test_regex.py (97%) rename regex_3/{regex => }/__init__.py (100%) rename regex_3/{regex => }/_regex_core.py (98%) rename regex_3/{regex => }/regex.py (91%) delete mode 100644 regex_3/regex/test/__init__.py rename regex_3/{regex/test => }/test_regex.py (97%) create mode 100644 setup.cfg diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..1265fad --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,8 @@ +include regex_2/*.c +include regex_2/*.h +include regex_2/*.py +include regex_3/*.c +include regex_3/*.h +include regex_3/*.py +include docs/*.* +include tools/*.py diff --git a/PKG-INFO b/PKG-INFO index 0ba4a0e..584e08b 100644 --- a/PKG-INFO +++ b/PKG-INFO @@ -1,1024 +1,1086 @@ -Metadata-Version: 1.1 -Name: regex -Version: 2019.08.19 -Summary: Alternative regular expression module, to replace re. -Home-page: https://bitbucket.org/mrabarnett/mrab-regex -Author: Matthew Barnett -Author-email: regex@mrabarnett.plus.com -License: Python Software Foundation License -Description: Introduction - ------------ - - This regex implementation is backwards-compatible with the standard 're' module, but offers additional functionality. - - Note - ---- - - The re module's behaviour with zero-width matches changed in Python 3.7, and this module will follow that behaviour when compiled for Python 3.7. - - Old vs new behaviour - -------------------- - - In order to be compatible with the re module, this module has 2 behaviours: - - * **Version 0** behaviour (old behaviour, compatible with the re module): - - Please note that the re module's behaviour may change over time, and I'll endeavour to match that behaviour in version 0. - - * Indicated by the ``VERSION0`` or ``V0`` flag, or ``(?V0)`` in the pattern. - - * Zero-width matches are not handled correctly in the re module before Python 3.7. The behaviour in those earlier versions is: - - * ``.split`` won't split a string at a zero-width match. - - * ``.sub`` will advance by one character after a zero-width match. - - * Inline flags apply to the entire pattern, and they can't be turned off. - - * Only simple sets are supported. - - * Case-insensitive matches in Unicode use simple case-folding by default. - - * **Version 1** behaviour (new behaviour, possibly different from the re module): - - * Indicated by the ``VERSION1`` or ``V1`` flag, or ``(?V1)`` in the pattern. - - * Zero-width matches are handled correctly. - - * Inline flags apply to the end of the group or pattern, and they can be turned off. - - * Nested sets and set operations are supported. - - * Case-insensitive matches in Unicode use full case-folding by default. - - If no version is specified, the regex module will default to ``regex.DEFAULT_VERSION``. - - Case-insensitive matches in Unicode - ----------------------------------- - - The regex module supports both simple and full case-folding for case-insensitive matches in Unicode. Use of full case-folding can be turned on using the ``FULLCASE`` or ``F`` flag, or ``(?f)`` in the pattern. Please note that this flag affects how the ``IGNORECASE`` flag works; the ``FULLCASE`` flag itself does not turn on case-insensitive matching. - - In the version 0 behaviour, the flag is off by default. - - In the version 1 behaviour, the flag is on by default. - - Nested sets and set operations - ------------------------------ - - It's not possible to support both simple sets, as used in the re module, and nested sets at the same time because of a difference in the meaning of an unescaped ``"["`` in a set. - - For example, the pattern ``[[a-z]--[aeiou]]`` is treated in the version 0 behaviour (simple sets, compatible with the re module) as: - - * Set containing "[" and the letters "a" to "z" - - * Literal "--" - - * Set containing letters "a", "e", "i", "o", "u" - - * Literal "]" - - but in the version 1 behaviour (nested sets, enhanced behaviour) as: - - * Set which is: - - * Set containing the letters "a" to "z" - - * but excluding: - - * Set containing the letters "a", "e", "i", "o", "u" - - Version 0 behaviour: only simple sets are supported. - - Version 1 behaviour: nested sets and set operations are supported. - - Flags - ----- - - There are 2 kinds of flag: scoped and global. Scoped flags can apply to only part of a pattern and can be turned on or off; global flags apply to the entire pattern and can only be turned on. - - The scoped flags are: ``FULLCASE``, ``IGNORECASE``, ``MULTILINE``, ``DOTALL``, ``VERBOSE``, ``WORD``. - - The global flags are: ``ASCII``, ``BESTMATCH``, ``ENHANCEMATCH``, ``LOCALE``, ``POSIX``, ``REVERSE``, ``UNICODE``, ``VERSION0``, ``VERSION1``. - - If neither the ``ASCII``, ``LOCALE`` nor ``UNICODE`` flag is specified, it will default to ``UNICODE`` if the regex pattern is a Unicode string and ``ASCII`` if it's a bytestring. - - The ``ENHANCEMATCH`` flag makes fuzzy matching attempt to improve the fit of the next match that it finds. - - The ``BESTMATCH`` flag makes fuzzy matching search for the best match instead of the next match. - - Notes on named capture groups - ----------------------------- - - All capture groups have a group number, starting from 1. - - Groups with the same group name will have the same group number, and groups with a different group name will have a different group number. - - The same name can be used by more than one group, with later captures 'overwriting' earlier captures. All of the captures of the group will be available from the ``captures`` method of the match object. - - Group numbers will be reused across different branches of a branch reset, eg. ``(?|(first)|(second))`` has only group 1. If capture groups have different group names then they will, of course, have different group numbers, eg. ``(?|(?P<foo>first)|(?P<bar>second))`` has group 1 ("foo") and group 2 ("bar"). - - In the regex ``(\s+)(?|(?P<foo>[A-Z]+)|(\w+) (?P<foo>[0-9]+)`` there are 2 groups: - - * ``(\s+)`` is group 1. - - * ``(?P<foo>[A-Z]+)`` is group 2, also called "foo". - - * ``(\w+)`` is group 2 because of the branch reset. - - * ``(?P<foo>[0-9]+)`` is group 2 because it's called "foo". - - If you want to prevent ``(\w+)`` from being group 2, you need to name it (different name, different group number). - - Multithreading - -------------- - - The regex module releases the GIL during matching on instances of the built-in (immutable) string classes, enabling other Python threads to run concurrently. It is also possible to force the regex module to release the GIL during matching by calling the matching methods with the keyword argument ``concurrent=True``. The behaviour is undefined if the string changes during matching, so use it *only* when it is guaranteed that that won't happen. - - Unicode - ------- - - This module supports Unicode 12.1.0. - - Full Unicode case-folding is supported. - - Additional features - ------------------- - - The issue numbers relate to the Python bug tracker, except where listed as "Hg issue". - - * Added support for lookaround in conditional pattern (`Hg issue 163 <https://bitbucket.org/mrabarnett/mrab-regex/issues/163>`_) - - The test of a conditional pattern can now be a lookaround. - - Examples: - - .. sourcecode:: python - - >>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc') - <regex.Match object; span=(0, 3), match='123'> - >>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123') - <regex.Match object; span=(0, 6), match='abc123'> - - This is not quite the same as putting a lookaround in the first branch of a pair of alternatives. - - Examples: - - .. sourcecode:: python - - >>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc')) - <regex.Match object; span=(0, 6), match='123abc'> - >>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc')) - None - - In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was **not** attempted. - - * Added POSIX matching (leftmost longest) (`Hg issue 150 <https://bitbucket.org/mrabarnett/mrab-regex/issues/150>`_) - - The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the ``POSIX`` flag (``(?p)``). - - Examples: - - .. sourcecode:: python - - >>> # Normal matching. - >>> regex.search(r'Mr|Mrs', 'Mrs') - <regex.Match object; span=(0, 2), match='Mr'> - >>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient') - <regex.Match object; span=(0, 7), match='oneself'> - >>> # POSIX matching. - >>> regex.search(r'(?p)Mr|Mrs', 'Mrs') - <regex.Match object; span=(0, 3), match='Mrs'> - >>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient') - <regex.Match object; span=(0, 17), match='oneselfsufficient'> - - Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there. - - * Added ``(?(DEFINE)...)`` (`Hg issue 152 <https://bitbucket.org/mrabarnett/mrab-regex/issues/152>`_) - - If there's no group called "DEFINE", then ... will be ignored, but any group definitions within it will be available. - - Examples: - - .. sourcecode:: python - - >>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants') - <regex.Match object; span=(0, 11), match='5 elephants'> - - * Added ``(*PRUNE)``, ``(*SKIP)`` and ``(*FAIL)`` (`Hg issue 153 <https://bitbucket.org/mrabarnett/mrab-regex/issues/153>`_) - - ``(*PRUNE)`` discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern. - - ``(*SKIP)`` is similar to ``(*PRUNE)``, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern. - - ``(*FAIL)`` causes immediate backtracking. ``(*F)`` is a permitted abbreviation. - - * Added ``\K`` (`Hg issue 151 <https://bitbucket.org/mrabarnett/mrab-regex/issues/151>`_) - - Keeps the part of the entire match after the position where ``\K`` occurred; the part before it is discarded. - - It does not affect what capture groups return. - - Examples: - - .. sourcecode:: python - - >>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef') - >>> m[0] - 'cde' - >>> m[1] - 'abcde' - >>> - >>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef') - >>> m[0] - 'bc' - >>> m[1] - 'bcdef' - - * Added capture subscripting for ``expandf`` and ``subf``/``subfn`` (`Hg issue 133 <https://bitbucket.org/mrabarnett/mrab-regex/issues/133>`_) - - You can now use subscripting to get the captures of a repeated capture group. - - Examples: - - .. sourcecode:: python - - >>> m = regex.match(r"(\w)+", "abc") - >>> m.expandf("{1}") - 'c' - >>> m.expandf("{1[0]} {1[1]} {1[2]}") - 'a b c' - >>> m.expandf("{1[-1]} {1[-2]} {1[-3]}") - 'c b a' - >>> - >>> m = regex.match(r"(?P<letter>\w)+", "abc") - >>> m.expandf("{letter}") - 'c' - >>> m.expandf("{letter[0]} {letter[1]} {letter[2]}") - 'a b c' - >>> m.expandf("{letter[-1]} {letter[-2]} {letter[-3]}") - 'c b a' - - * Added support for referring to a group by number using ``(?P=...)``. - - This is in addition to the existing ``\g<...>``. - - * Fixed the handling of locale-sensitive regexes. - - The ``LOCALE`` flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead. - - * Added partial matches (`Hg issue 102 <https://bitbucket.org/mrabarnett/mrab-regex/issues/102>`_) - - A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated. - - Partial matches are supported by ``match``, ``search``, ``fullmatch`` and ``finditer`` with the ``partial`` keyword argument. - - Match objects have a ``partial`` attribute, which is ``True`` if it's a partial match. - - For example, if you wanted a user to enter a 4-digit number and check it character by character as it was being entered: - - .. sourcecode:: python - - >>> pattern = regex.compile(r'\d{4}') - - >>> # Initially, nothing has been entered: - >>> print(pattern.fullmatch('', partial=True)) - <regex.Match object; span=(0, 0), match='', partial=True> - - >>> # An empty string is OK, but it's only a partial match. - >>> # The user enters a letter: - >>> print(pattern.fullmatch('a', partial=True)) - None - >>> # It'll never match. - - >>> # The user deletes that and enters a digit: - >>> print(pattern.fullmatch('1', partial=True)) - <regex.Match object; span=(0, 1), match='1', partial=True> - >>> # It matches this far, but it's only a partial match. - - >>> # The user enters 2 more digits: - >>> print(pattern.fullmatch('123', partial=True)) - <regex.Match object; span=(0, 3), match='123', partial=True> - >>> # It matches this far, but it's only a partial match. - - >>> # The user enters another digit: - >>> print(pattern.fullmatch('1234', partial=True)) - <regex.Match object; span=(0, 4), match='1234'> - >>> # It's a complete match. - - >>> # If the user enters another digit: - >>> print(pattern.fullmatch('12345', partial=True)) - None - >>> # It's no longer a match. - - >>> # This is a partial match: - >>> pattern.match('123', partial=True).partial - True - - >>> # This is a complete match: - >>> pattern.match('1233', partial=True).partial - False - - * ``*`` operator not working correctly with sub() (`Hg issue 106 <https://bitbucket.org/mrabarnett/mrab-regex/issues/106>`_) - - Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters? - - Examples: - - .. sourcecode:: python - - # Python 3.7 and later - >>> regex.sub('.*', 'x', 'test') - 'xx' - >>> regex.sub('.*?', '|', 'test') - '|||||||||' - - # Python 3.6 and earlier - >>> regex.sub('(?V0).*', 'x', 'test') - 'x' - >>> regex.sub('(?V1).*', 'x', 'test') - 'xx' - >>> regex.sub('(?V0).*?', '|', 'test') - '|t|e|s|t|' - >>> regex.sub('(?V1).*?', '|', 'test') - '|||||||||' - - * Added ``capturesdict`` (`Hg issue 86 <https://bitbucket.org/mrabarnett/mrab-regex/issues/86>`_) - - ``capturesdict`` is a combination of ``groupdict`` and ``captures``: - - ``groupdict`` returns a dict of the named groups and the last capture of those groups. - - ``captures`` returns a list of all the captures of a group - - ``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups. - - Examples: - - .. sourcecode:: python - - >>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n") - >>> m.groupdict() - {'word': 'three', 'digits': '3'} - >>> m.captures("word") - ['one', 'two', 'three'] - >>> m.captures("digits") - ['1', '2', '3'] - >>> m.capturesdict() - {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']} - - * Allow duplicate names of groups (`Hg issue 87 <https://bitbucket.org/mrabarnett/mrab-regex/issues/87>`_) - - Group names can now be duplicated. - - Examples: - - .. sourcecode:: python - - >>> # With optional groups: - >>> - >>> # Both groups capture, the second capture 'overwriting' the first. - >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or second") - >>> m.group("item") - 'second' - >>> m.captures("item") - ['first', 'second'] - >>> # Only the second group captures. - >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second") - >>> m.group("item") - 'second' - >>> m.captures("item") - ['second'] - >>> # Only the first group captures. - >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ") - >>> m.group("item") - 'first' - >>> m.captures("item") - ['first'] - >>> - >>> # With mandatory groups: - >>> - >>> # Both groups capture, the second capture 'overwriting' the first. - >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)?", "first or second") - >>> m.group("item") - 'second' - >>> m.captures("item") - ['first', 'second'] - >>> # Again, both groups capture, the second capture 'overwriting' the first. - >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second") - >>> m.group("item") - 'second' - >>> m.captures("item") - ['', 'second'] - >>> # And yet again, both groups capture, the second capture 'overwriting' the first. - >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ") - >>> m.group("item") - '' - >>> m.captures("item") - ['first', ''] - - * Added ``fullmatch`` (`issue #16203 <https://bugs.python.org/issue16203>`_) - - ``fullmatch`` behaves like ``match``, except that it must match all of the string. - - Examples: - - .. sourcecode:: python - - >>> print(regex.fullmatch(r"abc", "abc").span()) - (0, 3) - >>> print(regex.fullmatch(r"abc", "abcx")) - None - >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span()) - (0, 3) - >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span()) - (1, 4) - >>> - >>> regex.match(r"a.*?", "abcd").group(0) - 'a' - >>> regex.fullmatch(r"a.*?", "abcd").group(0) - 'abcd' - - * Added ``subf`` and ``subfn`` - - ``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string. - - Examples: - - .. sourcecode:: python - - >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar") - 'foo bar => bar foo' - >>> regex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", "{word2} {word1}", "foo bar") - 'bar foo' - - * Added ``expandf`` to match object - - ``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string. - - Examples: - - .. sourcecode:: python - - >>> m = regex.match(r"(\w+) (\w+)", "foo bar") - >>> m.expandf("{0} => {2} {1}") - 'foo bar => bar foo' - >>> - >>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar") - >>> m.expandf("{word2} {word1}") - 'bar foo' - - * Detach searched string - - A match object contains a reference to the string that was searched, via its ``string`` attribute. The ``detach_string`` method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large. - - Example: - - .. sourcecode:: python - - >>> m = regex.search(r"\w+", "Hello world") - >>> print(m.group()) - Hello - >>> print(m.string) - Hello world - >>> m.detach_string() - >>> print(m.group()) - Hello - >>> print(m.string) - None - - * Recursive patterns (`Hg issue 27 <https://bitbucket.org/mrabarnett/mrab-regex/issues/27>`_) - - Recursive and repeated patterns are supported. - - ``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group. - - ``(?&name)`` tries to match the named capture group. - - Examples: - - .. sourcecode:: python - - >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups() - ('Tarzan',) - >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups() - ('Jane',) - - >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak") - >>> m.group(0, 1, 2) - ('kayak', 'k', None) - - The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``. - - It's possible to backtrack into a recursed or repeated group. - - You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``). - - The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported. - - * Full Unicode case-folding is supported. - - In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode. - - Examples (in Python 3): - - .. sourcecode:: python - - >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span() - (0, 6) - >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span() - (0, 7) - - In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module. - - * Approximate "fuzzy" matching (`Hg issue 12 <https://bitbucket.org/mrabarnett/mrab-regex/issues/12>`_, `Hg issue 41 <https://bitbucket.org/mrabarnett/mrab-regex/issues/41>`_, `Hg issue 109 <https://bitbucket.org/mrabarnett/mrab-regex/issues/109>`_) - - Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters. - - A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.) - - The 3 types of error are: - - * Insertion, indicated by "i" - - * Deletion, indicated by "d" - - * Substitution, indicated by "s" - - In addition, "e" indicates any type of error. - - The fuzziness of a regex item is specified between "{" and "}" after the item. - - Examples: - - * ``foo`` match "foo" exactly - - * ``(?:foo){i}`` match "foo", permitting insertions - - * ``(?:foo){d}`` match "foo", permitting deletions - - * ``(?:foo){s}`` match "foo", permitting substitutions - - * ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions - - * ``(?:foo){e}`` match "foo", permitting errors - - If a certain type of error is specified, then any type not specified will **not** be permitted. - - In the following examples I'll omit the item and write only the fuzziness: - - * ``{d<=3}`` permit at most 3 deletions, but no other types - - * ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions - - * ``{1<=e<=3}`` permit at least 1 and at most 3 errors - - * ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions - - It's also possible to state the costs of each type of error and the maximum permitted total cost. - - Examples: - - * ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 - - * ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 - - You can also use "<" instead of "<=" if you want an exclusive minimum or maximum. - - You can add a test to perform on a character that's substituted or inserted. - - Examples: - - * ``{s<=2:[a-z]}`` at most 2 substitutions, which must be in the character set ``[a-z]``. - - * ``{s<=2,i<=3:\d}`` at most 2 substitutions, at most 3 insertions, which must be digits. - - By default, fuzzy matching searches for the first match that meets the given constraints. The ``ENHANCEMATCH`` flag will cause it to attempt to improve the fit (i.e. reduce the number of errors) of the match that it has found. - - The ``BESTMATCH`` flag will make it search for the best match instead. - - Further examples to note: - - * ``regex.search("(dog){e}", "cat and dog")[1]`` returns ``"cat"`` because that matches ``"dog"`` with 3 errors (an unlimited number of errors is permitted). - - * ``regex.search("(dog){e<=1}", "cat and dog")[1]`` returns ``" dog"`` (with a leading space) because that matches ``"dog"`` with 1 error, which is within the limit. - - * ``regex.search("(?e)(dog){e<=1}", "cat and dog")[1]`` returns ``"dog"`` (without a leading space) because the fuzzy search matches ``" dog"`` with 1 error, which is within the limit, and the ``(?e)`` then it attempts a better fit. - - In the first two examples there are perfect matches later in the string, but in neither case is it the first possible match. - - The match object has an attribute ``fuzzy_counts`` which gives the total number of substitutions, insertions and deletions. - - .. sourcecode:: python - - >>> # A 'raw' fuzzy match: - >>> regex.fullmatch(r"(?:cats|cat){e<=1}", "cat").fuzzy_counts - (0, 0, 1) - >>> # 0 substitutions, 0 insertions, 1 deletion. - - >>> # A better match might be possible if the ENHANCEMATCH flag used: - >>> regex.fullmatch(r"(?e)(?:cats|cat){e<=1}", "cat").fuzzy_counts - (0, 0, 0) - >>> # 0 substitutions, 0 insertions, 0 deletions. - - The match object also has an attribute ``fuzzy_changes`` which gives a tuple of the positions of the substitutions, insertions and deletions. - - .. sourcecode:: python - - >>> m = regex.search('(fuu){i<=2,d<=2,e<=5}', 'anaconda foo bar') - >>> m - <regex.Match object; span=(7, 10), match='a f', fuzzy_counts=(0, 2, 2)> - >>> m.fuzzy_changes - ([], [7, 8], [10, 11]) - - What this means is that if the matched part of the string had been: - - .. sourcecode:: python - - 'anacondfuuoo bar' - - it would've been an exact match. - - However, there were insertions at positions 7 and 8: - - .. sourcecode:: python - - 'anaconda fuuoo bar' - ^^ - - and deletions at positions 10 and 11: - - .. sourcecode:: python - - 'anaconda f~~oo bar' - ^^ - - So the actual string was: - - .. sourcecode:: python - - 'anaconda foo bar' - - * Named lists (`Hg issue 11 <https://bitbucket.org/mrabarnett/mrab-regex/issues/11>`_) - - ``\L<name>`` - - There are occasions where you may want to include a list (actually, a set) of options in a regex. - - One way is to build the pattern like this: - - .. sourcecode:: python - - >>> p = regex.compile(r"first|second|third|fourth|fifth") - - but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped and properly ordered, for example, "cats" before "cat". - - The new alternative is to use a named list: - - .. sourcecode:: python - - >>> option_set = ["first", "second", "third", "fourth", "fifth"] - >>> p = regex.compile(r"\L<options>", options=option_set) - - The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object : - - .. sourcecode:: python - - >>> print(p.named_lists) - # Python 3 - {'options': frozenset({'fifth', 'first', 'fourth', 'second', 'third'})} - # Python 2 - {'options': frozenset(['fifth', 'fourth', 'second', 'third', 'first'])} - - * Start and end of word - - ``\m`` matches at the start of a word. - - ``\M`` matches at the end of a word. - - Compare with ``\b``, which matches at the start or end of a word. - - * Unicode line separators - - Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are ``\x0D\x0A``, ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode. - - This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode). - - * Set operators - - **Version 1 behaviour only** - - Set operators have been added, and a set ``[...]`` can include nested sets. - - The operators, in order of increasing precedence, are: - - * ``||`` for union ("x||y" means "x or y") - - * ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both") - - * ``&&`` for intersection ("x&&y" means "x and y") - - * ``--`` (double dash) for difference ("x--y" means "x but not y") - - Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``. - - Examples: - - * ``[ab]`` # Set containing 'a' and 'b' - - * ``[a-z]`` # Set containing 'a' .. 'z' - - * ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w' - - * ``[a-z--qw]`` # Same as above - - * ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W' - - * ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9' - - * ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter - - * regex.escape (`issue #2650 <https://bugs.python.org/issue2650>`_) - - regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped. - - Examples: - - .. sourcecode:: python - - >>> regex.escape("foo!?", special_only=False) - 'foo\\!\\?' - >>> regex.escape("foo!?", special_only=True) - 'foo!\\?' - - * regex.escape (`Hg issue 249 <https://bitbucket.org/mrabarnett/mrab-regex/issues/249>`_) - - regex.escape has an additional keyword parameter ``literal_spaces``. When True, spaces are not escaped. - - Examples: - - .. sourcecode:: python - - >>> regex.escape("foo bar!?", literal_spaces=False) - 'foo\\ bar!\\?' - >>> regex.escape("foo bar!?", literal_spaces=True) - 'foo bar!\\?' - - * Repeated captures (`issue #7132 <https://bugs.python.org/issue7132>`_) - - A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are: - - * ``matchobject.captures([group1, ...])`` - - * Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``. - - * ``matchobject.starts([group])`` - - * Returns a list of the start positions. Compare with ``matchobject.start([group])``. - - * ``matchobject.ends([group])`` - - * Returns a list of the end positions. Compare with ``matchobject.end([group])``. - - * ``matchobject.spans([group])`` - - * Returns a list of the spans. Compare with ``matchobject.span([group])``. - - Examples: - - .. sourcecode:: python - - >>> m = regex.search(r"(\w{3})+", "123456789") - >>> m.group(1) - '789' - >>> m.captures(1) - ['123', '456', '789'] - >>> m.start(1) - 6 - >>> m.starts(1) - [0, 3, 6] - >>> m.end(1) - 9 - >>> m.ends(1) - [3, 6, 9] - >>> m.span(1) - (6, 9) - >>> m.spans(1) - [(0, 3), (3, 6), (6, 9)] - - * Atomic grouping (`issue #433030 <https://bugs.python.org/issue433030>`_) - - ``(?>...)`` - - If the following pattern subsequently fails, then the subpattern as a whole will fail. - - * Possessive quantifiers. - - ``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+`` - - The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``. - - * Scoped flags (`issue #433028 <https://bugs.python.org/issue433028>`_) - - ``(?flags-flags:...)`` - - The flags will apply only to the subpattern. Flags can be turned on or off. - - * Definition of 'word' character (`issue #1693050 <https://bugs.python.org/issue1693050>`_) - - The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. - - * Variable-length lookbehind - - A lookbehind can match a variable-length string. - - * Flags argument for regex.split, regex.sub and regex.subn (`issue #3482 <https://bugs.python.org/issue3482>`_) - - ``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument. - - * Pos and endpos arguments for regex.sub and regex.subn - - ``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments. - - * 'Overlapped' argument for regex.findall and regex.finditer - - ``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches. - - * Splititer - - ``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``. - - * Subscripting for groups - - A match object accepts access to the captured groups via subscripting and slicing: - - .. sourcecode:: python - - >>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu") - >>> print(m["before"]) - pqr - >>> print(len(m)) - 4 - >>> print(m[:]) - ('pqr123stu', 'pqr', '123', 'stu') - - * Named groups - - Groups can be named with ``(?<name>...)`` as well as the current ``(?P<name>...)``. - - * Group references - - Groups can be referenced within a pattern with ``\g<name>``. This also allows there to be more than 99 groups. - - * Named characters - - ``\N{name}`` - - Named characters are supported. (Note: only those known by Python's Unicode database are supported.) - - * Unicode codepoint properties, including scripts and blocks - - ``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}`` - - Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``. - - If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property: - - * ``Latin``, the 'Latin' script (``Script=Latin``). - - * ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). - - * ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). - - A short form starting with ``Is`` indicates a script or binary property: - - * ``IsLatin``, the 'Latin' script (``Script=Latin``). - - * ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). - - A short form starting with ``In`` indicates a block property: - - * ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). - - * POSIX character classes - - ``[[:alpha:]]``; ``[[:^alpha:]]`` - - POSIX character classes are supported. These are normally treated as an alternative form of ``\p{...}``. - - The exceptions are ``alnum``, ``digit``, ``punct`` and ``xdigit``, whose definitions are different from those of Unicode. - - ``[[:alnum:]]`` is equivalent to ``\p{posix_alnum}``. - - ``[[:digit:]]`` is equivalent to ``\p{posix_digit}``. - - ``[[:punct:]]`` is equivalent to ``\p{posix_punct}``. - - ``[[:xdigit:]]`` is equivalent to ``\p{posix_xdigit}``. - - * Search anchor - - ``\G`` - - A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes: - - .. sourcecode:: python - - >>> regex.findall(r"\w{2}", "abcd ef") - ['ab', 'cd', 'ef'] - >>> regex.findall(r"\G\w{2}", "abcd ef") - ['ab', 'cd'] - - * The search starts at position 0 and matches 2 letters 'ab'. - - * The search continues at position 2 and matches 2 letters 'cd'. - - * The search continues at position 4 and fails to match any letters. - - * The anchor stops the search start position from being advanced, so there are no more results. - - * Reverse searching - - Searches can now work backwards: - - .. sourcecode:: python - - >>> regex.findall(r".", "abc") - ['a', 'b', 'c'] - >>> regex.findall(r"(?r).", "abc") - ['c', 'b', 'a'] - - Note: the result of a reverse search is not necessarily the reverse of a forward search: - - .. sourcecode:: python - - >>> regex.findall(r"..", "abcde") - ['ab', 'cd'] - >>> regex.findall(r"(?r)..", "abcde") - ['de', 'bc'] - - * Matching a single grapheme - - ``\X`` - - The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. - - * Branch reset - - ``(?|...|...)`` - - Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers. - - Examples: - - .. sourcecode:: python - - >>> regex.match(r"(?|(first)|(second))", "first").groups() - ('first',) - >>> regex.match(r"(?|(first)|(second))", "second").groups() - ('second',) - - Note that there is only one group. - - * Default Unicode word boundary - - The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``. - - * Timeout (Python 3) - - The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation: - - .. sourcecode:: python - - >>> from time import sleep - >>> - >>> def fast_replace(m): - ... return 'X' - ... - >>> def slow_replace(m): - ... sleep(0.5) - ... return 'X' - ... - >>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2) - 'XXXXX' - >>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2) - Traceback (most recent call last): - File "<stdin>", line 1, in <module> - File "C:\Python37\lib\site-packages\regex\regex.py", line 276, in sub - endpos, concurrent, timeout) - TimeoutError: regex timed out -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Python Software Foundation License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Topic :: Scientific/Engineering :: Information Analysis -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Text Processing -Classifier: Topic :: Text Processing :: General +Metadata-Version: 1.1 +Name: regex +Version: 2020.7.14 +Summary: Alternative regular expression module, to replace re. +Home-page: https://bitbucket.org/mrabarnett/mrab-regex +Author: Matthew Barnett +Author-email: regex@mrabarnett.plus.com +License: Python Software Foundation License +Description: Introduction + ------------ + + This regex implementation is backwards-compatible with the standard 're' module, but offers additional functionality. + + Note + ---- + + The re module's behaviour with zero-width matches changed in Python 3.7, and this module will follow that behaviour when compiled for Python 3.7. + + Old vs new behaviour + -------------------- + + In order to be compatible with the re module, this module has 2 behaviours: + + * **Version 0** behaviour (old behaviour, compatible with the re module): + + Please note that the re module's behaviour may change over time, and I'll endeavour to match that behaviour in version 0. + + * Indicated by the ``VERSION0`` or ``V0`` flag, or ``(?V0)`` in the pattern. + + * Zero-width matches are not handled correctly in the re module before Python 3.7. The behaviour in those earlier versions is: + + * ``.split`` won't split a string at a zero-width match. + + * ``.sub`` will advance by one character after a zero-width match. + + * Inline flags apply to the entire pattern, and they can't be turned off. + + * Only simple sets are supported. + + * Case-insensitive matches in Unicode use simple case-folding by default. + + * **Version 1** behaviour (new behaviour, possibly different from the re module): + + * Indicated by the ``VERSION1`` or ``V1`` flag, or ``(?V1)`` in the pattern. + + * Zero-width matches are handled correctly. + + * Inline flags apply to the end of the group or pattern, and they can be turned off. + + * Nested sets and set operations are supported. + + * Case-insensitive matches in Unicode use full case-folding by default. + + If no version is specified, the regex module will default to ``regex.DEFAULT_VERSION``. + + Case-insensitive matches in Unicode + ----------------------------------- + + The regex module supports both simple and full case-folding for case-insensitive matches in Unicode. Use of full case-folding can be turned on using the ``FULLCASE`` or ``F`` flag, or ``(?f)`` in the pattern. Please note that this flag affects how the ``IGNORECASE`` flag works; the ``FULLCASE`` flag itself does not turn on case-insensitive matching. + + In the version 0 behaviour, the flag is off by default. + + In the version 1 behaviour, the flag is on by default. + + Nested sets and set operations + ------------------------------ + + It's not possible to support both simple sets, as used in the re module, and nested sets at the same time because of a difference in the meaning of an unescaped ``"["`` in a set. + + For example, the pattern ``[[a-z]--[aeiou]]`` is treated in the version 0 behaviour (simple sets, compatible with the re module) as: + + * Set containing "[" and the letters "a" to "z" + + * Literal "--" + + * Set containing letters "a", "e", "i", "o", "u" + + * Literal "]" + + but in the version 1 behaviour (nested sets, enhanced behaviour) as: + + * Set which is: + + * Set containing the letters "a" to "z" + + * but excluding: + + * Set containing the letters "a", "e", "i", "o", "u" + + Version 0 behaviour: only simple sets are supported. + + Version 1 behaviour: nested sets and set operations are supported. + + Flags + ----- + + There are 2 kinds of flag: scoped and global. Scoped flags can apply to only part of a pattern and can be turned on or off; global flags apply to the entire pattern and can only be turned on. + + The scoped flags are: ``FULLCASE``, ``IGNORECASE``, ``MULTILINE``, ``DOTALL``, ``VERBOSE``, ``WORD``. + + The global flags are: ``ASCII``, ``BESTMATCH``, ``ENHANCEMATCH``, ``LOCALE``, ``POSIX``, ``REVERSE``, ``UNICODE``, ``VERSION0``, ``VERSION1``. + + If neither the ``ASCII``, ``LOCALE`` nor ``UNICODE`` flag is specified, it will default to ``UNICODE`` if the regex pattern is a Unicode string and ``ASCII`` if it's a bytestring. + + The ``ENHANCEMATCH`` flag makes fuzzy matching attempt to improve the fit of the next match that it finds. + + The ``BESTMATCH`` flag makes fuzzy matching search for the best match instead of the next match. + + Notes on named capture groups + ----------------------------- + + All capture groups have a group number, starting from 1. + + Groups with the same group name will have the same group number, and groups with a different group name will have a different group number. + + The same name can be used by more than one group, with later captures 'overwriting' earlier captures. All of the captures of the group will be available from the ``captures`` method of the match object. + + Group numbers will be reused across different branches of a branch reset, eg. ``(?|(first)|(second))`` has only group 1. If capture groups have different group names then they will, of course, have different group numbers, eg. ``(?|(?P<foo>first)|(?P<bar>second))`` has group 1 ("foo") and group 2 ("bar"). + + In the regex ``(\s+)(?|(?P<foo>[A-Z]+)|(\w+) (?P<foo>[0-9]+)`` there are 2 groups: + + * ``(\s+)`` is group 1. + + * ``(?P<foo>[A-Z]+)`` is group 2, also called "foo". + + * ``(\w+)`` is group 2 because of the branch reset. + + * ``(?P<foo>[0-9]+)`` is group 2 because it's called "foo". + + If you want to prevent ``(\w+)`` from being group 2, you need to name it (different name, different group number). + + Multithreading + -------------- + + The regex module releases the GIL during matching on instances of the built-in (immutable) string classes, enabling other Python threads to run concurrently. It is also possible to force the regex module to release the GIL during matching by calling the matching methods with the keyword argument ``concurrent=True``. The behaviour is undefined if the string changes during matching, so use it *only* when it is guaranteed that that won't happen. + + Unicode + ------- + + This module supports Unicode 13.0.0. + + Full Unicode case-folding is supported. + + Additional features + ------------------- + + The issue numbers relate to the Python bug tracker, except where listed as "Hg issue". + + Added support for lookaround in conditional pattern (`Hg issue 163 <https://bitbucket.org/mrabarnett/mrab-regex/issues/163>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + The test of a conditional pattern can now be a lookaround. + + Examples: + + .. sourcecode:: python + + >>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc') + <regex.Match object; span=(0, 3), match='123'> + >>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123') + <regex.Match object; span=(0, 6), match='abc123'> + + This is not quite the same as putting a lookaround in the first branch of a pair of alternatives. + + Examples: + + .. sourcecode:: python + + >>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc')) + <regex.Match object; span=(0, 6), match='123abc'> + >>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc')) + None + + In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was **not** attempted. + + Added POSIX matching (leftmost longest) (`Hg issue 150 <https://bitbucket.org/mrabarnett/mrab-regex/issues/150>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the ``POSIX`` flag (``(?p)``). + + Examples: + + .. sourcecode:: python + + >>> # Normal matching. + >>> regex.search(r'Mr|Mrs', 'Mrs') + <regex.Match object; span=(0, 2), match='Mr'> + >>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient') + <regex.Match object; span=(0, 7), match='oneself'> + >>> # POSIX matching. + >>> regex.search(r'(?p)Mr|Mrs', 'Mrs') + <regex.Match object; span=(0, 3), match='Mrs'> + >>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient') + <regex.Match object; span=(0, 17), match='oneselfsufficient'> + + Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there. + + Added ``(?(DEFINE)...)`` (`Hg issue 152 <https://bitbucket.org/mrabarnett/mrab-regex/issues/152>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + If there's no group called "DEFINE", then ... will be ignored, but any group definitions within it will be available. + + Examples: + + .. sourcecode:: python + + >>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants') + <regex.Match object; span=(0, 11), match='5 elephants'> + + Added ``(*PRUNE)``, ``(*SKIP)`` and ``(*FAIL)`` (`Hg issue 153 <https://bitbucket.org/mrabarnett/mrab-regex/issues/153>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``(*PRUNE)`` discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern. + + ``(*SKIP)`` is similar to ``(*PRUNE)``, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern. + + ``(*FAIL)`` causes immediate backtracking. ``(*F)`` is a permitted abbreviation. + + Added ``\K`` (`Hg issue 151 <https://bitbucket.org/mrabarnett/mrab-regex/issues/151>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Keeps the part of the entire match after the position where ``\K`` occurred; the part before it is discarded. + + It does not affect what capture groups return. + + Examples: + + .. sourcecode:: python + + >>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef') + >>> m[0] + 'cde' + >>> m[1] + 'abcde' + >>> + >>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef') + >>> m[0] + 'bc' + >>> m[1] + 'bcdef' + + Added capture subscripting for ``expandf`` and ``subf``/``subfn`` (`Hg issue 133 <https://bitbucket.org/mrabarnett/mrab-regex/issues/133>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + You can now use subscripting to get the captures of a repeated capture group. + + Examples: + + .. sourcecode:: python + + >>> m = regex.match(r"(\w)+", "abc") + >>> m.expandf("{1}") + 'c' + >>> m.expandf("{1[0]} {1[1]} {1[2]}") + 'a b c' + >>> m.expandf("{1[-1]} {1[-2]} {1[-3]}") + 'c b a' + >>> + >>> m = regex.match(r"(?P<letter>\w)+", "abc") + >>> m.expandf("{letter}") + 'c' + >>> m.expandf("{letter[0]} {letter[1]} {letter[2]}") + 'a b c' + >>> m.expandf("{letter[-1]} {letter[-2]} {letter[-3]}") + 'c b a' + + Added support for referring to a group by number using ``(?P=...)``. + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + This is in addition to the existing ``\g<...>``. + + Fixed the handling of locale-sensitive regexes. + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + The ``LOCALE`` flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead. + + Added partial matches (`Hg issue 102 <https://bitbucket.org/mrabarnett/mrab-regex/issues/102>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated. + + Partial matches are supported by ``match``, ``search``, ``fullmatch`` and ``finditer`` with the ``partial`` keyword argument. + + Match objects have a ``partial`` attribute, which is ``True`` if it's a partial match. + + For example, if you wanted a user to enter a 4-digit number and check it character by character as it was being entered: + + .. sourcecode:: python + + >>> pattern = regex.compile(r'\d{4}') + + >>> # Initially, nothing has been entered: + >>> print(pattern.fullmatch('', partial=True)) + <regex.Match object; span=(0, 0), match='', partial=True> + + >>> # An empty string is OK, but it's only a partial match. + >>> # The user enters a letter: + >>> print(pattern.fullmatch('a', partial=True)) + None + >>> # It'll never match. + + >>> # The user deletes that and enters a digit: + >>> print(pattern.fullmatch('1', partial=True)) + <regex.Match object; span=(0, 1), match='1', partial=True> + >>> # It matches this far, but it's only a partial match. + + >>> # The user enters 2 more digits: + >>> print(pattern.fullmatch('123', partial=True)) + <regex.Match object; span=(0, 3), match='123', partial=True> + >>> # It matches this far, but it's only a partial match. + + >>> # The user enters another digit: + >>> print(pattern.fullmatch('1234', partial=True)) + <regex.Match object; span=(0, 4), match='1234'> + >>> # It's a complete match. + + >>> # If the user enters another digit: + >>> print(pattern.fullmatch('12345', partial=True)) + None + >>> # It's no longer a match. + + >>> # This is a partial match: + >>> pattern.match('123', partial=True).partial + True + + >>> # This is a complete match: + >>> pattern.match('1233', partial=True).partial + False + + ``*`` operator not working correctly with sub() (`Hg issue 106 <https://bitbucket.org/mrabarnett/mrab-regex/issues/106>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters? + + Examples: + + .. sourcecode:: python + + # Python 3.7 and later + >>> regex.sub('.*', 'x', 'test') + 'xx' + >>> regex.sub('.*?', '|', 'test') + '|||||||||' + + # Python 3.6 and earlier + >>> regex.sub('(?V0).*', 'x', 'test') + 'x' + >>> regex.sub('(?V1).*', 'x', 'test') + 'xx' + >>> regex.sub('(?V0).*?', '|', 'test') + '|t|e|s|t|' + >>> regex.sub('(?V1).*?', '|', 'test') + '|||||||||' + + Added ``capturesdict`` (`Hg issue 86 <https://bitbucket.org/mrabarnett/mrab-regex/issues/86>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``capturesdict`` is a combination of ``groupdict`` and ``captures``: + + ``groupdict`` returns a dict of the named groups and the last capture of those groups. + + ``captures`` returns a list of all the captures of a group + + ``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups. + + Examples: + + .. sourcecode:: python + + >>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n") + >>> m.groupdict() + {'word': 'three', 'digits': '3'} + >>> m.captures("word") + ['one', 'two', 'three'] + >>> m.captures("digits") + ['1', '2', '3'] + >>> m.capturesdict() + {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']} + + Allow duplicate names of groups (`Hg issue 87 <https://bitbucket.org/mrabarnett/mrab-regex/issues/87>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Group names can now be duplicated. + + Examples: + + .. sourcecode:: python + + >>> # With optional groups: + >>> + >>> # Both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['first', 'second'] + >>> # Only the second group captures. + >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['second'] + >>> # Only the first group captures. + >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ") + >>> m.group("item") + 'first' + >>> m.captures("item") + ['first'] + >>> + >>> # With mandatory groups: + >>> + >>> # Both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)?", "first or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['first', 'second'] + >>> # Again, both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['', 'second'] + >>> # And yet again, both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ") + >>> m.group("item") + '' + >>> m.captures("item") + ['first', ''] + + Added ``fullmatch`` (`issue #16203 <https://bugs.python.org/issue16203>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``fullmatch`` behaves like ``match``, except that it must match all of the string. + + Examples: + + .. sourcecode:: python + + >>> print(regex.fullmatch(r"abc", "abc").span()) + (0, 3) + >>> print(regex.fullmatch(r"abc", "abcx")) + None + >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span()) + (0, 3) + >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span()) + (1, 4) + >>> + >>> regex.match(r"a.*?", "abcd").group(0) + 'a' + >>> regex.fullmatch(r"a.*?", "abcd").group(0) + 'abcd' + + Added ``subf`` and ``subfn`` + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string. + + Examples: + + .. sourcecode:: python + + >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar") + 'foo bar => bar foo' + >>> regex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", "{word2} {word1}", "foo bar") + 'bar foo' + + Added ``expandf`` to match object + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string. + + Examples: + + .. sourcecode:: python + + >>> m = regex.match(r"(\w+) (\w+)", "foo bar") + >>> m.expandf("{0} => {2} {1}") + 'foo bar => bar foo' + >>> + >>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar") + >>> m.expandf("{word2} {word1}") + 'bar foo' + + Detach searched string + ^^^^^^^^^^^^^^^^^^^^^^ + + A match object contains a reference to the string that was searched, via its ``string`` attribute. The ``detach_string`` method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large. + + Example: + + .. sourcecode:: python + + >>> m = regex.search(r"\w+", "Hello world") + >>> print(m.group()) + Hello + >>> print(m.string) + Hello world + >>> m.detach_string() + >>> print(m.group()) + Hello + >>> print(m.string) + None + + Recursive patterns (`Hg issue 27 <https://bitbucket.org/mrabarnett/mrab-regex/issues/27>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Recursive and repeated patterns are supported. + + ``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group. + + ``(?&name)`` tries to match the named capture group. + + Examples: + + .. sourcecode:: python + + >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups() + ('Tarzan',) + >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups() + ('Jane',) + + >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak") + >>> m.group(0, 1, 2) + ('kayak', 'k', None) + + The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``. + + It's possible to backtrack into a recursed or repeated group. + + You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``). + + The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported. + + Full Unicode case-folding is supported. + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode. + + Examples (in Python 3): + + .. sourcecode:: python + + >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span() + (0, 6) + >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span() + (0, 7) + + In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module. + + Approximate "fuzzy" matching (`Hg issue 12 <https://bitbucket.org/mrabarnett/mrab-regex/issues/12>`_, `Hg issue 41 <https://bitbucket.org/mrabarnett/mrab-regex/issues/41>`_, `Hg issue 109 <https://bitbucket.org/mrabarnett/mrab-regex/issues/109>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters. + + A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.) + + The 3 types of error are: + + * Insertion, indicated by "i" + + * Deletion, indicated by "d" + + * Substitution, indicated by "s" + + In addition, "e" indicates any type of error. + + The fuzziness of a regex item is specified between "{" and "}" after the item. + + Examples: + + * ``foo`` match "foo" exactly + + * ``(?:foo){i}`` match "foo", permitting insertions + + * ``(?:foo){d}`` match "foo", permitting deletions + + * ``(?:foo){s}`` match "foo", permitting substitutions + + * ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions + + * ``(?:foo){e}`` match "foo", permitting errors + + If a certain type of error is specified, then any type not specified will **not** be permitted. + + In the following examples I'll omit the item and write only the fuzziness: + + * ``{d<=3}`` permit at most 3 deletions, but no other types + + * ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions + + * ``{1<=e<=3}`` permit at least 1 and at most 3 errors + + * ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions + + It's also possible to state the costs of each type of error and the maximum permitted total cost. + + Examples: + + * ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 + + * ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 + + You can also use "<" instead of "<=" if you want an exclusive minimum or maximum. + + You can add a test to perform on a character that's substituted or inserted. + + Examples: + + * ``{s<=2:[a-z]}`` at most 2 substitutions, which must be in the character set ``[a-z]``. + + * ``{s<=2,i<=3:\d}`` at most 2 substitutions, at most 3 insertions, which must be digits. + + By default, fuzzy matching searches for the first match that meets the given constraints. The ``ENHANCEMATCH`` flag will cause it to attempt to improve the fit (i.e. reduce the number of errors) of the match that it has found. + + The ``BESTMATCH`` flag will make it search for the best match instead. + + Further examples to note: + + * ``regex.search("(dog){e}", "cat and dog")[1]`` returns ``"cat"`` because that matches ``"dog"`` with 3 errors (an unlimited number of errors is permitted). + + * ``regex.search("(dog){e<=1}", "cat and dog")[1]`` returns ``" dog"`` (with a leading space) because that matches ``"dog"`` with 1 error, which is within the limit. + + * ``regex.search("(?e)(dog){e<=1}", "cat and dog")[1]`` returns ``"dog"`` (without a leading space) because the fuzzy search matches ``" dog"`` with 1 error, which is within the limit, and the ``(?e)`` then it attempts a better fit. + + In the first two examples there are perfect matches later in the string, but in neither case is it the first possible match. + + The match object has an attribute ``fuzzy_counts`` which gives the total number of substitutions, insertions and deletions. + + .. sourcecode:: python + + >>> # A 'raw' fuzzy match: + >>> regex.fullmatch(r"(?:cats|cat){e<=1}", "cat").fuzzy_counts + (0, 0, 1) + >>> # 0 substitutions, 0 insertions, 1 deletion. + + >>> # A better match might be possible if the ENHANCEMATCH flag used: + >>> regex.fullmatch(r"(?e)(?:cats|cat){e<=1}", "cat").fuzzy_counts + (0, 0, 0) + >>> # 0 substitutions, 0 insertions, 0 deletions. + + The match object also has an attribute ``fuzzy_changes`` which gives a tuple of the positions of the substitutions, insertions and deletions. + + .. sourcecode:: python + + >>> m = regex.search('(fuu){i<=2,d<=2,e<=5}', 'anaconda foo bar') + >>> m + <regex.Match object; span=(7, 10), match='a f', fuzzy_counts=(0, 2, 2)> + >>> m.fuzzy_changes + ([], [7, 8], [10, 11]) + + What this means is that if the matched part of the string had been: + + .. sourcecode:: python + + 'anacondfuuoo bar' + + it would've been an exact match. + + However, there were insertions at positions 7 and 8: + + .. sourcecode:: python + + 'anaconda fuuoo bar' + ^^ + + and deletions at positions 10 and 11: + + .. sourcecode:: python + + 'anaconda f~~oo bar' + ^^ + + So the actual string was: + + .. sourcecode:: python + + 'anaconda foo bar' + + Named lists (`Hg issue 11 <https://bitbucket.org/mrabarnett/mrab-regex/issues/11>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``\L<name>`` + + There are occasions where you may want to include a list (actually, a set) of options in a regex. + + One way is to build the pattern like this: + + .. sourcecode:: python + + >>> p = regex.compile(r"first|second|third|fourth|fifth") + + but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped and properly ordered, for example, "cats" before "cat". + + The new alternative is to use a named list: + + .. sourcecode:: python + + >>> option_set = ["first", "second", "third", "fourth", "fifth"] + >>> p = regex.compile(r"\L<options>", options=option_set) + + The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object : + + .. sourcecode:: python + + >>> print(p.named_lists) + # Python 3 + {'options': frozenset({'fifth', 'first', 'fourth', 'second', 'third'})} + # Python 2 + {'options': frozenset(['fifth', 'fourth', 'second', 'third', 'first'])} + + If there are any unused keyword arguments, ``ValueError`` will be raised unless you tell it otherwise: + + .. sourcecode:: python + + >>> option_set = ["first", "second", "third", "fourth", "fifth"] + >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[]) + Traceback (most recent call last): + File "<stdin>", line 1, in <module> + File "C:\Python37\lib\site-packages\regex\regex.py", line 348, in compile + return _compile(pattern, flags, ignore_unused, kwargs) + File "C:\Python37\lib\site-packages\regex\regex.py", line 585, in _compile + raise ValueError('unused keyword argument {!a}'.format(any_one)) + ValueError: unused keyword argument 'other_options' + >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[], ignore_unused=True) + >>> + + Start and end of word + ^^^^^^^^^^^^^^^^^^^^^ + + ``\m`` matches at the start of a word. + + ``\M`` matches at the end of a word. + + Compare with ``\b``, which matches at the start or end of a word. + + Unicode line separators + ^^^^^^^^^^^^^^^^^^^^^^^ + + Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are ``\x0D\x0A``, ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode. + + This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode). + + Set operators + ^^^^^^^^^^^^^ + + **Version 1 behaviour only** + + Set operators have been added, and a set ``[...]`` can include nested sets. + + The operators, in order of increasing precedence, are: + + * ``||`` for union ("x||y" means "x or y") + + * ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both") + + * ``&&`` for intersection ("x&&y" means "x and y") + + * ``--`` (double dash) for difference ("x--y" means "x but not y") + + Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``. + + Examples: + + * ``[ab]`` # Set containing 'a' and 'b' + + * ``[a-z]`` # Set containing 'a' .. 'z' + + * ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w' + + * ``[a-z--qw]`` # Same as above + + * ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W' + + * ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9' + + * ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter + + regex.escape (`issue #2650 <https://bugs.python.org/issue2650>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped. + + Examples: + + .. sourcecode:: python + + >>> regex.escape("foo!?", special_only=False) + 'foo\\!\\?' + >>> regex.escape("foo!?", special_only=True) + 'foo!\\?' + + regex.escape (`Hg issue 249 <https://bitbucket.org/mrabarnett/mrab-regex/issues/249>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + regex.escape has an additional keyword parameter ``literal_spaces``. When True, spaces are not escaped. + + Examples: + + .. sourcecode:: python + + >>> regex.escape("foo bar!?", literal_spaces=False) + 'foo\\ bar!\\?' + >>> regex.escape("foo bar!?", literal_spaces=True) + 'foo bar!\\?' + + Repeated captures (`issue #7132 <https://bugs.python.org/issue7132>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are: + + * ``matchobject.captures([group1, ...])`` + + * Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``. + + * ``matchobject.starts([group])`` + + * Returns a list of the start positions. Compare with ``matchobject.start([group])``. + + * ``matchobject.ends([group])`` + + * Returns a list of the end positions. Compare with ``matchobject.end([group])``. + + * ``matchobject.spans([group])`` + + * Returns a list of the spans. Compare with ``matchobject.span([group])``. + + Examples: + + .. sourcecode:: python + + >>> m = regex.search(r"(\w{3})+", "123456789") + >>> m.group(1) + '789' + >>> m.captures(1) + ['123', '456', '789'] + >>> m.start(1) + 6 + >>> m.starts(1) + [0, 3, 6] + >>> m.end(1) + 9 + >>> m.ends(1) + [3, 6, 9] + >>> m.span(1) + (6, 9) + >>> m.spans(1) + [(0, 3), (3, 6), (6, 9)] + + Atomic grouping (`issue #433030 <https://bugs.python.org/issue433030>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``(?>...)`` + + If the following pattern subsequently fails, then the subpattern as a whole will fail. + + Possessive quantifiers. + ^^^^^^^^^^^^^^^^^^^^^^^ + + ``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+`` + + The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``. + + Scoped flags (`issue #433028 <https://bugs.python.org/issue433028>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``(?flags-flags:...)`` + + The flags will apply only to the subpattern. Flags can be turned on or off. + + Definition of 'word' character (`issue #1693050 <https://bugs.python.org/issue1693050>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. + + Variable-length lookbehind + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + + A lookbehind can match a variable-length string. + + Flags argument for regex.split, regex.sub and regex.subn (`issue #3482 <https://bugs.python.org/issue3482>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument. + + Pos and endpos arguments for regex.sub and regex.subn + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments. + + 'Overlapped' argument for regex.findall and regex.finditer + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches. + + Splititer + ^^^^^^^^^ + + ``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``. + + Subscripting for groups + ^^^^^^^^^^^^^^^^^^^^^^^ + + A match object accepts access to the captured groups via subscripting and slicing: + + .. sourcecode:: python + + >>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu") + >>> print(m["before"]) + pqr + >>> print(len(m)) + 4 + >>> print(m[:]) + ('pqr123stu', 'pqr', '123', 'stu') + + Named groups + ^^^^^^^^^^^^ + + Groups can be named with ``(?<name>...)`` as well as the current ``(?P<name>...)``. + + Group references + ^^^^^^^^^^^^^^^^ + + Groups can be referenced within a pattern with ``\g<name>``. This also allows there to be more than 99 groups. + + Named characters + ^^^^^^^^^^^^^^^^ + + ``\N{name}`` + + Named characters are supported. (Note: only those known by Python's Unicode database are supported.) + + Unicode codepoint properties, including scripts and blocks + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}`` + + Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``. + + If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property: + + * ``Latin``, the 'Latin' script (``Script=Latin``). + + * ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). + + * ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). + + A short form starting with ``Is`` indicates a script or binary property: + + * ``IsLatin``, the 'Latin' script (``Script=Latin``). + + * ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). + + A short form starting with ``In`` indicates a block property: + + * ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). + + POSIX character classes + ^^^^^^^^^^^^^^^^^^^^^^^ + + ``[[:alpha:]]``; ``[[:^alpha:]]`` + + POSIX character classes are supported. These are normally treated as an alternative form of ``\p{...}``. + + The exceptions are ``alnum``, ``digit``, ``punct`` and ``xdigit``, whose definitions are different from those of Unicode. + + ``[[:alnum:]]`` is equivalent to ``\p{posix_alnum}``. + + ``[[:digit:]]`` is equivalent to ``\p{posix_digit}``. + + ``[[:punct:]]`` is equivalent to ``\p{posix_punct}``. + + ``[[:xdigit:]]`` is equivalent to ``\p{posix_xdigit}``. + + Search anchor + ^^^^^^^^^^^^^ + + ``\G`` + + A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes: + + .. sourcecode:: python + + >>> regex.findall(r"\w{2}", "abcd ef") + ['ab', 'cd', 'ef'] + >>> regex.findall(r"\G\w{2}", "abcd ef") + ['ab', 'cd'] + + * The search starts at position 0 and matches 2 letters 'ab'. + + * The search continues at position 2 and matches 2 letters 'cd'. + + * The search continues at position 4 and fails to match any letters. + + * The anchor stops the search start position from being advanced, so there are no more results. + + Reverse searching + ^^^^^^^^^^^^^^^^^ + + Searches can now work backwards: + + .. sourcecode:: python + + >>> regex.findall(r".", "abc") + ['a', 'b', 'c'] + >>> regex.findall(r"(?r).", "abc") + ['c', 'b', 'a'] + + Note: the result of a reverse search is not necessarily the reverse of a forward search: + + .. sourcecode:: python + + >>> regex.findall(r"..", "abcde") + ['ab', 'cd'] + >>> regex.findall(r"(?r)..", "abcde") + ['de', 'bc'] + + Matching a single grapheme + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``\X`` + + The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. + + Branch reset + ^^^^^^^^^^^^ + + ``(?|...|...)`` + + Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers. + + Examples: + + .. sourcecode:: python + + >>> regex.match(r"(?|(first)|(second))", "first").groups() + ('first',) + >>> regex.match(r"(?|(first)|(second))", "second").groups() + ('second',) + + Note that there is only one group. + + Default Unicode word boundary + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``. + + Timeout (Python 3) + ^^^^^^^^^^^^^^^^^^ + + The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation: + + .. sourcecode:: python + + >>> from time import sleep + >>> + >>> def fast_replace(m): + ... return 'X' + ... + >>> def slow_replace(m): + ... sleep(0.5) + ... return 'X' + ... + >>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2) + 'XXXXX' + >>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2) + Traceback (most recent call last): + File "<stdin>", line 1, in <module> + File "C:\Python37\lib\site-packages\regex\regex.py", line 276, in sub + endpos, concurrent, timeout) + TimeoutError: regex timed out + +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Python Software Foundation License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Topic :: Scientific/Engineering :: Information Analysis +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing +Classifier: Topic :: Text Processing :: General diff --git a/README b/README deleted file mode 100644 index adb0672..0000000 --- a/README +++ /dev/null @@ -1,18 +0,0 @@ -regex is an alternative to the re package in the Python standard library. It is -intended to act as a drop in replacement. regex is supported on multiple -versions of Python. - -For a full list of features see docs/Features.rst. - -To install from PyPI run - - python -m pip install regex - -To build and install regex for your default Python run - - python setup.py install - -To install regex for a specific version run setup.py with that interpreter, e.g. - - python3.7 setup.py install - diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..622c000 --- /dev/null +++ b/README.rst @@ -0,0 +1,1063 @@ +Introduction +------------ + +This regex implementation is backwards-compatible with the standard 're' module, but offers additional functionality. + +Note +---- + +The re module's behaviour with zero-width matches changed in Python 3.7, and this module will follow that behaviour when compiled for Python 3.7. + +Old vs new behaviour +-------------------- + +In order to be compatible with the re module, this module has 2 behaviours: + +* **Version 0** behaviour (old behaviour, compatible with the re module): + + Please note that the re module's behaviour may change over time, and I'll endeavour to match that behaviour in version 0. + + * Indicated by the ``VERSION0`` or ``V0`` flag, or ``(?V0)`` in the pattern. + + * Zero-width matches are not handled correctly in the re module before Python 3.7. The behaviour in those earlier versions is: + + * ``.split`` won't split a string at a zero-width match. + + * ``.sub`` will advance by one character after a zero-width match. + + * Inline flags apply to the entire pattern, and they can't be turned off. + + * Only simple sets are supported. + + * Case-insensitive matches in Unicode use simple case-folding by default. + +* **Version 1** behaviour (new behaviour, possibly different from the re module): + + * Indicated by the ``VERSION1`` or ``V1`` flag, or ``(?V1)`` in the pattern. + + * Zero-width matches are handled correctly. + + * Inline flags apply to the end of the group or pattern, and they can be turned off. + + * Nested sets and set operations are supported. + + * Case-insensitive matches in Unicode use full case-folding by default. + +If no version is specified, the regex module will default to ``regex.DEFAULT_VERSION``. + +Case-insensitive matches in Unicode +----------------------------------- + +The regex module supports both simple and full case-folding for case-insensitive matches in Unicode. Use of full case-folding can be turned on using the ``FULLCASE`` or ``F`` flag, or ``(?f)`` in the pattern. Please note that this flag affects how the ``IGNORECASE`` flag works; the ``FULLCASE`` flag itself does not turn on case-insensitive matching. + +In the version 0 behaviour, the flag is off by default. + +In the version 1 behaviour, the flag is on by default. + +Nested sets and set operations +------------------------------ + +It's not possible to support both simple sets, as used in the re module, and nested sets at the same time because of a difference in the meaning of an unescaped ``"["`` in a set. + +For example, the pattern ``[[a-z]--[aeiou]]`` is treated in the version 0 behaviour (simple sets, compatible with the re module) as: + +* Set containing "[" and the letters "a" to "z" + +* Literal "--" + +* Set containing letters "a", "e", "i", "o", "u" + +* Literal "]" + +but in the version 1 behaviour (nested sets, enhanced behaviour) as: + +* Set which is: + + * Set containing the letters "a" to "z" + +* but excluding: + + * Set containing the letters "a", "e", "i", "o", "u" + +Version 0 behaviour: only simple sets are supported. + +Version 1 behaviour: nested sets and set operations are supported. + +Flags +----- + +There are 2 kinds of flag: scoped and global. Scoped flags can apply to only part of a pattern and can be turned on or off; global flags apply to the entire pattern and can only be turned on. + +The scoped flags are: ``FULLCASE``, ``IGNORECASE``, ``MULTILINE``, ``DOTALL``, ``VERBOSE``, ``WORD``. + +The global flags are: ``ASCII``, ``BESTMATCH``, ``ENHANCEMATCH``, ``LOCALE``, ``POSIX``, ``REVERSE``, ``UNICODE``, ``VERSION0``, ``VERSION1``. + +If neither the ``ASCII``, ``LOCALE`` nor ``UNICODE`` flag is specified, it will default to ``UNICODE`` if the regex pattern is a Unicode string and ``ASCII`` if it's a bytestring. + +The ``ENHANCEMATCH`` flag makes fuzzy matching attempt to improve the fit of the next match that it finds. + +The ``BESTMATCH`` flag makes fuzzy matching search for the best match instead of the next match. + +Notes on named capture groups +----------------------------- + +All capture groups have a group number, starting from 1. + +Groups with the same group name will have the same group number, and groups with a different group name will have a different group number. + +The same name can be used by more than one group, with later captures 'overwriting' earlier captures. All of the captures of the group will be available from the ``captures`` method of the match object. + +Group numbers will be reused across different branches of a branch reset, eg. ``(?|(first)|(second))`` has only group 1. If capture groups have different group names then they will, of course, have different group numbers, eg. ``(?|(?P<foo>first)|(?P<bar>second))`` has group 1 ("foo") and group 2 ("bar"). + +In the regex ``(\s+)(?|(?P<foo>[A-Z]+)|(\w+) (?P<foo>[0-9]+)`` there are 2 groups: + +* ``(\s+)`` is group 1. + +* ``(?P<foo>[A-Z]+)`` is group 2, also called "foo". + +* ``(\w+)`` is group 2 because of the branch reset. + +* ``(?P<foo>[0-9]+)`` is group 2 because it's called "foo". + +If you want to prevent ``(\w+)`` from being group 2, you need to name it (different name, different group number). + +Multithreading +-------------- + +The regex module releases the GIL during matching on instances of the built-in (immutable) string classes, enabling other Python threads to run concurrently. It is also possible to force the regex module to release the GIL during matching by calling the matching methods with the keyword argument ``concurrent=True``. The behaviour is undefined if the string changes during matching, so use it *only* when it is guaranteed that that won't happen. + +Unicode +------- + +This module supports Unicode 13.0.0. + +Full Unicode case-folding is supported. + +Additional features +------------------- + +The issue numbers relate to the Python bug tracker, except where listed as "Hg issue". + +Added support for lookaround in conditional pattern (`Hg issue 163 <https://bitbucket.org/mrabarnett/mrab-regex/issues/163>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The test of a conditional pattern can now be a lookaround. + +Examples: + +.. sourcecode:: python + + >>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc') + <regex.Match object; span=(0, 3), match='123'> + >>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123') + <regex.Match object; span=(0, 6), match='abc123'> + +This is not quite the same as putting a lookaround in the first branch of a pair of alternatives. + +Examples: + +.. sourcecode:: python + + >>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc')) + <regex.Match object; span=(0, 6), match='123abc'> + >>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc')) + None + +In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was **not** attempted. + +Added POSIX matching (leftmost longest) (`Hg issue 150 <https://bitbucket.org/mrabarnett/mrab-regex/issues/150>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the ``POSIX`` flag (``(?p)``). + +Examples: + +.. sourcecode:: python + + >>> # Normal matching. + >>> regex.search(r'Mr|Mrs', 'Mrs') + <regex.Match object; span=(0, 2), match='Mr'> + >>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient') + <regex.Match object; span=(0, 7), match='oneself'> + >>> # POSIX matching. + >>> regex.search(r'(?p)Mr|Mrs', 'Mrs') + <regex.Match object; span=(0, 3), match='Mrs'> + >>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient') + <regex.Match object; span=(0, 17), match='oneselfsufficient'> + +Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there. + +Added ``(?(DEFINE)...)`` (`Hg issue 152 <https://bitbucket.org/mrabarnett/mrab-regex/issues/152>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If there's no group called "DEFINE", then ... will be ignored, but any group definitions within it will be available. + +Examples: + +.. sourcecode:: python + + >>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants') + <regex.Match object; span=(0, 11), match='5 elephants'> + +Added ``(*PRUNE)``, ``(*SKIP)`` and ``(*FAIL)`` (`Hg issue 153 <https://bitbucket.org/mrabarnett/mrab-regex/issues/153>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``(*PRUNE)`` discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern. + +``(*SKIP)`` is similar to ``(*PRUNE)``, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern. + +``(*FAIL)`` causes immediate backtracking. ``(*F)`` is a permitted abbreviation. + +Added ``\K`` (`Hg issue 151 <https://bitbucket.org/mrabarnett/mrab-regex/issues/151>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Keeps the part of the entire match after the position where ``\K`` occurred; the part before it is discarded. + +It does not affect what capture groups return. + +Examples: + +.. sourcecode:: python + + >>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef') + >>> m[0] + 'cde' + >>> m[1] + 'abcde' + >>> + >>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef') + >>> m[0] + 'bc' + >>> m[1] + 'bcdef' + +Added capture subscripting for ``expandf`` and ``subf``/``subfn`` (`Hg issue 133 <https://bitbucket.org/mrabarnett/mrab-regex/issues/133>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can now use subscripting to get the captures of a repeated capture group. + +Examples: + +.. sourcecode:: python + + >>> m = regex.match(r"(\w)+", "abc") + >>> m.expandf("{1}") + 'c' + >>> m.expandf("{1[0]} {1[1]} {1[2]}") + 'a b c' + >>> m.expandf("{1[-1]} {1[-2]} {1[-3]}") + 'c b a' + >>> + >>> m = regex.match(r"(?P<letter>\w)+", "abc") + >>> m.expandf("{letter}") + 'c' + >>> m.expandf("{letter[0]} {letter[1]} {letter[2]}") + 'a b c' + >>> m.expandf("{letter[-1]} {letter[-2]} {letter[-3]}") + 'c b a' + +Added support for referring to a group by number using ``(?P=...)``. +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This is in addition to the existing ``\g<...>``. + +Fixed the handling of locale-sensitive regexes. +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ``LOCALE`` flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead. + +Added partial matches (`Hg issue 102 <https://bitbucket.org/mrabarnett/mrab-regex/issues/102>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated. + +Partial matches are supported by ``match``, ``search``, ``fullmatch`` and ``finditer`` with the ``partial`` keyword argument. + +Match objects have a ``partial`` attribute, which is ``True`` if it's a partial match. + +For example, if you wanted a user to enter a 4-digit number and check it character by character as it was being entered: + +.. sourcecode:: python + + >>> pattern = regex.compile(r'\d{4}') + + >>> # Initially, nothing has been entered: + >>> print(pattern.fullmatch('', partial=True)) + <regex.Match object; span=(0, 0), match='', partial=True> + + >>> # An empty string is OK, but it's only a partial match. + >>> # The user enters a letter: + >>> print(pattern.fullmatch('a', partial=True)) + None + >>> # It'll never match. + + >>> # The user deletes that and enters a digit: + >>> print(pattern.fullmatch('1', partial=True)) + <regex.Match object; span=(0, 1), match='1', partial=True> + >>> # It matches this far, but it's only a partial match. + + >>> # The user enters 2 more digits: + >>> print(pattern.fullmatch('123', partial=True)) + <regex.Match object; span=(0, 3), match='123', partial=True> + >>> # It matches this far, but it's only a partial match. + + >>> # The user enters another digit: + >>> print(pattern.fullmatch('1234', partial=True)) + <regex.Match object; span=(0, 4), match='1234'> + >>> # It's a complete match. + + >>> # If the user enters another digit: + >>> print(pattern.fullmatch('12345', partial=True)) + None + >>> # It's no longer a match. + + >>> # This is a partial match: + >>> pattern.match('123', partial=True).partial + True + + >>> # This is a complete match: + >>> pattern.match('1233', partial=True).partial + False + +``*`` operator not working correctly with sub() (`Hg issue 106 <https://bitbucket.org/mrabarnett/mrab-regex/issues/106>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters? + +Examples: + +.. sourcecode:: python + + # Python 3.7 and later + >>> regex.sub('.*', 'x', 'test') + 'xx' + >>> regex.sub('.*?', '|', 'test') + '|||||||||' + + # Python 3.6 and earlier + >>> regex.sub('(?V0).*', 'x', 'test') + 'x' + >>> regex.sub('(?V1).*', 'x', 'test') + 'xx' + >>> regex.sub('(?V0).*?', '|', 'test') + '|t|e|s|t|' + >>> regex.sub('(?V1).*?', '|', 'test') + '|||||||||' + +Added ``capturesdict`` (`Hg issue 86 <https://bitbucket.org/mrabarnett/mrab-regex/issues/86>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``capturesdict`` is a combination of ``groupdict`` and ``captures``: + +``groupdict`` returns a dict of the named groups and the last capture of those groups. + +``captures`` returns a list of all the captures of a group + +``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups. + +Examples: + +.. sourcecode:: python + + >>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n") + >>> m.groupdict() + {'word': 'three', 'digits': '3'} + >>> m.captures("word") + ['one', 'two', 'three'] + >>> m.captures("digits") + ['1', '2', '3'] + >>> m.capturesdict() + {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']} + +Allow duplicate names of groups (`Hg issue 87 <https://bitbucket.org/mrabarnett/mrab-regex/issues/87>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Group names can now be duplicated. + +Examples: + +.. sourcecode:: python + + >>> # With optional groups: + >>> + >>> # Both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['first', 'second'] + >>> # Only the second group captures. + >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['second'] + >>> # Only the first group captures. + >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ") + >>> m.group("item") + 'first' + >>> m.captures("item") + ['first'] + >>> + >>> # With mandatory groups: + >>> + >>> # Both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)?", "first or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['first', 'second'] + >>> # Again, both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['', 'second'] + >>> # And yet again, both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ") + >>> m.group("item") + '' + >>> m.captures("item") + ['first', ''] + +Added ``fullmatch`` (`issue #16203 <https://bugs.python.org/issue16203>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``fullmatch`` behaves like ``match``, except that it must match all of the string. + +Examples: + +.. sourcecode:: python + + >>> print(regex.fullmatch(r"abc", "abc").span()) + (0, 3) + >>> print(regex.fullmatch(r"abc", "abcx")) + None + >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span()) + (0, 3) + >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span()) + (1, 4) + >>> + >>> regex.match(r"a.*?", "abcd").group(0) + 'a' + >>> regex.fullmatch(r"a.*?", "abcd").group(0) + 'abcd' + +Added ``subf`` and ``subfn`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string. + +Examples: + +.. sourcecode:: python + + >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar") + 'foo bar => bar foo' + >>> regex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", "{word2} {word1}", "foo bar") + 'bar foo' + +Added ``expandf`` to match object +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string. + +Examples: + +.. sourcecode:: python + + >>> m = regex.match(r"(\w+) (\w+)", "foo bar") + >>> m.expandf("{0} => {2} {1}") + 'foo bar => bar foo' + >>> + >>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar") + >>> m.expandf("{word2} {word1}") + 'bar foo' + +Detach searched string +^^^^^^^^^^^^^^^^^^^^^^ + +A match object contains a reference to the string that was searched, via its ``string`` attribute. The ``detach_string`` method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large. + +Example: + +.. sourcecode:: python + + >>> m = regex.search(r"\w+", "Hello world") + >>> print(m.group()) + Hello + >>> print(m.string) + Hello world + >>> m.detach_string() + >>> print(m.group()) + Hello + >>> print(m.string) + None + +Recursive patterns (`Hg issue 27 <https://bitbucket.org/mrabarnett/mrab-regex/issues/27>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Recursive and repeated patterns are supported. + +``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group. + +``(?&name)`` tries to match the named capture group. + +Examples: + +.. sourcecode:: python + + >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups() + ('Tarzan',) + >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups() + ('Jane',) + + >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak") + >>> m.group(0, 1, 2) + ('kayak', 'k', None) + +The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``. + +It's possible to backtrack into a recursed or repeated group. + +You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``). + +The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported. + +Full Unicode case-folding is supported. +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode. + +Examples (in Python 3): + +.. sourcecode:: python + + >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span() + (0, 6) + >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span() + (0, 7) + +In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module. + +Approximate "fuzzy" matching (`Hg issue 12 <https://bitbucket.org/mrabarnett/mrab-regex/issues/12>`_, `Hg issue 41 <https://bitbucket.org/mrabarnett/mrab-regex/issues/41>`_, `Hg issue 109 <https://bitbucket.org/mrabarnett/mrab-regex/issues/109>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters. + +A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.) + +The 3 types of error are: + +* Insertion, indicated by "i" + +* Deletion, indicated by "d" + +* Substitution, indicated by "s" + +In addition, "e" indicates any type of error. + +The fuzziness of a regex item is specified between "{" and "}" after the item. + +Examples: + +* ``foo`` match "foo" exactly + +* ``(?:foo){i}`` match "foo", permitting insertions + +* ``(?:foo){d}`` match "foo", permitting deletions + +* ``(?:foo){s}`` match "foo", permitting substitutions + +* ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions + +* ``(?:foo){e}`` match "foo", permitting errors + +If a certain type of error is specified, then any type not specified will **not** be permitted. + +In the following examples I'll omit the item and write only the fuzziness: + +* ``{d<=3}`` permit at most 3 deletions, but no other types + +* ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions + +* ``{1<=e<=3}`` permit at least 1 and at most 3 errors + +* ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions + +It's also possible to state the costs of each type of error and the maximum permitted total cost. + +Examples: + +* ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 + +* ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 + +You can also use "<" instead of "<=" if you want an exclusive minimum or maximum. + +You can add a test to perform on a character that's substituted or inserted. + +Examples: + +* ``{s<=2:[a-z]}`` at most 2 substitutions, which must be in the character set ``[a-z]``. + +* ``{s<=2,i<=3:\d}`` at most 2 substitutions, at most 3 insertions, which must be digits. + +By default, fuzzy matching searches for the first match that meets the given constraints. The ``ENHANCEMATCH`` flag will cause it to attempt to improve the fit (i.e. reduce the number of errors) of the match that it has found. + +The ``BESTMATCH`` flag will make it search for the best match instead. + +Further examples to note: + +* ``regex.search("(dog){e}", "cat and dog")[1]`` returns ``"cat"`` because that matches ``"dog"`` with 3 errors (an unlimited number of errors is permitted). + +* ``regex.search("(dog){e<=1}", "cat and dog")[1]`` returns ``" dog"`` (with a leading space) because that matches ``"dog"`` with 1 error, which is within the limit. + +* ``regex.search("(?e)(dog){e<=1}", "cat and dog")[1]`` returns ``"dog"`` (without a leading space) because the fuzzy search matches ``" dog"`` with 1 error, which is within the limit, and the ``(?e)`` then it attempts a better fit. + +In the first two examples there are perfect matches later in the string, but in neither case is it the first possible match. + +The match object has an attribute ``fuzzy_counts`` which gives the total number of substitutions, insertions and deletions. + +.. sourcecode:: python + + >>> # A 'raw' fuzzy match: + >>> regex.fullmatch(r"(?:cats|cat){e<=1}", "cat").fuzzy_counts + (0, 0, 1) + >>> # 0 substitutions, 0 insertions, 1 deletion. + + >>> # A better match might be possible if the ENHANCEMATCH flag used: + >>> regex.fullmatch(r"(?e)(?:cats|cat){e<=1}", "cat").fuzzy_counts + (0, 0, 0) + >>> # 0 substitutions, 0 insertions, 0 deletions. + +The match object also has an attribute ``fuzzy_changes`` which gives a tuple of the positions of the substitutions, insertions and deletions. + +.. sourcecode:: python + + >>> m = regex.search('(fuu){i<=2,d<=2,e<=5}', 'anaconda foo bar') + >>> m + <regex.Match object; span=(7, 10), match='a f', fuzzy_counts=(0, 2, 2)> + >>> m.fuzzy_changes + ([], [7, 8], [10, 11]) + +What this means is that if the matched part of the string had been: + +.. sourcecode:: python + + 'anacondfuuoo bar' + +it would've been an exact match. + +However, there were insertions at positions 7 and 8: + +.. sourcecode:: python + + 'anaconda fuuoo bar' + ^^ + +and deletions at positions 10 and 11: + +.. sourcecode:: python + + 'anaconda f~~oo bar' + ^^ + +So the actual string was: + +.. sourcecode:: python + + 'anaconda foo bar' + +Named lists (`Hg issue 11 <https://bitbucket.org/mrabarnett/mrab-regex/issues/11>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``\L<name>`` + +There are occasions where you may want to include a list (actually, a set) of options in a regex. + +One way is to build the pattern like this: + +.. sourcecode:: python + + >>> p = regex.compile(r"first|second|third|fourth|fifth") + +but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped and properly ordered, for example, "cats" before "cat". + +The new alternative is to use a named list: + +.. sourcecode:: python + + >>> option_set = ["first", "second", "third", "fourth", "fifth"] + >>> p = regex.compile(r"\L<options>", options=option_set) + +The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object : + +.. sourcecode:: python + + >>> print(p.named_lists) + # Python 3 + {'options': frozenset({'fifth', 'first', 'fourth', 'second', 'third'})} + # Python 2 + {'options': frozenset(['fifth', 'fourth', 'second', 'third', 'first'])} + +If there are any unused keyword arguments, ``ValueError`` will be raised unless you tell it otherwise: + +.. sourcecode:: python + + >>> option_set = ["first", "second", "third", "fourth", "fifth"] + >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[]) + Traceback (most recent call last): + File "<stdin>", line 1, in <module> + File "C:\Python37\lib\site-packages\regex\regex.py", line 348, in compile + return _compile(pattern, flags, ignore_unused, kwargs) + File "C:\Python37\lib\site-packages\regex\regex.py", line 585, in _compile + raise ValueError('unused keyword argument {!a}'.format(any_one)) + ValueError: unused keyword argument 'other_options' + >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[], ignore_unused=True) + >>> + +Start and end of word +^^^^^^^^^^^^^^^^^^^^^ + +``\m`` matches at the start of a word. + +``\M`` matches at the end of a word. + +Compare with ``\b``, which matches at the start or end of a word. + +Unicode line separators +^^^^^^^^^^^^^^^^^^^^^^^ + +Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are ``\x0D\x0A``, ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode. + +This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode). + +Set operators +^^^^^^^^^^^^^ + +**Version 1 behaviour only** + +Set operators have been added, and a set ``[...]`` can include nested sets. + +The operators, in order of increasing precedence, are: + +* ``||`` for union ("x||y" means "x or y") + +* ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both") + +* ``&&`` for intersection ("x&&y" means "x and y") + +* ``--`` (double dash) for difference ("x--y" means "x but not y") + +Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``. + +Examples: + +* ``[ab]`` # Set containing 'a' and 'b' + +* ``[a-z]`` # Set containing 'a' .. 'z' + +* ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w' + +* ``[a-z--qw]`` # Same as above + +* ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W' + +* ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9' + +* ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter + +regex.escape (`issue #2650 <https://bugs.python.org/issue2650>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped. + +Examples: + +.. sourcecode:: python + + >>> regex.escape("foo!?", special_only=False) + 'foo\\!\\?' + >>> regex.escape("foo!?", special_only=True) + 'foo!\\?' + +regex.escape (`Hg issue 249 <https://bitbucket.org/mrabarnett/mrab-regex/issues/249>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +regex.escape has an additional keyword parameter ``literal_spaces``. When True, spaces are not escaped. + +Examples: + +.. sourcecode:: python + + >>> regex.escape("foo bar!?", literal_spaces=False) + 'foo\\ bar!\\?' + >>> regex.escape("foo bar!?", literal_spaces=True) + 'foo bar!\\?' + +Repeated captures (`issue #7132 <https://bugs.python.org/issue7132>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are: + +* ``matchobject.captures([group1, ...])`` + + * Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``. + +* ``matchobject.starts([group])`` + + * Returns a list of the start positions. Compare with ``matchobject.start([group])``. + +* ``matchobject.ends([group])`` + + * Returns a list of the end positions. Compare with ``matchobject.end([group])``. + +* ``matchobject.spans([group])`` + + * Returns a list of the spans. Compare with ``matchobject.span([group])``. + +Examples: + +.. sourcecode:: python + + >>> m = regex.search(r"(\w{3})+", "123456789") + >>> m.group(1) + '789' + >>> m.captures(1) + ['123', '456', '789'] + >>> m.start(1) + 6 + >>> m.starts(1) + [0, 3, 6] + >>> m.end(1) + 9 + >>> m.ends(1) + [3, 6, 9] + >>> m.span(1) + (6, 9) + >>> m.spans(1) + [(0, 3), (3, 6), (6, 9)] + +Atomic grouping (`issue #433030 <https://bugs.python.org/issue433030>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``(?>...)`` + +If the following pattern subsequently fails, then the subpattern as a whole will fail. + +Possessive quantifiers. +^^^^^^^^^^^^^^^^^^^^^^^ + +``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+`` + +The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``. + +Scoped flags (`issue #433028 <https://bugs.python.org/issue433028>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``(?flags-flags:...)`` + +The flags will apply only to the subpattern. Flags can be turned on or off. + +Definition of 'word' character (`issue #1693050 <https://bugs.python.org/issue1693050>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. + +Variable-length lookbehind +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A lookbehind can match a variable-length string. + +Flags argument for regex.split, regex.sub and regex.subn (`issue #3482 <https://bugs.python.org/issue3482>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument. + +Pos and endpos arguments for regex.sub and regex.subn +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments. + +'Overlapped' argument for regex.findall and regex.finditer +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches. + +Splititer +^^^^^^^^^ + +``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``. + +Subscripting for groups +^^^^^^^^^^^^^^^^^^^^^^^ + +A match object accepts access to the captured groups via subscripting and slicing: + +.. sourcecode:: python + + >>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu") + >>> print(m["before"]) + pqr + >>> print(len(m)) + 4 + >>> print(m[:]) + ('pqr123stu', 'pqr', '123', 'stu') + +Named groups +^^^^^^^^^^^^ + +Groups can be named with ``(?<name>...)`` as well as the current ``(?P<name>...)``. + +Group references +^^^^^^^^^^^^^^^^ + +Groups can be referenced within a pattern with ``\g<name>``. This also allows there to be more than 99 groups. + +Named characters +^^^^^^^^^^^^^^^^ + +``\N{name}`` + +Named characters are supported. (Note: only those known by Python's Unicode database are supported.) + +Unicode codepoint properties, including scripts and blocks +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}`` + +Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``. + +If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property: + +* ``Latin``, the 'Latin' script (``Script=Latin``). + +* ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). + +* ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). + +A short form starting with ``Is`` indicates a script or binary property: + +* ``IsLatin``, the 'Latin' script (``Script=Latin``). + +* ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). + +A short form starting with ``In`` indicates a block property: + +* ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). + +POSIX character classes +^^^^^^^^^^^^^^^^^^^^^^^ + +``[[:alpha:]]``; ``[[:^alpha:]]`` + +POSIX character classes are supported. These are normally treated as an alternative form of ``\p{...}``. + +The exceptions are ``alnum``, ``digit``, ``punct`` and ``xdigit``, whose definitions are different from those of Unicode. + +``[[:alnum:]]`` is equivalent to ``\p{posix_alnum}``. + +``[[:digit:]]`` is equivalent to ``\p{posix_digit}``. + +``[[:punct:]]`` is equivalent to ``\p{posix_punct}``. + +``[[:xdigit:]]`` is equivalent to ``\p{posix_xdigit}``. + +Search anchor +^^^^^^^^^^^^^ + +``\G`` + +A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes: + +.. sourcecode:: python + + >>> regex.findall(r"\w{2}", "abcd ef") + ['ab', 'cd', 'ef'] + >>> regex.findall(r"\G\w{2}", "abcd ef") + ['ab', 'cd'] + +* The search starts at position 0 and matches 2 letters 'ab'. + +* The search continues at position 2 and matches 2 letters 'cd'. + +* The search continues at position 4 and fails to match any letters. + +* The anchor stops the search start position from being advanced, so there are no more results. + +Reverse searching +^^^^^^^^^^^^^^^^^ + +Searches can now work backwards: + +.. sourcecode:: python + + >>> regex.findall(r".", "abc") + ['a', 'b', 'c'] + >>> regex.findall(r"(?r).", "abc") + ['c', 'b', 'a'] + +Note: the result of a reverse search is not necessarily the reverse of a forward search: + +.. sourcecode:: python + + >>> regex.findall(r"..", "abcde") + ['ab', 'cd'] + >>> regex.findall(r"(?r)..", "abcde") + ['de', 'bc'] + +Matching a single grapheme +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``\X`` + +The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. + +Branch reset +^^^^^^^^^^^^ + +``(?|...|...)`` + +Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers. + +Examples: + +.. sourcecode:: python + + >>> regex.match(r"(?|(first)|(second))", "first").groups() + ('first',) + >>> regex.match(r"(?|(first)|(second))", "second").groups() + ('second',) + +Note that there is only one group. + +Default Unicode word boundary +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``. + +Timeout (Python 3) +^^^^^^^^^^^^^^^^^^ + +The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation: + +.. sourcecode:: python + + >>> from time import sleep + >>> + >>> def fast_replace(m): + ... return 'X' + ... + >>> def slow_replace(m): + ... sleep(0.5) + ... return 'X' + ... + >>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2) + 'XXXXX' + >>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2) + Traceback (most recent call last): + File "<stdin>", line 1, in <module> + File "C:\Python37\lib\site-packages\regex\regex.py", line 276, in sub + endpos, concurrent, timeout) + TimeoutError: regex timed out diff --git a/docs/Features.html b/docs/Features.html index cb4b13a..34d0e4b 100644 --- a/docs/Features.html +++ b/docs/Features.html @@ -3,7 +3,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" /> +<meta name="generator" content="Docutils 0.15.2: http://docutils.sourceforge.net/" /> <title>Features.rst</title> <style type="text/css"> @@ -461,14 +461,14 @@ ul.auto-toc { </div> <div class="section" id="unicode"> <h1>Unicode</h1> -<p>This module supports Unicode 12.1.0.</p> +<p>This module supports Unicode 13.0.0.</p> <p>Full Unicode case-folding is supported.</p> </div> <div class="section" id="additional-features"> <h1>Additional features</h1> <p>The issue numbers relate to the Python bug tracker, except where listed as "Hg issue".</p> -<ul> -<li><p class="first">Added support for lookaround in conditional pattern (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/163">Hg issue 163</a>)</p> +<div class="section" id="added-support-for-lookaround-in-conditional-pattern-hg-issue-163"> +<h2>Added support for lookaround in conditional pattern (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/163">Hg issue 163</a>)</h2> <p>The test of a conditional pattern can now be a lookaround.</p> <p>Examples:</p> <pre class="code python literal-block"> @@ -486,8 +486,9 @@ ul.auto-toc { <span class="name builtin pseudo">None</span> </pre> <p>In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was <strong>not</strong> attempted.</p> -</li> -<li><p class="first">Added POSIX matching (leftmost longest) (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/150">Hg issue 150</a>)</p> +</div> +<div class="section" id="added-posix-matching-leftmost-longest-hg-issue-150"> +<h2>Added POSIX matching (leftmost longest) (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/150">Hg issue 150</a>)</h2> <p>The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the <tt class="docutils literal">POSIX</tt> flag (<tt class="docutils literal"><span class="pre">(?p)</span></tt>).</p> <p>Examples:</p> <pre class="code python literal-block"> @@ -503,21 +504,24 @@ ul.auto-toc { <span class="operator"><</span><span class="name">regex</span><span class="operator">.</span><span class="name">Match</span> <span class="name builtin">object</span><span class="punctuation">;</span> <span class="name">span</span><span class="operator">=</span><span class="punctuation">(</span><span class="literal number integer">0</span><span class="punctuation">,</span> <span class="literal number integer">17</span><span class="punctuation">),</span> <span class="name">match</span><span class="operator">=</span><span class="literal string single">'oneselfsufficient'</span><span class="operator">></span> </pre> <p>Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there.</p> -</li> -<li><p class="first">Added <tt class="docutils literal"><span class="pre">(?(DEFINE)...)</span></tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/152">Hg issue 152</a>)</p> +</div> +<div class="section" id="added-define-hg-issue-152"> +<h2>Added <tt class="docutils literal"><span class="pre">(?(DEFINE)...)</span></tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/152">Hg issue 152</a>)</h2> <p>If there's no group called "DEFINE", then ... will be ignored, but any group definitions within it will be available.</p> <p>Examples:</p> <pre class="code python literal-block"> <span class="operator">>>></span> <span class="name">regex</span><span class="operator">.</span><span class="name">search</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string single">'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)'</span><span class="punctuation">,</span> <span class="literal string single">'5 elephants'</span><span class="punctuation">)</span> <span class="operator"><</span><span class="name">regex</span><span class="operator">.</span><span class="name">Match</span> <span class="name builtin">object</span><span class="punctuation">;</span> <span class="name">span</span><span class="operator">=</span><span class="punctuation">(</span><span class="literal number integer">0</span><span class="punctuation">,</span> <span class="literal number integer">11</span><span class="punctuation">),</span> <span class="name">match</span><span class="operator">=</span><span class="literal string single">'5 elephants'</span><span class="operator">></span> </pre> -</li> -<li><p class="first">Added <tt class="docutils literal">(*PRUNE)</tt>, <tt class="docutils literal">(*SKIP)</tt> and <tt class="docutils literal">(*FAIL)</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/153">Hg issue 153</a>)</p> +</div> +<div class="section" id="added-prune-skip-and-fail-hg-issue-153"> +<h2>Added <tt class="docutils literal">(*PRUNE)</tt>, <tt class="docutils literal">(*SKIP)</tt> and <tt class="docutils literal">(*FAIL)</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/153">Hg issue 153</a>)</h2> <p><tt class="docutils literal">(*PRUNE)</tt> discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.</p> <p><tt class="docutils literal">(*SKIP)</tt> is similar to <tt class="docutils literal">(*PRUNE)</tt>, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern.</p> <p><tt class="docutils literal">(*FAIL)</tt> causes immediate backtracking. <tt class="docutils literal">(*F)</tt> is a permitted abbreviation.</p> -</li> -<li><p class="first">Added <tt class="docutils literal">\K</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/151">Hg issue 151</a>)</p> +</div> +<div class="section" id="added-k-hg-issue-151"> +<h2>Added <tt class="docutils literal">\K</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/151">Hg issue 151</a>)</h2> <p>Keeps the part of the entire match after the position where <tt class="docutils literal">\K</tt> occurred; the part before it is discarded.</p> <p>It does not affect what capture groups return.</p> <p>Examples:</p> @@ -534,8 +538,9 @@ ul.auto-toc { <span class="operator">>>></span> <span class="name">m</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">]</span> <span class="literal string single">'bcdef'</span> </pre> -</li> -<li><p class="first">Added capture subscripting for <tt class="docutils literal">expandf</tt> and <tt class="docutils literal">subf</tt>/<tt class="docutils literal">subfn</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/133">Hg issue 133</a>)</p> +</div> +<div class="section" id="added-capture-subscripting-for-expandf-and-subf-subfn-hg-issue-133"> +<h2>Added capture subscripting for <tt class="docutils literal">expandf</tt> and <tt class="docutils literal">subf</tt>/<tt class="docutils literal">subfn</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/133">Hg issue 133</a>)</h2> <p>You can now use subscripting to get the captures of a repeated capture group.</p> <p>Examples:</p> <pre class="code python literal-block"> @@ -555,14 +560,17 @@ ul.auto-toc { <span class="operator">>>></span> <span class="name">m</span><span class="operator">.</span><span class="name">expandf</span><span class="punctuation">(</span><span class="literal string double">"{letter[-1]} {letter[-2]} {letter[-3]}"</span><span class="punctuation">)</span> <span class="literal string single">'c b a'</span> </pre> -</li> -<li><p class="first">Added support for referring to a group by number using <tt class="docutils literal"><span class="pre">(?P=...)</span></tt>.</p> +</div> +<div class="section" id="added-support-for-referring-to-a-group-by-number-using-p"> +<h2>Added support for referring to a group by number using <tt class="docutils literal"><span class="pre">(?P=...)</span></tt>.</h2> <p>This is in addition to the existing <tt class="docutils literal"><span class="pre">\g<...></span></tt>.</p> -</li> -<li><p class="first">Fixed the handling of locale-sensitive regexes.</p> +</div> +<div class="section" id="fixed-the-handling-of-locale-sensitive-regexes"> +<h2>Fixed the handling of locale-sensitive regexes.</h2> <p>The <tt class="docutils literal">LOCALE</tt> flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead.</p> -</li> -<li><p class="first">Added partial matches (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/102">Hg issue 102</a>)</p> +</div> +<div class="section" id="added-partial-matches-hg-issue-102"> +<h2>Added partial matches (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/102">Hg issue 102</a>)</h2> <p>A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated.</p> <p>Partial matches are supported by <tt class="docutils literal">match</tt>, <tt class="docutils literal">search</tt>, <tt class="docutils literal">fullmatch</tt> and <tt class="docutils literal">finditer</tt> with the <tt class="docutils literal">partial</tt> keyword argument.</p> <p>Match objects have a <tt class="docutils literal">partial</tt> attribute, which is <tt class="docutils literal">True</tt> if it's a partial match.</p> @@ -608,8 +616,9 @@ ul.auto-toc { <span class="operator">>>></span> <span class="name">pattern</span><span class="operator">.</span><span class="name">match</span><span class="punctuation">(</span><span class="literal string single">'1233'</span><span class="punctuation">,</span> <span class="name">partial</span><span class="operator">=</span><span class="name builtin pseudo">True</span><span class="punctuation">)</span><span class="operator">.</span><span class="name">partial</span> <span class="name builtin pseudo">False</span> </pre> -</li> -<li><p class="first"><tt class="docutils literal">*</tt> operator not working correctly with sub() (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/106">Hg issue 106</a>)</p> +</div> +<div class="section" id="operator-not-working-correctly-with-sub-hg-issue-106"> +<h2><tt class="docutils literal">*</tt> operator not working correctly with sub() (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/106">Hg issue 106</a>)</h2> <p>Sometimes it's not clear how zero-width matches should be handled. For example, should <tt class="docutils literal">.*</tt> match 0 characters directly after matching >0 characters?</p> <p>Examples:</p> <pre class="code python literal-block"> @@ -629,8 +638,9 @@ ul.auto-toc { <span class="operator">>>></span> <span class="name">regex</span><span class="operator">.</span><span class="name">sub</span><span class="punctuation">(</span><span class="literal string single">'(?V1).*?'</span><span class="punctuation">,</span> <span class="literal string single">'|'</span><span class="punctuation">,</span> <span class="literal string single">'test'</span><span class="punctuation">)</span> <span class="literal string single">'|||||||||'</span> </pre> -</li> -<li><p class="first">Added <tt class="docutils literal">capturesdict</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/86">Hg issue 86</a>)</p> +</div> +<div class="section" id="added-capturesdict-hg-issue-86"> +<h2>Added <tt class="docutils literal">capturesdict</tt> (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/86">Hg issue 86</a>)</h2> <p><tt class="docutils literal">capturesdict</tt> is a combination of <tt class="docutils literal">groupdict</tt> and <tt class="docutils literal">captures</tt>:</p> <p><tt class="docutils literal">groupdict</tt> returns a dict of the named groups and the last capture of those groups.</p> <p><tt class="docutils literal">captures</tt> returns a list of all the captures of a group</p> @@ -647,8 +657,9 @@ ul.auto-toc { <span class="operator">>>></span> <span class="name">m</span><span class="operator">.</span><span class="name">capturesdict</span><span class="punctuation">()</span> <span class="punctuation">{</span><span class="literal string single">'word'</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="literal string single">'one'</span><span class="punctuation">,</span> <span class="literal string single">'two'</span><span class="punctuation">,</span> <span class="literal string single">'three'</span><span class="punctuation">],</span> <span class="literal string single">'digits'</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="literal string single">'1'</span><span class="punctuation">,</span> <span class="literal string single">'2'</span><span class="punctuation">,</span> <span class="literal string single">'3'</span><span class="punctuation">]}</span> </pre> -</li> -<li><p class="first">Allow duplicate names of groups (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/87">Hg issue 87</a>)</p> +</div> +<div class="section" id="allow-duplicate-names-of-groups-hg-issue-87"> +<h2>Allow duplicate names of groups (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/87">Hg issue 87</a>)</h2> <p>Group names can now be duplicated.</p> <p>Examples:</p> <pre class="code python literal-block"> @@ -694,8 +705,9 @@ ul.auto-toc { <span class="operator">>>></span> <span class="name">m</span><span class="operator">.</span><span class="name">captures</span><span class="punctuation">(</span><span class="literal string double">"item"</span><span class="punctuation">)</span> <span class="punctuation">[</span><span class="literal string single">'first'</span><span class="punctuation">,</span> <span class="literal string single">''</span><span class="punctuation">]</span> </pre> -</li> -<li><p class="first">Added <tt class="docutils literal">fullmatch</tt> (<a class="reference external" href="https://bugs.python.org/issue16203">issue #16203</a>)</p> +</div> +<div class="section" id="added-fullmatch-issue-16203"> +<h2>Added <tt class="docutils literal">fullmatch</tt> (<a class="reference external" href="https://bugs.python.org/issue16203">issue #16203</a>)</h2> <p><tt class="docutils literal">fullmatch</tt> behaves like <tt class="docutils literal">match</tt>, except that it must match all of the string.</p> <p>Examples:</p> <pre class="code python literal-block"> @@ -713,8 +725,9 @@ ul.auto-toc { <span class="operator">>>></span> <span class="name">regex</span><span class="operator">.</span><span class="name">fullmatch</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">"a.*?"</span><span class="punctuation">,</span> <span class="literal string double">"abcd"</span><span class="punctuation">)</span><span class="operator">.</span><span class="name">group</span><span class="punctuation">(</span><span class="literal number integer">0</span><span class="punctuation">)</span> <span class="literal string single">'abcd'</span> </pre> -</li> -<li><p class="first">Added <tt class="docutils literal">subf</tt> and <tt class="docutils literal">subfn</tt></p> +</div> +<div class="section" id="added-subf-and-subfn"> +<h2>Added <tt class="docutils literal">subf</tt> and <tt class="docutils literal">subfn</tt></h2> <p><tt class="docutils literal">subf</tt> and <tt class="docutils literal">subfn</tt> are alternatives to <tt class="docutils literal">sub</tt> and <tt class="docutils literal">subn</tt> respectively. When passed a replacement string, they treat it as a format string.</p> <p>Examples:</p> <pre class="code python literal-block"> @@ -723,8 +736,9 @@ ul.auto-toc { <span class="operator">>>></span> <span class="name">regex</span><span class="operator">.</span><span class="name">subf</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">"(?P<word1>\w+) (?P<word2>\w+)"</span><span class="punctuation">,</span> <span class="literal string double">"{word2} {word1}"</span><span class="punctuation">,</span> <span class="literal string double">"foo bar"</span><span class="punctuation">)</span> <span class="literal string single">'bar foo'</span> </pre> -</li> -<li><p class="first">Added <tt class="docutils literal">expandf</tt> to match object</p> +</div> +<div class="section" id="added-expandf-to-match-object"> +<h2>Added <tt class="docutils literal">expandf</tt> to match object</h2> <p><tt class="docutils literal">expandf</tt> is an alternative to <tt class="docutils literal">expand</tt>. When passed a replacement string, it treats it as a format string.</p> <p>Examples:</p> <pre class="code python literal-block"> @@ -736,8 +750,9 @@ ul.auto-toc { <span class="operator">>>></span> <span class="name">m</span><span class="operator">.</span><span class="name">expandf</span><span class="punctuation">(</span><span class="literal string double">"{word2} {word1}"</span><span class="punctuation">)</span> <span class="literal string single">'bar foo'</span> </pre> -</li> -<li><p class="first">Detach searched string</p> +</div> +<div class="section" id="detach-searched-string"> +<h2>Detach searched string</h2> <p>A match object contains a reference to the string that was searched, via its <tt class="docutils literal">string</tt> attribute. The <tt class="docutils literal">detach_string</tt> method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large.</p> <p>Example:</p> <pre class="code python literal-block"> @@ -752,8 +767,9 @@ ul.auto-toc { <span class="operator">>>></span> <span class="keyword">print</span><span class="punctuation">(</span><span class="name">m</span><span class="operator">.</span><span class="name">string</span><span class="punctuation">)</span> <span class="name builtin pseudo">None</span> </pre> -</li> -<li><p class="first">Recursive patterns (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/27">Hg issue 27</a>)</p> +</div> +<div class="section" id="recursive-patterns-hg-issue-27"> +<h2>Recursive patterns (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/27">Hg issue 27</a>)</h2> <p>Recursive and repeated patterns are supported.</p> <p><tt class="docutils literal"><span class="pre">(?R)</span></tt> or <tt class="docutils literal"><span class="pre">(?0)</span></tt> tries to match the entire regex recursively. <tt class="docutils literal"><span class="pre">(?1)</span></tt>, <tt class="docutils literal"><span class="pre">(?2)</span></tt>, etc, try to match the relevant capture group.</p> <p><tt class="docutils literal"><span class="pre">(?&name)</span></tt> tries to match the named capture group.</p> @@ -772,8 +788,9 @@ ul.auto-toc { <p>It's possible to backtrack into a recursed or repeated group.</p> <p>You can't call a group if there is more than one group with that group name or group number (<tt class="docutils literal">"ambiguous group reference"</tt>).</p> <p>The alternative forms <tt class="docutils literal"><span class="pre">(?P>name)</span></tt> and <tt class="docutils literal"><span class="pre">(?P&name)</span></tt> are also supported.</p> -</li> -<li><p class="first">Full Unicode case-folding is supported.</p> +</div> +<div class="section" id="full-unicode-case-folding-is-supported"> +<h2>Full Unicode case-folding is supported.</h2> <p>In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode.</p> <p>Examples (in Python 3):</p> <pre class="code python literal-block"> @@ -783,8 +800,9 @@ ul.auto-toc { <span class="punctuation">(</span><span class="literal number integer">0</span><span class="punctuation">,</span> <span class="literal number integer">7</span><span class="punctuation">)</span> </pre> <p>In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module.</p> -</li> -<li><p class="first">Approximate "fuzzy" matching (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/12">Hg issue 12</a>, <a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/41">Hg issue 41</a>, <a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/109">Hg issue 109</a>)</p> +</div> +<div class="section" id="approximate-fuzzy-matching-hg-issue-12-hg-issue-41-hg-issue-109"> +<h2>Approximate "fuzzy" matching (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/12">Hg issue 12</a>, <a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/41">Hg issue 41</a>, <a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/109">Hg issue 109</a>)</h2> <p>Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters.</p> <p>A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.)</p> <p>The 3 types of error are:</p> @@ -873,8 +891,9 @@ ul.auto-toc { <pre class="code python literal-block"> <span class="literal string single">'anaconda foo bar'</span> </pre> -</li> -<li><p class="first">Named lists (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/11">Hg issue 11</a>)</p> +</div> +<div class="section" id="named-lists-hg-issue-11"> +<h2>Named lists (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/11">Hg issue 11</a>)</h2> <p><tt class="docutils literal">\L<name></tt></p> <p>There are occasions where you may want to include a list (actually, a set) of options in a regex.</p> <p>One way is to build the pattern like this:</p> @@ -895,17 +914,34 @@ ul.auto-toc { <span class="comment single"># Python 2</span> <span class="punctuation">{</span><span class="literal string single">'options'</span><span class="punctuation">:</span> <span class="name builtin">frozenset</span><span class="punctuation">([</span><span class="literal string single">'fifth'</span><span class="punctuation">,</span> <span class="literal string single">'fourth'</span><span class="punctuation">,</span> <span class="literal string single">'second'</span><span class="punctuation">,</span> <span class="literal string single">'third'</span><span class="punctuation">,</span> <span class="literal string single">'first'</span><span class="punctuation">])}</span> </pre> -</li> -<li><p class="first">Start and end of word</p> +<p>If there are any unused keyword arguments, <tt class="docutils literal">ValueError</tt> will be raised unless you tell it otherwise:</p> +<pre class="code python literal-block"> +<span class="operator">>>></span> <span class="name">option_set</span> <span class="operator">=</span> <span class="punctuation">[</span><span class="literal string double">"first"</span><span class="punctuation">,</span> <span class="literal string double">"second"</span><span class="punctuation">,</span> <span class="literal string double">"third"</span><span class="punctuation">,</span> <span class="literal string double">"fourth"</span><span class="punctuation">,</span> <span class="literal string double">"fifth"</span><span class="punctuation">]</span> +<span class="operator">>>></span> <span class="name">p</span> <span class="operator">=</span> <span class="name">regex</span><span class="operator">.</span><span class="name">compile</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">"\L<options>"</span><span class="punctuation">,</span> <span class="name">options</span><span class="operator">=</span><span class="name">option_set</span><span class="punctuation">,</span> <span class="name">other_options</span><span class="operator">=</span><span class="punctuation">[])</span> +<span class="name">Traceback</span> <span class="punctuation">(</span><span class="name">most</span> <span class="name">recent</span> <span class="name">call</span> <span class="name">last</span><span class="punctuation">):</span> + <span class="name">File</span> <span class="literal string double">"<stdin>"</span><span class="punctuation">,</span> <span class="name">line</span> <span class="literal number integer">1</span><span class="punctuation">,</span> <span class="operator word">in</span> <span class="operator"><</span><span class="name">module</span><span class="operator">></span> + <span class="name">File</span> <span class="literal string double">"C:\Python37\lib\site-packages</span><span class="literal string escape">\r</span><span class="literal string double">egex</span><span class="literal string escape">\r</span><span class="literal string double">egex.py"</span><span class="punctuation">,</span> <span class="name">line</span> <span class="literal number integer">348</span><span class="punctuation">,</span> <span class="operator word">in</span> <span class="name builtin">compile</span> + <span class="keyword">return</span> <span class="name">_compile</span><span class="punctuation">(</span><span class="name">pattern</span><span class="punctuation">,</span> <span class="name">flags</span><span class="punctuation">,</span> <span class="name">ignore_unused</span><span class="punctuation">,</span> <span class="name">kwargs</span><span class="punctuation">)</span> + <span class="name">File</span> <span class="literal string double">"C:\Python37\lib\site-packages</span><span class="literal string escape">\r</span><span class="literal string double">egex</span><span class="literal string escape">\r</span><span class="literal string double">egex.py"</span><span class="punctuation">,</span> <span class="name">line</span> <span class="literal number integer">585</span><span class="punctuation">,</span> <span class="operator word">in</span> <span class="name">_compile</span> + <span class="keyword">raise</span> <span class="name exception">ValueError</span><span class="punctuation">(</span><span class="literal string single">'unused keyword argument {!a}'</span><span class="operator">.</span><span class="name">format</span><span class="punctuation">(</span><span class="name">any_one</span><span class="punctuation">))</span> +<span class="name exception">ValueError</span><span class="punctuation">:</span> <span class="name">unused</span> <span class="name">keyword</span> <span class="name">argument</span> <span class="literal string single">'other_options'</span> +<span class="operator">>>></span> <span class="name">p</span> <span class="operator">=</span> <span class="name">regex</span><span class="operator">.</span><span class="name">compile</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">"\L<options>"</span><span class="punctuation">,</span> <span class="name">options</span><span class="operator">=</span><span class="name">option_set</span><span class="punctuation">,</span> <span class="name">other_options</span><span class="operator">=</span><span class="punctuation">[],</span> <span class="name">ignore_unused</span><span class="operator">=</span><span class="name builtin pseudo">True</span><span class="punctuation">)</span> +<span class="operator">>>></span> +</pre> +</div> +<div class="section" id="start-and-end-of-word"> +<h2>Start and end of word</h2> <p><tt class="docutils literal">\m</tt> matches at the start of a word.</p> <p><tt class="docutils literal">\M</tt> matches at the end of a word.</p> <p>Compare with <tt class="docutils literal">\b</tt>, which matches at the start or end of a word.</p> -</li> -<li><p class="first">Unicode line separators</p> +</div> +<div class="section" id="unicode-line-separators"> +<h2>Unicode line separators</h2> <p>Normally the only line separator is <tt class="docutils literal">\n</tt> (<tt class="docutils literal">\x0A</tt>), but if the <tt class="docutils literal">WORD</tt> flag is turned on then the line separators are <tt class="docutils literal">\x0D\x0A</tt>, <tt class="docutils literal">\x0A</tt>, <tt class="docutils literal">\x0B</tt>, <tt class="docutils literal">\x0C</tt> and <tt class="docutils literal">\x0D</tt>, plus <tt class="docutils literal">\x85</tt>, <tt class="docutils literal">\u2028</tt> and <tt class="docutils literal">\u2029</tt> when working with Unicode.</p> <p>This affects the regex dot <tt class="docutils literal">"."</tt>, which, with the <tt class="docutils literal">DOTALL</tt> flag turned off, matches any character except a line separator. It also affects the line anchors <tt class="docutils literal">^</tt> and <tt class="docutils literal">$</tt> (in multiline mode).</p> -</li> -<li><p class="first">Set operators</p> +</div> +<div class="section" id="set-operators"> +<h2>Set operators</h2> <p><strong>Version 1 behaviour only</strong></p> <p>Set operators have been added, and a set <tt class="docutils literal"><span class="pre">[...]</span></tt> can include nested sets.</p> <p>The operators, in order of increasing precedence, are:</p> @@ -926,8 +962,9 @@ ul.auto-toc { <li><tt class="docutils literal"><span class="pre">[\p{N}--[0-9]]</span></tt> # Set containing all numbers except '0' .. '9'</li> <li><tt class="docutils literal"><span class="pre">[\p{ASCII}&&\p{Letter}]</span></tt> # Set containing all characters which are ASCII and letter</li> </ul> -</li> -<li><p class="first">regex.escape (<a class="reference external" href="https://bugs.python.org/issue2650">issue #2650</a>)</p> +</div> +<div class="section" id="regex-escape-issue-2650"> +<h2>regex.escape (<a class="reference external" href="https://bugs.python.org/issue2650">issue #2650</a>)</h2> <p>regex.escape has an additional keyword parameter <tt class="docutils literal">special_only</tt>. When True, only 'special' regex characters, such as '?', are escaped.</p> <p>Examples:</p> <pre class="code python literal-block"> @@ -936,8 +973,9 @@ ul.auto-toc { <span class="operator">>>></span> <span class="name">regex</span><span class="operator">.</span><span class="name">escape</span><span class="punctuation">(</span><span class="literal string double">"foo!?"</span><span class="punctuation">,</span> <span class="name">special_only</span><span class="operator">=</span><span class="name builtin pseudo">True</span><span class="punctuation">)</span> <span class="literal string single">'foo!</span><span class="literal string escape">\\</span><span class="literal string single">?'</span> </pre> -</li> -<li><p class="first">regex.escape (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/249">Hg issue 249</a>)</p> +</div> +<div class="section" id="regex-escape-hg-issue-249"> +<h2>regex.escape (<a class="reference external" href="https://bitbucket.org/mrabarnett/mrab-regex/issues/249">Hg issue 249</a>)</h2> <p>regex.escape has an additional keyword parameter <tt class="docutils literal">literal_spaces</tt>. When True, spaces are not escaped.</p> <p>Examples:</p> <pre class="code python literal-block"> @@ -946,8 +984,9 @@ ul.auto-toc { <span class="operator">>>></span> <span class="name">regex</span><span class="operator">.</span><span class="name">escape</span><span class="punctuation">(</span><span class="literal string double">"foo bar!?"</span><span class="punctuation">,</span> <span class="name">literal_spaces</span><span class="operator">=</span><span class="name builtin pseudo">True</span><span class="punctuation">)</span> <span class="literal string single">'foo bar!</span><span class="literal string escape">\\</span><span class="literal string single">?'</span> </pre> -</li> -<li><p class="first">Repeated captures (<a class="reference external" href="https://bugs.python.org/issue7132">issue #7132</a>)</p> +</div> +<div class="section" id="repeated-captures-issue-7132"> +<h2>Repeated captures (<a class="reference external" href="https://bugs.python.org/issue7132">issue #7132</a>)</h2> <p>A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are:</p> <ul class="simple"> <li><tt class="docutils literal"><span class="pre">matchobject.captures([group1,</span> <span class="pre">...])</span></tt><ul> @@ -987,38 +1026,48 @@ ul.auto-toc { <span class="operator">>>></span> <span class="name">m</span><span class="operator">.</span><span class="name">spans</span><span class="punctuation">(</span><span class="literal number integer">1</span><span class="punctuation">)</span> <span class="punctuation">[(</span><span class="literal number integer">0</span><span class="punctuation">,</span> <span class="literal number integer">3</span><span class="punctuation">),</span> <span class="punctuation">(</span><span class="literal number integer">3</span><span class="punctuation">,</span> <span class="literal number integer">6</span><span class="punctuation">),</span> <span class="punctuation">(</span><span class="literal number integer">6</span><span class="punctuation">,</span> <span class="literal number integer">9</span><span class="punctuation">)]</span> </pre> -</li> -<li><p class="first">Atomic grouping (<a class="reference external" href="https://bugs.python.org/issue433030">issue #433030</a>)</p> +</div> +<div class="section" id="atomic-grouping-issue-433030"> +<h2>Atomic grouping (<a class="reference external" href="https://bugs.python.org/issue433030">issue #433030</a>)</h2> <p><tt class="docutils literal"><span class="pre">(?>...)</span></tt></p> <p>If the following pattern subsequently fails, then the subpattern as a whole will fail.</p> -</li> -<li><p class="first">Possessive quantifiers.</p> +</div> +<div class="section" id="possessive-quantifiers"> +<h2>Possessive quantifiers.</h2> <p><tt class="docutils literal"><span class="pre">(?:...)?+</span></tt> ; <tt class="docutils literal"><span class="pre">(?:...)*+</span></tt> ; <tt class="docutils literal"><span class="pre">(?:...)++</span></tt> ; <tt class="docutils literal"><span class="pre">(?:...){min,max}+</span></tt></p> <p>The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, <tt class="docutils literal"><span class="pre">(?:...)++</span></tt> is equivalent to <tt class="docutils literal"><span class="pre">(?>(?:...)+)</span></tt>.</p> -</li> -<li><p class="first">Scoped flags (<a class="reference external" href="https://bugs.python.org/issue433028">issue #433028</a>)</p> +</div> +<div class="section" id="scoped-flags-issue-433028"> +<h2>Scoped flags (<a class="reference external" href="https://bugs.python.org/issue433028">issue #433028</a>)</h2> <p><tt class="docutils literal"><span class="pre">(?flags-flags:...)</span></tt></p> <p>The flags will apply only to the subpattern. Flags can be turned on or off.</p> -</li> -<li><p class="first">Definition of 'word' character (<a class="reference external" href="https://bugs.python.org/issue1693050">issue #1693050</a>)</p> +</div> +<div class="section" id="definition-of-word-character-issue-1693050"> +<h2>Definition of 'word' character (<a class="reference external" href="https://bugs.python.org/issue1693050">issue #1693050</a>)</h2> <p>The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at <tt class="docutils literal"><span class="pre">http://www.unicode.org/reports/tr29/</span></tt>.</p> -</li> -<li><p class="first">Variable-length lookbehind</p> +</div> +<div class="section" id="variable-length-lookbehind"> +<h2>Variable-length lookbehind</h2> <p>A lookbehind can match a variable-length string.</p> -</li> -<li><p class="first">Flags argument for regex.split, regex.sub and regex.subn (<a class="reference external" href="https://bugs.python.org/issue3482">issue #3482</a>)</p> +</div> +<div class="section" id="flags-argument-for-regex-split-regex-sub-and-regex-subn-issue-3482"> +<h2>Flags argument for regex.split, regex.sub and regex.subn (<a class="reference external" href="https://bugs.python.org/issue3482">issue #3482</a>)</h2> <p><tt class="docutils literal">regex.split</tt>, <tt class="docutils literal">regex.sub</tt> and <tt class="docutils literal">regex.subn</tt> support a 'flags' argument.</p> -</li> -<li><p class="first">Pos and endpos arguments for regex.sub and regex.subn</p> +</div> +<div class="section" id="pos-and-endpos-arguments-for-regex-sub-and-regex-subn"> +<h2>Pos and endpos arguments for regex.sub and regex.subn</h2> <p><tt class="docutils literal">regex.sub</tt> and <tt class="docutils literal">regex.subn</tt> support 'pos' and 'endpos' arguments.</p> -</li> -<li><p class="first">'Overlapped' argument for regex.findall and regex.finditer</p> +</div> +<div class="section" id="overlapped-argument-for-regex-findall-and-regex-finditer"> +<h2>'Overlapped' argument for regex.findall and regex.finditer</h2> <p><tt class="docutils literal">regex.findall</tt> and <tt class="docutils literal">regex.finditer</tt> support an 'overlapped' flag which permits overlapped matches.</p> -</li> -<li><p class="first">Splititer</p> +</div> +<div class="section" id="splititer"> +<h2>Splititer</h2> <p><tt class="docutils literal">regex.splititer</tt> has been added. It's a generator equivalent of <tt class="docutils literal">regex.split</tt>.</p> -</li> -<li><p class="first">Subscripting for groups</p> +</div> +<div class="section" id="subscripting-for-groups"> +<h2>Subscripting for groups</h2> <p>A match object accepts access to the captured groups via subscripting and slicing:</p> <pre class="code python literal-block"> <span class="operator">>>></span> <span class="name">m</span> <span class="operator">=</span> <span class="name">regex</span><span class="operator">.</span><span class="name">search</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)"</span><span class="punctuation">,</span> <span class="literal string double">"pqr123stu"</span><span class="punctuation">)</span> @@ -1029,18 +1078,22 @@ ul.auto-toc { <span class="operator">>>></span> <span class="keyword">print</span><span class="punctuation">(</span><span class="name">m</span><span class="punctuation">[:])</span> <span class="punctuation">(</span><span class="literal string single">'pqr123stu'</span><span class="punctuation">,</span> <span class="literal string single">'pqr'</span><span class="punctuation">,</span> <span class="literal string single">'123'</span><span class="punctuation">,</span> <span class="literal string single">'stu'</span><span class="punctuation">)</span> </pre> -</li> -<li><p class="first">Named groups</p> +</div> +<div class="section" id="named-groups"> +<h2>Named groups</h2> <p>Groups can be named with <tt class="docutils literal"><span class="pre">(?<name>...)</span></tt> as well as the current <tt class="docutils literal"><span class="pre">(?P<name>...)</span></tt>.</p> -</li> -<li><p class="first">Group references</p> +</div> +<div class="section" id="group-references"> +<h2>Group references</h2> <p>Groups can be referenced within a pattern with <tt class="docutils literal">\g<name></tt>. This also allows there to be more than 99 groups.</p> -</li> -<li><p class="first">Named characters</p> +</div> +<div class="section" id="named-characters"> +<h2>Named characters</h2> <p><tt class="docutils literal">\N{name}</tt></p> <p>Named characters are supported. (Note: only those known by Python's Unicode database are supported.)</p> -</li> -<li><p class="first">Unicode codepoint properties, including scripts and blocks</p> +</div> +<div class="section" id="unicode-codepoint-properties-including-scripts-and-blocks"> +<h2>Unicode codepoint properties, including scripts and blocks</h2> <p><tt class="docutils literal">\p{property=value}</tt>; <tt class="docutils literal">\P{property=value}</tt>; <tt class="docutils literal">\p{value}</tt> ; <tt class="docutils literal">\P{value}</tt></p> <p>Many Unicode properties are supported, including blocks and scripts. <tt class="docutils literal">\p{property=value}</tt> or <tt class="docutils literal">\p{property:value}</tt> matches a character whose property <tt class="docutils literal">property</tt> has value <tt class="docutils literal">value</tt>. The inverse of <tt class="docutils literal">\p{property=value}</tt> is <tt class="docutils literal">\P{property=value}</tt> or <tt class="docutils literal"><span class="pre">\p{^property=value}</span></tt>.</p> <p>If the short form <tt class="docutils literal">\p{value}</tt> is used, the properties are checked in the order: <tt class="docutils literal">General_Category</tt>, <tt class="docutils literal">Script</tt>, <tt class="docutils literal">Block</tt>, binary property:</p> @@ -1058,8 +1111,9 @@ ul.auto-toc { <ul class="simple"> <li><tt class="docutils literal">InBasicLatin</tt>, the 'BasicLatin' block (<tt class="docutils literal">Block=BasicLatin</tt>).</li> </ul> -</li> -<li><p class="first">POSIX character classes</p> +</div> +<div class="section" id="posix-character-classes"> +<h2>POSIX character classes</h2> <p><tt class="docutils literal"><span class="pre">[[:alpha:]]</span></tt>; <tt class="docutils literal"><span class="pre">[[:^alpha:]]</span></tt></p> <p>POSIX character classes are supported. These are normally treated as an alternative form of <tt class="docutils literal"><span class="pre">\p{...}</span></tt>.</p> <p>The exceptions are <tt class="docutils literal">alnum</tt>, <tt class="docutils literal">digit</tt>, <tt class="docutils literal">punct</tt> and <tt class="docutils literal">xdigit</tt>, whose definitions are different from those of Unicode.</p> @@ -1067,8 +1121,9 @@ ul.auto-toc { <p><tt class="docutils literal"><span class="pre">[[:digit:]]</span></tt> is equivalent to <tt class="docutils literal">\p{posix_digit}</tt>.</p> <p><tt class="docutils literal"><span class="pre">[[:punct:]]</span></tt> is equivalent to <tt class="docutils literal">\p{posix_punct}</tt>.</p> <p><tt class="docutils literal"><span class="pre">[[:xdigit:]]</span></tt> is equivalent to <tt class="docutils literal">\p{posix_xdigit}</tt>.</p> -</li> -<li><p class="first">Search anchor</p> +</div> +<div class="section" id="search-anchor"> +<h2>Search anchor</h2> <p><tt class="docutils literal">\G</tt></p> <p>A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes:</p> <pre class="code python literal-block"> @@ -1083,8 +1138,9 @@ ul.auto-toc { <li>The search continues at position 4 and fails to match any letters.</li> <li>The anchor stops the search start position from being advanced, so there are no more results.</li> </ul> -</li> -<li><p class="first">Reverse searching</p> +</div> +<div class="section" id="reverse-searching"> +<h2>Reverse searching</h2> <p>Searches can now work backwards:</p> <pre class="code python literal-block"> <span class="operator">>>></span> <span class="name">regex</span><span class="operator">.</span><span class="name">findall</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">"."</span><span class="punctuation">,</span> <span class="literal string double">"abc"</span><span class="punctuation">)</span> @@ -1099,12 +1155,14 @@ ul.auto-toc { <span class="operator">>>></span> <span class="name">regex</span><span class="operator">.</span><span class="name">findall</span><span class="punctuation">(</span><span class="literal string affix">r</span><span class="literal string double">"(?r).."</span><span class="punctuation">,</span> <span class="literal string double">"abcde"</span><span class="punctuation">)</span> <span class="punctuation">[</span><span class="literal string single">'de'</span><span class="punctuation">,</span> <span class="literal string single">'bc'</span><span class="punctuation">]</span> </pre> -</li> -<li><p class="first">Matching a single grapheme</p> +</div> +<div class="section" id="matching-a-single-grapheme"> +<h2>Matching a single grapheme</h2> <p><tt class="docutils literal">\X</tt></p> <p>The grapheme matcher is supported. It now conforms to the Unicode specification at <tt class="docutils literal"><span class="pre">http://www.unicode.org/reports/tr29/</span></tt>.</p> -</li> -<li><p class="first">Branch reset</p> +</div> +<div class="section" id="branch-reset"> +<h2>Branch reset</h2> <p><tt class="docutils literal"><span class="pre">(?|...|...)</span></tt></p> <p>Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers.</p> <p>Examples:</p> @@ -1115,11 +1173,13 @@ ul.auto-toc { <span class="punctuation">(</span><span class="literal string single">'second'</span><span class="punctuation">,)</span> </pre> <p>Note that there is only one group.</p> -</li> -<li><p class="first">Default Unicode word boundary</p> +</div> +<div class="section" id="default-unicode-word-boundary"> +<h2>Default Unicode word boundary</h2> <p>The <tt class="docutils literal">WORD</tt> flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to <tt class="docutils literal">\b</tt> and <tt class="docutils literal">\B</tt>.</p> -</li> -<li><p class="first">Timeout (Python 3)</p> +</div> +<div class="section" id="timeout-python-3"> +<h2>Timeout (Python 3)</h2> <p>The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation:</p> <pre class="code python literal-block"> <span class="operator">>>></span> <span class="keyword namespace">from</span> <span class="name namespace">time</span> <span class="keyword namespace">import</span> <span class="name">sleep</span> @@ -1140,8 +1200,7 @@ ul.auto-toc { <span class="name">endpos</span><span class="punctuation">,</span> <span class="name">concurrent</span><span class="punctuation">,</span> <span class="name">timeout</span><span class="punctuation">)</span> <span class="name">TimeoutError</span><span class="punctuation">:</span> <span class="name">regex</span> <span class="name">timed</span> <span class="name">out</span> </pre> -</li> -</ul> +</div> </div> </div> </body> diff --git a/docs/Features.rst b/docs/Features.rst index c73f113..622c000 100644 --- a/docs/Features.rst +++ b/docs/Features.rst @@ -129,7 +129,7 @@ The regex module releases the GIL during matching on instances of the built-in ( Unicode ------- -This module supports Unicode 12.1.0. +This module supports Unicode 13.0.0. Full Unicode case-folding is supported. @@ -138,863 +138,926 @@ Additional features The issue numbers relate to the Python bug tracker, except where listed as "Hg issue". -* Added support for lookaround in conditional pattern (`Hg issue 163 <https://bitbucket.org/mrabarnett/mrab-regex/issues/163>`_) +Added support for lookaround in conditional pattern (`Hg issue 163 <https://bitbucket.org/mrabarnett/mrab-regex/issues/163>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - The test of a conditional pattern can now be a lookaround. +The test of a conditional pattern can now be a lookaround. - Examples: +Examples: - .. sourcecode:: python +.. sourcecode:: python - >>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc') - <regex.Match object; span=(0, 3), match='123'> - >>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123') - <regex.Match object; span=(0, 6), match='abc123'> + >>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc') + <regex.Match object; span=(0, 3), match='123'> + >>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123') + <regex.Match object; span=(0, 6), match='abc123'> - This is not quite the same as putting a lookaround in the first branch of a pair of alternatives. +This is not quite the same as putting a lookaround in the first branch of a pair of alternatives. - Examples: +Examples: - .. sourcecode:: python +.. sourcecode:: python - >>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc')) - <regex.Match object; span=(0, 6), match='123abc'> - >>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc')) - None + >>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc')) + <regex.Match object; span=(0, 6), match='123abc'> + >>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc')) + None - In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was **not** attempted. +In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was **not** attempted. -* Added POSIX matching (leftmost longest) (`Hg issue 150 <https://bitbucket.org/mrabarnett/mrab-regex/issues/150>`_) +Added POSIX matching (leftmost longest) (`Hg issue 150 <https://bitbucket.org/mrabarnett/mrab-regex/issues/150>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the ``POSIX`` flag (``(?p)``). +The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the ``POSIX`` flag (``(?p)``). - Examples: +Examples: - .. sourcecode:: python +.. sourcecode:: python - >>> # Normal matching. - >>> regex.search(r'Mr|Mrs', 'Mrs') - <regex.Match object; span=(0, 2), match='Mr'> - >>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient') - <regex.Match object; span=(0, 7), match='oneself'> - >>> # POSIX matching. - >>> regex.search(r'(?p)Mr|Mrs', 'Mrs') - <regex.Match object; span=(0, 3), match='Mrs'> - >>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient') - <regex.Match object; span=(0, 17), match='oneselfsufficient'> + >>> # Normal matching. + >>> regex.search(r'Mr|Mrs', 'Mrs') + <regex.Match object; span=(0, 2), match='Mr'> + >>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient') + <regex.Match object; span=(0, 7), match='oneself'> + >>> # POSIX matching. + >>> regex.search(r'(?p)Mr|Mrs', 'Mrs') + <regex.Match object; span=(0, 3), match='Mrs'> + >>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient') + <regex.Match object; span=(0, 17), match='oneselfsufficient'> - Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there. +Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there. -* Added ``(?(DEFINE)...)`` (`Hg issue 152 <https://bitbucket.org/mrabarnett/mrab-regex/issues/152>`_) +Added ``(?(DEFINE)...)`` (`Hg issue 152 <https://bitbucket.org/mrabarnett/mrab-regex/issues/152>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - If there's no group called "DEFINE", then ... will be ignored, but any group definitions within it will be available. +If there's no group called "DEFINE", then ... will be ignored, but any group definitions within it will be available. - Examples: +Examples: - .. sourcecode:: python +.. sourcecode:: python - >>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants') - <regex.Match object; span=(0, 11), match='5 elephants'> + >>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants') + <regex.Match object; span=(0, 11), match='5 elephants'> -* Added ``(*PRUNE)``, ``(*SKIP)`` and ``(*FAIL)`` (`Hg issue 153 <https://bitbucket.org/mrabarnett/mrab-regex/issues/153>`_) +Added ``(*PRUNE)``, ``(*SKIP)`` and ``(*FAIL)`` (`Hg issue 153 <https://bitbucket.org/mrabarnett/mrab-regex/issues/153>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ``(*PRUNE)`` discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern. +``(*PRUNE)`` discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern. - ``(*SKIP)`` is similar to ``(*PRUNE)``, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern. +``(*SKIP)`` is similar to ``(*PRUNE)``, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern. - ``(*FAIL)`` causes immediate backtracking. ``(*F)`` is a permitted abbreviation. +``(*FAIL)`` causes immediate backtracking. ``(*F)`` is a permitted abbreviation. -* Added ``\K`` (`Hg issue 151 <https://bitbucket.org/mrabarnett/mrab-regex/issues/151>`_) +Added ``\K`` (`Hg issue 151 <https://bitbucket.org/mrabarnett/mrab-regex/issues/151>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Keeps the part of the entire match after the position where ``\K`` occurred; the part before it is discarded. +Keeps the part of the entire match after the position where ``\K`` occurred; the part before it is discarded. - It does not affect what capture groups return. +It does not affect what capture groups return. - Examples: +Examples: - .. sourcecode:: python +.. sourcecode:: python - >>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef') - >>> m[0] - 'cde' - >>> m[1] - 'abcde' - >>> - >>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef') - >>> m[0] - 'bc' - >>> m[1] - 'bcdef' + >>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef') + >>> m[0] + 'cde' + >>> m[1] + 'abcde' + >>> + >>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef') + >>> m[0] + 'bc' + >>> m[1] + 'bcdef' -* Added capture subscripting for ``expandf`` and ``subf``/``subfn`` (`Hg issue 133 <https://bitbucket.org/mrabarnett/mrab-regex/issues/133>`_) +Added capture subscripting for ``expandf`` and ``subf``/``subfn`` (`Hg issue 133 <https://bitbucket.org/mrabarnett/mrab-regex/issues/133>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - You can now use subscripting to get the captures of a repeated capture group. +You can now use subscripting to get the captures of a repeated capture group. - Examples: +Examples: - .. sourcecode:: python +.. sourcecode:: python - >>> m = regex.match(r"(\w)+", "abc") - >>> m.expandf("{1}") - 'c' - >>> m.expandf("{1[0]} {1[1]} {1[2]}") - 'a b c' - >>> m.expandf("{1[-1]} {1[-2]} {1[-3]}") - 'c b a' - >>> - >>> m = regex.match(r"(?P<letter>\w)+", "abc") - >>> m.expandf("{letter}") - 'c' - >>> m.expandf("{letter[0]} {letter[1]} {letter[2]}") - 'a b c' - >>> m.expandf("{letter[-1]} {letter[-2]} {letter[-3]}") - 'c b a' + >>> m = regex.match(r"(\w)+", "abc") + >>> m.expandf("{1}") + 'c' + >>> m.expandf("{1[0]} {1[1]} {1[2]}") + 'a b c' + >>> m.expandf("{1[-1]} {1[-2]} {1[-3]}") + 'c b a' + >>> + >>> m = regex.match(r"(?P<letter>\w)+", "abc") + >>> m.expandf("{letter}") + 'c' + >>> m.expandf("{letter[0]} {letter[1]} {letter[2]}") + 'a b c' + >>> m.expandf("{letter[-1]} {letter[-2]} {letter[-3]}") + 'c b a' -* Added support for referring to a group by number using ``(?P=...)``. +Added support for referring to a group by number using ``(?P=...)``. +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - This is in addition to the existing ``\g<...>``. +This is in addition to the existing ``\g<...>``. -* Fixed the handling of locale-sensitive regexes. +Fixed the handling of locale-sensitive regexes. +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - The ``LOCALE`` flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead. +The ``LOCALE`` flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead. -* Added partial matches (`Hg issue 102 <https://bitbucket.org/mrabarnett/mrab-regex/issues/102>`_) +Added partial matches (`Hg issue 102 <https://bitbucket.org/mrabarnett/mrab-regex/issues/102>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated. +A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated. - Partial matches are supported by ``match``, ``search``, ``fullmatch`` and ``finditer`` with the ``partial`` keyword argument. +Partial matches are supported by ``match``, ``search``, ``fullmatch`` and ``finditer`` with the ``partial`` keyword argument. - Match objects have a ``partial`` attribute, which is ``True`` if it's a partial match. +Match objects have a ``partial`` attribute, which is ``True`` if it's a partial match. - For example, if you wanted a user to enter a 4-digit number and check it character by character as it was being entered: +For example, if you wanted a user to enter a 4-digit number and check it character by character as it was being entered: - .. sourcecode:: python +.. sourcecode:: python - >>> pattern = regex.compile(r'\d{4}') + >>> pattern = regex.compile(r'\d{4}') - >>> # Initially, nothing has been entered: - >>> print(pattern.fullmatch('', partial=True)) - <regex.Match object; span=(0, 0), match='', partial=True> + >>> # Initially, nothing has been entered: + >>> print(pattern.fullmatch('', partial=True)) + <regex.Match object; span=(0, 0), match='', partial=True> - >>> # An empty string is OK, but it's only a partial match. - >>> # The user enters a letter: - >>> print(pattern.fullmatch('a', partial=True)) - None - >>> # It'll never match. + >>> # An empty string is OK, but it's only a partial match. + >>> # The user enters a letter: + >>> print(pattern.fullmatch('a', partial=True)) + None + >>> # It'll never match. - >>> # The user deletes that and enters a digit: - >>> print(pattern.fullmatch('1', partial=True)) - <regex.Match object; span=(0, 1), match='1', partial=True> - >>> # It matches this far, but it's only a partial match. + >>> # The user deletes that and enters a digit: + >>> print(pattern.fullmatch('1', partial=True)) + <regex.Match object; span=(0, 1), match='1', partial=True> + >>> # It matches this far, but it's only a partial match. - >>> # The user enters 2 more digits: - >>> print(pattern.fullmatch('123', partial=True)) - <regex.Match object; span=(0, 3), match='123', partial=True> - >>> # It matches this far, but it's only a partial match. + >>> # The user enters 2 more digits: + >>> print(pattern.fullmatch('123', partial=True)) + <regex.Match object; span=(0, 3), match='123', partial=True> + >>> # It matches this far, but it's only a partial match. - >>> # The user enters another digit: - >>> print(pattern.fullmatch('1234', partial=True)) - <regex.Match object; span=(0, 4), match='1234'> - >>> # It's a complete match. + >>> # The user enters another digit: + >>> print(pattern.fullmatch('1234', partial=True)) + <regex.Match object; span=(0, 4), match='1234'> + >>> # It's a complete match. - >>> # If the user enters another digit: - >>> print(pattern.fullmatch('12345', partial=True)) - None - >>> # It's no longer a match. + >>> # If the user enters another digit: + >>> print(pattern.fullmatch('12345', partial=True)) + None + >>> # It's no longer a match. + + >>> # This is a partial match: + >>> pattern.match('123', partial=True).partial + True + + >>> # This is a complete match: + >>> pattern.match('1233', partial=True).partial + False + +``*`` operator not working correctly with sub() (`Hg issue 106 <https://bitbucket.org/mrabarnett/mrab-regex/issues/106>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters? + +Examples: + +.. sourcecode:: python + + # Python 3.7 and later + >>> regex.sub('.*', 'x', 'test') + 'xx' + >>> regex.sub('.*?', '|', 'test') + '|||||||||' + + # Python 3.6 and earlier + >>> regex.sub('(?V0).*', 'x', 'test') + 'x' + >>> regex.sub('(?V1).*', 'x', 'test') + 'xx' + >>> regex.sub('(?V0).*?', '|', 'test') + '|t|e|s|t|' + >>> regex.sub('(?V1).*?', '|', 'test') + '|||||||||' + +Added ``capturesdict`` (`Hg issue 86 <https://bitbucket.org/mrabarnett/mrab-regex/issues/86>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``capturesdict`` is a combination of ``groupdict`` and ``captures``: + +``groupdict`` returns a dict of the named groups and the last capture of those groups. + +``captures`` returns a list of all the captures of a group + +``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups. + +Examples: + +.. sourcecode:: python + + >>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n") + >>> m.groupdict() + {'word': 'three', 'digits': '3'} + >>> m.captures("word") + ['one', 'two', 'three'] + >>> m.captures("digits") + ['1', '2', '3'] + >>> m.capturesdict() + {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']} + +Allow duplicate names of groups (`Hg issue 87 <https://bitbucket.org/mrabarnett/mrab-regex/issues/87>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Group names can now be duplicated. + +Examples: + +.. sourcecode:: python + + >>> # With optional groups: + >>> + >>> # Both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['first', 'second'] + >>> # Only the second group captures. + >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['second'] + >>> # Only the first group captures. + >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ") + >>> m.group("item") + 'first' + >>> m.captures("item") + ['first'] + >>> + >>> # With mandatory groups: + >>> + >>> # Both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)?", "first or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['first', 'second'] + >>> # Again, both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['', 'second'] + >>> # And yet again, both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ") + >>> m.group("item") + '' + >>> m.captures("item") + ['first', ''] + +Added ``fullmatch`` (`issue #16203 <https://bugs.python.org/issue16203>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``fullmatch`` behaves like ``match``, except that it must match all of the string. + +Examples: + +.. sourcecode:: python + + >>> print(regex.fullmatch(r"abc", "abc").span()) + (0, 3) + >>> print(regex.fullmatch(r"abc", "abcx")) + None + >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span()) + (0, 3) + >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span()) + (1, 4) + >>> + >>> regex.match(r"a.*?", "abcd").group(0) + 'a' + >>> regex.fullmatch(r"a.*?", "abcd").group(0) + 'abcd' - >>> # This is a partial match: - >>> pattern.match('123', partial=True).partial - True - - >>> # This is a complete match: - >>> pattern.match('1233', partial=True).partial - False - -* ``*`` operator not working correctly with sub() (`Hg issue 106 <https://bitbucket.org/mrabarnett/mrab-regex/issues/106>`_) - - Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters? - - Examples: - - .. sourcecode:: python - - # Python 3.7 and later - >>> regex.sub('.*', 'x', 'test') - 'xx' - >>> regex.sub('.*?', '|', 'test') - '|||||||||' - - # Python 3.6 and earlier - >>> regex.sub('(?V0).*', 'x', 'test') - 'x' - >>> regex.sub('(?V1).*', 'x', 'test') - 'xx' - >>> regex.sub('(?V0).*?', '|', 'test') - '|t|e|s|t|' - >>> regex.sub('(?V1).*?', '|', 'test') - '|||||||||' - -* Added ``capturesdict`` (`Hg issue 86 <https://bitbucket.org/mrabarnett/mrab-regex/issues/86>`_) - - ``capturesdict`` is a combination of ``groupdict`` and ``captures``: - - ``groupdict`` returns a dict of the named groups and the last capture of those groups. - - ``captures`` returns a list of all the captures of a group - - ``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups. - - Examples: +Added ``subf`` and ``subfn`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - .. sourcecode:: python +``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string. - >>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n") - >>> m.groupdict() - {'word': 'three', 'digits': '3'} - >>> m.captures("word") - ['one', 'two', 'three'] - >>> m.captures("digits") - ['1', '2', '3'] - >>> m.capturesdict() - {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']} - -* Allow duplicate names of groups (`Hg issue 87 <https://bitbucket.org/mrabarnett/mrab-regex/issues/87>`_) - - Group names can now be duplicated. - - Examples: - - .. sourcecode:: python - - >>> # With optional groups: - >>> - >>> # Both groups capture, the second capture 'overwriting' the first. - >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or second") - >>> m.group("item") - 'second' - >>> m.captures("item") - ['first', 'second'] - >>> # Only the second group captures. - >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second") - >>> m.group("item") - 'second' - >>> m.captures("item") - ['second'] - >>> # Only the first group captures. - >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ") - >>> m.group("item") - 'first' - >>> m.captures("item") - ['first'] - >>> - >>> # With mandatory groups: - >>> - >>> # Both groups capture, the second capture 'overwriting' the first. - >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)?", "first or second") - >>> m.group("item") - 'second' - >>> m.captures("item") - ['first', 'second'] - >>> # Again, both groups capture, the second capture 'overwriting' the first. - >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second") - >>> m.group("item") - 'second' - >>> m.captures("item") - ['', 'second'] - >>> # And yet again, both groups capture, the second capture 'overwriting' the first. - >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ") - >>> m.group("item") - '' - >>> m.captures("item") - ['first', ''] +Examples: -* Added ``fullmatch`` (`issue #16203 <https://bugs.python.org/issue16203>`_) +.. sourcecode:: python + + >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar") + 'foo bar => bar foo' + >>> regex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", "{word2} {word1}", "foo bar") + 'bar foo' + +Added ``expandf`` to match object +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string. + +Examples: + +.. sourcecode:: python + + >>> m = regex.match(r"(\w+) (\w+)", "foo bar") + >>> m.expandf("{0} => {2} {1}") + 'foo bar => bar foo' + >>> + >>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar") + >>> m.expandf("{word2} {word1}") + 'bar foo' + +Detach searched string +^^^^^^^^^^^^^^^^^^^^^^ + +A match object contains a reference to the string that was searched, via its ``string`` attribute. The ``detach_string`` method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large. + +Example: + +.. sourcecode:: python + + >>> m = regex.search(r"\w+", "Hello world") + >>> print(m.group()) + Hello + >>> print(m.string) + Hello world + >>> m.detach_string() + >>> print(m.group()) + Hello + >>> print(m.string) + None - ``fullmatch`` behaves like ``match``, except that it must match all of the string. +Recursive patterns (`Hg issue 27 <https://bitbucket.org/mrabarnett/mrab-regex/issues/27>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Examples: +Recursive and repeated patterns are supported. - .. sourcecode:: python +``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group. - >>> print(regex.fullmatch(r"abc", "abc").span()) - (0, 3) - >>> print(regex.fullmatch(r"abc", "abcx")) - None - >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span()) - (0, 3) - >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span()) - (1, 4) - >>> - >>> regex.match(r"a.*?", "abcd").group(0) - 'a' - >>> regex.fullmatch(r"a.*?", "abcd").group(0) - 'abcd' +``(?&name)`` tries to match the named capture group. -* Added ``subf`` and ``subfn`` +Examples: - ``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string. +.. sourcecode:: python - Examples: + >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups() + ('Tarzan',) + >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups() + ('Jane',) - .. sourcecode:: python + >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak") + >>> m.group(0, 1, 2) + ('kayak', 'k', None) - >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar") - 'foo bar => bar foo' - >>> regex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", "{word2} {word1}", "foo bar") - 'bar foo' +The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``. -* Added ``expandf`` to match object +It's possible to backtrack into a recursed or repeated group. - ``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string. +You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``). - Examples: +The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported. - .. sourcecode:: python - - >>> m = regex.match(r"(\w+) (\w+)", "foo bar") - >>> m.expandf("{0} => {2} {1}") - 'foo bar => bar foo' - >>> - >>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar") - >>> m.expandf("{word2} {word1}") - 'bar foo' - -* Detach searched string - - A match object contains a reference to the string that was searched, via its ``string`` attribute. The ``detach_string`` method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large. - - Example: - - .. sourcecode:: python - - >>> m = regex.search(r"\w+", "Hello world") - >>> print(m.group()) - Hello - >>> print(m.string) - Hello world - >>> m.detach_string() - >>> print(m.group()) - Hello - >>> print(m.string) - None - -* Recursive patterns (`Hg issue 27 <https://bitbucket.org/mrabarnett/mrab-regex/issues/27>`_) - - Recursive and repeated patterns are supported. - - ``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group. - - ``(?&name)`` tries to match the named capture group. - - Examples: - - .. sourcecode:: python - - >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups() - ('Tarzan',) - >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups() - ('Jane',) - - >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak") - >>> m.group(0, 1, 2) - ('kayak', 'k', None) - - The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``. - - It's possible to backtrack into a recursed or repeated group. +Full Unicode case-folding is supported. +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``). +In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode. - The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported. +Examples (in Python 3): -* Full Unicode case-folding is supported. +.. sourcecode:: python - In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode. + >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span() + (0, 6) + >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span() + (0, 7) - Examples (in Python 3): +In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module. - .. sourcecode:: python +Approximate "fuzzy" matching (`Hg issue 12 <https://bitbucket.org/mrabarnett/mrab-regex/issues/12>`_, `Hg issue 41 <https://bitbucket.org/mrabarnett/mrab-regex/issues/41>`_, `Hg issue 109 <https://bitbucket.org/mrabarnett/mrab-regex/issues/109>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span() - (0, 6) - >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span() - (0, 7) +Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters. - In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module. +A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.) -* Approximate "fuzzy" matching (`Hg issue 12 <https://bitbucket.org/mrabarnett/mrab-regex/issues/12>`_, `Hg issue 41 <https://bitbucket.org/mrabarnett/mrab-regex/issues/41>`_, `Hg issue 109 <https://bitbucket.org/mrabarnett/mrab-regex/issues/109>`_) +The 3 types of error are: - Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters. +* Insertion, indicated by "i" - A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.) +* Deletion, indicated by "d" - The 3 types of error are: +* Substitution, indicated by "s" - * Insertion, indicated by "i" +In addition, "e" indicates any type of error. - * Deletion, indicated by "d" +The fuzziness of a regex item is specified between "{" and "}" after the item. - * Substitution, indicated by "s" +Examples: - In addition, "e" indicates any type of error. +* ``foo`` match "foo" exactly - The fuzziness of a regex item is specified between "{" and "}" after the item. +* ``(?:foo){i}`` match "foo", permitting insertions - Examples: +* ``(?:foo){d}`` match "foo", permitting deletions - * ``foo`` match "foo" exactly +* ``(?:foo){s}`` match "foo", permitting substitutions - * ``(?:foo){i}`` match "foo", permitting insertions +* ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions - * ``(?:foo){d}`` match "foo", permitting deletions +* ``(?:foo){e}`` match "foo", permitting errors - * ``(?:foo){s}`` match "foo", permitting substitutions +If a certain type of error is specified, then any type not specified will **not** be permitted. - * ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions +In the following examples I'll omit the item and write only the fuzziness: - * ``(?:foo){e}`` match "foo", permitting errors +* ``{d<=3}`` permit at most 3 deletions, but no other types - If a certain type of error is specified, then any type not specified will **not** be permitted. +* ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions - In the following examples I'll omit the item and write only the fuzziness: +* ``{1<=e<=3}`` permit at least 1 and at most 3 errors - * ``{d<=3}`` permit at most 3 deletions, but no other types +* ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions - * ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions +It's also possible to state the costs of each type of error and the maximum permitted total cost. - * ``{1<=e<=3}`` permit at least 1 and at most 3 errors +Examples: - * ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions +* ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 - It's also possible to state the costs of each type of error and the maximum permitted total cost. +* ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 - Examples: +You can also use "<" instead of "<=" if you want an exclusive minimum or maximum. - * ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 +You can add a test to perform on a character that's substituted or inserted. - * ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 +Examples: - You can also use "<" instead of "<=" if you want an exclusive minimum or maximum. +* ``{s<=2:[a-z]}`` at most 2 substitutions, which must be in the character set ``[a-z]``. - You can add a test to perform on a character that's substituted or inserted. +* ``{s<=2,i<=3:\d}`` at most 2 substitutions, at most 3 insertions, which must be digits. - Examples: +By default, fuzzy matching searches for the first match that meets the given constraints. The ``ENHANCEMATCH`` flag will cause it to attempt to improve the fit (i.e. reduce the number of errors) of the match that it has found. - * ``{s<=2:[a-z]}`` at most 2 substitutions, which must be in the character set ``[a-z]``. +The ``BESTMATCH`` flag will make it search for the best match instead. - * ``{s<=2,i<=3:\d}`` at most 2 substitutions, at most 3 insertions, which must be digits. +Further examples to note: - By default, fuzzy matching searches for the first match that meets the given constraints. The ``ENHANCEMATCH`` flag will cause it to attempt to improve the fit (i.e. reduce the number of errors) of the match that it has found. +* ``regex.search("(dog){e}", "cat and dog")[1]`` returns ``"cat"`` because that matches ``"dog"`` with 3 errors (an unlimited number of errors is permitted). - The ``BESTMATCH`` flag will make it search for the best match instead. +* ``regex.search("(dog){e<=1}", "cat and dog")[1]`` returns ``" dog"`` (with a leading space) because that matches ``"dog"`` with 1 error, which is within the limit. - Further examples to note: +* ``regex.search("(?e)(dog){e<=1}", "cat and dog")[1]`` returns ``"dog"`` (without a leading space) because the fuzzy search matches ``" dog"`` with 1 error, which is within the limit, and the ``(?e)`` then it attempts a better fit. - * ``regex.search("(dog){e}", "cat and dog")[1]`` returns ``"cat"`` because that matches ``"dog"`` with 3 errors (an unlimited number of errors is permitted). +In the first two examples there are perfect matches later in the string, but in neither case is it the first possible match. - * ``regex.search("(dog){e<=1}", "cat and dog")[1]`` returns ``" dog"`` (with a leading space) because that matches ``"dog"`` with 1 error, which is within the limit. +The match object has an attribute ``fuzzy_counts`` which gives the total number of substitutions, insertions and deletions. - * ``regex.search("(?e)(dog){e<=1}", "cat and dog")[1]`` returns ``"dog"`` (without a leading space) because the fuzzy search matches ``" dog"`` with 1 error, which is within the limit, and the ``(?e)`` then it attempts a better fit. +.. sourcecode:: python - In the first two examples there are perfect matches later in the string, but in neither case is it the first possible match. + >>> # A 'raw' fuzzy match: + >>> regex.fullmatch(r"(?:cats|cat){e<=1}", "cat").fuzzy_counts + (0, 0, 1) + >>> # 0 substitutions, 0 insertions, 1 deletion. - The match object has an attribute ``fuzzy_counts`` which gives the total number of substitutions, insertions and deletions. + >>> # A better match might be possible if the ENHANCEMATCH flag used: + >>> regex.fullmatch(r"(?e)(?:cats|cat){e<=1}", "cat").fuzzy_counts + (0, 0, 0) + >>> # 0 substitutions, 0 insertions, 0 deletions. - .. sourcecode:: python +The match object also has an attribute ``fuzzy_changes`` which gives a tuple of the positions of the substitutions, insertions and deletions. - >>> # A 'raw' fuzzy match: - >>> regex.fullmatch(r"(?:cats|cat){e<=1}", "cat").fuzzy_counts - (0, 0, 1) - >>> # 0 substitutions, 0 insertions, 1 deletion. +.. sourcecode:: python - >>> # A better match might be possible if the ENHANCEMATCH flag used: - >>> regex.fullmatch(r"(?e)(?:cats|cat){e<=1}", "cat").fuzzy_counts - (0, 0, 0) - >>> # 0 substitutions, 0 insertions, 0 deletions. + >>> m = regex.search('(fuu){i<=2,d<=2,e<=5}', 'anaconda foo bar') + >>> m + <regex.Match object; span=(7, 10), match='a f', fuzzy_counts=(0, 2, 2)> + >>> m.fuzzy_changes + ([], [7, 8], [10, 11]) - The match object also has an attribute ``fuzzy_changes`` which gives a tuple of the positions of the substitutions, insertions and deletions. +What this means is that if the matched part of the string had been: - .. sourcecode:: python +.. sourcecode:: python - >>> m = regex.search('(fuu){i<=2,d<=2,e<=5}', 'anaconda foo bar') - >>> m - <regex.Match object; span=(7, 10), match='a f', fuzzy_counts=(0, 2, 2)> - >>> m.fuzzy_changes - ([], [7, 8], [10, 11]) + 'anacondfuuoo bar' - What this means is that if the matched part of the string had been: +it would've been an exact match. - .. sourcecode:: python +However, there were insertions at positions 7 and 8: - 'anacondfuuoo bar' +.. sourcecode:: python - it would've been an exact match. + 'anaconda fuuoo bar' + ^^ - However, there were insertions at positions 7 and 8: +and deletions at positions 10 and 11: - .. sourcecode:: python +.. sourcecode:: python - 'anaconda fuuoo bar' - ^^ + 'anaconda f~~oo bar' + ^^ - and deletions at positions 10 and 11: +So the actual string was: - .. sourcecode:: python +.. sourcecode:: python - 'anaconda f~~oo bar' - ^^ + 'anaconda foo bar' - So the actual string was: +Named lists (`Hg issue 11 <https://bitbucket.org/mrabarnett/mrab-regex/issues/11>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - .. sourcecode:: python +``\L<name>`` - 'anaconda foo bar' +There are occasions where you may want to include a list (actually, a set) of options in a regex. -* Named lists (`Hg issue 11 <https://bitbucket.org/mrabarnett/mrab-regex/issues/11>`_) +One way is to build the pattern like this: - ``\L<name>`` +.. sourcecode:: python - There are occasions where you may want to include a list (actually, a set) of options in a regex. + >>> p = regex.compile(r"first|second|third|fourth|fifth") - One way is to build the pattern like this: +but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped and properly ordered, for example, "cats" before "cat". - .. sourcecode:: python +The new alternative is to use a named list: - >>> p = regex.compile(r"first|second|third|fourth|fifth") +.. sourcecode:: python - but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped and properly ordered, for example, "cats" before "cat". + >>> option_set = ["first", "second", "third", "fourth", "fifth"] + >>> p = regex.compile(r"\L<options>", options=option_set) - The new alternative is to use a named list: +The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object : - .. sourcecode:: python +.. sourcecode:: python - >>> option_set = ["first", "second", "third", "fourth", "fifth"] - >>> p = regex.compile(r"\L<options>", options=option_set) + >>> print(p.named_lists) + # Python 3 + {'options': frozenset({'fifth', 'first', 'fourth', 'second', 'third'})} + # Python 2 + {'options': frozenset(['fifth', 'fourth', 'second', 'third', 'first'])} - The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object : +If there are any unused keyword arguments, ``ValueError`` will be raised unless you tell it otherwise: - .. sourcecode:: python +.. sourcecode:: python - >>> print(p.named_lists) - # Python 3 - {'options': frozenset({'fifth', 'first', 'fourth', 'second', 'third'})} - # Python 2 - {'options': frozenset(['fifth', 'fourth', 'second', 'third', 'first'])} + >>> option_set = ["first", "second", "third", "fourth", "fifth"] + >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[]) + Traceback (most recent call last): + File "<stdin>", line 1, in <module> + File "C:\Python37\lib\site-packages\regex\regex.py", line 348, in compile + return _compile(pattern, flags, ignore_unused, kwargs) + File "C:\Python37\lib\site-packages\regex\regex.py", line 585, in _compile + raise ValueError('unused keyword argument {!a}'.format(any_one)) + ValueError: unused keyword argument 'other_options' + >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[], ignore_unused=True) + >>> -* Start and end of word +Start and end of word +^^^^^^^^^^^^^^^^^^^^^ - ``\m`` matches at the start of a word. +``\m`` matches at the start of a word. - ``\M`` matches at the end of a word. +``\M`` matches at the end of a word. - Compare with ``\b``, which matches at the start or end of a word. +Compare with ``\b``, which matches at the start or end of a word. -* Unicode line separators +Unicode line separators +^^^^^^^^^^^^^^^^^^^^^^^ - Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are ``\x0D\x0A``, ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode. +Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are ``\x0D\x0A``, ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode. - This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode). +This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode). -* Set operators +Set operators +^^^^^^^^^^^^^ - **Version 1 behaviour only** +**Version 1 behaviour only** - Set operators have been added, and a set ``[...]`` can include nested sets. +Set operators have been added, and a set ``[...]`` can include nested sets. - The operators, in order of increasing precedence, are: +The operators, in order of increasing precedence, are: - * ``||`` for union ("x||y" means "x or y") +* ``||`` for union ("x||y" means "x or y") - * ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both") +* ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both") - * ``&&`` for intersection ("x&&y" means "x and y") +* ``&&`` for intersection ("x&&y" means "x and y") - * ``--`` (double dash) for difference ("x--y" means "x but not y") +* ``--`` (double dash) for difference ("x--y" means "x but not y") - Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``. +Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``. - Examples: +Examples: - * ``[ab]`` # Set containing 'a' and 'b' +* ``[ab]`` # Set containing 'a' and 'b' - * ``[a-z]`` # Set containing 'a' .. 'z' +* ``[a-z]`` # Set containing 'a' .. 'z' - * ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w' +* ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w' - * ``[a-z--qw]`` # Same as above +* ``[a-z--qw]`` # Same as above - * ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W' +* ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W' - * ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9' +* ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9' - * ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter +* ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter -* regex.escape (`issue #2650 <https://bugs.python.org/issue2650>`_) +regex.escape (`issue #2650 <https://bugs.python.org/issue2650>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped. +regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped. - Examples: +Examples: - .. sourcecode:: python +.. sourcecode:: python - >>> regex.escape("foo!?", special_only=False) - 'foo\\!\\?' - >>> regex.escape("foo!?", special_only=True) - 'foo!\\?' + >>> regex.escape("foo!?", special_only=False) + 'foo\\!\\?' + >>> regex.escape("foo!?", special_only=True) + 'foo!\\?' -* regex.escape (`Hg issue 249 <https://bitbucket.org/mrabarnett/mrab-regex/issues/249>`_) +regex.escape (`Hg issue 249 <https://bitbucket.org/mrabarnett/mrab-regex/issues/249>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - regex.escape has an additional keyword parameter ``literal_spaces``. When True, spaces are not escaped. +regex.escape has an additional keyword parameter ``literal_spaces``. When True, spaces are not escaped. - Examples: +Examples: - .. sourcecode:: python +.. sourcecode:: python - >>> regex.escape("foo bar!?", literal_spaces=False) - 'foo\\ bar!\\?' - >>> regex.escape("foo bar!?", literal_spaces=True) - 'foo bar!\\?' + >>> regex.escape("foo bar!?", literal_spaces=False) + 'foo\\ bar!\\?' + >>> regex.escape("foo bar!?", literal_spaces=True) + 'foo bar!\\?' -* Repeated captures (`issue #7132 <https://bugs.python.org/issue7132>`_) +Repeated captures (`issue #7132 <https://bugs.python.org/issue7132>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are: +A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are: - * ``matchobject.captures([group1, ...])`` +* ``matchobject.captures([group1, ...])`` - * Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``. + * Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``. - * ``matchobject.starts([group])`` +* ``matchobject.starts([group])`` - * Returns a list of the start positions. Compare with ``matchobject.start([group])``. + * Returns a list of the start positions. Compare with ``matchobject.start([group])``. - * ``matchobject.ends([group])`` +* ``matchobject.ends([group])`` - * Returns a list of the end positions. Compare with ``matchobject.end([group])``. + * Returns a list of the end positions. Compare with ``matchobject.end([group])``. - * ``matchobject.spans([group])`` +* ``matchobject.spans([group])`` - * Returns a list of the spans. Compare with ``matchobject.span([group])``. + * Returns a list of the spans. Compare with ``matchobject.span([group])``. - Examples: +Examples: - .. sourcecode:: python +.. sourcecode:: python - >>> m = regex.search(r"(\w{3})+", "123456789") - >>> m.group(1) - '789' - >>> m.captures(1) - ['123', '456', '789'] - >>> m.start(1) - 6 - >>> m.starts(1) - [0, 3, 6] - >>> m.end(1) - 9 - >>> m.ends(1) - [3, 6, 9] - >>> m.span(1) - (6, 9) - >>> m.spans(1) - [(0, 3), (3, 6), (6, 9)] + >>> m = regex.search(r"(\w{3})+", "123456789") + >>> m.group(1) + '789' + >>> m.captures(1) + ['123', '456', '789'] + >>> m.start(1) + 6 + >>> m.starts(1) + [0, 3, 6] + >>> m.end(1) + 9 + >>> m.ends(1) + [3, 6, 9] + >>> m.span(1) + (6, 9) + >>> m.spans(1) + [(0, 3), (3, 6), (6, 9)] -* Atomic grouping (`issue #433030 <https://bugs.python.org/issue433030>`_) +Atomic grouping (`issue #433030 <https://bugs.python.org/issue433030>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ``(?>...)`` +``(?>...)`` - If the following pattern subsequently fails, then the subpattern as a whole will fail. +If the following pattern subsequently fails, then the subpattern as a whole will fail. -* Possessive quantifiers. +Possessive quantifiers. +^^^^^^^^^^^^^^^^^^^^^^^ - ``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+`` +``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+`` - The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``. +The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``. -* Scoped flags (`issue #433028 <https://bugs.python.org/issue433028>`_) +Scoped flags (`issue #433028 <https://bugs.python.org/issue433028>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ``(?flags-flags:...)`` +``(?flags-flags:...)`` - The flags will apply only to the subpattern. Flags can be turned on or off. +The flags will apply only to the subpattern. Flags can be turned on or off. -* Definition of 'word' character (`issue #1693050 <https://bugs.python.org/issue1693050>`_) +Definition of 'word' character (`issue #1693050 <https://bugs.python.org/issue1693050>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. +The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. -* Variable-length lookbehind +Variable-length lookbehind +^^^^^^^^^^^^^^^^^^^^^^^^^^ - A lookbehind can match a variable-length string. +A lookbehind can match a variable-length string. -* Flags argument for regex.split, regex.sub and regex.subn (`issue #3482 <https://bugs.python.org/issue3482>`_) +Flags argument for regex.split, regex.sub and regex.subn (`issue #3482 <https://bugs.python.org/issue3482>`_) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument. +``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument. -* Pos and endpos arguments for regex.sub and regex.subn +Pos and endpos arguments for regex.sub and regex.subn +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments. +``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments. -* 'Overlapped' argument for regex.findall and regex.finditer +'Overlapped' argument for regex.findall and regex.finditer +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches. +``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches. -* Splititer +Splititer +^^^^^^^^^ - ``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``. +``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``. -* Subscripting for groups +Subscripting for groups +^^^^^^^^^^^^^^^^^^^^^^^ - A match object accepts access to the captured groups via subscripting and slicing: +A match object accepts access to the captured groups via subscripting and slicing: - .. sourcecode:: python +.. sourcecode:: python - >>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu") - >>> print(m["before"]) - pqr - >>> print(len(m)) - 4 - >>> print(m[:]) - ('pqr123stu', 'pqr', '123', 'stu') + >>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu") + >>> print(m["before"]) + pqr + >>> print(len(m)) + 4 + >>> print(m[:]) + ('pqr123stu', 'pqr', '123', 'stu') -* Named groups +Named groups +^^^^^^^^^^^^ - Groups can be named with ``(?<name>...)`` as well as the current ``(?P<name>...)``. +Groups can be named with ``(?<name>...)`` as well as the current ``(?P<name>...)``. -* Group references +Group references +^^^^^^^^^^^^^^^^ - Groups can be referenced within a pattern with ``\g<name>``. This also allows there to be more than 99 groups. +Groups can be referenced within a pattern with ``\g<name>``. This also allows there to be more than 99 groups. -* Named characters +Named characters +^^^^^^^^^^^^^^^^ - ``\N{name}`` +``\N{name}`` - Named characters are supported. (Note: only those known by Python's Unicode database are supported.) +Named characters are supported. (Note: only those known by Python's Unicode database are supported.) -* Unicode codepoint properties, including scripts and blocks +Unicode codepoint properties, including scripts and blocks +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}`` +``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}`` - Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``. +Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``. - If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property: +If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property: - * ``Latin``, the 'Latin' script (``Script=Latin``). +* ``Latin``, the 'Latin' script (``Script=Latin``). - * ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). +* ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). - * ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). +* ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). - A short form starting with ``Is`` indicates a script or binary property: +A short form starting with ``Is`` indicates a script or binary property: - * ``IsLatin``, the 'Latin' script (``Script=Latin``). +* ``IsLatin``, the 'Latin' script (``Script=Latin``). - * ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). +* ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). - A short form starting with ``In`` indicates a block property: +A short form starting with ``In`` indicates a block property: - * ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). +* ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). -* POSIX character classes +POSIX character classes +^^^^^^^^^^^^^^^^^^^^^^^ - ``[[:alpha:]]``; ``[[:^alpha:]]`` +``[[:alpha:]]``; ``[[:^alpha:]]`` - POSIX character classes are supported. These are normally treated as an alternative form of ``\p{...}``. +POSIX character classes are supported. These are normally treated as an alternative form of ``\p{...}``. - The exceptions are ``alnum``, ``digit``, ``punct`` and ``xdigit``, whose definitions are different from those of Unicode. +The exceptions are ``alnum``, ``digit``, ``punct`` and ``xdigit``, whose definitions are different from those of Unicode. - ``[[:alnum:]]`` is equivalent to ``\p{posix_alnum}``. +``[[:alnum:]]`` is equivalent to ``\p{posix_alnum}``. - ``[[:digit:]]`` is equivalent to ``\p{posix_digit}``. +``[[:digit:]]`` is equivalent to ``\p{posix_digit}``. - ``[[:punct:]]`` is equivalent to ``\p{posix_punct}``. +``[[:punct:]]`` is equivalent to ``\p{posix_punct}``. - ``[[:xdigit:]]`` is equivalent to ``\p{posix_xdigit}``. +``[[:xdigit:]]`` is equivalent to ``\p{posix_xdigit}``. -* Search anchor +Search anchor +^^^^^^^^^^^^^ - ``\G`` +``\G`` - A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes: +A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes: - .. sourcecode:: python +.. sourcecode:: python - >>> regex.findall(r"\w{2}", "abcd ef") - ['ab', 'cd', 'ef'] - >>> regex.findall(r"\G\w{2}", "abcd ef") - ['ab', 'cd'] + >>> regex.findall(r"\w{2}", "abcd ef") + ['ab', 'cd', 'ef'] + >>> regex.findall(r"\G\w{2}", "abcd ef") + ['ab', 'cd'] - * The search starts at position 0 and matches 2 letters 'ab'. +* The search starts at position 0 and matches 2 letters 'ab'. - * The search continues at position 2 and matches 2 letters 'cd'. +* The search continues at position 2 and matches 2 letters 'cd'. - * The search continues at position 4 and fails to match any letters. +* The search continues at position 4 and fails to match any letters. - * The anchor stops the search start position from being advanced, so there are no more results. +* The anchor stops the search start position from being advanced, so there are no more results. -* Reverse searching +Reverse searching +^^^^^^^^^^^^^^^^^ - Searches can now work backwards: +Searches can now work backwards: - .. sourcecode:: python +.. sourcecode:: python - >>> regex.findall(r".", "abc") - ['a', 'b', 'c'] - >>> regex.findall(r"(?r).", "abc") - ['c', 'b', 'a'] + >>> regex.findall(r".", "abc") + ['a', 'b', 'c'] + >>> regex.findall(r"(?r).", "abc") + ['c', 'b', 'a'] - Note: the result of a reverse search is not necessarily the reverse of a forward search: +Note: the result of a reverse search is not necessarily the reverse of a forward search: - .. sourcecode:: python +.. sourcecode:: python - >>> regex.findall(r"..", "abcde") - ['ab', 'cd'] - >>> regex.findall(r"(?r)..", "abcde") - ['de', 'bc'] + >>> regex.findall(r"..", "abcde") + ['ab', 'cd'] + >>> regex.findall(r"(?r)..", "abcde") + ['de', 'bc'] -* Matching a single grapheme +Matching a single grapheme +^^^^^^^^^^^^^^^^^^^^^^^^^^ - ``\X`` +``\X`` - The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. +The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. -* Branch reset +Branch reset +^^^^^^^^^^^^ - ``(?|...|...)`` +``(?|...|...)`` - Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers. +Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers. - Examples: +Examples: - .. sourcecode:: python +.. sourcecode:: python - >>> regex.match(r"(?|(first)|(second))", "first").groups() - ('first',) - >>> regex.match(r"(?|(first)|(second))", "second").groups() - ('second',) + >>> regex.match(r"(?|(first)|(second))", "first").groups() + ('first',) + >>> regex.match(r"(?|(first)|(second))", "second").groups() + ('second',) - Note that there is only one group. +Note that there is only one group. -* Default Unicode word boundary +Default Unicode word boundary +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``. +The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``. -* Timeout (Python 3) +Timeout (Python 3) +^^^^^^^^^^^^^^^^^^ - The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation: +The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation: - .. sourcecode:: python +.. sourcecode:: python - >>> from time import sleep - >>> - >>> def fast_replace(m): - ... return 'X' - ... - >>> def slow_replace(m): - ... sleep(0.5) - ... return 'X' - ... - >>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2) - 'XXXXX' - >>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2) - Traceback (most recent call last): - File "<stdin>", line 1, in <module> - File "C:\Python37\lib\site-packages\regex\regex.py", line 276, in sub - endpos, concurrent, timeout) - TimeoutError: regex timed out + >>> from time import sleep + >>> + >>> def fast_replace(m): + ... return 'X' + ... + >>> def slow_replace(m): + ... sleep(0.5) + ... return 'X' + ... + >>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2) + 'XXXXX' + >>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2) + Traceback (most recent call last): + File "<stdin>", line 1, in <module> + File "C:\Python37\lib\site-packages\regex\regex.py", line 276, in sub + endpos, concurrent, timeout) + TimeoutError: regex timed out diff --git a/docs/UnicodeProperties.txt b/docs/UnicodeProperties.rst similarity index 100% rename from docs/UnicodeProperties.txt rename to docs/UnicodeProperties.rst diff --git a/regex.egg-info/PKG-INFO b/regex.egg-info/PKG-INFO new file mode 100644 index 0000000..584e08b --- /dev/null +++ b/regex.egg-info/PKG-INFO @@ -0,0 +1,1086 @@ +Metadata-Version: 1.1 +Name: regex +Version: 2020.7.14 +Summary: Alternative regular expression module, to replace re. +Home-page: https://bitbucket.org/mrabarnett/mrab-regex +Author: Matthew Barnett +Author-email: regex@mrabarnett.plus.com +License: Python Software Foundation License +Description: Introduction + ------------ + + This regex implementation is backwards-compatible with the standard 're' module, but offers additional functionality. + + Note + ---- + + The re module's behaviour with zero-width matches changed in Python 3.7, and this module will follow that behaviour when compiled for Python 3.7. + + Old vs new behaviour + -------------------- + + In order to be compatible with the re module, this module has 2 behaviours: + + * **Version 0** behaviour (old behaviour, compatible with the re module): + + Please note that the re module's behaviour may change over time, and I'll endeavour to match that behaviour in version 0. + + * Indicated by the ``VERSION0`` or ``V0`` flag, or ``(?V0)`` in the pattern. + + * Zero-width matches are not handled correctly in the re module before Python 3.7. The behaviour in those earlier versions is: + + * ``.split`` won't split a string at a zero-width match. + + * ``.sub`` will advance by one character after a zero-width match. + + * Inline flags apply to the entire pattern, and they can't be turned off. + + * Only simple sets are supported. + + * Case-insensitive matches in Unicode use simple case-folding by default. + + * **Version 1** behaviour (new behaviour, possibly different from the re module): + + * Indicated by the ``VERSION1`` or ``V1`` flag, or ``(?V1)`` in the pattern. + + * Zero-width matches are handled correctly. + + * Inline flags apply to the end of the group or pattern, and they can be turned off. + + * Nested sets and set operations are supported. + + * Case-insensitive matches in Unicode use full case-folding by default. + + If no version is specified, the regex module will default to ``regex.DEFAULT_VERSION``. + + Case-insensitive matches in Unicode + ----------------------------------- + + The regex module supports both simple and full case-folding for case-insensitive matches in Unicode. Use of full case-folding can be turned on using the ``FULLCASE`` or ``F`` flag, or ``(?f)`` in the pattern. Please note that this flag affects how the ``IGNORECASE`` flag works; the ``FULLCASE`` flag itself does not turn on case-insensitive matching. + + In the version 0 behaviour, the flag is off by default. + + In the version 1 behaviour, the flag is on by default. + + Nested sets and set operations + ------------------------------ + + It's not possible to support both simple sets, as used in the re module, and nested sets at the same time because of a difference in the meaning of an unescaped ``"["`` in a set. + + For example, the pattern ``[[a-z]--[aeiou]]`` is treated in the version 0 behaviour (simple sets, compatible with the re module) as: + + * Set containing "[" and the letters "a" to "z" + + * Literal "--" + + * Set containing letters "a", "e", "i", "o", "u" + + * Literal "]" + + but in the version 1 behaviour (nested sets, enhanced behaviour) as: + + * Set which is: + + * Set containing the letters "a" to "z" + + * but excluding: + + * Set containing the letters "a", "e", "i", "o", "u" + + Version 0 behaviour: only simple sets are supported. + + Version 1 behaviour: nested sets and set operations are supported. + + Flags + ----- + + There are 2 kinds of flag: scoped and global. Scoped flags can apply to only part of a pattern and can be turned on or off; global flags apply to the entire pattern and can only be turned on. + + The scoped flags are: ``FULLCASE``, ``IGNORECASE``, ``MULTILINE``, ``DOTALL``, ``VERBOSE``, ``WORD``. + + The global flags are: ``ASCII``, ``BESTMATCH``, ``ENHANCEMATCH``, ``LOCALE``, ``POSIX``, ``REVERSE``, ``UNICODE``, ``VERSION0``, ``VERSION1``. + + If neither the ``ASCII``, ``LOCALE`` nor ``UNICODE`` flag is specified, it will default to ``UNICODE`` if the regex pattern is a Unicode string and ``ASCII`` if it's a bytestring. + + The ``ENHANCEMATCH`` flag makes fuzzy matching attempt to improve the fit of the next match that it finds. + + The ``BESTMATCH`` flag makes fuzzy matching search for the best match instead of the next match. + + Notes on named capture groups + ----------------------------- + + All capture groups have a group number, starting from 1. + + Groups with the same group name will have the same group number, and groups with a different group name will have a different group number. + + The same name can be used by more than one group, with later captures 'overwriting' earlier captures. All of the captures of the group will be available from the ``captures`` method of the match object. + + Group numbers will be reused across different branches of a branch reset, eg. ``(?|(first)|(second))`` has only group 1. If capture groups have different group names then they will, of course, have different group numbers, eg. ``(?|(?P<foo>first)|(?P<bar>second))`` has group 1 ("foo") and group 2 ("bar"). + + In the regex ``(\s+)(?|(?P<foo>[A-Z]+)|(\w+) (?P<foo>[0-9]+)`` there are 2 groups: + + * ``(\s+)`` is group 1. + + * ``(?P<foo>[A-Z]+)`` is group 2, also called "foo". + + * ``(\w+)`` is group 2 because of the branch reset. + + * ``(?P<foo>[0-9]+)`` is group 2 because it's called "foo". + + If you want to prevent ``(\w+)`` from being group 2, you need to name it (different name, different group number). + + Multithreading + -------------- + + The regex module releases the GIL during matching on instances of the built-in (immutable) string classes, enabling other Python threads to run concurrently. It is also possible to force the regex module to release the GIL during matching by calling the matching methods with the keyword argument ``concurrent=True``. The behaviour is undefined if the string changes during matching, so use it *only* when it is guaranteed that that won't happen. + + Unicode + ------- + + This module supports Unicode 13.0.0. + + Full Unicode case-folding is supported. + + Additional features + ------------------- + + The issue numbers relate to the Python bug tracker, except where listed as "Hg issue". + + Added support for lookaround in conditional pattern (`Hg issue 163 <https://bitbucket.org/mrabarnett/mrab-regex/issues/163>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + The test of a conditional pattern can now be a lookaround. + + Examples: + + .. sourcecode:: python + + >>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc') + <regex.Match object; span=(0, 3), match='123'> + >>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123') + <regex.Match object; span=(0, 6), match='abc123'> + + This is not quite the same as putting a lookaround in the first branch of a pair of alternatives. + + Examples: + + .. sourcecode:: python + + >>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc')) + <regex.Match object; span=(0, 6), match='123abc'> + >>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc')) + None + + In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was **not** attempted. + + Added POSIX matching (leftmost longest) (`Hg issue 150 <https://bitbucket.org/mrabarnett/mrab-regex/issues/150>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the ``POSIX`` flag (``(?p)``). + + Examples: + + .. sourcecode:: python + + >>> # Normal matching. + >>> regex.search(r'Mr|Mrs', 'Mrs') + <regex.Match object; span=(0, 2), match='Mr'> + >>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient') + <regex.Match object; span=(0, 7), match='oneself'> + >>> # POSIX matching. + >>> regex.search(r'(?p)Mr|Mrs', 'Mrs') + <regex.Match object; span=(0, 3), match='Mrs'> + >>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient') + <regex.Match object; span=(0, 17), match='oneselfsufficient'> + + Note that it will take longer to find matches because when it finds a match at a certain position, it won't return that immediately, but will keep looking to see if there's another longer match there. + + Added ``(?(DEFINE)...)`` (`Hg issue 152 <https://bitbucket.org/mrabarnett/mrab-regex/issues/152>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + If there's no group called "DEFINE", then ... will be ignored, but any group definitions within it will be available. + + Examples: + + .. sourcecode:: python + + >>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants') + <regex.Match object; span=(0, 11), match='5 elephants'> + + Added ``(*PRUNE)``, ``(*SKIP)`` and ``(*FAIL)`` (`Hg issue 153 <https://bitbucket.org/mrabarnett/mrab-regex/issues/153>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``(*PRUNE)`` discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won't affect the enclosing pattern. + + ``(*SKIP)`` is similar to ``(*PRUNE)``, except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won't affect the enclosing pattern. + + ``(*FAIL)`` causes immediate backtracking. ``(*F)`` is a permitted abbreviation. + + Added ``\K`` (`Hg issue 151 <https://bitbucket.org/mrabarnett/mrab-regex/issues/151>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Keeps the part of the entire match after the position where ``\K`` occurred; the part before it is discarded. + + It does not affect what capture groups return. + + Examples: + + .. sourcecode:: python + + >>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef') + >>> m[0] + 'cde' + >>> m[1] + 'abcde' + >>> + >>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef') + >>> m[0] + 'bc' + >>> m[1] + 'bcdef' + + Added capture subscripting for ``expandf`` and ``subf``/``subfn`` (`Hg issue 133 <https://bitbucket.org/mrabarnett/mrab-regex/issues/133>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + You can now use subscripting to get the captures of a repeated capture group. + + Examples: + + .. sourcecode:: python + + >>> m = regex.match(r"(\w)+", "abc") + >>> m.expandf("{1}") + 'c' + >>> m.expandf("{1[0]} {1[1]} {1[2]}") + 'a b c' + >>> m.expandf("{1[-1]} {1[-2]} {1[-3]}") + 'c b a' + >>> + >>> m = regex.match(r"(?P<letter>\w)+", "abc") + >>> m.expandf("{letter}") + 'c' + >>> m.expandf("{letter[0]} {letter[1]} {letter[2]}") + 'a b c' + >>> m.expandf("{letter[-1]} {letter[-2]} {letter[-3]}") + 'c b a' + + Added support for referring to a group by number using ``(?P=...)``. + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + This is in addition to the existing ``\g<...>``. + + Fixed the handling of locale-sensitive regexes. + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + The ``LOCALE`` flag is intended for legacy code and has limited support. You're still recommended to use Unicode instead. + + Added partial matches (`Hg issue 102 <https://bitbucket.org/mrabarnett/mrab-regex/issues/102>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated. + + Partial matches are supported by ``match``, ``search``, ``fullmatch`` and ``finditer`` with the ``partial`` keyword argument. + + Match objects have a ``partial`` attribute, which is ``True`` if it's a partial match. + + For example, if you wanted a user to enter a 4-digit number and check it character by character as it was being entered: + + .. sourcecode:: python + + >>> pattern = regex.compile(r'\d{4}') + + >>> # Initially, nothing has been entered: + >>> print(pattern.fullmatch('', partial=True)) + <regex.Match object; span=(0, 0), match='', partial=True> + + >>> # An empty string is OK, but it's only a partial match. + >>> # The user enters a letter: + >>> print(pattern.fullmatch('a', partial=True)) + None + >>> # It'll never match. + + >>> # The user deletes that and enters a digit: + >>> print(pattern.fullmatch('1', partial=True)) + <regex.Match object; span=(0, 1), match='1', partial=True> + >>> # It matches this far, but it's only a partial match. + + >>> # The user enters 2 more digits: + >>> print(pattern.fullmatch('123', partial=True)) + <regex.Match object; span=(0, 3), match='123', partial=True> + >>> # It matches this far, but it's only a partial match. + + >>> # The user enters another digit: + >>> print(pattern.fullmatch('1234', partial=True)) + <regex.Match object; span=(0, 4), match='1234'> + >>> # It's a complete match. + + >>> # If the user enters another digit: + >>> print(pattern.fullmatch('12345', partial=True)) + None + >>> # It's no longer a match. + + >>> # This is a partial match: + >>> pattern.match('123', partial=True).partial + True + + >>> # This is a complete match: + >>> pattern.match('1233', partial=True).partial + False + + ``*`` operator not working correctly with sub() (`Hg issue 106 <https://bitbucket.org/mrabarnett/mrab-regex/issues/106>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Sometimes it's not clear how zero-width matches should be handled. For example, should ``.*`` match 0 characters directly after matching >0 characters? + + Examples: + + .. sourcecode:: python + + # Python 3.7 and later + >>> regex.sub('.*', 'x', 'test') + 'xx' + >>> regex.sub('.*?', '|', 'test') + '|||||||||' + + # Python 3.6 and earlier + >>> regex.sub('(?V0).*', 'x', 'test') + 'x' + >>> regex.sub('(?V1).*', 'x', 'test') + 'xx' + >>> regex.sub('(?V0).*?', '|', 'test') + '|t|e|s|t|' + >>> regex.sub('(?V1).*?', '|', 'test') + '|||||||||' + + Added ``capturesdict`` (`Hg issue 86 <https://bitbucket.org/mrabarnett/mrab-regex/issues/86>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``capturesdict`` is a combination of ``groupdict`` and ``captures``: + + ``groupdict`` returns a dict of the named groups and the last capture of those groups. + + ``captures`` returns a list of all the captures of a group + + ``capturesdict`` returns a dict of the named groups and lists of all the captures of those groups. + + Examples: + + .. sourcecode:: python + + >>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n") + >>> m.groupdict() + {'word': 'three', 'digits': '3'} + >>> m.captures("word") + ['one', 'two', 'three'] + >>> m.captures("digits") + ['1', '2', '3'] + >>> m.capturesdict() + {'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']} + + Allow duplicate names of groups (`Hg issue 87 <https://bitbucket.org/mrabarnett/mrab-regex/issues/87>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Group names can now be duplicated. + + Examples: + + .. sourcecode:: python + + >>> # With optional groups: + >>> + >>> # Both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['first', 'second'] + >>> # Only the second group captures. + >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['second'] + >>> # Only the first group captures. + >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ") + >>> m.group("item") + 'first' + >>> m.captures("item") + ['first'] + >>> + >>> # With mandatory groups: + >>> + >>> # Both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)?", "first or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['first', 'second'] + >>> # Again, both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second") + >>> m.group("item") + 'second' + >>> m.captures("item") + ['', 'second'] + >>> # And yet again, both groups capture, the second capture 'overwriting' the first. + >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ") + >>> m.group("item") + '' + >>> m.captures("item") + ['first', ''] + + Added ``fullmatch`` (`issue #16203 <https://bugs.python.org/issue16203>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``fullmatch`` behaves like ``match``, except that it must match all of the string. + + Examples: + + .. sourcecode:: python + + >>> print(regex.fullmatch(r"abc", "abc").span()) + (0, 3) + >>> print(regex.fullmatch(r"abc", "abcx")) + None + >>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span()) + (0, 3) + >>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span()) + (1, 4) + >>> + >>> regex.match(r"a.*?", "abcd").group(0) + 'a' + >>> regex.fullmatch(r"a.*?", "abcd").group(0) + 'abcd' + + Added ``subf`` and ``subfn`` + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``subf`` and ``subfn`` are alternatives to ``sub`` and ``subn`` respectively. When passed a replacement string, they treat it as a format string. + + Examples: + + .. sourcecode:: python + + >>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar") + 'foo bar => bar foo' + >>> regex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", "{word2} {word1}", "foo bar") + 'bar foo' + + Added ``expandf`` to match object + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``expandf`` is an alternative to ``expand``. When passed a replacement string, it treats it as a format string. + + Examples: + + .. sourcecode:: python + + >>> m = regex.match(r"(\w+) (\w+)", "foo bar") + >>> m.expandf("{0} => {2} {1}") + 'foo bar => bar foo' + >>> + >>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar") + >>> m.expandf("{word2} {word1}") + 'bar foo' + + Detach searched string + ^^^^^^^^^^^^^^^^^^^^^^ + + A match object contains a reference to the string that was searched, via its ``string`` attribute. The ``detach_string`` method will 'detach' that string, making it available for garbage collection, which might save valuable memory if that string is very large. + + Example: + + .. sourcecode:: python + + >>> m = regex.search(r"\w+", "Hello world") + >>> print(m.group()) + Hello + >>> print(m.string) + Hello world + >>> m.detach_string() + >>> print(m.group()) + Hello + >>> print(m.string) + None + + Recursive patterns (`Hg issue 27 <https://bitbucket.org/mrabarnett/mrab-regex/issues/27>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Recursive and repeated patterns are supported. + + ``(?R)`` or ``(?0)`` tries to match the entire regex recursively. ``(?1)``, ``(?2)``, etc, try to match the relevant capture group. + + ``(?&name)`` tries to match the named capture group. + + Examples: + + .. sourcecode:: python + + >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups() + ('Tarzan',) + >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups() + ('Jane',) + + >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak") + >>> m.group(0, 1, 2) + ('kayak', 'k', None) + + The first two examples show how the subpattern within the capture group is reused, but is _not_ itself a capture group. In other words, ``"(Tarzan|Jane) loves (?1)"`` is equivalent to ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``. + + It's possible to backtrack into a recursed or repeated group. + + You can't call a group if there is more than one group with that group name or group number (``"ambiguous group reference"``). + + The alternative forms ``(?P>name)`` and ``(?P&name)`` are also supported. + + Full Unicode case-folding is supported. + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode. + + Examples (in Python 3): + + .. sourcecode:: python + + >>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span() + (0, 6) + >>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span() + (0, 7) + + In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module. + + Approximate "fuzzy" matching (`Hg issue 12 <https://bitbucket.org/mrabarnett/mrab-regex/issues/12>`_, `Hg issue 41 <https://bitbucket.org/mrabarnett/mrab-regex/issues/41>`_, `Hg issue 109 <https://bitbucket.org/mrabarnett/mrab-regex/issues/109>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Regex usually attempts an exact match, but sometimes an approximate, or "fuzzy", match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters. + + A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.) + + The 3 types of error are: + + * Insertion, indicated by "i" + + * Deletion, indicated by "d" + + * Substitution, indicated by "s" + + In addition, "e" indicates any type of error. + + The fuzziness of a regex item is specified between "{" and "}" after the item. + + Examples: + + * ``foo`` match "foo" exactly + + * ``(?:foo){i}`` match "foo", permitting insertions + + * ``(?:foo){d}`` match "foo", permitting deletions + + * ``(?:foo){s}`` match "foo", permitting substitutions + + * ``(?:foo){i,s}`` match "foo", permitting insertions and substitutions + + * ``(?:foo){e}`` match "foo", permitting errors + + If a certain type of error is specified, then any type not specified will **not** be permitted. + + In the following examples I'll omit the item and write only the fuzziness: + + * ``{d<=3}`` permit at most 3 deletions, but no other types + + * ``{i<=1,s<=2}`` permit at most 1 insertion and at most 2 substitutions, but no deletions + + * ``{1<=e<=3}`` permit at least 1 and at most 3 errors + + * ``{i<=2,d<=2,e<=3}`` permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions + + It's also possible to state the costs of each type of error and the maximum permitted total cost. + + Examples: + + * ``{2i+2d+1s<=4}`` each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 + + * ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4 + + You can also use "<" instead of "<=" if you want an exclusive minimum or maximum. + + You can add a test to perform on a character that's substituted or inserted. + + Examples: + + * ``{s<=2:[a-z]}`` at most 2 substitutions, which must be in the character set ``[a-z]``. + + * ``{s<=2,i<=3:\d}`` at most 2 substitutions, at most 3 insertions, which must be digits. + + By default, fuzzy matching searches for the first match that meets the given constraints. The ``ENHANCEMATCH`` flag will cause it to attempt to improve the fit (i.e. reduce the number of errors) of the match that it has found. + + The ``BESTMATCH`` flag will make it search for the best match instead. + + Further examples to note: + + * ``regex.search("(dog){e}", "cat and dog")[1]`` returns ``"cat"`` because that matches ``"dog"`` with 3 errors (an unlimited number of errors is permitted). + + * ``regex.search("(dog){e<=1}", "cat and dog")[1]`` returns ``" dog"`` (with a leading space) because that matches ``"dog"`` with 1 error, which is within the limit. + + * ``regex.search("(?e)(dog){e<=1}", "cat and dog")[1]`` returns ``"dog"`` (without a leading space) because the fuzzy search matches ``" dog"`` with 1 error, which is within the limit, and the ``(?e)`` then it attempts a better fit. + + In the first two examples there are perfect matches later in the string, but in neither case is it the first possible match. + + The match object has an attribute ``fuzzy_counts`` which gives the total number of substitutions, insertions and deletions. + + .. sourcecode:: python + + >>> # A 'raw' fuzzy match: + >>> regex.fullmatch(r"(?:cats|cat){e<=1}", "cat").fuzzy_counts + (0, 0, 1) + >>> # 0 substitutions, 0 insertions, 1 deletion. + + >>> # A better match might be possible if the ENHANCEMATCH flag used: + >>> regex.fullmatch(r"(?e)(?:cats|cat){e<=1}", "cat").fuzzy_counts + (0, 0, 0) + >>> # 0 substitutions, 0 insertions, 0 deletions. + + The match object also has an attribute ``fuzzy_changes`` which gives a tuple of the positions of the substitutions, insertions and deletions. + + .. sourcecode:: python + + >>> m = regex.search('(fuu){i<=2,d<=2,e<=5}', 'anaconda foo bar') + >>> m + <regex.Match object; span=(7, 10), match='a f', fuzzy_counts=(0, 2, 2)> + >>> m.fuzzy_changes + ([], [7, 8], [10, 11]) + + What this means is that if the matched part of the string had been: + + .. sourcecode:: python + + 'anacondfuuoo bar' + + it would've been an exact match. + + However, there were insertions at positions 7 and 8: + + .. sourcecode:: python + + 'anaconda fuuoo bar' + ^^ + + and deletions at positions 10 and 11: + + .. sourcecode:: python + + 'anaconda f~~oo bar' + ^^ + + So the actual string was: + + .. sourcecode:: python + + 'anaconda foo bar' + + Named lists (`Hg issue 11 <https://bitbucket.org/mrabarnett/mrab-regex/issues/11>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``\L<name>`` + + There are occasions where you may want to include a list (actually, a set) of options in a regex. + + One way is to build the pattern like this: + + .. sourcecode:: python + + >>> p = regex.compile(r"first|second|third|fourth|fifth") + + but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped and properly ordered, for example, "cats" before "cat". + + The new alternative is to use a named list: + + .. sourcecode:: python + + >>> option_set = ["first", "second", "third", "fourth", "fifth"] + >>> p = regex.compile(r"\L<options>", options=option_set) + + The order of the items is irrelevant, they are treated as a set. The named lists are available as the ``.named_lists`` attribute of the pattern object : + + .. sourcecode:: python + + >>> print(p.named_lists) + # Python 3 + {'options': frozenset({'fifth', 'first', 'fourth', 'second', 'third'})} + # Python 2 + {'options': frozenset(['fifth', 'fourth', 'second', 'third', 'first'])} + + If there are any unused keyword arguments, ``ValueError`` will be raised unless you tell it otherwise: + + .. sourcecode:: python + + >>> option_set = ["first", "second", "third", "fourth", "fifth"] + >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[]) + Traceback (most recent call last): + File "<stdin>", line 1, in <module> + File "C:\Python37\lib\site-packages\regex\regex.py", line 348, in compile + return _compile(pattern, flags, ignore_unused, kwargs) + File "C:\Python37\lib\site-packages\regex\regex.py", line 585, in _compile + raise ValueError('unused keyword argument {!a}'.format(any_one)) + ValueError: unused keyword argument 'other_options' + >>> p = regex.compile(r"\L<options>", options=option_set, other_options=[], ignore_unused=True) + >>> + + Start and end of word + ^^^^^^^^^^^^^^^^^^^^^ + + ``\m`` matches at the start of a word. + + ``\M`` matches at the end of a word. + + Compare with ``\b``, which matches at the start or end of a word. + + Unicode line separators + ^^^^^^^^^^^^^^^^^^^^^^^ + + Normally the only line separator is ``\n`` (``\x0A``), but if the ``WORD`` flag is turned on then the line separators are ``\x0D\x0A``, ``\x0A``, ``\x0B``, ``\x0C`` and ``\x0D``, plus ``\x85``, ``\u2028`` and ``\u2029`` when working with Unicode. + + This affects the regex dot ``"."``, which, with the ``DOTALL`` flag turned off, matches any character except a line separator. It also affects the line anchors ``^`` and ``$`` (in multiline mode). + + Set operators + ^^^^^^^^^^^^^ + + **Version 1 behaviour only** + + Set operators have been added, and a set ``[...]`` can include nested sets. + + The operators, in order of increasing precedence, are: + + * ``||`` for union ("x||y" means "x or y") + + * ``~~`` (double tilde) for symmetric difference ("x~~y" means "x or y, but not both") + + * ``&&`` for intersection ("x&&y" means "x and y") + + * ``--`` (double dash) for difference ("x--y" means "x but not y") + + Implicit union, ie, simple juxtaposition like in ``[ab]``, has the highest precedence. Thus, ``[ab&&cd]`` is the same as ``[[a||b]&&[c||d]]``. + + Examples: + + * ``[ab]`` # Set containing 'a' and 'b' + + * ``[a-z]`` # Set containing 'a' .. 'z' + + * ``[[a-z]--[qw]]`` # Set containing 'a' .. 'z', but not 'q' or 'w' + + * ``[a-z--qw]`` # Same as above + + * ``[\p{L}--QW]`` # Set containing all letters except 'Q' and 'W' + + * ``[\p{N}--[0-9]]`` # Set containing all numbers except '0' .. '9' + + * ``[\p{ASCII}&&\p{Letter}]`` # Set containing all characters which are ASCII and letter + + regex.escape (`issue #2650 <https://bugs.python.org/issue2650>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + regex.escape has an additional keyword parameter ``special_only``. When True, only 'special' regex characters, such as '?', are escaped. + + Examples: + + .. sourcecode:: python + + >>> regex.escape("foo!?", special_only=False) + 'foo\\!\\?' + >>> regex.escape("foo!?", special_only=True) + 'foo!\\?' + + regex.escape (`Hg issue 249 <https://bitbucket.org/mrabarnett/mrab-regex/issues/249>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + regex.escape has an additional keyword parameter ``literal_spaces``. When True, spaces are not escaped. + + Examples: + + .. sourcecode:: python + + >>> regex.escape("foo bar!?", literal_spaces=False) + 'foo\\ bar!\\?' + >>> regex.escape("foo bar!?", literal_spaces=True) + 'foo bar!\\?' + + Repeated captures (`issue #7132 <https://bugs.python.org/issue7132>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + A match object has additional methods which return information on all the successful matches of a repeated capture group. These methods are: + + * ``matchobject.captures([group1, ...])`` + + * Returns a list of the strings matched in a group or groups. Compare with ``matchobject.group([group1, ...])``. + + * ``matchobject.starts([group])`` + + * Returns a list of the start positions. Compare with ``matchobject.start([group])``. + + * ``matchobject.ends([group])`` + + * Returns a list of the end positions. Compare with ``matchobject.end([group])``. + + * ``matchobject.spans([group])`` + + * Returns a list of the spans. Compare with ``matchobject.span([group])``. + + Examples: + + .. sourcecode:: python + + >>> m = regex.search(r"(\w{3})+", "123456789") + >>> m.group(1) + '789' + >>> m.captures(1) + ['123', '456', '789'] + >>> m.start(1) + 6 + >>> m.starts(1) + [0, 3, 6] + >>> m.end(1) + 9 + >>> m.ends(1) + [3, 6, 9] + >>> m.span(1) + (6, 9) + >>> m.spans(1) + [(0, 3), (3, 6), (6, 9)] + + Atomic grouping (`issue #433030 <https://bugs.python.org/issue433030>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``(?>...)`` + + If the following pattern subsequently fails, then the subpattern as a whole will fail. + + Possessive quantifiers. + ^^^^^^^^^^^^^^^^^^^^^^^ + + ``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+`` + + The subpattern is matched up to 'max' times. If the following pattern subsequently fails, then all of the repeated subpatterns will fail as a whole. For example, ``(?:...)++`` is equivalent to ``(?>(?:...)+)``. + + Scoped flags (`issue #433028 <https://bugs.python.org/issue433028>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``(?flags-flags:...)`` + + The flags will apply only to the subpattern. Flags can be turned on or off. + + Definition of 'word' character (`issue #1693050 <https://bugs.python.org/issue1693050>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + The definition of a 'word' character has been expanded for Unicode. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. + + Variable-length lookbehind + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + + A lookbehind can match a variable-length string. + + Flags argument for regex.split, regex.sub and regex.subn (`issue #3482 <https://bugs.python.org/issue3482>`_) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``regex.split``, ``regex.sub`` and ``regex.subn`` support a 'flags' argument. + + Pos and endpos arguments for regex.sub and regex.subn + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``regex.sub`` and ``regex.subn`` support 'pos' and 'endpos' arguments. + + 'Overlapped' argument for regex.findall and regex.finditer + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``regex.findall`` and ``regex.finditer`` support an 'overlapped' flag which permits overlapped matches. + + Splititer + ^^^^^^^^^ + + ``regex.splititer`` has been added. It's a generator equivalent of ``regex.split``. + + Subscripting for groups + ^^^^^^^^^^^^^^^^^^^^^^^ + + A match object accepts access to the captured groups via subscripting and slicing: + + .. sourcecode:: python + + >>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu") + >>> print(m["before"]) + pqr + >>> print(len(m)) + 4 + >>> print(m[:]) + ('pqr123stu', 'pqr', '123', 'stu') + + Named groups + ^^^^^^^^^^^^ + + Groups can be named with ``(?<name>...)`` as well as the current ``(?P<name>...)``. + + Group references + ^^^^^^^^^^^^^^^^ + + Groups can be referenced within a pattern with ``\g<name>``. This also allows there to be more than 99 groups. + + Named characters + ^^^^^^^^^^^^^^^^ + + ``\N{name}`` + + Named characters are supported. (Note: only those known by Python's Unicode database are supported.) + + Unicode codepoint properties, including scripts and blocks + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``\p{property=value}``; ``\P{property=value}``; ``\p{value}`` ; ``\P{value}`` + + Many Unicode properties are supported, including blocks and scripts. ``\p{property=value}`` or ``\p{property:value}`` matches a character whose property ``property`` has value ``value``. The inverse of ``\p{property=value}`` is ``\P{property=value}`` or ``\p{^property=value}``. + + If the short form ``\p{value}`` is used, the properties are checked in the order: ``General_Category``, ``Script``, ``Block``, binary property: + + * ``Latin``, the 'Latin' script (``Script=Latin``). + + * ``BasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). + + * ``Alphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). + + A short form starting with ``Is`` indicates a script or binary property: + + * ``IsLatin``, the 'Latin' script (``Script=Latin``). + + * ``IsAlphabetic``, the 'Alphabetic' binary property (``Alphabetic=Yes``). + + A short form starting with ``In`` indicates a block property: + + * ``InBasicLatin``, the 'BasicLatin' block (``Block=BasicLatin``). + + POSIX character classes + ^^^^^^^^^^^^^^^^^^^^^^^ + + ``[[:alpha:]]``; ``[[:^alpha:]]`` + + POSIX character classes are supported. These are normally treated as an alternative form of ``\p{...}``. + + The exceptions are ``alnum``, ``digit``, ``punct`` and ``xdigit``, whose definitions are different from those of Unicode. + + ``[[:alnum:]]`` is equivalent to ``\p{posix_alnum}``. + + ``[[:digit:]]`` is equivalent to ``\p{posix_digit}``. + + ``[[:punct:]]`` is equivalent to ``\p{posix_punct}``. + + ``[[:xdigit:]]`` is equivalent to ``\p{posix_xdigit}``. + + Search anchor + ^^^^^^^^^^^^^ + + ``\G`` + + A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes: + + .. sourcecode:: python + + >>> regex.findall(r"\w{2}", "abcd ef") + ['ab', 'cd', 'ef'] + >>> regex.findall(r"\G\w{2}", "abcd ef") + ['ab', 'cd'] + + * The search starts at position 0 and matches 2 letters 'ab'. + + * The search continues at position 2 and matches 2 letters 'cd'. + + * The search continues at position 4 and fails to match any letters. + + * The anchor stops the search start position from being advanced, so there are no more results. + + Reverse searching + ^^^^^^^^^^^^^^^^^ + + Searches can now work backwards: + + .. sourcecode:: python + + >>> regex.findall(r".", "abc") + ['a', 'b', 'c'] + >>> regex.findall(r"(?r).", "abc") + ['c', 'b', 'a'] + + Note: the result of a reverse search is not necessarily the reverse of a forward search: + + .. sourcecode:: python + + >>> regex.findall(r"..", "abcde") + ['ab', 'cd'] + >>> regex.findall(r"(?r)..", "abcde") + ['de', 'bc'] + + Matching a single grapheme + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``\X`` + + The grapheme matcher is supported. It now conforms to the Unicode specification at ``http://www.unicode.org/reports/tr29/``. + + Branch reset + ^^^^^^^^^^^^ + + ``(?|...|...)`` + + Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers. + + Examples: + + .. sourcecode:: python + + >>> regex.match(r"(?|(first)|(second))", "first").groups() + ('first',) + >>> regex.match(r"(?|(first)|(second))", "second").groups() + ('second',) + + Note that there is only one group. + + Default Unicode word boundary + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + The ``WORD`` flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to ``\b`` and ``\B``. + + Timeout (Python 3) + ^^^^^^^^^^^^^^^^^^ + + The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation: + + .. sourcecode:: python + + >>> from time import sleep + >>> + >>> def fast_replace(m): + ... return 'X' + ... + >>> def slow_replace(m): + ... sleep(0.5) + ... return 'X' + ... + >>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2) + 'XXXXX' + >>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2) + Traceback (most recent call last): + File "<stdin>", line 1, in <module> + File "C:\Python37\lib\site-packages\regex\regex.py", line 276, in sub + endpos, concurrent, timeout) + TimeoutError: regex timed out + +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Python Software Foundation License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Topic :: Scientific/Engineering :: Information Analysis +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing +Classifier: Topic :: Text Processing :: General diff --git a/regex.egg-info/SOURCES.txt b/regex.egg-info/SOURCES.txt new file mode 100644 index 0000000..820e244 --- /dev/null +++ b/regex.egg-info/SOURCES.txt @@ -0,0 +1,27 @@ +MANIFEST.in +README.rst +setup.py +docs/Features.html +docs/Features.rst +docs/UnicodeProperties.rst +regex.egg-info/PKG-INFO +regex.egg-info/SOURCES.txt +regex.egg-info/dependency_links.txt +regex.egg-info/top_level.txt +regex_2/__init__.py +regex_2/_regex.c +regex_2/_regex.h +regex_2/_regex_core.py +regex_2/_regex_unicode.c +regex_2/_regex_unicode.h +regex_2/regex.py +regex_2/test_regex.py +regex_3/__init__.py +regex_3/_regex.c +regex_3/_regex.h +regex_3/_regex_core.py +regex_3/_regex_unicode.c +regex_3/_regex_unicode.h +regex_3/regex.py +regex_3/test_regex.py +tools/build_regex_unicode.py \ No newline at end of file diff --git a/regex.egg-info/dependency_links.txt b/regex.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/regex.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/regex.egg-info/top_level.txt b/regex.egg-info/top_level.txt new file mode 100644 index 0000000..4f9256d --- /dev/null +++ b/regex.egg-info/top_level.txt @@ -0,0 +1 @@ +regex diff --git a/regex_2/regex/__init__.py b/regex_2/__init__.py similarity index 100% rename from regex_2/regex/__init__.py rename to regex_2/__init__.py diff --git a/regex_2/_regex.c b/regex_2/_regex.c index f87e706..01ac858 100644 --- a/regex_2/_regex.c +++ b/regex_2/_regex.c @@ -495,6 +495,7 @@ typedef struct RE_State { Py_ssize_t req_pos; /* The position where the required string matched. */ Py_ssize_t req_end; /* The end position where the required string matched. */ int partial_side; /* The side that could truncate in a partial match. */ + /* Various flags. */ RE_UINT16 iterations; /* The number of iterations the matching engine has performed since checking for KeyboardInterrupt. */ BOOL is_unicode; /* Whether the string to be matched is Unicode. */ BOOL should_release; /* Whether the buffer should be released. */ @@ -1829,7 +1830,7 @@ static BOOL unicode_at_grapheme_boundary(RE_State* state, Py_ssize_t text_pos) return FALSE; /* GB8 */ - if ((left_prop == RE_GBREAK_LVT || left_prop == RE_GBREAK_T) && left_prop + if ((left_prop == RE_GBREAK_LVT || left_prop == RE_GBREAK_T) && right_prop == RE_GBREAK_T) return FALSE; @@ -1870,14 +1871,16 @@ static BOOL unicode_at_grapheme_boundary(RE_State* state, Py_ssize_t text_pos) * number of RI characters before the break point. */ /* GB12 and GB13 */ - pos = left_pos; + if (right_prop == RE_GBREAK_REGIONALINDICATOR) { + pos = left_pos; - while (pos >= 0 && re_get_grapheme_cluster_break(char_at(state->text, pos)) - == RE_WBREAK_REGIONALINDICATOR) - --pos; + while (pos >= 0 && re_get_grapheme_cluster_break(char_at(state->text, + pos)) == RE_GBREAK_REGIONALINDICATOR) + --pos; - if ((left_pos - pos) % 2 == 1) - return FALSE; + if ((left_pos - pos) % 2 == 1) + return FALSE; + } /* Otherwise, break everywhere. */ /* GB999 */ @@ -9318,7 +9321,8 @@ Py_LOCAL_INLINE(BOOL) is_repeat_guarded(RE_State* state, size_t index, RE_GuardList* guard_list; /* Is a guard active here? */ - if (!(state->pattern->repeat_info[index].status & guard_type)) + if (!(state->pattern->repeat_info[index].status & guard_type) || + state->is_fuzzy) return FALSE; /* Which guard list? */ @@ -9460,715 +9464,6 @@ too_wide: return NULL; } -/* Looks for a string in a string set. */ -Py_LOCAL_INLINE(int) string_set_contains(RE_State* state, PyObject* string_set, - Py_ssize_t first, Py_ssize_t last) { - PyObject* string; - int status; - - if (state->is_unicode) - string = build_unicode_value(state->text, first, last, - state->charsize); - else - string = build_bytes_value(state->text, first, last, state->charsize); - if (!string) - return RE_ERROR_INTERNAL; - - status = PySet_Contains(string_set, string); - Py_DECREF(string); - - return status; -} - -/* Looks for a string in a string set, ignoring case. */ -Py_LOCAL_INLINE(int) string_set_contains_ign(RE_State* state, PyObject* - string_set, void* buffer, Py_ssize_t first, Py_ssize_t last, Py_ssize_t - index, Py_ssize_t buffer_charsize) { - Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); - void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); - RE_EncodingTable* encoding; - RE_LocaleInfo* locale_info; - BOOL (*possible_turkic)(RE_LocaleInfo* locale_info, Py_UCS4 ch); - Py_UCS4 codepoints[4]; - - switch (buffer_charsize) { - case 1: - char_at = bytes1_char_at; - set_char_at = bytes1_set_char_at; - break; - case 2: - char_at = bytes2_char_at; - set_char_at = bytes2_set_char_at; - break; - case 4: - char_at = bytes4_char_at; - set_char_at = bytes4_set_char_at; - break; - default: - char_at = bytes1_char_at; - set_char_at = bytes1_set_char_at; - break; - } - - encoding = state->encoding; - locale_info = state->locale_info; - possible_turkic = encoding->possible_turkic; - - /* Look for a possible Turkic 'I'. */ - while (index < last && !possible_turkic(locale_info, char_at(buffer, - index))) - ++index; - - if (index < last) { - /* Possible Turkic 'I'. */ - int count; - int i; - - /* Try all the alternatives to the 'I'. */ - count = encoding->all_turkic_i(locale_info, char_at(buffer, index), - codepoints); - - for (i = 0; i < count; i++) { - int status; - - set_char_at(buffer, index, codepoints[i]); - - /* Recurse for the remainder of the string. */ - status = string_set_contains_ign(state, string_set, buffer, first, - last, index + 1, buffer_charsize); - if (status != 0) - return status; - } - - return 0; - } else { - /* No Turkic 'I'. */ - PyObject* string; - int status; - - if (state->is_unicode) - string = build_unicode_value(buffer, first, last, buffer_charsize); - else - string = build_bytes_value(buffer, first, last, buffer_charsize); - if (!string) - return RE_ERROR_MEMORY; - - status = PySet_Contains(string_set, string); - Py_DECREF(string); - - return status; - } -} - -/* Creates a partial string set for truncation at the left or right side. */ -Py_LOCAL_INLINE(int) make_partial_string_set(RE_State* state, RE_Node* node) { - PatternObject* pattern; - int partial_side; - PyObject* string_set; - PyObject* partial_set; - PyObject* iter = NULL; - PyObject* item = NULL; - PyObject* slice = NULL; - - pattern = state->pattern; - partial_side = state->partial_side; - if (partial_side != RE_PARTIAL_LEFT && partial_side != RE_PARTIAL_RIGHT) - return RE_ERROR_INTERNAL; - - /* Fetch the full string set. PyList_GET_ITEM borrows a reference. */ - string_set = PyList_GET_ITEM(pattern->named_list_indexes, node->values[0]); - if (!string_set) - return RE_ERROR_INTERNAL; - - /* Gets the list of partial string sets. */ - if (!pattern->partial_named_lists[partial_side]) { - size_t size; - - size = pattern->named_lists_count * sizeof(PyObject*); - pattern->partial_named_lists[partial_side] = re_alloc(size); - if (!pattern->partial_named_lists[partial_side]) - return RE_ERROR_INTERNAL; - - memset(pattern->partial_named_lists[partial_side], 0, size); - } - - /* Get the partial string set. */ - partial_set = pattern->partial_named_lists[partial_side][node->values[0]]; - if (partial_set) - return 1; - - /* Build the partial string set. */ - partial_set = PySet_New(NULL); - if (!partial_set) - return RE_ERROR_INTERNAL; - - iter = PyObject_GetIter(string_set); - if (!iter) - goto error; - - item = PyIter_Next(iter); - - while (item) { - Py_ssize_t len; - Py_ssize_t first; - Py_ssize_t last; - - len = PySequence_Length(item); - if (len == -1) - goto error; - - first = 0; - last = len; - - while (last - first > 1) { - int status; - - /* Shorten the entry. */ - if (partial_side == RE_PARTIAL_LEFT) - ++first; - else - --last; - - slice = PySequence_GetSlice(item, first, last); - if (!slice) - goto error; - - status = PySet_Add(partial_set, slice); - Py_DECREF(slice); - if (status < 0) - goto error; - } - - Py_DECREF(item); - item = PyIter_Next(iter); - } - - if (PyErr_Occurred()) - goto error; - - Py_DECREF(iter); - - pattern->partial_named_lists[partial_side][node->values[0]] = partial_set; - - return 1; - -error: - Py_XDECREF(item); - Py_XDECREF(iter); - Py_DECREF(partial_set); - - return RE_ERROR_INTERNAL; -} - -/* Tries to match a string at the current position with a member of a string - * set, forwards or backwards. - */ -Py_LOCAL_INLINE(int) string_set_match_fwdrev(RE_State* state, RE_Node* node, - BOOL reverse) { - Py_ssize_t min_len; - Py_ssize_t max_len; - Py_ssize_t text_available; - Py_ssize_t slice_available; - int partial_side; - Py_ssize_t len; - Py_ssize_t first; - Py_ssize_t last; - int status; - PyObject* string_set; - - min_len = (Py_ssize_t)node->values[1]; - max_len = (Py_ssize_t)node->values[2]; - - acquire_GIL(state); - - if (reverse) { - text_available = state->text_pos; - slice_available = state->text_pos - state->slice_start; - partial_side = RE_PARTIAL_LEFT; - } else { - text_available = state->text_length - state->text_pos; - slice_available = state->slice_end - state->text_pos; - partial_side = RE_PARTIAL_RIGHT; - } - - /* Get as many characters as we need for the longest possible match. */ - len = min_ssize_t(max_len, slice_available); - - if (reverse) { - first = state->text_pos - len; - last = state->text_pos; - } else { - first = state->text_pos; - last = state->text_pos + len; - } - - /* If we didn't get all of the characters we need, is a partial match - * allowed? - */ - if (len < max_len && len == text_available && state->partial_side == - partial_side) { - if (len == 0) { - /* An empty string is always a possible partial match. */ - status = RE_ERROR_PARTIAL; - goto finished; - } - - /* Make a set of the possible partial matches. */ - status = make_partial_string_set(state, node); - if (status < 0) - goto finished; - - /* Fetch the partial string set. */ - string_set = - state->pattern->partial_named_lists[partial_side][node->values[0]]; - - /* Is the text we have a partial match? */ - status = string_set_contains(state, string_set, first, last); - if (status < 0) - goto finished; - - if (status == 1) { - /* Advance past the match. */ - if (reverse) - state->text_pos -= len; - else - state->text_pos += len; - - status = RE_ERROR_PARTIAL; - goto finished; - } - } - - /* Fetch the string set. PyList_GET_ITEM borrows a reference. */ - string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, - node->values[0]); - if (!string_set) { - status = RE_ERROR_INTERNAL; - goto finished; - } - - /* We've already looked for a partial match (if allowed), but what about a - * complete match? - */ - while (len >= min_len) { - status = string_set_contains(state, string_set, first, last); - - if (status == 1) { - /* Advance past the match. */ - if (reverse) - state->text_pos -= len; - else - state->text_pos += len; - - status = 1; - goto finished; - } - - /* Look for a shorter match. */ - --len; - if (reverse) - ++first; - else - --last; - } - - /* No match. */ - status = 0; - -finished: - release_GIL(state); - - return status; -} - -/* Tries to match a string at the current position with a member of a string - * set, ignoring case, forwards or backwards. - */ -Py_LOCAL_INLINE(int) string_set_match_fld_fwdrev(RE_State* state, RE_Node* - node, BOOL reverse) { - int (*full_case_fold)(RE_LocaleInfo* locale_info, Py_UCS4 ch, Py_UCS4* - folded); - Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); - Py_ssize_t folded_charsize; - void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); - Py_ssize_t min_len; - Py_ssize_t max_len; - Py_ssize_t buf_len; - void* folded; - int status; - BOOL* end_of_fold = NULL; - Py_ssize_t text_available; - Py_ssize_t slice_available; - Py_ssize_t t_pos; - Py_ssize_t f_pos; - int step; - int partial_side; - Py_ssize_t len; - Py_ssize_t consumed; - Py_UCS4 codepoints[RE_MAX_FOLDED]; - Py_ssize_t first; - Py_ssize_t last; - PyObject* string_set; - - full_case_fold = state->encoding->full_case_fold; - char_at = state->char_at; - - /* The folded string will have the same width as the original string. */ - folded_charsize = state->charsize; - - switch (folded_charsize) { - case 1: - set_char_at = bytes1_set_char_at; - break; - case 2: - set_char_at = bytes2_set_char_at; - break; - case 4: - set_char_at = bytes4_set_char_at; - break; - default: - return RE_ERROR_INTERNAL; - } - - min_len = (Py_ssize_t)node->values[1]; - max_len = (Py_ssize_t)node->values[2]; - - acquire_GIL(state); - - /* Allocate a buffer for the folded string. */ - buf_len = max_len + RE_MAX_FOLDED; - folded = re_alloc((size_t)(buf_len * folded_charsize)); - if (!folded) { - status = RE_ERROR_MEMORY; - goto finished; - } - - end_of_fold = re_alloc((size_t)buf_len * sizeof(BOOL)); - if (!end_of_fold) { - status = RE_ERROR_MEMORY; - goto finished; - } - - memset(end_of_fold, 0, (size_t)buf_len * sizeof(BOOL)); - - if (reverse) { - text_available = state->text_pos; - slice_available = state->text_pos - state->slice_start; - t_pos = state->text_pos - 1; - f_pos = buf_len; - step = -1; - partial_side = RE_PARTIAL_LEFT; - } else { - text_available = state->text_length - state->text_pos; - slice_available = state->slice_end - state->text_pos; - t_pos = state->text_pos; - f_pos = 0; - step = 1; - partial_side = RE_PARTIAL_RIGHT; - } - - /* We can stop getting characters as soon as the case-folded string is long - * enough (each codepoint from the text can expand to more than one folded - * codepoint). - */ - len = 0; - end_of_fold[len] = TRUE; - - consumed = 0; - while (len < max_len && consumed < slice_available) { - int count; - int j; - - count = full_case_fold(state->locale_info, char_at(state->text, t_pos), - codepoints); - - if (reverse) - f_pos -= count; - - for (j = 0; j < count; j++) - set_char_at(folded, f_pos + j, codepoints[j]); - - if (!reverse) - f_pos += count; - - len += count; - end_of_fold[len] = TRUE; - ++consumed; - t_pos += step; - } - - if (reverse) { - first = f_pos; - last = buf_len; - } else { - first = 0; - last = f_pos; - } - - /* If we didn't get all of the characters we need, is a partial match - * allowed? - */ - if (len < max_len && len == text_available && state->partial_side == - partial_side) { - if (len == 0) { - /* An empty string is always a possible partial match. */ - status = RE_ERROR_PARTIAL; - goto finished; - } - - /* Make a set of the possible partial matches. */ - status = make_partial_string_set(state, node); - if (status < 0) - goto finished; - - /* Fetch the partial string set. */ - string_set = - state->pattern->partial_named_lists[partial_side][node->values[0]]; - - /* Is the text we have a partial match? */ - status = string_set_contains_ign(state, string_set, folded, first, - last, first, folded_charsize); - if (status < 0) - goto finished; - - if (status == 1) { - /* Advance past the match. */ - if (reverse) - state->text_pos -= consumed; - else - state->text_pos += consumed; - - status = RE_ERROR_PARTIAL; - goto finished; - } - } - - /* Fetch the string set. PyList_GET_ITEM borrows a reference. */ - string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, - node->values[0]); - if (!string_set) { - status = RE_ERROR_INTERNAL; - goto finished; - } - - /* We've already looked for a partial match (if allowed), but what about a - * complete match? - */ - while (len >= min_len) { - if (end_of_fold[len]) { - status = string_set_contains_ign(state, string_set, folded, first, - last, first, folded_charsize); - - if (status == 1) { - /* Advance past the match. */ - if (reverse) - state->text_pos -= consumed; - else - state->text_pos += consumed; - - status = 1; - goto finished; - } - - --consumed; - } - - /* Look for a shorter match. */ - --len; - if (reverse) - ++first; - else - --last; - } - - /* No match. */ - status = 0; - -finished: - re_dealloc(end_of_fold); - re_dealloc(folded); - - release_GIL(state); - - return status; -} - -/* Tries to match a string at the current position with a member of a string - * set, ignoring case, forwards or backwards. - */ -Py_LOCAL_INLINE(int) string_set_match_ign_fwdrev(RE_State* state, RE_Node* - node, BOOL reverse) { - Py_UCS4 (*simple_case_fold)(RE_LocaleInfo* locale_info, Py_UCS4 ch); - Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); - Py_ssize_t folded_charsize; - void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); - Py_ssize_t min_len; - Py_ssize_t max_len; - void* folded; - int status; - Py_ssize_t text_available; - Py_ssize_t slice_available; - Py_ssize_t t_pos; - Py_ssize_t f_pos; - int step; - int partial_side; - Py_ssize_t len; - Py_ssize_t i; - Py_ssize_t first; - Py_ssize_t last; - PyObject* string_set; - - simple_case_fold = state->encoding->simple_case_fold; - char_at = state->char_at; - - /* The folded string will have the same width as the original string. */ - folded_charsize = state->charsize; - - switch (folded_charsize) { - case 1: - set_char_at = bytes1_set_char_at; - break; - case 2: - set_char_at = bytes2_set_char_at; - break; - case 4: - set_char_at = bytes4_set_char_at; - break; - default: - return RE_ERROR_INTERNAL; - } - - min_len = (Py_ssize_t)node->values[1]; - max_len = (Py_ssize_t)node->values[2]; - - acquire_GIL(state); - - /* Allocate a buffer for the folded string. */ - folded = re_alloc((size_t)(max_len * folded_charsize)); - if (!folded) { - status = RE_ERROR_MEMORY; - goto finished; - } - - if (reverse) { - text_available = state->text_pos; - slice_available = state->text_pos - state->slice_start; - t_pos = state->text_pos - 1; - f_pos = max_len - 1; - step = -1; - partial_side = RE_PARTIAL_LEFT; - } else { - text_available = state->text_length - state->text_pos; - slice_available = state->slice_end - state->text_pos; - t_pos = state->text_pos; - f_pos = 0; - step = 1; - partial_side = RE_PARTIAL_RIGHT; - } - - /* Get as many characters as we need for the longest possible match. */ - len = min_ssize_t(max_len, slice_available); - - for (i = 0; i < len; i ++) { - Py_UCS4 ch; - - ch = simple_case_fold(state->locale_info, char_at(state->text, t_pos)); - set_char_at(folded, f_pos, ch); - t_pos += step; - f_pos += step; - } - - if (reverse) { - first = f_pos + 1; - last = max_len; - } else { - first = 0; - last = f_pos; - } - - /* If we didn't get all of the characters we need, is a partial match - * allowed? - */ - if (len < max_len && len == text_available && state->partial_side == - partial_side) { - if (len == 0) { - /* An empty string is always a possible partial match. */ - status = RE_ERROR_PARTIAL; - goto finished; - } - - /* Make a set of the possible partial matches. */ - status = make_partial_string_set(state, node); - if (status < 0) - goto finished; - - /* Fetch the partial string set. */ - string_set = - state->pattern->partial_named_lists[partial_side][node->values[0]]; - - /* Is the text we have a partial match? */ - status = string_set_contains_ign(state, string_set, folded, first, - last, first, folded_charsize); - if (status < 0) - goto finished; - - if (status == 1) { - /* Advance past the match. */ - if (reverse) - state->text_pos -= len; - else - state->text_pos += len; - - status = RE_ERROR_PARTIAL; - goto finished; - } - } - - /* Fetch the string set. PyList_GET_ITEM borrows a reference. */ - string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, - node->values[0]); - if (!string_set) { - status = RE_ERROR_INTERNAL; - goto finished; - } - - /* We've already looked for a partial match (if allowed), but what about a - * complete match? - */ - while (len >= min_len) { - status = string_set_contains_ign(state, string_set, folded, first, - last, first, folded_charsize); - - if (status == 1) { - /* Advance past the match. */ - if (reverse) - state->text_pos -= len; - else - state->text_pos += len; - - status = 1; - goto finished; - } - - /* Look for a shorter match. */ - --len; - if (reverse) - ++first; - else - --last; - } - - /* No match. */ - status = 0; - -finished: - re_dealloc(folded); - - release_GIL(state); - - return status; -} - Py_LOCAL_INLINE(size_t) total_errors(size_t* fuzzy_counts) { return fuzzy_counts[RE_FUZZY_DEL] + fuzzy_counts[RE_FUZZY_INS] + fuzzy_counts[RE_FUZZY_SUB]; @@ -10330,16 +9625,25 @@ Py_LOCAL_INLINE(void) unrecord_fuzzy(RE_State* state) { --state->fuzzy_changes.count; } -/* Makes a list of lists of fuzzy changes. */ -Py_LOCAL_INLINE(void) make_fuzzy_changes_list(RE_FuzzyChangesList* +/* Initialises a list of fuzzy changes. */ +Py_LOCAL_INLINE(void) init_fuzzy_changes_list(RE_FuzzyChangesList* changes_list) { changes_list->capacity = 0; changes_list->count = 0; changes_list->items = NULL; } -/* Makes a list of lists of fuzzy changes. */ -Py_LOCAL_INLINE(void) make_best_changes_list(RE_BestChangesList* +/* Finalises a list of fuzzy changes. */ +Py_LOCAL_INLINE(void) fini_fuzzy_changes_list(RE_State* state, + RE_FuzzyChangesList* changes_list) { + safe_dealloc(state, changes_list->items); + changes_list->capacity = 0; + changes_list->count = 0; + changes_list->items = NULL; +} + +/* Initialises a list of lists of fuzzy changes. */ +Py_LOCAL_INLINE(void) init_best_changes_list(RE_BestChangesList* best_changes_list) { best_changes_list->capacity = 0; best_changes_list->count = 0; @@ -10364,11 +9668,14 @@ Py_LOCAL_INLINE(void) clear_best_fuzzy_changes(RE_State* state, best_changes_list->count = 0; } -/* Destroys a list of lists of fuzzy changes. */ -Py_LOCAL_INLINE(void) destroy_best_changes_list(RE_State* state, +/* Finalises a list of lists of fuzzy changes. */ +Py_LOCAL_INLINE(void) fini_best_changes_list(RE_State* state, RE_BestChangesList* best_changes_list) { clear_best_fuzzy_changes(state, best_changes_list); safe_dealloc(state, best_changes_list->lists); + best_changes_list->capacity = 0; + best_changes_list->count = 0; + best_changes_list->lists = NULL; } /* Adds a list of fuzzy changes to a list of best fuzzy changes. */ @@ -10411,20 +9718,6 @@ Py_LOCAL_INLINE(BOOL) add_best_fuzzy_changes(RE_State* state, return TRUE; } -/* Initialises a list of fuzzy changes. */ -Py_LOCAL_INLINE(void) make_changes_list(RE_State* state, RE_FuzzyChangesList* - best_changes_list) { - best_changes_list->capacity = 0; - best_changes_list->count = 0; - best_changes_list->items = NULL; -} - -/* Finitialises a list of fuzzy changes. */ -Py_LOCAL_INLINE(void) destroy_changes_list(RE_State* state, - RE_FuzzyChangesList* best_changes_list) { - safe_dealloc(state, best_changes_list->items); -} - /* Saves a list of fuzzy changes. */ Py_LOCAL_INLINE(BOOL) save_fuzzy_changes(RE_State* state, RE_FuzzyChangesList* best_changes_list) { @@ -10522,6 +9815,13 @@ Py_LOCAL_INLINE(BOOL) fuzzy_ext_match(RE_State* state, RE_Node* fuzzy_node, return pos > state->slice_start && matches_RANGE(state->encoding, state->locale_info, test_node, state->char_at(state->text, pos - 1)) == test_node->match; + case RE_OP_SET_DIFF: + case RE_OP_SET_INTER: + case RE_OP_SET_SYM_DIFF: + case RE_OP_SET_UNION: + return pos < state->slice_end && matches_SET(state->encoding, + state->locale_info, test_node, state->char_at(state->text, pos)) == + test_node->match; } return TRUE; @@ -10613,6 +9913,14 @@ Py_LOCAL_INLINE(BOOL) fuzzy_ext_match_group_fld(RE_State* state, RE_Node* matches_RANGE(state->encoding, state->locale_info, test_node, folded_char_at(state, state->text_pos - 1, folded_pos - 1)) == test_node->match; + case RE_OP_SET_DIFF: + case RE_OP_SET_INTER: + case RE_OP_SET_SYM_DIFF: + case RE_OP_SET_UNION: + return state->text_pos < state->slice_end && + matches_SET(state->encoding, state->locale_info, test_node, + folded_char_at(state, state->text_pos, folded_pos)) == + test_node->match; } return TRUE; @@ -10623,58 +9931,60 @@ Py_LOCAL_INLINE(int) next_fuzzy_match_item(RE_State* state, RE_FuzzyData* data, BOOL is_string, RE_INT8 step) { Py_ssize_t new_pos; - if (this_error_permitted(state, data->fuzzy_type)) { - switch (data->fuzzy_type) { - case RE_FUZZY_DEL: - /* Could a character at text_pos have been deleted? */ - if (step == 0) - return RE_ERROR_FAILURE; + if (!this_error_permitted(state, data->fuzzy_type)) + return RE_ERROR_FAILURE; - if (is_string) - data->new_string_pos += step; - else - data->new_node = data->new_node->next_1.node; - return RE_ERROR_SUCCESS; - case RE_FUZZY_INS: - /* Could the character at text_pos have been inserted? */ - if (!data->permit_insertion) + switch (data->fuzzy_type) { + case RE_FUZZY_DEL: + /* Could a character at text_pos have been deleted? */ + if (step == 0) + return RE_ERROR_FAILURE; + + if (is_string) + data->new_string_pos += step; + else + data->new_node = data->new_node->next_1.node; + return RE_ERROR_SUCCESS; + case RE_FUZZY_INS: + /* Could the character at text_pos have been inserted? */ + if (!data->permit_insertion) + return RE_ERROR_FAILURE; + + if (step == 0) + new_pos = data->new_text_pos + data->step; + else + new_pos = data->new_text_pos + step; + + if (state->slice_start <= new_pos && new_pos <= state->slice_end) { + if (!fuzzy_ext_match(state, state->fuzzy_node, data->new_text_pos)) return RE_ERROR_FAILURE; - if (step == 0) - new_pos = data->new_text_pos + data->step; - else - new_pos = data->new_text_pos + step; - if (state->slice_start <= new_pos && new_pos <= state->slice_end) { - if (!fuzzy_ext_match(state, state->fuzzy_node, - data->new_text_pos)) - return RE_ERROR_FAILURE; + data->new_text_pos = new_pos; + return RE_ERROR_SUCCESS; + } - data->new_text_pos = new_pos; - return RE_ERROR_SUCCESS; - } + return check_fuzzy_partial(state, new_pos); + case RE_FUZZY_SUB: + /* Could the character at text_pos have been substituted? */ + if (step == 0) + return RE_ERROR_FAILURE; - return check_fuzzy_partial(state, new_pos); - case RE_FUZZY_SUB: - /* Could the character at text_pos have been substituted? */ - if (step == 0) + new_pos = data->new_text_pos + step; + if (state->slice_start <= new_pos && new_pos <= state->slice_end) { + if (!fuzzy_ext_match(state, state->fuzzy_node, data->new_text_pos)) return RE_ERROR_FAILURE; - new_pos = data->new_text_pos + step; - if (state->slice_start <= new_pos && new_pos <= state->slice_end) { - if (!fuzzy_ext_match(state, state->fuzzy_node, - data->new_text_pos)) - return RE_ERROR_FAILURE; + data->new_text_pos = new_pos; - data->new_text_pos = new_pos; - if (is_string) - data->new_string_pos += step; - else - data->new_node = data->new_node->next_1.node; - return RE_ERROR_SUCCESS; - } + if (is_string) + data->new_string_pos += step; + else + data->new_node = data->new_node->next_1.node; - return check_fuzzy_partial(state, new_pos); + return RE_ERROR_SUCCESS; } + + return check_fuzzy_partial(state, new_pos); } return RE_ERROR_FAILURE; @@ -10685,11 +9995,14 @@ Py_LOCAL_INLINE(int) fuzzy_match_item(RE_State* state, BOOL search, Py_ssize_t* text_pos, RE_Node** node, RE_INT8 step) { size_t* fuzzy_counts; RE_FuzzyData data; + TRACE(("<<fuzzy_match_item>>\n")) fuzzy_counts = state->fuzzy_counts; - if (!any_error_permitted(state)) + if (!any_error_permitted(state)) { + TRACE((" return RE_ERROR_FAILURE\n")) return RE_ERROR_FAILURE; + } data.new_text_pos = *text_pos; data.new_node = *node; @@ -10723,6 +10036,7 @@ Py_LOCAL_INLINE(int) fuzzy_match_item(RE_State* state, BOOL search, Py_ssize_t* goto found; } + TRACE((" return RE_ERROR_FAILURE\n")) return RE_ERROR_FAILURE; found: @@ -10739,7 +10053,8 @@ found: /* bstack: node step text_pos fuzzy_type op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -10748,6 +10063,9 @@ found: *text_pos = data.new_text_pos; *node = data.new_node; + TRACE((" fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0], + fuzzy_counts[1], fuzzy_counts[2])) + TRACE((" return RE_ERROR_SUCCESS\n")) return RE_ERROR_SUCCESS; } @@ -10759,6 +10077,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_item(RE_State* state, RE_UINT8 op, BOOL RE_FuzzyData data; RE_INT8 step; RE_Node* curr_node; + TRACE(("<<retry_fuzzy_match_item>>\n")) fuzzy_counts = state->fuzzy_counts; @@ -10804,6 +10123,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_item(RE_State* state, RE_UINT8 op, BOOL goto found; } + TRACE((" return RE_ERROR_FAILURE\n")) return RE_ERROR_FAILURE; found: @@ -10820,7 +10140,8 @@ found: /* bstack: node step text_pos fuzzy_type op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -10829,6 +10150,9 @@ found: *text_pos = data.new_text_pos; *node = data.new_node; + TRACE((" fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0], + fuzzy_counts[1], fuzzy_counts[2])) + TRACE((" return RE_ERROR_SUCCESS\n")) return RE_ERROR_SUCCESS; } @@ -10925,11 +10249,14 @@ Py_LOCAL_INLINE(int) fuzzy_match_string(RE_State* state, BOOL search, Py_ssize_t* text_pos, RE_Node* node, Py_ssize_t* string_pos, RE_INT8 step) { size_t* fuzzy_counts; RE_FuzzyData data; + TRACE(("<<fuzzy_match_string>>\n")) fuzzy_counts = state->fuzzy_counts; - if (!any_error_permitted(state)) + if (!any_error_permitted(state)) { + TRACE((" return RE_ERROR_FAILURE\n")) return RE_ERROR_FAILURE; + } data.new_text_pos = *text_pos; data.new_string_pos = *string_pos; @@ -10953,6 +10280,7 @@ Py_LOCAL_INLINE(int) fuzzy_match_string(RE_State* state, BOOL search, goto found; } + TRACE((" return RE_ERROR_FAILURE\n")) return RE_ERROR_FAILURE; found: @@ -10971,7 +10299,8 @@ found: /* bstack: node step string_pos text_pos fuzzy_type op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -10980,6 +10309,9 @@ found: *text_pos = data.new_text_pos; *string_pos = data.new_string_pos; + TRACE((" fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0], + fuzzy_counts[1], fuzzy_counts[2])) + TRACE((" return RE_ERROR_SUCCESS\n")) return RE_ERROR_SUCCESS; } @@ -10991,6 +10323,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_string(RE_State* state, RE_UINT8 op, Py_ssize_t curr_text_pos; Py_ssize_t curr_string_pos; RE_Node* new_node; + TRACE(("<<retry_fuzzy_match_string>>\n")) fuzzy_counts = state->fuzzy_counts; @@ -11032,6 +10365,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_string(RE_State* state, RE_UINT8 op, goto found; } + TRACE((" return RE_ERROR_FAILURE\n")) return RE_ERROR_FAILURE; found: @@ -11048,7 +10382,8 @@ found: if (!push_uint8(state, &state->bstack, op)) return RE_ERROR_MEMORY; - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; /* bstack: node step string_pos text_pos fuzzy_type op */ @@ -11060,6 +10395,9 @@ found: *node = new_node; *string_pos = data.new_string_pos; + TRACE((" fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0], + fuzzy_counts[1], fuzzy_counts[2])) + TRACE((" return RE_ERROR_SUCCESS\n")) return RE_ERROR_SUCCESS; } @@ -11177,7 +10515,8 @@ found: * op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -11276,7 +10615,8 @@ found: * op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -11410,7 +10750,8 @@ found: * folded_len text_pos fuzzy_type op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -11515,7 +10856,8 @@ found: * folded_len text_pos fuzzy_type op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -12966,7 +12308,7 @@ advance: /* The counts are of type size_t, so the format needs to specify * that. */ - TRACE(("min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n", + TRACE((" min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n", node->values[1], node->values[2], rp_data->count)) /* Could the body or tail match? */ @@ -13193,7 +12535,7 @@ advance: /* The counts are of type size_t, so the format needs to specify * that. */ - TRACE(("min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n", + TRACE((" min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n", node->values[1], node->values[2], rp_data->count)) /* Could the body or tail match? */ @@ -13615,6 +12957,11 @@ advance: rp_data->capture_change = state->capture_change; /* Could the body or tail match? */ +#if defined(VERBOSE) + printf(" is_repeat_guarded(..., RE_STATUS_BODY) returns %d\n", + is_repeat_guarded(state, index, state->text_pos, + RE_STATUS_BODY)); +#endif try_body = node->values[2] > 0 && !is_repeat_guarded(state, index, state->text_pos, RE_STATUS_BODY); if (try_body) { @@ -15538,66 +14885,6 @@ advance: node = node->next_1.node; break; } - case RE_OP_STRING_SET: /* Member of a string set. */ - TRACE(("%s\n", re_op_text[node->op])) - - status = string_set_match_fwdrev(state, node, FALSE); - if (status < 0) - return status; - if (status == 0) - goto backtrack; - node = node->next_1.node; - break; - case RE_OP_STRING_SET_FLD: /* Member of a string set, ignoring case. */ - TRACE(("%s\n", re_op_text[node->op])) - - status = string_set_match_fld_fwdrev(state, node, FALSE); - if (status < 0) - return status; - if (status == 0) - goto backtrack; - node = node->next_1.node; - break; - case RE_OP_STRING_SET_FLD_REV: /* Member of a string set, ignoring case. */ - TRACE(("%s\n", re_op_text[node->op])) - - status = string_set_match_fld_fwdrev(state, node, TRUE); - if (status < 0) - return status; - if (status == 0) - goto backtrack; - node = node->next_1.node; - break; - case RE_OP_STRING_SET_IGN: /* Member of a string set, ignoring case. */ - TRACE(("%s\n", re_op_text[node->op])) - - status = string_set_match_ign_fwdrev(state, node, FALSE); - if (status < 0) - return status; - if (status == 0) - goto backtrack; - node = node->next_1.node; - break; - case RE_OP_STRING_SET_IGN_REV: /* Member of a string set, ignoring case. */ - TRACE(("%s\n", re_op_text[node->op])) - - status = string_set_match_ign_fwdrev(state, node, TRUE); - if (status < 0) - return status; - if (status == 0) - goto backtrack; - node = node->next_1.node; - break; - case RE_OP_STRING_SET_REV: /* Member of a string set. */ - TRACE(("%s\n", re_op_text[node->op])) - - status = string_set_match_fwdrev(state, node, TRUE); - if (status < 0) - return status; - if (status == 0) - goto backtrack; - node = node->next_1.node; - break; case RE_OP_SUCCESS: /* Success. */ /* Must the match advance past its start? */ TRACE(("%s\n", re_op_text[node->op])) @@ -17923,8 +17210,17 @@ Py_LOCAL_INLINE(void) restore_fuzzy_counts(RE_State* state, size_t* Py_MEMCPY(state->fuzzy_counts, fuzzy_counts, sizeof(state->fuzzy_counts)); } -/* Makes the list of best matches found so far. */ -Py_LOCAL_INLINE(void) make_best_list(RE_BestList* best_list) { +/* Initialises the list of best matches found so far. */ +Py_LOCAL_INLINE(void) init_best_list(RE_BestList* best_list) { + best_list->capacity = 0; + best_list->count = 0; + best_list->entries = NULL; +} + +/* Finalises the list of best matches found so far. */ +Py_LOCAL_INLINE(void) fini_best_list(RE_State* state, RE_BestList* + best_list) { + safe_dealloc(state, best_list->entries); best_list->capacity = 0; best_list->count = 0; best_list->entries = NULL; @@ -17965,13 +17261,6 @@ Py_LOCAL_INLINE(BOOL) add_to_best_list(RE_State* state, RE_BestList* best_list, return TRUE; } -/* Destroy the list of best matches found so far. */ -Py_LOCAL_INLINE(void) destroy_best_list(RE_State* state, RE_BestList* - best_list) { - if (best_list->entries) - safe_dealloc(state, best_list->entries); -} - /* Performs a match or search from the current text position for a best fuzzy * match. */ @@ -18005,8 +17294,8 @@ Py_LOCAL_INLINE(int) do_best_fuzzy_match(RE_State* state, BOOL search) { must_advance = state->must_advance; found_match = FALSE; - make_best_list(&best_list); - make_best_changes_list(&best_changes_list); + init_best_list(&best_list); + init_best_changes_list(&best_changes_list); /* Search the text for the best match. */ start_pos = state->text_pos; @@ -18099,7 +17388,7 @@ Py_LOCAL_INLINE(int) do_best_fuzzy_match(RE_State* state, BOOL search) { error_limit = RE_MAX_ERRORS; best_groups = NULL; - make_fuzzy_changes_list(&best_fuzzy_changes); + init_fuzzy_changes_list(&best_fuzzy_changes); /* Look again at the best of the matches that we've seen. */ for (i = 0; i < best_list.count; i++) { @@ -18220,27 +17509,29 @@ Py_LOCAL_INLINE(int) do_best_fuzzy_match(RE_State* state, BOOL search) { state->text_pos = entry->match_pos; init_match(state); status = basic_match(state, search); + + list = &best_changes_list.lists[0]; + state->fuzzy_changes.count = list->count; + Py_MEMCPY(state->fuzzy_changes.items, list->items, + (size_t)list->count * sizeof(RE_FuzzyChange)); } + fini_fuzzy_changes_list(state, &best_fuzzy_changes); + state->slice_start = slice_start; state->slice_end = slice_end; - - list = &best_changes_list.lists[0]; - state->fuzzy_changes.count = list->count; - Py_MEMCPY(state->fuzzy_changes.items, list->items, - (size_t)list->count * sizeof(RE_FuzzyChange)); } else state->fuzzy_changes.count = 0; } - destroy_best_list(state, &best_list); - destroy_best_changes_list(state, &best_changes_list); + fini_best_list(state, &best_list); + fini_best_changes_list(state, &best_changes_list); return status; error: - destroy_best_list(state, &best_list); - destroy_best_changes_list(state, &best_changes_list); + fini_best_list(state, &best_list); + fini_best_changes_list(state, &best_changes_list); return RE_ERROR_MEMORY; } @@ -18264,7 +17555,7 @@ Py_LOCAL_INLINE(int) do_enhanced_fuzzy_match(RE_State* state, BOOL search) { pattern = state->pattern; - make_changes_list(state, &best_fuzzy_changes); + init_fuzzy_changes_list(&best_fuzzy_changes); if (state->reverse) available = state->text_pos - state->slice_start; @@ -18400,12 +17691,12 @@ Py_LOCAL_INLINE(int) do_enhanced_fuzzy_match(RE_State* state, BOOL search) { restore_fuzzy_changes(state, &best_fuzzy_changes); } - destroy_changes_list(state, &best_fuzzy_changes); + fini_fuzzy_changes_list(state, &best_fuzzy_changes); return status; error: - destroy_changes_list(state, &best_fuzzy_changes); + fini_fuzzy_changes_list(state, &best_fuzzy_changes); return status; } @@ -18967,7 +18258,6 @@ Py_LOCAL_INLINE(BOOL) state_init_2(RE_State* state, PatternObject* pattern, break; } - /* A state struct can sometimes be shared across threads. In such * instances, if multithreading is enabled we need to protect the state * with a lock (mutex) during matching. @@ -19144,7 +18434,7 @@ Py_LOCAL_INLINE(Py_ssize_t) as_string_index(PyObject* obj, Py_ssize_t def) { return value; set_error(RE_ERROR_INDEX, NULL); - return 0; + return -1; } /* Deallocates a MatchObject. */ @@ -20661,6 +19951,8 @@ static PyObject* match_lastgroup(PyObject* self_) { PyObject* result; index = Py_BuildValue("n", self->lastgroup); + if (!index) + return NULL; /* PyDict_GetItem returns borrows a reference. */ result = PyDict_GetItem(self->pattern->indexgroup, index); @@ -25291,12 +24583,6 @@ Py_LOCAL_INLINE(BOOL) section_contains_repeat(RE_CODE** code, RE_CODE* case RE_OP_RANGE_IGN: case RE_OP_RANGE_IGN_REV: case RE_OP_RANGE_REV: - case RE_OP_STRING_SET: - case RE_OP_STRING_SET_FLD: - case RE_OP_STRING_SET_FLD_REV: - case RE_OP_STRING_SET_IGN: - case RE_OP_STRING_SET_IGN_REV: - case RE_OP_STRING_SET_REV: /* codes: opcode, value, value, value. */ *code += 4; break; @@ -25671,37 +24957,6 @@ Py_LOCAL_INLINE(int) build_SET(RE_CompileArgs* args) { return RE_ERROR_SUCCESS; } -/* Builds a STRING_SET node. */ -Py_LOCAL_INLINE(int) build_STRING_SET(RE_CompileArgs* args) { - RE_CODE index; - RE_CODE min_len; - RE_CODE max_len; - RE_Node* node; - - /* codes: opcode, index, min_len, max_len. */ - if (args->code + 3 > args->end_code) - return RE_ERROR_ILLEGAL; - - index = args->code[1]; - min_len = args->code[2]; - max_len = args->code[3]; - node = create_node(args->pattern, (RE_UINT8)args->code[0], 0, 0, 3); - if (!node) - return RE_ERROR_MEMORY; - - node->values[0] = index; - node->values[1] = min_len; - node->values[2] = max_len; - - args->code += 4; - - /* Append the reference. */ - add_node(args->end, node); - args->end = node; - - return RE_ERROR_SUCCESS; -} - /* Builds a SUCCESS node . */ Py_LOCAL_INLINE(int) build_SUCCESS(RE_CompileArgs* args) { RE_Node* node; @@ -26011,17 +25266,6 @@ Py_LOCAL_INLINE(int) build_sequence(RE_CompileArgs* args) { if (!build_STRING(args, FALSE)) return FALSE; break; - case RE_OP_STRING_SET: - case RE_OP_STRING_SET_FLD: - case RE_OP_STRING_SET_FLD_REV: - case RE_OP_STRING_SET_IGN: - case RE_OP_STRING_SET_IGN_REV: - case RE_OP_STRING_SET_REV: - /* A reference to a list. */ - status = build_STRING_SET(args); - if (status != RE_ERROR_SUCCESS) - return status; - break; default: /* We've found an opcode which we don't recognise. We'll leave it * for the caller. @@ -26935,5 +26179,3 @@ PyMODINIT_FUNC init_regex(void) { return; } } - -/* vim:ts=4:sw=4:et */ diff --git a/regex_2/_regex.h b/regex_2/_regex.h index f2b7d67..4c7f5fb 100644 --- a/regex_2/_regex.h +++ b/regex_2/_regex.h @@ -98,29 +98,23 @@ #define RE_OP_STRING_IGN 77 #define RE_OP_STRING_IGN_REV 78 #define RE_OP_STRING_REV 79 -#define RE_OP_STRING_SET 80 -#define RE_OP_STRING_SET_FLD 81 -#define RE_OP_STRING_SET_FLD_REV 82 -#define RE_OP_STRING_SET_IGN 83 -#define RE_OP_STRING_SET_IGN_REV 84 -#define RE_OP_STRING_SET_REV 85 -#define RE_OP_FUZZY_EXT 86 -#define RE_OP_BODY_END 87 -#define RE_OP_BODY_START 88 -#define RE_OP_END_ATOMIC 89 -#define RE_OP_END_CONDITIONAL 90 -#define RE_OP_END_FUZZY 91 -#define RE_OP_END_GREEDY_REPEAT 92 -#define RE_OP_END_GROUP 93 -#define RE_OP_END_LAZY_REPEAT 94 -#define RE_OP_END_LOOKAROUND 95 -#define RE_OP_FUZZY_INSERT 96 -#define RE_OP_GREEDY_REPEAT_ONE 97 -#define RE_OP_GROUP_RETURN 98 -#define RE_OP_LAZY_REPEAT_ONE 99 -#define RE_OP_MATCH_BODY 100 -#define RE_OP_MATCH_TAIL 101 -#define RE_OP_START_GROUP 102 +#define RE_OP_FUZZY_EXT 80 +#define RE_OP_BODY_END 81 +#define RE_OP_BODY_START 82 +#define RE_OP_END_ATOMIC 83 +#define RE_OP_END_CONDITIONAL 84 +#define RE_OP_END_FUZZY 85 +#define RE_OP_END_GREEDY_REPEAT 86 +#define RE_OP_END_GROUP 87 +#define RE_OP_END_LAZY_REPEAT 88 +#define RE_OP_END_LOOKAROUND 89 +#define RE_OP_FUZZY_INSERT 90 +#define RE_OP_GREEDY_REPEAT_ONE 91 +#define RE_OP_GROUP_RETURN 92 +#define RE_OP_LAZY_REPEAT_ONE 93 +#define RE_OP_MATCH_BODY 94 +#define RE_OP_MATCH_TAIL 95 +#define RE_OP_START_GROUP 96 char* re_op_text[] = { "RE_OP_FAILURE", @@ -203,12 +197,6 @@ char* re_op_text[] = { "RE_OP_STRING_IGN", "RE_OP_STRING_IGN_REV", "RE_OP_STRING_REV", - "RE_OP_STRING_SET", - "RE_OP_STRING_SET_FLD", - "RE_OP_STRING_SET_FLD_REV", - "RE_OP_STRING_SET_IGN", - "RE_OP_STRING_SET_IGN_REV", - "RE_OP_STRING_SET_REV", "RE_OP_FUZZY_EXT", "RE_OP_BODY_END", "RE_OP_BODY_START", diff --git a/regex_2/regex/_regex_core.py b/regex_2/_regex_core.py similarity index 98% rename from regex_2/regex/_regex_core.py rename to regex_2/_regex_core.py index 93b6e15..9a77fe0 100644 --- a/regex_2/regex/_regex_core.py +++ b/regex_2/_regex_core.py @@ -219,12 +219,6 @@ STRING_FLD_REV STRING_IGN STRING_IGN_REV STRING_REV -STRING_SET -STRING_SET_FLD -STRING_SET_FLD_REV -STRING_SET_IGN -STRING_SET_IGN_REV -STRING_SET_REV FUZZY_EXT """ @@ -2033,6 +2027,9 @@ class Branch(RegexBase): b.fix_groups(pattern, reverse, fuzzy) def optimise(self, info, reverse): + if not self.branches: + return Sequence([]) + # Flatten branches within branches. branches = Branch._flatten_branches(info, reverse, self.branches) @@ -2452,6 +2449,9 @@ class CallGroup(RegexBase): def max_width(self): return UNLIMITED + def __del__(self): + self.info = None + class CallRef(RegexBase): def __init__(self, ref, parsed): self.ref = ref @@ -2621,6 +2621,9 @@ class Conditional(RegexBase): def max_width(self): return max(self.yes_item.max_width(), self.no_item.max_width()) + def __del__(self): + self.info = None + class DefaultBoundary(ZeroWidthBase): _opcode = OP.DEFAULT_BOUNDARY _op_name = "DEFAULT_BOUNDARY" @@ -3015,6 +3018,9 @@ class Group(RegexBase): def get_required_string(self, reverse): return self.subpattern.get_required_string(reverse) + def __del__(self): + self.info = None + class Keep(ZeroWidthBase): _opcode = OP.KEEP _op_name = "KEEP" @@ -3363,6 +3369,9 @@ class RefGroup(RegexBase): def max_width(self): return UNLIMITED + def __del__(self): + self.info = None + class SearchAnchor(ZeroWidthBase): _opcode = OP.SEARCH_ANCHOR _op_name = "SEARCH_ANCHOR" @@ -3682,6 +3691,9 @@ class SetBase(RegexBase): return max(len(folded) for folded in seen) + def __del__(self): + self.info = None + class SetDiff(SetBase): _opcode = {(NOCASE, False): OP.SET_DIFF, (IGNORECASE, False): OP.SET_DIFF_IGN, (FULLCASE, False): OP.SET_DIFF, (FULLIGNORECASE, False): @@ -3919,13 +3931,7 @@ class Literal(String): print "%sLITERAL MATCH %s%s" % (INDENT * indent, display, CASE_TEXT[self.case_flags]) -class StringSet(RegexBase): - _opcode = {(NOCASE, False): OP.STRING_SET, (IGNORECASE, False): - OP.STRING_SET_IGN, (FULLCASE, False): OP.STRING_SET, (FULLIGNORECASE, - False): OP.STRING_SET_FLD, (NOCASE, True): OP.STRING_SET_REV, - (IGNORECASE, True): OP.STRING_SET_IGN_REV, (FULLCASE, True): - OP.STRING_SET_REV, (FULLIGNORECASE, True): OP.STRING_SET_FLD_REV} - +class StringSet(Branch): def __init__(self, info, name, case_flags=NOCASE): self.info = info self.name = name @@ -3937,84 +3943,30 @@ class StringSet(RegexBase): if self.set_key not in info.named_lists_used: info.named_lists_used[self.set_key] = len(info.named_lists_used) - def _compile(self, reverse, fuzzy): index = self.info.named_lists_used[self.set_key] items = self.info.kwargs[self.name] case_flags = self.case_flags - if not items: - return [] - encoding = self.info.flags & _ALL_ENCODINGS fold_flags = encoding | case_flags - if fuzzy: - choices = [self._folded(fold_flags, i) for i in items] - - # Sort from longest to shortest. - choices.sort(key=lambda s: (-len(s), s)) + choices = [] + for string in items: + choices.append([Character(ord(c), case_flags=case_flags) for c in + string]) - branches = [] - for string in choices: - branches.append(Sequence([Character(c, case_flags=case_flags) - for c in string])) + # Sort from longest to shortest. + choices.sort(key=len, reverse=True) - if len(branches) > 1: - branch = Branch(branches) - else: - branch = branches[0] - branch = branch.optimise(self.info, - reverse).pack_characters(self.info) - - return branch.compile(reverse, fuzzy) - else: - min_len = min(len(i) for i in items) - max_len = max(len(self._folded(fold_flags, i)) for i in items) - return [(self._opcode[case_flags, reverse], index, min_len, - max_len)] + self.branches = [Sequence(choice) for choice in choices] def dump(self, indent, reverse): print "%sSTRING_SET %s%s" % (INDENT * indent, self.name, CASE_TEXT[self.case_flags]) - def _folded(self, fold_flags, item): - if isinstance(item, unicode): - return [ord(c) for c in _regex.fold_case(fold_flags, item)] - else: - return [ord(c) for c in item] - - def _flatten(self, s): - # Flattens the branches. - if isinstance(s, Branch): - for b in s.branches: - self._flatten(b) - elif isinstance(s, Sequence) and s.items: - seq = s.items - - while isinstance(seq[-1], Sequence): - seq[-1 : ] = seq[-1].items - - n = 0 - while n < len(seq) and isinstance(seq[n], Character): - n += 1 - - if n > 1: - seq[ : n] = [String([c.value for c in seq[ : n]], - case_flags=self.case_flags)] - - self._flatten(seq[-1]) - - def max_width(self): - if not self.info.kwargs[self.name]: - return 0 - - if self.case_flags & IGNORECASE: - fold_flags = (self.info.flags & _ALL_ENCODINGS) | self.case_flags - return max(len(_regex.fold_case(fold_flags, i)) for i in - self.info.kwargs[self.name]) - else: - return max(len(i) for i in self.info.kwargs[self.name]) + def __del__(self): + self.info = None class Source(object): "Scanner for the regular expression source string." @@ -4488,6 +4440,7 @@ CHARACTER_ESCAPES = { CHARSET_ESCAPES = { "d": lookup_property(None, "Digit", True), "D": lookup_property(None, "Digit", False), + "h": lookup_property(None, "Blank", True), "s": lookup_property(None, "Space", True), "S": lookup_property(None, "Space", False), "w": lookup_property(None, "Word", True), diff --git a/regex_2/_regex_unicode.c b/regex_2/_regex_unicode.c index eff2643..aec7fe7 100644 --- a/regex_2/_regex_unicode.c +++ b/regex_2/_regex_unicode.c @@ -1,4 +1,4 @@ -/* For Unicode version 12.1.0 */ +/* For Unicode version 13.0.0 */ #include "_regex_unicode.h" @@ -6,21 +6,20 @@ #define RE_GRAPH_MASK ((1 << RE_PROP_CC) | (1 << RE_PROP_CS) | (1 << RE_PROP_CN)) #define RE_WORD_MASK (RE_PROP_M_MASK | (1 << RE_PROP_ND) | (1 << RE_PROP_PC)) -typedef struct RE_ScriptExt { +typedef struct { RE_UINT8 scripts[RE_MAX_SCX]; } RE_ScriptExt; -typedef struct RE_AllCases { - RE_INT32 diffs[RE_MAX_CASES - 1]; +typedef struct { + RE_UINT32 delta; + RE_UINT16 others[RE_MAX_CASES - 1]; } RE_AllCases; -typedef struct RE_FullCaseFolding { - RE_INT32 diff; - RE_UINT16 codepoints[RE_MAX_FOLDED - 1]; +typedef struct { + RE_UINT16 data[RE_MAX_FOLDED]; } RE_FullCaseFolding; -/* strings. */ - +/* Strings. */ char* re_strings[] = { "-1/2", "0", @@ -393,6 +392,8 @@ char* re_strings[] = { "CHEROKEESUP", "CHEROKEESUPPLEMENT", "CHESSSYMBOLS", + "CHORASMIAN", + "CHRS", "CI", "CIRCLE", "CJ", @@ -411,6 +412,7 @@ char* re_strings[] = { "CJKEXTD", "CJKEXTE", "CJKEXTF", + "CJKEXTG", "CJKRADICALSSUP", "CJKRADICALSSUPPLEMENT", "CJKSTROKES", @@ -423,6 +425,7 @@ char* re_strings[] = { "CJKUNIFIEDIDEOGRAPHSEXTENSIOND", "CJKUNIFIEDIDEOGRAPHSEXTENSIONE", "CJKUNIFIEDIDEOGRAPHSEXTENSIONF", + "CJKUNIFIEDIDEOGRAPHSEXTENSIONG", "CL", "CLOSE", "CLOSEPARENTHESIS", @@ -521,8 +524,10 @@ char* re_strings[] = { "DIACRITICALSEXT", "DIACRITICALSFORSYMBOLS", "DIACRITICALSSUP", + "DIAK", "DIGIT", "DINGBATS", + "DIVESAKURU", "DOGR", "DOGRA", "DOMINO", @@ -544,6 +549,7 @@ char* re_strings[] = { "EBASE", "EBASEGAZ", "EBG", + "ECOMP", "EGYP", "EGYPTIANHIEROGLYPHFORMATCONTROLS", "EGYPTIANHIEROGLYPHS", @@ -552,6 +558,7 @@ char* re_strings[] = { "ELYM", "ELYMAIC", "EM", + "EMOD", "EMODIFIER", "EMOJI", "EMOJICOMPONENT", @@ -570,6 +577,7 @@ char* re_strings[] = { "ENCLOSEDIDEOGRAPHICSUP", "ENCLOSEDIDEOGRAPHICSUPPLEMENT", "ENCLOSINGMARK", + "EPRES", "ES", "ET", "ETHI", @@ -590,6 +598,7 @@ char* re_strings[] = { "EXTENDEDPICTOGRAPHIC", "EXTENDER", "EXTENDNUMLET", + "EXTPICT", "F", "FALSE", "FARSIYEH", @@ -678,6 +687,8 @@ char* re_strings[] = { "HANIFIROHINGYAKINNAYA", "HANIFIROHINGYAPA", "HANO", + "HANR", + "HANREADING", "HANUNOO", "HATR", "HATRAN", @@ -781,12 +792,14 @@ char* re_strings[] = { "KHAPH", "KHAR", "KHAROSHTHI", + "KHITANSMALLSCRIPT", "KHMER", "KHMERSYMBOLS", "KHMR", "KHOJ", "KHOJKI", "KHUDAWADI", + "KITS", "KNDA", "KNOTTEDHEH", "KTHI", @@ -844,6 +857,8 @@ char* re_strings[] = { "LINEFEED", "LINESEPARATOR", "LISU", + "LISUSUP", + "LISUSUPPLEMENT", "LL", "LM", "LO", @@ -1299,6 +1314,7 @@ char* re_strings[] = { "SYMBOL", "SYMBOLSANDPICTOGRAPHSEXTA", "SYMBOLSANDPICTOGRAPHSEXTENDEDA", + "SYMBOLSFORLEGACYCOMPUTING", "SYRC", "SYRIAC", "SYRIACSUP", @@ -1326,6 +1342,8 @@ char* re_strings[] = { "TANG", "TANGUT", "TANGUTCOMPONENTS", + "TANGUTSUP", + "TANGUTSUPPLEMENT", "TAVT", "TAW", "TEHMARBUTA", @@ -1350,6 +1368,7 @@ char* re_strings[] = { "TONEMARK", "TOP", "TOPANDBOTTOM", + "TOPANDBOTTOMANDLEFT", "TOPANDBOTTOMANDRIGHT", "TOPANDLEFT", "TOPANDLEFTANDRIGHT", @@ -1424,6 +1443,8 @@ char* re_strings[] = { "YEHBARREE", "YEHWITHTAIL", "YES", + "YEZI", + "YEZIDI", "YI", "YIII", "YIJING", @@ -1449,1760 +1470,1777 @@ char* re_strings[] = { "ZZZZ", }; -/* strings: 13687 bytes. */ - -/* properties. */ - +/* Properties. */ RE_Property re_properties[] = { - { 591, 0, 0}, - { 588, 0, 0}, - { 271, 1, 1}, - { 270, 1, 1}, - {1185, 2, 2}, - {1183, 2, 2}, - {1186, 3, 2}, - {1187, 3, 2}, - {1384, 4, 3}, - {1378, 4, 3}, - { 617, 5, 4}, - { 589, 5, 4}, - {1193, 6, 5}, - {1182, 6, 5}, - { 900, 7, 6}, - { 189, 8, 6}, - { 188, 8, 6}, - { 828, 9, 6}, - { 827, 9, 6}, - {1350, 10, 6}, - {1349, 10, 6}, - { 314, 11, 6}, - { 316, 12, 6}, - { 371, 12, 6}, - { 363, 13, 6}, - { 457, 13, 6}, - { 365, 14, 6}, - { 459, 14, 6}, - { 364, 15, 6}, - { 458, 15, 6}, - { 361, 16, 6}, - { 455, 16, 6}, - { 362, 17, 6}, - { 456, 17, 6}, - { 694, 18, 6}, - { 690, 18, 6}, - { 684, 19, 6}, - { 683, 19, 6}, - {1393, 20, 6}, - {1392, 20, 6}, - {1391, 21, 6}, - {1390, 21, 6}, - { 484, 22, 6}, - { 492, 22, 6}, - { 618, 23, 6}, - { 626, 23, 6}, - { 616, 24, 6}, - { 620, 24, 6}, - { 619, 25, 6}, - { 627, 25, 6}, - {1380, 26, 6}, - {1388, 26, 6}, - {1231, 26, 6}, - { 263, 27, 6}, - { 261, 27, 6}, - { 730, 28, 6}, - { 728, 28, 6}, - { 477, 29, 6}, - { 681, 30, 6}, - {1147, 31, 6}, - {1144, 31, 6}, - {1311, 32, 6}, - {1310, 32, 6}, - {1071, 33, 6}, - {1050, 33, 6}, - { 667, 34, 6}, - { 666, 34, 6}, - { 221, 35, 6}, - { 177, 35, 6}, - {1064, 36, 6}, - {1030, 36, 6}, - { 686, 37, 6}, - { 685, 37, 6}, - { 494, 38, 6}, - { 493, 38, 6}, - { 566, 39, 6}, - { 563, 39, 6}, - {1070, 40, 6}, - {1049, 40, 6}, - {1076, 41, 6}, - {1078, 41, 6}, - {1003, 42, 6}, - { 980, 42, 6}, - {1066, 43, 6}, - {1035, 43, 6}, - { 692, 44, 6}, - { 691, 44, 6}, - { 695, 45, 6}, - { 693, 45, 6}, - {1149, 46, 6}, - {1346, 47, 6}, - {1342, 47, 6}, - {1065, 48, 6}, - {1032, 48, 6}, - { 486, 49, 6}, - { 485, 49, 6}, - {1222, 50, 6}, - {1188, 50, 6}, - { 826, 51, 6}, - { 825, 51, 6}, - {1068, 52, 6}, - {1037, 52, 6}, - {1067, 53, 6}, - {1036, 53, 6}, - {1194, 54, 6}, - {1240, 54, 6}, - {1355, 55, 6}, - {1371, 55, 6}, - {1090, 56, 6}, - {1091, 56, 6}, - {1089, 57, 6}, - {1088, 57, 6}, - {1129, 58, 6}, - {1095, 58, 6}, - {1150, 59, 6}, - {1155, 59, 6}, - { 650, 60, 7}, - { 678, 60, 7}, - { 262, 61, 8}, - { 251, 61, 8}, - { 308, 62, 9}, - { 320, 62, 9}, - { 483, 63, 10}, - { 510, 63, 10}, - { 517, 64, 11}, - { 515, 64, 11}, - { 732, 65, 12}, - { 726, 65, 12}, - { 733, 66, 13}, - { 734, 66, 13}, - { 818, 67, 14}, - { 793, 67, 14}, - {1023, 68, 15}, - {1016, 68, 15}, - {1024, 69, 16}, - {1027, 69, 16}, - { 265, 70, 6}, - { 264, 70, 6}, - { 699, 71, 17}, - { 707, 71, 17}, - { 701, 72, 18}, - { 708, 72, 18}, - { 531, 73, 19}, - { 535, 74, 19}, - { 533, 75, 19}, - { 534, 76, 19}, - { 532, 77, 19}, - { 565, 78, 19}, - { 990, 79, 20}, - { 989, 79, 20}, - { 988, 80, 21}, - { 987, 80, 21}, - { 994, 81, 20}, - { 993, 81, 20}, - { 992, 82, 21}, - { 991, 82, 21}, - { 192, 83, 6}, - { 187, 83, 6}, - { 200, 84, 6}, - { 269, 85, 6}, - { 615, 86, 6}, - {1130, 87, 6}, - {1383, 88, 6}, - {1389, 89, 6}, - {1121, 90, 6}, - {1120, 91, 6}, - {1122, 92, 6}, - {1123, 93, 6}, -}; - -/* properties: 672 bytes. */ - -/* property values. */ - + { 189, 0, 0}, /* ALPHABETIC */ + { 188, 0, 0}, /* ALPHA */ + { 192, 1, 0}, /* ALPHANUMERIC */ + { 187, 1, 0}, /* ALNUM */ + { 200, 2, 0}, /* ANY */ + { 221, 3, 0}, /* ASCIIHEXDIGIT */ + { 177, 3, 0}, /* AHEX */ + { 262, 4, 1}, /* BIDICLASS */ + { 251, 4, 1}, /* BC */ + { 263, 5, 0}, /* BIDICONTROL */ + { 261, 5, 0}, /* BIDIC */ + { 265, 6, 0}, /* BIDIMIRRORED */ + { 264, 6, 0}, /* BIDIM */ + { 269, 7, 0}, /* BLANK */ + { 271, 8, 2}, /* BLOCK */ + { 270, 8, 2}, /* BLK */ + { 308, 9, 3}, /* CANONICALCOMBININGCLASS */ + { 320, 9, 3}, /* CCC */ + { 314, 10, 0}, /* CASED */ + { 316, 11, 0}, /* CASEIGNORABLE */ + { 373, 11, 0}, /* CI */ + { 361, 12, 0}, /* CHANGESWHENCASEFOLDED */ + { 459, 12, 0}, /* CWCF */ + { 362, 13, 0}, /* CHANGESWHENCASEMAPPED */ + { 460, 13, 0}, /* CWCM */ + { 363, 14, 0}, /* CHANGESWHENLOWERCASED */ + { 461, 14, 0}, /* CWL */ + { 364, 15, 0}, /* CHANGESWHENTITLECASED */ + { 462, 15, 0}, /* CWT */ + { 365, 16, 0}, /* CHANGESWHENUPPERCASED */ + { 463, 16, 0}, /* CWU */ + { 481, 17, 0}, /* DASH */ + { 487, 18, 4}, /* DECOMPOSITIONTYPE */ + { 516, 18, 4}, /* DT */ + { 488, 19, 0}, /* DEFAULTIGNORABLECODEPOINT */ + { 496, 19, 0}, /* DI */ + { 490, 20, 0}, /* DEPRECATED */ + { 489, 20, 0}, /* DEP */ + { 498, 21, 0}, /* DIACRITIC */ + { 497, 21, 0}, /* DIA */ + { 523, 22, 5}, /* EASTASIANWIDTH */ + { 521, 22, 5}, /* EA */ + { 539, 23, 0}, /* EMOJI */ + { 540, 24, 0}, /* EMOJICOMPONENT */ + { 528, 24, 0}, /* ECOMP */ + { 541, 25, 0}, /* EMOJIMODIFIER */ + { 537, 25, 0}, /* EMOD */ + { 542, 26, 0}, /* EMOJIMODIFIERBASE */ + { 525, 26, 0}, /* EBASE */ + { 543, 27, 0}, /* EMOJIPRESENTATION */ + { 556, 27, 0}, /* EPRES */ + { 574, 28, 0}, /* EXTENDEDPICTOGRAPHIC */ + { 577, 28, 0}, /* EXTPICT */ + { 575, 29, 0}, /* EXTENDER */ + { 572, 29, 0}, /* EXT */ + { 601, 30, 6}, /* GENERALCATEGORY */ + { 598, 30, 6}, /* GC */ + { 625, 31, 0}, /* GRAPH */ + { 626, 32, 0}, /* GRAPHEMEBASE */ + { 630, 32, 0}, /* GRBASE */ + { 627, 33, 7}, /* GRAPHEMECLUSTERBREAK */ + { 599, 33, 7}, /* GCB */ + { 628, 34, 0}, /* GRAPHEMEEXTEND */ + { 636, 34, 0}, /* GREXT */ + { 629, 35, 0}, /* GRAPHEMELINK */ + { 637, 35, 0}, /* GRLINK */ + { 660, 36, 8}, /* HANGULSYLLABLETYPE */ + { 690, 36, 8}, /* HST */ + { 679, 37, 0}, /* HEXDIGIT */ + { 678, 37, 0}, /* HEX */ + { 693, 38, 0}, /* HYPHEN */ + { 696, 39, 0}, /* IDCONTINUE */ + { 695, 39, 0}, /* IDC */ + { 698, 40, 0}, /* IDEOGRAPHIC */ + { 697, 40, 0}, /* IDEO */ + { 704, 41, 0}, /* IDSBINARYOPERATOR */ + { 703, 41, 0}, /* IDSB */ + { 706, 42, 0}, /* IDSTART */ + { 702, 42, 0}, /* IDS */ + { 707, 43, 0}, /* IDSTRINARYOPERATOR */ + { 705, 43, 0}, /* IDST */ + { 711, 44, 9}, /* INDICPOSITIONALCATEGORY */ + { 719, 44, 9}, /* INPC */ + { 713, 45, 10}, /* INDICSYLLABICCATEGORY */ + { 720, 45, 10}, /* INSC */ + { 742, 46, 0}, /* JOINCONTROL */ + { 740, 46, 0}, /* JOINC */ + { 744, 47, 11}, /* JOININGGROUP */ + { 738, 47, 11}, /* JG */ + { 745, 48, 12}, /* JOININGTYPE */ + { 746, 48, 12}, /* JT */ + { 832, 49, 13}, /* LINEBREAK */ + { 807, 49, 13}, /* LB */ + { 842, 50, 0}, /* LOGICALORDEREXCEPTION */ + { 841, 50, 0}, /* LOE */ + { 844, 51, 0}, /* LOWERCASE */ + { 843, 51, 0}, /* LOWER */ + { 916, 52, 0}, /* MATH */ + {1004, 53, 14}, /* NFCQUICKCHECK */ + {1003, 53, 14}, /* NFCQC */ + {1006, 54, 15}, /* NFDQUICKCHECK */ + {1005, 54, 15}, /* NFDQC */ + {1008, 55, 14}, /* NFKCQUICKCHECK */ + {1007, 55, 14}, /* NFKCQC */ + {1010, 56, 15}, /* NFKDQUICKCHECK */ + {1009, 56, 15}, /* NFKDQC */ + {1019, 57, 0}, /* NONCHARACTERCODEPOINT */ + { 996, 57, 0}, /* NCHAR */ + {1039, 58, 16}, /* NUMERICTYPE */ + {1032, 58, 16}, /* NT */ + {1040, 59, 17}, /* NUMERICVALUE */ + {1043, 59, 17}, /* NV */ + {1080, 60, 0}, /* OTHERALPHABETIC */ + {1046, 60, 0}, /* OALPHA */ + {1081, 61, 0}, /* OTHERDEFAULTIGNORABLECODEPOINT */ + {1048, 61, 0}, /* ODI */ + {1082, 62, 0}, /* OTHERGRAPHEMEEXTEND */ + {1051, 62, 0}, /* OGREXT */ + {1083, 63, 0}, /* OTHERIDCONTINUE */ + {1052, 63, 0}, /* OIDC */ + {1084, 64, 0}, /* OTHERIDSTART */ + {1053, 64, 0}, /* OIDS */ + {1086, 65, 0}, /* OTHERLOWERCASE */ + {1065, 65, 0}, /* OLOWER */ + {1087, 66, 0}, /* OTHERMATH */ + {1066, 66, 0}, /* OMATH */ + {1092, 67, 0}, /* OTHERUPPERCASE */ + {1094, 67, 0}, /* OUPPER */ + {1105, 68, 0}, /* PATTERNSYNTAX */ + {1104, 68, 0}, /* PATSYN */ + {1106, 69, 0}, /* PATTERNWHITESPACE */ + {1107, 69, 0}, /* PATWS */ + {1136, 70, 0}, /* POSIXALNUM */ + {1137, 71, 0}, /* POSIXDIGIT */ + {1138, 72, 0}, /* POSIXPUNCT */ + {1139, 73, 0}, /* POSIXXDIGIT */ + {1145, 74, 0}, /* PREPENDEDCONCATENATIONMARK */ + {1111, 74, 0}, /* PCM */ + {1146, 75, 0}, /* PRINT */ + {1163, 76, 0}, /* QUOTATIONMARK */ + {1160, 76, 0}, /* QMARK */ + {1165, 77, 0}, /* RADICAL */ + {1166, 78, 0}, /* REGIONALINDICATOR */ + {1171, 78, 0}, /* RI */ + {1201, 79, 18}, /* SCRIPT */ + {1199, 79, 18}, /* SC */ + {1202, 80, 18}, /* SCRIPTEXTENSIONS */ + {1203, 80, 18}, /* SCX */ + {1209, 81, 19}, /* SENTENCEBREAK */ + {1198, 81, 19}, /* SB */ + {1210, 82, 0}, /* SENTENCETERMINAL */ + {1256, 82, 0}, /* STERM */ + {1238, 83, 0}, /* SOFTDOTTED */ + {1204, 83, 0}, /* SD */ + {1330, 84, 0}, /* TERMINALPUNCTUATION */ + {1329, 84, 0}, /* TERM */ + {1366, 85, 0}, /* UNIFIEDIDEOGRAPH */ + {1362, 85, 0}, /* UIDEO */ + {1370, 86, 0}, /* UPPERCASE */ + {1369, 86, 0}, /* UPPER */ + {1375, 87, 0}, /* VARIATIONSELECTOR */ + {1391, 87, 0}, /* VS */ + {1400, 88, 0}, /* WHITESPACE */ + {1408, 88, 0}, /* WSPACE */ + {1247, 88, 0}, /* SPACE */ + {1403, 89, 0}, /* WORD */ + {1404, 90, 20}, /* WORDBREAK */ + {1398, 90, 20}, /* WB */ + {1409, 91, 0}, /* XDIGIT */ + {1411, 92, 0}, /* XIDCONTINUE */ + {1410, 92, 0}, /* XIDC */ + {1413, 93, 0}, /* XIDSTART */ + {1412, 93, 0}, /* XIDS */ +}; + +/* Property values. */ RE_PropertyValue re_property_values[] = { - {1343, 0, 0}, - { 406, 0, 0}, - {1351, 0, 1}, - { 835, 0, 1}, - { 829, 0, 2}, - { 822, 0, 2}, - {1323, 0, 3}, - { 834, 0, 3}, - { 946, 0, 4}, - { 823, 0, 4}, - {1069, 0, 5}, - { 824, 0, 5}, - {1007, 0, 6}, - { 944, 0, 6}, - { 547, 0, 7}, - { 910, 0, 7}, - {1233, 0, 8}, - { 909, 0, 8}, - { 482, 0, 9}, - { 981, 0, 9}, - { 499, 0, 9}, - { 808, 0, 10}, - { 998, 0, 10}, - {1073, 0, 11}, - { 999, 0, 11}, - {1232, 0, 12}, - {1419, 0, 12}, - { 820, 0, 13}, - {1417, 0, 13}, - {1087, 0, 14}, - {1418, 0, 14}, - { 439, 0, 15}, - { 319, 0, 15}, - { 407, 0, 15}, - { 580, 0, 16}, - { 358, 0, 16}, - {1131, 0, 17}, - { 408, 0, 17}, - {1267, 0, 18}, - { 449, 0, 18}, - { 478, 0, 19}, - {1096, 0, 19}, - {1053, 0, 20}, - {1134, 0, 20}, - { 404, 0, 21}, - {1099, 0, 21}, - { 424, 0, 22}, - {1094, 0, 22}, - {1074, 0, 23}, - {1117, 0, 23}, - { 905, 0, 24}, - {1214, 0, 24}, - { 453, 0, 25}, - {1183, 0, 25}, - { 948, 0, 26}, - {1213, 0, 26}, - {1075, 0, 27}, - {1221, 0, 27}, - { 706, 0, 28}, - {1114, 0, 28}, - { 575, 0, 29}, - {1101, 0, 29}, - {1063, 0, 30}, - { 301, 0, 30}, - { 302, 0, 30}, - { 806, 0, 31}, - { 769, 0, 31}, - { 770, 0, 31}, - { 898, 0, 32}, - { 844, 0, 32}, - { 415, 0, 32}, - { 845, 0, 32}, - {1019, 0, 33}, - { 968, 0, 33}, - { 969, 0, 33}, - {1138, 0, 34}, - {1082, 0, 34}, - {1137, 0, 34}, - {1083, 0, 34}, - {1274, 0, 35}, - {1172, 0, 35}, - {1173, 0, 35}, - {1196, 0, 36}, - {1410, 0, 36}, - {1411, 0, 36}, - { 315, 0, 37}, - { 794, 0, 37}, - { 222, 0, 38}, - {1000, 1, 0}, - { 978, 1, 0}, - { 245, 1, 1}, - { 220, 1, 1}, - { 779, 1, 2}, - { 778, 1, 2}, - { 777, 1, 2}, - { 786, 1, 3}, - { 780, 1, 3}, - { 788, 1, 4}, - { 782, 1, 4}, - { 716, 1, 5}, - { 715, 1, 5}, - {1234, 1, 6}, - { 947, 1, 6}, - { 410, 1, 7}, - { 495, 1, 7}, - { 622, 1, 8}, - { 621, 1, 8}, - { 462, 1, 9}, - { 470, 1, 10}, - { 469, 1, 10}, - { 471, 1, 10}, - { 216, 1, 11}, - { 661, 1, 12}, - { 203, 1, 13}, - {1278, 1, 14}, - { 215, 1, 15}, - { 214, 1, 15}, - {1316, 1, 16}, - { 996, 1, 17}, - {1177, 1, 18}, - { 865, 1, 19}, - {1280, 1, 20}, - {1279, 1, 20}, - { 205, 1, 21}, - { 204, 1, 21}, - { 489, 1, 22}, - { 257, 1, 23}, - { 631, 1, 24}, - { 628, 1, 25}, - {1055, 1, 26}, - {1297, 1, 27}, - {1309, 1, 28}, - { 749, 1, 29}, - { 852, 1, 30}, - {1211, 1, 31}, - {1317, 1, 32}, - { 774, 1, 33}, - {1318, 1, 34}, - { 962, 1, 35}, - { 597, 1, 36}, - { 646, 1, 37}, - { 721, 1, 37}, - { 551, 1, 38}, - { 557, 1, 39}, - { 556, 1, 39}, - { 367, 1, 40}, - {1344, 1, 41}, - {1338, 1, 41}, - { 306, 1, 41}, - {1034, 1, 42}, - {1170, 1, 43}, - {1283, 1, 44}, - { 656, 1, 45}, - { 297, 1, 46}, - {1285, 1, 47}, - { 759, 1, 48}, - { 952, 1, 49}, - {1345, 1, 50}, - {1339, 1, 50}, - { 811, 1, 51}, - {1288, 1, 52}, - { 985, 1, 53}, - { 760, 1, 54}, - { 295, 1, 55}, - {1289, 1, 56}, - { 411, 1, 57}, - { 496, 1, 57}, - { 240, 1, 58}, - {1244, 1, 59}, - { 248, 1, 60}, - { 805, 1, 61}, - {1038, 1, 62}, - { 468, 1, 63}, - { 465, 1, 63}, - { 599, 1, 64}, - { 598, 1, 64}, - {1246, 1, 65}, - {1245, 1, 65}, - {1359, 1, 66}, - {1358, 1, 66}, - {1111, 1, 67}, - {1110, 1, 67}, - {1112, 1, 68}, - {1113, 1, 68}, - { 413, 1, 69}, - { 498, 1, 69}, - { 787, 1, 70}, - { 781, 1, 70}, - { 624, 1, 71}, - { 623, 1, 71}, - { 592, 1, 72}, - {1138, 1, 72}, - {1253, 1, 73}, - {1252, 1, 73}, - { 454, 1, 74}, - { 412, 1, 75}, - { 497, 1, 75}, - { 416, 1, 75}, - { 807, 1, 76}, - {1020, 1, 77}, - { 219, 1, 78}, - { 903, 1, 79}, - { 904, 1, 79}, - { 936, 1, 80}, - { 941, 1, 80}, - { 440, 1, 81}, - {1054, 1, 82}, - {1031, 1, 82}, - { 540, 1, 83}, - { 539, 1, 83}, - { 282, 1, 84}, - { 272, 1, 85}, - { 593, 1, 86}, - { 933, 1, 87}, - { 940, 1, 87}, - { 500, 1, 88}, - { 931, 1, 89}, - { 937, 1, 89}, - {1255, 1, 90}, - {1248, 1, 90}, - { 289, 1, 91}, - { 288, 1, 91}, - {1256, 1, 92}, - {1249, 1, 92}, - { 932, 1, 93}, - { 938, 1, 93}, - {1258, 1, 94}, - {1254, 1, 94}, - { 934, 1, 95}, - { 930, 1, 95}, - { 604, 1, 96}, - { 789, 1, 97}, - { 783, 1, 97}, - { 442, 1, 98}, - { 601, 1, 99}, - { 600, 1, 99}, - {1320, 1, 100}, - { 554, 1, 101}, - { 552, 1, 101}, - { 466, 1, 102}, - { 463, 1, 102}, - {1259, 1, 103}, - {1265, 1, 103}, - { 390, 1, 104}, - { 389, 1, 104}, - { 748, 1, 105}, - { 747, 1, 105}, - { 687, 1, 106}, - { 683, 1, 106}, - { 393, 1, 107}, - { 392, 1, 107}, - { 672, 1, 108}, - { 751, 1, 109}, - { 275, 1, 110}, - { 645, 1, 111}, - { 421, 1, 111}, - { 746, 1, 112}, - { 277, 1, 113}, - { 276, 1, 113}, - { 391, 1, 114}, - { 754, 1, 115}, - { 752, 1, 115}, - { 544, 1, 116}, - { 543, 1, 116}, - { 377, 1, 117}, - { 375, 1, 117}, - { 395, 1, 118}, - { 383, 1, 118}, - {1405, 1, 119}, - {1404, 1, 119}, - { 394, 1, 120}, - { 374, 1, 120}, - {1407, 1, 121}, - {1406, 1, 122}, - { 821, 1, 123}, - {1353, 1, 124}, - { 467, 1, 125}, - { 464, 1, 125}, - { 242, 1, 126}, - { 949, 1, 127}, - { 790, 1, 128}, - { 784, 1, 128}, - {1273, 1, 129}, - { 418, 1, 130}, - { 698, 1, 130}, - {1103, 1, 131}, - {1181, 1, 132}, - { 491, 1, 133}, - { 490, 1, 133}, - { 755, 1, 134}, - {1153, 1, 135}, - { 647, 1, 136}, - { 722, 1, 136}, - { 725, 1, 137}, - { 966, 1, 138}, - { 964, 1, 138}, - { 360, 1, 139}, - { 965, 1, 140}, - { 963, 1, 140}, - {1290, 1, 141}, - { 918, 1, 142}, - { 917, 1, 142}, - { 555, 1, 143}, - { 553, 1, 143}, - { 791, 1, 144}, - { 785, 1, 144}, - { 369, 1, 145}, - { 368, 1, 145}, - { 916, 1, 146}, - { 649, 1, 147}, - { 644, 1, 147}, - { 648, 1, 148}, - { 723, 1, 148}, - { 670, 1, 149}, - { 668, 1, 150}, - { 669, 1, 150}, - { 830, 1, 151}, - {1132, 1, 152}, - {1136, 1, 152}, - {1131, 1, 152}, - { 379, 1, 153}, - { 381, 1, 153}, - { 191, 1, 154}, - { 190, 1, 154}, - { 212, 1, 155}, - { 210, 1, 155}, - {1356, 1, 156}, - {1371, 1, 156}, - {1362, 1, 157}, - { 414, 1, 158}, - { 638, 1, 158}, - { 378, 1, 159}, - { 376, 1, 159}, - {1217, 1, 160}, - {1216, 1, 160}, - { 213, 1, 161}, - { 211, 1, 161}, - { 640, 1, 162}, - { 637, 1, 162}, - {1235, 1, 163}, - { 817, 1, 164}, - { 816, 1, 165}, - { 172, 1, 166}, - { 198, 1, 167}, - { 199, 1, 168}, - {1105, 1, 169}, - {1104, 1, 169}, - { 841, 1, 170}, - { 312, 1, 171}, - { 443, 1, 172}, - {1041, 1, 173}, - { 612, 1, 174}, - {1043, 1, 175}, - {1341, 1, 176}, - {1044, 1, 177}, - { 487, 1, 178}, - {1200, 1, 179}, - {1062, 1, 180}, - {1059, 1, 181}, - { 526, 1, 182}, - { 317, 1, 183}, - { 814, 1, 184}, - { 461, 1, 185}, - { 696, 1, 186}, - {1086, 1, 187}, - { 971, 1, 188}, - { 658, 1, 189}, - {1109, 1, 190}, - { 843, 1, 191}, - { 924, 1, 192}, - { 923, 1, 193}, - { 758, 1, 194}, - {1046, 1, 195}, - {1042, 1, 196}, - { 868, 1, 197}, - { 234, 1, 198}, - { 710, 1, 199}, - { 709, 1, 200}, - {1135, 1, 201}, - {1047, 1, 202}, - {1040, 1, 203}, - { 652, 1, 204}, - {1169, 1, 205}, - {1168, 1, 205}, - {1045, 1, 206}, - {1224, 1, 207}, - { 528, 1, 208}, - { 285, 1, 209}, - { 738, 1, 210}, - {1227, 1, 211}, - { 359, 1, 212}, - { 846, 1, 213}, - {1199, 1, 214}, - {1212, 1, 215}, - { 763, 1, 216}, - { 959, 1, 217}, - { 764, 1, 218}, - { 614, 1, 219}, - { 983, 1, 220}, - {1322, 1, 221}, - {1206, 1, 222}, - { 945, 1, 223}, - { 954, 1, 224}, - { 953, 1, 224}, - {1294, 1, 225}, - { 178, 1, 226}, - { 502, 1, 227}, - {1376, 1, 228}, - { 974, 1, 229}, - {1413, 1, 230}, - {1229, 1, 231}, - {1093, 1, 232}, - { 259, 1, 233}, - { 897, 1, 234}, - { 899, 1, 235}, - { 630, 1, 236}, - { 851, 1, 237}, - {1299, 1, 238}, - {1298, 1, 238}, - { 450, 1, 239}, - { 452, 1, 240}, - { 451, 1, 240}, - { 516, 1, 241}, - { 524, 1, 242}, - { 523, 1, 243}, - { 195, 1, 244}, - { 244, 1, 245}, - { 243, 1, 245}, - { 955, 1, 246}, - { 247, 1, 247}, - {1084, 1, 248}, - { 912, 1, 249}, - { 925, 1, 250}, - { 689, 1, 251}, - { 688, 1, 251}, - {1302, 1, 252}, - {1303, 1, 253}, - { 744, 1, 254}, - { 743, 1, 254}, - { 742, 1, 255}, - { 741, 1, 255}, - {1219, 1, 256}, - {1218, 1, 256}, - {1026, 1, 257}, - { 513, 1, 258}, - {1203, 1, 259}, - { 300, 1, 260}, - { 299, 1, 260}, - { 961, 1, 261}, - { 960, 1, 261}, - { 197, 1, 262}, - { 196, 1, 262}, - { 906, 1, 263}, - {1292, 1, 264}, - {1291, 1, 264}, - { 445, 1, 265}, - { 444, 1, 265}, - { 902, 1, 266}, - { 901, 1, 266}, - {1268, 1, 267}, - { 606, 1, 268}, - { 605, 1, 268}, - {1029, 1, 269}, - {1374, 1, 270}, - { 920, 1, 271}, - { 170, 1, 272}, - { 700, 1, 273}, - {1077, 1, 274}, - { 208, 1, 275}, - { 207, 1, 275}, - { 849, 1, 276}, - { 848, 1, 276}, - { 504, 1, 277}, - { 503, 1, 277}, - {1115, 1, 278}, - { 541, 1, 279}, - { 542, 1, 279}, - { 546, 1, 280}, - { 545, 1, 280}, - { 935, 1, 281}, - { 939, 1, 281}, - { 536, 1, 282}, - {1057, 1, 283}, - {1335, 1, 284}, - {1334, 1, 284}, - { 184, 1, 285}, - { 183, 1, 285}, - { 595, 1, 286}, - { 594, 1, 286}, - {1257, 1, 287}, - {1250, 1, 287}, - {1260, 1, 288}, - {1266, 1, 288}, - { 370, 1, 289}, - {1276, 1, 290}, - {1275, 1, 290}, - { 396, 1, 291}, - { 384, 1, 291}, - { 397, 1, 292}, - { 385, 1, 292}, - { 398, 1, 293}, - { 386, 1, 293}, - { 399, 1, 294}, - { 387, 1, 294}, - { 400, 1, 295}, - { 388, 1, 295}, - { 380, 1, 296}, - { 382, 1, 296}, - {1286, 1, 297}, - {1357, 1, 298}, - {1372, 1, 298}, - {1261, 1, 299}, - {1263, 1, 299}, - {1262, 1, 300}, - {1264, 1, 300}, - {1347, 2, 0}, - {1424, 2, 0}, - { 417, 2, 1}, - {1423, 2, 1}, - { 776, 2, 2}, - { 792, 2, 2}, - { 621, 2, 3}, - { 625, 2, 3}, - { 462, 2, 4}, - { 472, 2, 4}, - { 216, 2, 5}, - { 218, 2, 5}, - { 661, 2, 6}, - { 660, 2, 6}, - { 203, 2, 7}, - { 202, 2, 7}, - {1278, 2, 8}, - {1277, 2, 8}, - {1316, 2, 9}, - {1315, 2, 9}, - { 489, 2, 10}, - { 488, 2, 10}, - { 257, 2, 11}, - { 256, 2, 11}, - { 631, 2, 12}, - { 632, 2, 12}, - { 628, 2, 13}, - { 629, 2, 13}, - {1055, 2, 14}, - {1058, 2, 14}, - {1297, 2, 15}, - {1300, 2, 15}, - {1309, 2, 16}, - {1308, 2, 16}, - { 749, 2, 17}, - { 765, 2, 17}, - { 852, 2, 18}, - { 943, 2, 18}, - {1211, 2, 19}, - {1210, 2, 19}, - {1317, 2, 20}, - { 774, 2, 21}, - { 775, 2, 21}, - {1318, 2, 22}, - {1319, 2, 22}, - { 962, 2, 23}, - { 967, 2, 23}, - { 597, 2, 24}, - { 596, 2, 24}, - { 644, 2, 25}, - { 643, 2, 25}, - { 551, 2, 26}, - { 550, 2, 26}, - { 367, 2, 27}, - { 366, 2, 27}, - { 305, 2, 28}, - { 309, 2, 28}, - {1034, 2, 29}, - {1033, 2, 29}, - {1170, 2, 30}, - {1171, 2, 30}, - { 759, 2, 31}, - { 761, 2, 31}, - { 952, 2, 32}, - { 951, 2, 32}, - { 672, 2, 33}, - { 671, 2, 33}, - { 751, 2, 34}, - { 740, 2, 34}, - { 275, 2, 35}, - { 274, 2, 35}, - { 642, 2, 36}, - { 651, 2, 36}, - {1402, 2, 37}, - {1403, 2, 37}, - {1041, 2, 38}, - { 720, 2, 38}, - { 612, 2, 39}, - { 611, 2, 39}, - { 487, 2, 40}, - { 509, 2, 40}, - { 703, 2, 41}, - {1416, 2, 41}, - {1141, 2, 41}, - {1283, 2, 42}, - {1314, 2, 42}, - { 656, 2, 43}, - { 655, 2, 43}, - { 297, 2, 44}, - { 296, 2, 44}, - {1285, 2, 45}, - {1284, 2, 45}, - { 811, 2, 46}, - { 810, 2, 46}, - {1288, 2, 47}, - {1295, 2, 47}, - { 815, 2, 48}, - { 813, 2, 48}, - {1341, 2, 49}, - {1340, 2, 49}, - {1200, 2, 50}, - {1201, 2, 50}, - {1062, 2, 51}, - {1061, 2, 51}, - { 460, 2, 52}, - { 447, 2, 52}, - { 288, 2, 53}, - { 287, 2, 53}, - { 295, 2, 54}, - { 294, 2, 54}, - { 442, 2, 55}, - { 441, 2, 55}, - {1140, 2, 55}, - { 985, 2, 56}, - {1296, 2, 56}, - { 604, 2, 57}, - { 603, 2, 57}, - {1320, 2, 58}, - {1313, 2, 58}, - {1273, 2, 59}, - {1272, 2, 59}, - {1044, 2, 60}, - {1394, 2, 60}, - { 758, 2, 61}, - { 757, 2, 61}, - { 240, 2, 62}, - { 239, 2, 62}, - { 450, 2, 63}, - {1395, 2, 63}, - {1109, 2, 64}, - {1108, 2, 64}, - {1103, 2, 65}, - {1102, 2, 65}, - { 996, 2, 66}, - { 997, 2, 66}, - {1244, 2, 67}, - {1243, 2, 67}, - { 805, 2, 68}, - { 804, 2, 68}, - {1038, 2, 69}, - {1039, 2, 69}, - {1353, 2, 70}, - {1354, 2, 70}, - {1181, 2, 71}, - {1180, 2, 71}, - { 755, 2, 72}, - { 739, 2, 72}, - {1153, 2, 73}, - {1162, 2, 73}, - { 841, 2, 74}, - { 840, 2, 74}, - { 312, 2, 75}, - { 311, 2, 75}, - { 843, 2, 76}, - { 842, 2, 76}, - { 360, 2, 77}, - {1289, 2, 78}, - { 773, 2, 78}, - {1290, 2, 79}, - {1304, 2, 79}, - { 234, 2, 80}, - { 235, 2, 80}, - { 524, 2, 81}, - { 522, 2, 81}, - {1177, 2, 82}, - {1178, 2, 82}, - { 821, 2, 83}, - { 242, 2, 84}, - { 241, 2, 84}, - { 725, 2, 85}, - { 724, 2, 85}, - { 916, 2, 86}, - { 957, 2, 86}, - { 696, 2, 87}, - { 217, 2, 87}, - {1046, 2, 88}, - {1179, 2, 88}, - { 710, 2, 89}, - {1133, 2, 89}, - { 709, 2, 90}, - {1106, 2, 90}, - {1047, 2, 91}, - {1056, 2, 91}, - { 738, 2, 92}, - { 767, 2, 92}, - { 248, 2, 93}, - { 249, 2, 93}, - { 285, 2, 94}, - { 284, 2, 94}, - { 865, 2, 95}, - { 864, 2, 95}, - { 359, 2, 96}, - { 303, 2, 96}, - { 923, 2, 97}, - { 921, 2, 97}, - { 924, 2, 98}, - { 922, 2, 98}, - { 925, 2, 99}, - {1116, 2, 99}, - {1199, 2, 100}, - {1204, 2, 100}, - {1227, 2, 101}, - {1226, 2, 101}, - {1294, 2, 102}, - {1293, 2, 102}, - { 317, 2, 103}, - { 176, 2, 103}, - { 247, 2, 104}, - { 246, 2, 104}, - { 513, 2, 105}, - { 512, 2, 105}, - { 526, 2, 106}, - { 525, 2, 106}, - { 614, 2, 107}, - { 613, 2, 107}, - {1084, 2, 108}, - { 675, 2, 108}, - { 763, 2, 109}, - { 762, 2, 109}, - { 814, 2, 110}, - { 812, 2, 110}, - { 846, 2, 111}, - { 847, 2, 111}, - { 868, 2, 112}, - { 867, 2, 112}, - { 920, 2, 113}, - { 919, 2, 113}, - { 945, 2, 114}, - { 955, 2, 115}, - { 956, 2, 115}, - {1042, 2, 116}, - { 976, 2, 116}, - { 971, 2, 117}, - { 979, 2, 117}, - {1086, 2, 118}, - {1085, 2, 118}, - {1093, 2, 119}, - {1092, 2, 119}, - {1043, 2, 120}, - {1100, 2, 120}, - {1135, 2, 121}, - {1107, 2, 121}, - {1206, 2, 122}, - {1205, 2, 122}, - { 764, 2, 123}, - {1208, 2, 123}, - {1322, 2, 124}, - {1321, 2, 124}, - {1376, 2, 125}, - {1375, 2, 125}, - { 178, 2, 126}, - { 195, 2, 127}, - { 674, 2, 127}, - { 658, 2, 128}, - { 657, 2, 128}, - { 959, 2, 129}, - { 958, 2, 129}, - {1040, 2, 130}, - { 679, 2, 130}, - {1207, 2, 131}, - {1198, 2, 131}, - { 170, 2, 132}, - { 171, 2, 132}, - { 259, 2, 133}, - { 260, 2, 133}, - { 897, 2, 134}, - { 896, 2, 134}, - { 983, 2, 135}, - {1059, 2, 136}, - {1060, 2, 136}, - {1302, 2, 137}, - {1301, 2, 137}, - { 899, 2, 138}, - { 610, 2, 138}, - {1026, 2, 139}, - {1014, 2, 139}, - {1229, 2, 140}, - {1228, 2, 140}, - {1413, 2, 141}, - {1414, 2, 141}, - { 502, 2, 142}, - { 501, 2, 142}, - { 630, 2, 143}, - { 609, 2, 143}, - { 851, 2, 144}, - { 850, 2, 144}, - { 912, 2, 145}, - { 913, 2, 145}, - { 652, 2, 146}, - {1166, 2, 146}, - {1224, 2, 147}, - {1223, 2, 147}, - {1045, 2, 148}, - {1225, 2, 148}, - { 528, 2, 149}, - { 527, 2, 149}, - { 974, 2, 150}, - { 973, 2, 150}, - {1029, 2, 151}, - { 676, 2, 151}, - {1374, 2, 152}, - {1379, 2, 152}, - { 753, 2, 153}, - { 677, 2, 153}, - {1063, 3, 0}, - {1396, 3, 0}, - { 507, 3, 1}, - { 508, 3, 1}, - {1209, 3, 2}, - {1236, 3, 2}, - { 662, 3, 3}, - { 673, 3, 3}, - { 448, 3, 4}, - { 809, 3, 5}, - { 984, 3, 6}, - { 998, 3, 6}, - { 564, 3, 7}, - {1150, 3, 8}, - {1155, 3, 8}, - { 580, 3, 9}, - { 578, 3, 9}, - { 751, 3, 10}, - { 736, 3, 10}, - { 186, 3, 11}, - { 795, 3, 11}, - { 926, 3, 12}, - { 942, 3, 12}, - { 927, 3, 13}, - { 944, 3, 13}, - { 928, 3, 14}, - { 908, 3, 14}, - {1022, 3, 15}, - {1017, 3, 15}, - { 567, 3, 16}, - { 561, 3, 16}, - {1421, 3, 17}, - {1387, 3, 18}, - { 519, 3, 19}, - { 518, 3, 19}, - { 520, 3, 20}, - { 521, 3, 20}, - { 530, 3, 21}, - { 529, 3, 21}, - { 608, 3, 22}, - { 587, 3, 22}, - {1063, 4, 0}, - {1396, 4, 0}, - {1128, 4, 1}, - {1125, 4, 1}, - { 448, 4, 2}, - { 809, 4, 3}, - { 439, 4, 4}, - { 406, 4, 4}, - { 564, 4, 5}, - { 561, 4, 5}, - {1150, 4, 6}, - {1155, 4, 6}, - {1233, 4, 7}, - {1214, 4, 7}, - { 769, 4, 8}, - {1352, 4, 9}, - {1282, 4, 10}, - { 836, 4, 11}, - { 838, 4, 12}, - {1421, 4, 13}, - { 519, 4, 14}, - { 518, 4, 14}, - { 520, 4, 15}, - { 521, 4, 15}, - { 530, 4, 16}, - { 529, 4, 16}, - { 608, 4, 17}, - { 587, 4, 17}, - {1063, 5, 0}, - {1396, 5, 0}, - { 448, 5, 1}, - { 809, 5, 2}, - { 564, 5, 3}, - { 561, 5, 3}, - {1195, 5, 4}, - {1189, 5, 4}, - { 580, 5, 5}, - { 578, 5, 5}, - {1230, 5, 6}, - { 827, 5, 7}, - { 824, 5, 7}, - {1349, 5, 8}, - {1348, 5, 8}, - {1048, 5, 9}, - { 795, 5, 9}, - {1022, 5, 10}, - {1017, 5, 10}, - { 228, 5, 11}, - { 223, 5, 11}, - {1240, 5, 12}, - {1239, 5, 12}, - { 402, 5, 13}, - { 401, 5, 13}, - {1184, 5, 14}, - {1183, 5, 14}, - { 999, 6, 0}, - { 968, 6, 0}, - { 568, 6, 0}, - { 569, 6, 0}, - {1401, 6, 1}, - {1397, 6, 1}, - {1282, 6, 1}, - {1336, 6, 1}, - {1010, 7, 0}, - { 970, 7, 0}, - { 796, 7, 1}, - { 769, 7, 1}, - {1369, 7, 2}, - {1352, 7, 2}, - {1332, 7, 3}, - {1282, 7, 3}, - { 837, 7, 4}, - { 836, 7, 4}, - { 839, 7, 5}, - { 838, 7, 5}, - { 800, 8, 0}, - { 769, 8, 0}, - {1158, 8, 1}, - {1148, 8, 1}, - { 558, 8, 2}, - { 537, 8, 2}, - { 559, 8, 3}, - { 548, 8, 3}, - { 560, 8, 4}, - { 549, 8, 4}, - { 209, 8, 5}, - { 194, 8, 5}, - { 419, 8, 6}, - { 449, 8, 6}, - {1087, 8, 7}, - { 236, 8, 7}, - {1191, 8, 8}, - {1172, 8, 8}, - {1380, 8, 9}, - {1386, 8, 9}, - {1072, 8, 10}, - {1051, 8, 10}, - { 281, 8, 11}, - { 273, 8, 11}, - {1007, 8, 12}, - {1015, 8, 12}, - { 206, 8, 13}, - { 181, 8, 13}, - { 803, 8, 14}, - { 833, 8, 14}, - {1161, 8, 15}, - {1165, 8, 15}, - { 801, 8, 16}, - { 831, 8, 16}, - {1159, 8, 17}, - {1163, 8, 17}, - {1118, 8, 18}, - {1097, 8, 18}, - { 802, 8, 19}, - { 832, 8, 19}, - {1160, 8, 20}, - {1164, 8, 20}, - { 577, 8, 21}, - { 583, 8, 21}, - {1119, 8, 22}, - {1098, 8, 22}, - {1011, 9, 0}, - { 1, 9, 0}, - {1012, 9, 0}, - {1080, 9, 1}, - { 2, 9, 1}, - {1079, 9, 1}, - {1018, 9, 2}, - { 142, 9, 2}, - { 995, 9, 2}, - { 745, 9, 3}, - { 151, 9, 3}, - { 768, 9, 3}, - {1363, 9, 4}, - { 158, 9, 4}, - {1370, 9, 4}, - { 321, 9, 5}, - { 21, 9, 5}, - { 324, 9, 6}, - { 33, 9, 6}, - { 326, 9, 7}, - { 37, 9, 7}, - { 329, 9, 8}, - { 40, 9, 8}, - { 333, 9, 9}, - { 45, 9, 9}, - { 334, 9, 10}, - { 46, 9, 10}, - { 335, 9, 11}, - { 48, 9, 11}, - { 336, 9, 12}, - { 49, 9, 12}, - { 337, 9, 13}, - { 51, 9, 13}, - { 338, 9, 14}, - { 52, 9, 14}, - { 339, 9, 15}, - { 56, 9, 15}, - { 340, 9, 16}, - { 63, 9, 16}, - { 341, 9, 17}, - { 68, 9, 17}, - { 342, 9, 18}, - { 74, 9, 18}, - { 343, 9, 19}, - { 79, 9, 19}, - { 344, 9, 20}, - { 81, 9, 20}, - { 345, 9, 21}, - { 82, 9, 21}, - { 346, 9, 22}, - { 83, 9, 22}, - { 347, 9, 23}, - { 84, 9, 23}, - { 348, 9, 24}, - { 85, 9, 24}, - { 349, 9, 25}, - { 95, 9, 25}, - { 350, 9, 26}, - { 100, 9, 26}, - { 351, 9, 27}, - { 101, 9, 27}, - { 352, 9, 28}, - { 102, 9, 28}, - { 353, 9, 29}, - { 103, 9, 29}, - { 354, 9, 30}, - { 104, 9, 30}, - { 355, 9, 31}, - { 105, 9, 31}, - { 356, 9, 32}, - { 157, 9, 32}, - { 357, 9, 33}, - { 165, 9, 33}, - { 322, 9, 34}, - { 31, 9, 34}, - { 323, 9, 35}, - { 32, 9, 35}, - { 325, 9, 36}, - { 36, 9, 36}, - { 327, 9, 37}, - { 38, 9, 37}, - { 328, 9, 38}, - { 39, 9, 38}, - { 330, 9, 39}, - { 42, 9, 39}, - { 331, 9, 40}, - { 43, 9, 40}, - { 231, 9, 41}, - { 62, 9, 41}, - { 226, 9, 41}, - { 229, 9, 42}, - { 64, 9, 42}, - { 224, 9, 42}, - { 230, 9, 43}, - { 65, 9, 43}, - { 225, 9, 43}, - { 254, 9, 44}, - { 67, 9, 44}, - { 268, 9, 44}, - { 253, 9, 45}, - { 69, 9, 45}, - { 236, 9, 45}, - { 255, 9, 46}, - { 70, 9, 46}, - { 283, 9, 46}, - { 797, 9, 47}, - { 71, 9, 47}, - { 769, 9, 47}, - {1156, 9, 48}, - { 72, 9, 48}, - {1148, 9, 48}, - { 168, 9, 49}, - { 73, 9, 49}, - { 181, 9, 49}, - { 167, 9, 50}, - { 75, 9, 50}, - { 166, 9, 50}, - { 169, 9, 51}, - { 76, 9, 51}, - { 201, 9, 51}, - { 506, 9, 52}, - { 77, 9, 52}, - { 479, 9, 52}, - { 505, 9, 53}, - { 78, 9, 53}, - { 474, 9, 53}, - { 714, 9, 54}, - { 80, 9, 54}, - { 717, 9, 54}, - { 332, 9, 55}, - { 44, 9, 55}, - { 232, 9, 56}, - { 57, 9, 56}, - { 227, 9, 56}, - {1004, 10, 0}, - { 307, 10, 1}, - { 304, 10, 1}, - { 420, 10, 2}, - { 409, 10, 2}, - { 579, 10, 3}, - {1001, 10, 4}, - { 978, 10, 4}, - { 705, 10, 5}, - { 704, 10, 5}, - { 914, 10, 6}, - { 911, 10, 6}, - { 574, 10, 7}, - { 573, 10, 7}, - { 719, 10, 8}, - { 718, 10, 8}, - { 372, 10, 9}, - { 538, 10, 9}, - {1251, 10, 10}, - {1247, 10, 10}, - {1242, 10, 11}, - {1361, 10, 12}, - {1360, 10, 12}, - {1381, 10, 13}, - { 977, 10, 14}, - { 975, 10, 14}, - {1215, 10, 15}, - {1220, 10, 15}, - {1238, 10, 16}, - {1237, 10, 16}, - { 582, 10, 17}, - { 581, 10, 17}, - { 982, 11, 0}, - { 968, 11, 0}, - { 193, 11, 1}, - { 166, 11, 1}, - { 639, 11, 2}, - { 633, 11, 2}, - {1381, 11, 3}, - {1373, 11, 3}, - { 584, 11, 4}, - { 568, 11, 4}, - { 977, 11, 5}, - { 970, 11, 5}, - {1002, 12, 0}, - { 180, 12, 1}, - { 182, 12, 2}, - { 185, 12, 3}, - { 252, 12, 4}, - { 258, 12, 5}, - { 475, 12, 6}, - { 476, 12, 7}, - { 514, 12, 8}, - { 572, 12, 9}, - { 576, 12, 10}, - { 585, 12, 11}, - { 586, 12, 12}, - { 636, 12, 13}, - { 641, 12, 14}, - {1307, 12, 14}, - { 659, 12, 15}, - { 663, 12, 16}, - { 664, 12, 17}, - { 665, 12, 18}, - { 737, 12, 19}, - { 750, 12, 20}, - { 766, 12, 21}, - { 771, 12, 22}, - { 772, 12, 23}, - { 915, 12, 24}, - { 929, 12, 25}, - {1009, 12, 26}, - {1025, 12, 27}, - {1099, 12, 28}, - {1142, 12, 29}, - {1143, 12, 30}, - {1152, 12, 31}, - {1154, 12, 32}, - {1175, 12, 33}, - {1176, 12, 34}, - {1190, 12, 35}, - {1192, 12, 36}, - {1202, 12, 37}, - {1269, 12, 38}, - {1287, 12, 39}, - {1305, 12, 40}, - {1306, 12, 41}, - {1312, 12, 42}, - {1377, 12, 43}, - {1281, 12, 44}, - {1398, 12, 45}, - {1399, 12, 46}, - {1400, 12, 47}, - {1408, 12, 48}, - {1409, 12, 49}, - {1412, 12, 50}, - {1415, 12, 51}, - { 756, 12, 52}, - { 571, 12, 53}, - { 298, 12, 54}, - { 570, 12, 55}, - {1028, 12, 56}, - {1167, 12, 57}, - {1241, 12, 58}, - { 869, 12, 59}, - { 870, 12, 60}, - { 871, 12, 61}, - { 872, 12, 62}, - { 873, 12, 63}, - { 874, 12, 64}, - { 875, 12, 65}, - { 876, 12, 66}, - { 877, 12, 67}, - { 878, 12, 68}, - { 879, 12, 69}, - { 880, 12, 70}, - { 881, 12, 71}, - { 882, 12, 72}, - { 883, 12, 73}, - { 884, 12, 74}, - { 885, 12, 75}, - { 886, 12, 76}, - { 887, 12, 77}, - { 888, 12, 78}, - { 889, 12, 79}, - { 890, 12, 80}, - { 891, 12, 81}, - { 892, 12, 82}, - { 893, 12, 83}, - { 894, 12, 84}, - { 895, 12, 85}, - { 173, 12, 86}, - { 175, 12, 87}, - { 174, 12, 88}, - { 857, 12, 89}, - { 854, 12, 90}, - { 860, 12, 91}, - { 863, 12, 92}, - { 858, 12, 93}, - { 859, 12, 94}, - { 853, 12, 95}, - { 861, 12, 96}, - { 855, 12, 97}, - { 856, 12, 98}, - { 862, 12, 99}, - { 654, 12, 100}, - { 653, 12, 101}, - {1006, 13, 0}, - {1337, 13, 0}, - { 729, 13, 1}, - { 301, 13, 1}, - { 511, 13, 2}, - { 473, 13, 2}, - {1157, 13, 3}, - {1148, 13, 3}, - { 799, 13, 4}, - { 769, 13, 4}, - {1333, 13, 5}, - {1282, 13, 5}, - {1347, 14, 0}, - {1396, 14, 0}, - {1053, 14, 1}, - {1052, 14, 1}, - { 404, 14, 2}, - { 401, 14, 2}, - {1146, 14, 3}, - {1145, 14, 3}, - { 607, 14, 4}, - { 602, 14, 4}, - {1008, 14, 5}, - {1013, 14, 5}, - { 562, 14, 6}, - { 561, 14, 6}, - { 293, 14, 7}, - {1270, 14, 7}, - { 702, 14, 8}, - { 717, 14, 8}, - {1127, 14, 9}, - {1126, 14, 9}, - {1124, 14, 10}, - {1117, 14, 10}, - {1022, 14, 11}, - {1017, 14, 11}, - { 189, 14, 12}, - { 181, 14, 12}, - { 686, 14, 13}, - { 682, 14, 13}, - { 711, 14, 14}, - { 697, 14, 14}, - { 712, 14, 14}, - { 681, 14, 15}, - { 680, 14, 15}, - { 415, 14, 16}, - { 405, 14, 16}, - { 291, 14, 17}, - { 250, 14, 17}, - { 290, 14, 18}, - { 238, 14, 18}, - {1231, 14, 19}, - {1230, 14, 19}, - { 866, 14, 20}, - { 267, 14, 20}, - { 313, 14, 21}, - { 448, 14, 21}, - { 819, 14, 22}, - { 809, 14, 22}, - { 438, 14, 23}, - { 318, 14, 23}, - { 422, 14, 24}, - {1174, 14, 24}, - { 193, 14, 25}, - { 179, 14, 25}, - { 292, 14, 26}, - { 237, 14, 26}, - {1267, 14, 27}, - {1197, 14, 27}, - {1422, 14, 28}, - {1420, 14, 28}, - { 986, 14, 29}, - { 998, 14, 29}, - {1385, 14, 30}, - {1382, 14, 30}, - { 727, 14, 31}, - { 735, 14, 32}, - { 734, 14, 33}, - { 634, 14, 34}, - { 635, 14, 35}, - { 403, 14, 36}, - { 446, 14, 36}, - { 662, 14, 37}, - { 673, 14, 37}, - { 423, 14, 38}, - { 373, 14, 38}, - {1150, 14, 39}, - {1155, 14, 39}, - { 519, 14, 40}, - { 518, 14, 40}, - { 530, 14, 41}, - { 529, 14, 41}, - {1421, 14, 42}, - {1004, 15, 0}, - {1022, 15, 1}, - {1017, 15, 1}, - { 499, 15, 2}, - { 492, 15, 2}, - { 481, 15, 3}, - { 480, 15, 3}, - { 972, 16, 0}, - { 0, 16, 1}, - { 1, 16, 2}, - { 11, 16, 3}, - { 6, 16, 4}, - { 19, 16, 5}, - { 16, 16, 6}, - { 13, 16, 7}, - { 10, 16, 8}, - { 94, 16, 9}, - { 92, 16, 10}, - { 8, 16, 11}, - { 5, 16, 12}, - { 4, 16, 13}, - { 3, 16, 14}, - { 20, 16, 15}, - { 18, 16, 16}, - { 17, 16, 17}, - { 89, 16, 18}, - { 15, 16, 19}, - { 87, 16, 20}, - { 14, 16, 21}, - { 12, 16, 22}, - { 9, 16, 23}, - { 93, 16, 24}, - { 55, 16, 25}, - { 127, 16, 26}, - { 7, 16, 27}, - { 143, 16, 28}, - { 91, 16, 29}, - { 130, 16, 30}, - { 54, 16, 31}, - { 90, 16, 32}, - { 110, 16, 33}, - { 129, 16, 34}, - { 145, 16, 35}, - { 34, 16, 36}, - { 2, 16, 37}, - { 88, 16, 38}, - { 53, 16, 39}, - { 128, 16, 40}, - { 86, 16, 41}, - { 144, 16, 42}, - { 109, 16, 43}, - { 159, 16, 44}, - { 126, 16, 45}, - { 35, 16, 46}, - { 136, 16, 47}, - { 41, 16, 48}, - { 142, 16, 49}, - { 47, 16, 50}, - { 151, 16, 51}, - { 50, 16, 52}, - { 158, 16, 53}, - { 21, 16, 54}, - { 33, 16, 55}, - { 37, 16, 56}, - { 40, 16, 57}, - { 45, 16, 58}, - { 46, 16, 59}, - { 48, 16, 60}, - { 49, 16, 61}, - { 51, 16, 62}, - { 52, 16, 63}, - { 56, 16, 64}, - { 63, 16, 65}, - { 68, 16, 66}, - { 74, 16, 67}, - { 79, 16, 68}, - { 81, 16, 69}, - { 82, 16, 70}, - { 83, 16, 71}, - { 84, 16, 72}, - { 85, 16, 73}, - { 95, 16, 74}, - { 100, 16, 75}, - { 101, 16, 76}, - { 102, 16, 77}, - { 103, 16, 78}, - { 104, 16, 79}, - { 105, 16, 80}, - { 106, 16, 81}, - { 107, 16, 82}, - { 108, 16, 83}, - { 111, 16, 84}, - { 116, 16, 85}, - { 117, 16, 86}, - { 118, 16, 87}, - { 120, 16, 88}, - { 121, 16, 89}, - { 122, 16, 90}, - { 123, 16, 91}, - { 124, 16, 92}, - { 125, 16, 93}, - { 131, 16, 94}, - { 137, 16, 95}, - { 146, 16, 96}, - { 152, 16, 97}, - { 160, 16, 98}, - { 22, 16, 99}, - { 57, 16, 100}, - { 96, 16, 101}, - { 112, 16, 102}, - { 132, 16, 103}, - { 138, 16, 104}, - { 147, 16, 105}, - { 153, 16, 106}, - { 161, 16, 107}, - { 23, 16, 108}, - { 58, 16, 109}, - { 97, 16, 110}, - { 113, 16, 111}, - { 133, 16, 112}, - { 139, 16, 113}, - { 148, 16, 114}, - { 154, 16, 115}, - { 162, 16, 116}, - { 24, 16, 117}, - { 59, 16, 118}, - { 98, 16, 119}, - { 114, 16, 120}, - { 134, 16, 121}, - { 140, 16, 122}, - { 149, 16, 123}, - { 155, 16, 124}, - { 163, 16, 125}, - { 25, 16, 126}, - { 60, 16, 127}, - { 66, 16, 128}, - { 99, 16, 129}, - { 115, 16, 130}, - { 119, 16, 131}, - { 135, 16, 132}, - { 141, 16, 133}, - { 150, 16, 134}, - { 156, 16, 135}, - { 164, 16, 136}, - { 26, 16, 137}, - { 27, 16, 138}, - { 61, 16, 139}, - { 28, 16, 140}, - { 29, 16, 141}, - { 30, 16, 142}, - { 970, 17, 0}, - {1156, 17, 1}, - { 797, 17, 2}, - {1365, 17, 3}, - { 798, 17, 4}, - {1326, 17, 5}, - { 278, 17, 6}, - {1327, 17, 7}, - {1331, 17, 8}, - {1329, 17, 9}, - {1330, 17, 10}, - { 280, 17, 11}, - { 279, 17, 12}, - {1328, 17, 13}, - {1081, 17, 14}, - {1063, 18, 0}, - { 266, 18, 1}, - {1364, 18, 2}, - { 233, 18, 3}, - {1018, 18, 4}, - {1363, 18, 5}, - {1139, 18, 6}, - { 713, 18, 7}, - {1368, 18, 8}, - {1367, 18, 9}, - {1366, 18, 10}, - { 432, 18, 11}, - { 425, 18, 12}, - { 426, 18, 13}, - { 437, 18, 14}, - { 434, 18, 15}, - { 433, 18, 16}, - { 429, 18, 17}, - { 436, 18, 18}, - { 435, 18, 19}, - { 431, 18, 20}, - { 427, 18, 21}, - { 428, 18, 22}, - { 950, 18, 23}, - {1324, 18, 24}, - {1325, 18, 25}, - { 590, 18, 26}, - { 310, 18, 27}, - {1151, 18, 28}, - {1271, 18, 29}, - { 430, 18, 30}, - {1005, 18, 31}, - { 731, 18, 32}, - {1021, 18, 33}, - {1019, 18, 34}, - { 286, 18, 35}, - { 999, 19, 0}, - {1401, 19, 1}, - {1401, 20, 0}, - {1397, 20, 0}, - { 999, 20, 1}, - { 968, 20, 1}, - {1401, 21, 0}, - {1397, 21, 0}, - { 999, 21, 1}, - { 968, 21, 1}, - { 907, 21, 2}, - { 844, 21, 2}, + {1015, 0, 0}, /* NO */ + { 984, 0, 0}, /* N */ + { 578, 0, 0}, /* F */ + { 579, 0, 0}, /* FALSE */ + {1421, 0, 1}, /* YES */ + {1417, 0, 1}, /* Y */ + {1299, 0, 1}, /* T */ + {1356, 0, 1}, /* TRUE */ + { 814, 1, 0}, /* LEFTTORIGHT */ + { 783, 1, 0}, /* L */ + { 281, 1, 1}, /* BOUNDARYNEUTRAL */ + { 273, 1, 1}, /* BN */ + {1207, 1, 2}, /* SEGMENTSEPARATOR */ + {1188, 1, 2}, /* S */ + {1103, 1, 3}, /* PARAGRAPHSEPARATOR */ + { 236, 1, 3}, /* B */ + {1400, 1, 4}, /* WHITESPACE */ + {1406, 1, 4}, /* WS */ + {1088, 1, 5}, /* OTHERNEUTRAL */ + {1067, 1, 5}, /* ON */ + { 569, 1, 6}, /* EUROPEANTERMINATOR */ + { 558, 1, 6}, /* ET */ + { 568, 1, 7}, /* EUROPEANSEPARATOR */ + { 557, 1, 7}, /* ES */ + { 423, 1, 8}, /* COMMONSEPARATOR */ + { 453, 1, 8}, /* CS */ + { 567, 1, 9}, /* EUROPEANNUMBER */ + { 545, 1, 9}, /* EN */ + {1023, 1, 10}, /* NONSPACINGMARK */ + {1031, 1, 10}, /* NSM */ + {1174, 1, 11}, /* RIGHTTOLEFT */ + {1164, 1, 11}, /* R */ + { 209, 1, 12}, /* ARABICNUMBER */ + { 194, 1, 12}, /* AN */ + { 206, 1, 13}, /* ARABICLETTER */ + { 181, 1, 13}, /* AL */ + { 815, 1, 14}, /* LEFTTORIGHTEMBEDDING */ + { 847, 1, 14}, /* LRE */ + {1175, 1, 15}, /* RIGHTTOLEFTEMBEDDING */ + {1179, 1, 15}, /* RLE */ + {1134, 1, 16}, /* POPDIRECTIONALFORMAT */ + {1113, 1, 16}, /* PDF */ + { 817, 1, 17}, /* LEFTTORIGHTOVERRIDE */ + { 849, 1, 17}, /* LRO */ + {1177, 1, 18}, /* RIGHTTOLEFTOVERRIDE */ + {1181, 1, 18}, /* RLO */ + { 816, 1, 19}, /* LEFTTORIGHTISOLATE */ + { 848, 1, 19}, /* LRI */ + {1176, 1, 20}, /* RIGHTTOLEFTISOLATE */ + {1180, 1, 20}, /* RLI */ + { 587, 1, 21}, /* FIRSTSTRONGISOLATE */ + { 593, 1, 21}, /* FSI */ + {1135, 1, 22}, /* POPDIRECTIONALISOLATE */ + {1114, 1, 22}, /* PDI */ + {1016, 2, 0}, /* NOBLOCK */ + { 994, 2, 0}, /* NB */ + { 245, 2, 1}, /* BASICLATIN */ + { 220, 2, 1}, /* ASCII */ + { 793, 2, 2}, /* LATIN1SUPPLEMENT */ + { 792, 2, 2}, /* LATIN1SUP */ + { 791, 2, 2}, /* LATIN1 */ + { 800, 2, 3}, /* LATINEXTENDEDA */ + { 794, 2, 3}, /* LATINEXTA */ + { 802, 2, 4}, /* LATINEXTENDEDB */ + { 796, 2, 4}, /* LATINEXTB */ + { 728, 2, 5}, /* IPAEXTENSIONS */ + { 727, 2, 5}, /* IPAEXT */ + {1250, 2, 6}, /* SPACINGMODIFIERLETTERS */ + { 963, 2, 6}, /* MODIFIERLETTERS */ + { 414, 2, 7}, /* COMBININGDIACRITICALMARKS */ + { 499, 2, 7}, /* DIACRITICALS */ + { 632, 2, 8}, /* GREEKANDCOPTIC */ + { 631, 2, 8}, /* GREEK */ + { 466, 2, 9}, /* CYRILLIC */ + { 474, 2, 10}, /* CYRILLICSUPPLEMENT */ + { 473, 2, 10}, /* CYRILLICSUP */ + { 475, 2, 10}, /* CYRILLICSUPPLEMENTARY */ + { 216, 2, 11}, /* ARMENIAN */ + { 673, 2, 12}, /* HEBREW */ + { 203, 2, 13}, /* ARABIC */ + {1295, 2, 14}, /* SYRIAC */ + { 215, 2, 15}, /* ARABICSUPPLEMENT */ + { 214, 2, 15}, /* ARABICSUP */ + {1335, 2, 16}, /* THAANA */ + {1012, 2, 17}, /* NKO */ + {1193, 2, 18}, /* SAMARITAN */ + { 881, 2, 19}, /* MANDAIC */ + {1297, 2, 20}, /* SYRIACSUPPLEMENT */ + {1296, 2, 20}, /* SYRIACSUP */ + { 205, 2, 21}, /* ARABICEXTENDEDA */ + { 204, 2, 21}, /* ARABICEXTA */ + { 493, 2, 22}, /* DEVANAGARI */ + { 257, 2, 23}, /* BENGALI */ + { 641, 2, 24}, /* GURMUKHI */ + { 638, 2, 25}, /* GUJARATI */ + {1071, 2, 26}, /* ORIYA */ + {1314, 2, 27}, /* TAMIL */ + {1328, 2, 28}, /* TELUGU */ + { 761, 2, 29}, /* KANNADA */ + { 868, 2, 30}, /* MALAYALAM */ + {1227, 2, 31}, /* SINHALA */ + {1336, 2, 32}, /* THAI */ + { 788, 2, 33}, /* LAO */ + {1337, 2, 34}, /* TIBETAN */ + { 978, 2, 35}, /* MYANMAR */ + { 607, 2, 36}, /* GEORGIAN */ + { 656, 2, 37}, /* HANGULJAMO */ + { 733, 2, 37}, /* JAMO */ + { 560, 2, 38}, /* ETHIOPIC */ + { 566, 2, 39}, /* ETHIOPICSUPPLEMENT */ + { 565, 2, 39}, /* ETHIOPICSUP */ + { 367, 2, 40}, /* CHEROKEE */ + {1364, 2, 41}, /* UNIFIEDCANADIANABORIGINALSYLLABICS */ + {1358, 2, 41}, /* UCAS */ + { 306, 2, 41}, /* CANADIANSYLLABICS */ + {1050, 2, 42}, /* OGHAM */ + {1186, 2, 43}, /* RUNIC */ + {1300, 2, 44}, /* TAGALOG */ + { 668, 2, 45}, /* HANUNOO */ + { 297, 2, 46}, /* BUHID */ + {1302, 2, 47}, /* TAGBANWA */ + { 772, 2, 48}, /* KHMER */ + { 968, 2, 49}, /* MONGOLIAN */ + {1365, 2, 50}, /* UNIFIEDCANADIANABORIGINALSYLLABICSEXTENDED */ + {1359, 2, 50}, /* UCASEXT */ + { 825, 2, 51}, /* LIMBU */ + {1305, 2, 52}, /* TAILE */ + {1001, 2, 53}, /* NEWTAILUE */ + { 773, 2, 54}, /* KHMERSYMBOLS */ + { 295, 2, 55}, /* BUGINESE */ + {1306, 2, 56}, /* TAITHAM */ + { 415, 2, 57}, /* COMBININGDIACRITICALMARKSEXTENDED */ + { 500, 2, 57}, /* DIACRITICALSEXT */ + { 240, 2, 58}, /* BALINESE */ + {1260, 2, 59}, /* SUNDANESE */ + { 248, 2, 60}, /* BATAK */ + { 819, 2, 61}, /* LEPCHA */ + {1054, 2, 62}, /* OLCHIKI */ + { 472, 2, 63}, /* CYRILLICEXTENDEDC */ + { 469, 2, 63}, /* CYRILLICEXTC */ + { 609, 2, 64}, /* GEORGIANEXTENDED */ + { 608, 2, 64}, /* GEORGIANEXT */ + {1262, 2, 65}, /* SUNDANESESUPPLEMENT */ + {1261, 2, 65}, /* SUNDANESESUP */ + {1379, 2, 66}, /* VEDICEXTENSIONS */ + {1378, 2, 66}, /* VEDICEXT */ + {1127, 2, 67}, /* PHONETICEXTENSIONS */ + {1126, 2, 67}, /* PHONETICEXT */ + {1128, 2, 68}, /* PHONETICEXTENSIONSSUPPLEMENT */ + {1129, 2, 68}, /* PHONETICEXTSUP */ + { 417, 2, 69}, /* COMBININGDIACRITICALMARKSSUPPLEMENT */ + { 502, 2, 69}, /* DIACRITICALSSUP */ + { 801, 2, 70}, /* LATINEXTENDEDADDITIONAL */ + { 795, 2, 70}, /* LATINEXTADDITIONAL */ + { 634, 2, 71}, /* GREEKEXTENDED */ + { 633, 2, 71}, /* GREEKEXT */ + { 602, 2, 72}, /* GENERALPUNCTUATION */ + {1154, 2, 72}, /* PUNCTUATION */ + {1269, 2, 73}, /* SUPERSCRIPTSANDSUBSCRIPTS */ + {1268, 2, 73}, /* SUPERANDSUB */ + { 458, 2, 74}, /* CURRENCYSYMBOLS */ + { 416, 2, 75}, /* COMBININGDIACRITICALMARKSFORSYMBOLS */ + { 501, 2, 75}, /* DIACRITICALSFORSYMBOLS */ + { 420, 2, 75}, /* COMBININGMARKSFORSYMBOLS */ + { 821, 2, 76}, /* LETTERLIKESYMBOLS */ + {1036, 2, 77}, /* NUMBERFORMS */ + { 219, 2, 78}, /* ARROWS */ + { 919, 2, 79}, /* MATHEMATICALOPERATORS */ + { 920, 2, 79}, /* MATHOPERATORS */ + { 952, 2, 80}, /* MISCELLANEOUSTECHNICAL */ + { 957, 2, 80}, /* MISCTECHNICAL */ + { 444, 2, 81}, /* CONTROLPICTURES */ + {1070, 2, 82}, /* OPTICALCHARACTERRECOGNITION */ + {1047, 2, 82}, /* OCR */ + { 548, 2, 83}, /* ENCLOSEDALPHANUMERICS */ + { 547, 2, 83}, /* ENCLOSEDALPHANUM */ + { 282, 2, 84}, /* BOXDRAWING */ + { 272, 2, 85}, /* BLOCKELEMENTS */ + { 603, 2, 86}, /* GEOMETRICSHAPES */ + { 949, 2, 87}, /* MISCELLANEOUSSYMBOLS */ + { 956, 2, 87}, /* MISCSYMBOLS */ + { 505, 2, 88}, /* DINGBATS */ + { 947, 2, 89}, /* MISCELLANEOUSMATHEMATICALSYMBOLSA */ + { 953, 2, 89}, /* MISCMATHSYMBOLSA */ + {1271, 2, 90}, /* SUPPLEMENTALARROWSA */ + {1264, 2, 90}, /* SUPARROWSA */ + { 289, 2, 91}, /* BRAILLEPATTERNS */ + { 288, 2, 91}, /* BRAILLE */ + {1272, 2, 92}, /* SUPPLEMENTALARROWSB */ + {1265, 2, 92}, /* SUPARROWSB */ + { 948, 2, 93}, /* MISCELLANEOUSMATHEMATICALSYMBOLSB */ + { 954, 2, 93}, /* MISCMATHSYMBOLSB */ + {1274, 2, 94}, /* SUPPLEMENTALMATHEMATICALOPERATORS */ + {1270, 2, 94}, /* SUPMATHOPERATORS */ + { 950, 2, 95}, /* MISCELLANEOUSSYMBOLSANDARROWS */ + { 946, 2, 95}, /* MISCARROWS */ + { 614, 2, 96}, /* GLAGOLITIC */ + { 803, 2, 97}, /* LATINEXTENDEDC */ + { 797, 2, 97}, /* LATINEXTC */ + { 446, 2, 98}, /* COPTIC */ + { 611, 2, 99}, /* GEORGIANSUPPLEMENT */ + { 610, 2, 99}, /* GEORGIANSUP */ + {1339, 2, 100}, /* TIFINAGH */ + { 563, 2, 101}, /* ETHIOPICEXTENDED */ + { 561, 2, 101}, /* ETHIOPICEXT */ + { 470, 2, 102}, /* CYRILLICEXTENDEDA */ + { 467, 2, 102}, /* CYRILLICEXTA */ + {1275, 2, 103}, /* SUPPLEMENTALPUNCTUATION */ + {1281, 2, 103}, /* SUPPUNCTUATION */ + { 393, 2, 104}, /* CJKRADICALSSUPPLEMENT */ + { 392, 2, 104}, /* CJKRADICALSSUP */ + { 760, 2, 105}, /* KANGXIRADICALS */ + { 759, 2, 105}, /* KANGXI */ + { 699, 2, 106}, /* IDEOGRAPHICDESCRIPTIONCHARACTERS */ + { 695, 2, 106}, /* IDC */ + { 396, 2, 107}, /* CJKSYMBOLSANDPUNCTUATION */ + { 395, 2, 107}, /* CJKSYMBOLS */ + { 684, 2, 108}, /* HIRAGANA */ + { 763, 2, 109}, /* KATAKANA */ + { 275, 2, 110}, /* BOPOMOFO */ + { 655, 2, 111}, /* HANGULCOMPATIBILITYJAMO */ + { 425, 2, 111}, /* COMPATJAMO */ + { 758, 2, 112}, /* KANBUN */ + { 277, 2, 113}, /* BOPOMOFOEXTENDED */ + { 276, 2, 113}, /* BOPOMOFOEXT */ + { 394, 2, 114}, /* CJKSTROKES */ + { 766, 2, 115}, /* KATAKANAPHONETICEXTENSIONS */ + { 764, 2, 115}, /* KATAKANAEXT */ + { 552, 2, 116}, /* ENCLOSEDCJKLETTERSANDMONTHS */ + { 551, 2, 116}, /* ENCLOSEDCJK */ + { 379, 2, 117}, /* CJKCOMPATIBILITY */ + { 377, 2, 117}, /* CJKCOMPAT */ + { 398, 2, 118}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONA */ + { 385, 2, 118}, /* CJKEXTA */ + {1427, 2, 119}, /* YIJINGHEXAGRAMSYMBOLS */ + {1426, 2, 119}, /* YIJING */ + { 397, 2, 120}, /* CJKUNIFIEDIDEOGRAPHS */ + { 376, 2, 120}, /* CJK */ + {1429, 2, 121}, /* YISYLLABLES */ + {1428, 2, 122}, /* YIRADICALS */ + { 835, 2, 123}, /* LISU */ + {1373, 2, 124}, /* VAI */ + { 471, 2, 125}, /* CYRILLICEXTENDEDB */ + { 468, 2, 125}, /* CYRILLICEXTB */ + { 242, 2, 126}, /* BAMUM */ + { 965, 2, 127}, /* MODIFIERTONELETTERS */ + { 804, 2, 128}, /* LATINEXTENDEDD */ + { 798, 2, 128}, /* LATINEXTD */ + {1289, 2, 129}, /* SYLOTINAGRI */ + { 422, 2, 130}, /* COMMONINDICNUMBERFORMS */ + { 710, 2, 130}, /* INDICNUMBERFORMS */ + {1119, 2, 131}, /* PHAGSPA */ + {1197, 2, 132}, /* SAURASHTRA */ + { 495, 2, 133}, /* DEVANAGARIEXTENDED */ + { 494, 2, 133}, /* DEVANAGARIEXT */ + { 767, 2, 134}, /* KAYAHLI */ + {1169, 2, 135}, /* REJANG */ + { 657, 2, 136}, /* HANGULJAMOEXTENDEDA */ + { 734, 2, 136}, /* JAMOEXTA */ + { 737, 2, 137}, /* JAVANESE */ + { 982, 2, 138}, /* MYANMAREXTENDEDB */ + { 980, 2, 138}, /* MYANMAREXTB */ + { 360, 2, 139}, /* CHAM */ + { 981, 2, 140}, /* MYANMAREXTENDEDA */ + { 979, 2, 140}, /* MYANMAREXTA */ + {1307, 2, 141}, /* TAIVIET */ + { 934, 2, 142}, /* MEETEIMAYEKEXTENSIONS */ + { 933, 2, 142}, /* MEETEIMAYEKEXT */ + { 564, 2, 143}, /* ETHIOPICEXTENDEDA */ + { 562, 2, 143}, /* ETHIOPICEXTA */ + { 805, 2, 144}, /* LATINEXTENDEDE */ + { 799, 2, 144}, /* LATINEXTE */ + { 369, 2, 145}, /* CHEROKEESUPPLEMENT */ + { 368, 2, 145}, /* CHEROKEESUP */ + { 932, 2, 146}, /* MEETEIMAYEK */ + { 659, 2, 147}, /* HANGULSYLLABLES */ + { 654, 2, 147}, /* HANGUL */ + { 658, 2, 148}, /* HANGULJAMOEXTENDEDB */ + { 735, 2, 148}, /* JAMOEXTB */ + { 682, 2, 149}, /* HIGHSURROGATES */ + { 680, 2, 150}, /* HIGHPRIVATEUSESURROGATES */ + { 681, 2, 150}, /* HIGHPUSURROGATES */ + { 846, 2, 151}, /* LOWSURROGATES */ + {1148, 2, 152}, /* PRIVATEUSEAREA */ + {1152, 2, 152}, /* PUA */ + {1147, 2, 152}, /* PRIVATEUSE */ + { 381, 2, 153}, /* CJKCOMPATIBILITYIDEOGRAPHS */ + { 383, 2, 153}, /* CJKCOMPATIDEOGRAPHS */ + { 191, 2, 154}, /* ALPHABETICPRESENTATIONFORMS */ + { 190, 2, 154}, /* ALPHABETICPF */ + { 212, 2, 155}, /* ARABICPRESENTATIONFORMSA */ + { 210, 2, 155}, /* ARABICPFA */ + {1376, 2, 156}, /* VARIATIONSELECTORS */ + {1391, 2, 156}, /* VS */ + {1382, 2, 157}, /* VERTICALFORMS */ + { 418, 2, 158}, /* COMBININGHALFMARKS */ + { 648, 2, 158}, /* HALFMARKS */ + { 380, 2, 159}, /* CJKCOMPATIBILITYFORMS */ + { 378, 2, 159}, /* CJKCOMPATFORMS */ + {1233, 2, 160}, /* SMALLFORMVARIANTS */ + {1232, 2, 160}, /* SMALLFORMS */ + { 213, 2, 161}, /* ARABICPRESENTATIONFORMSB */ + { 211, 2, 161}, /* ARABICPFB */ + { 650, 2, 162}, /* HALFWIDTHANDFULLWIDTHFORMS */ + { 647, 2, 162}, /* HALFANDFULLFORMS */ + {1251, 2, 163}, /* SPECIALS */ + { 831, 2, 164}, /* LINEARBSYLLABARY */ + { 830, 2, 165}, /* LINEARBIDEOGRAMS */ + { 172, 2, 166}, /* AEGEANNUMBERS */ + { 198, 2, 167}, /* ANCIENTGREEKNUMBERS */ + { 199, 2, 168}, /* ANCIENTSYMBOLS */ + {1121, 2, 169}, /* PHAISTOSDISC */ + {1120, 2, 169}, /* PHAISTOS */ + { 857, 2, 170}, /* LYCIAN */ + { 312, 2, 171}, /* CARIAN */ + { 447, 2, 172}, /* COPTICEPACTNUMBERS */ + {1057, 2, 173}, /* OLDITALIC */ + { 622, 2, 174}, /* GOTHIC */ + {1059, 2, 175}, /* OLDPERMIC */ + {1361, 2, 176}, /* UGARITIC */ + {1060, 2, 177}, /* OLDPERSIAN */ + { 491, 2, 178}, /* DESERET */ + {1216, 2, 179}, /* SHAVIAN */ + {1078, 2, 180}, /* OSMANYA */ + {1075, 2, 181}, /* OSAGE */ + { 533, 2, 182}, /* ELBASAN */ + { 317, 2, 183}, /* CAUCASIANALBANIAN */ + { 828, 2, 184}, /* LINEARA */ + { 465, 2, 185}, /* CYPRIOTSYLLABARY */ + { 708, 2, 186}, /* IMPERIALARAMAIC */ + {1102, 2, 187}, /* PALMYRENE */ + { 987, 2, 188}, /* NABATAEAN */ + { 670, 2, 189}, /* HATRAN */ + {1125, 2, 190}, /* PHOENICIAN */ + { 859, 2, 191}, /* LYDIAN */ + { 940, 2, 192}, /* MEROITICHIEROGLYPHS */ + { 939, 2, 193}, /* MEROITICCURSIVE */ + { 770, 2, 194}, /* KHAROSHTHI */ + {1062, 2, 195}, /* OLDSOUTHARABIAN */ + {1058, 2, 196}, /* OLDNORTHARABIAN */ + { 884, 2, 197}, /* MANICHAEAN */ + { 234, 2, 198}, /* AVESTAN */ + { 722, 2, 199}, /* INSCRIPTIONALPARTHIAN */ + { 721, 2, 200}, /* INSCRIPTIONALPAHLAVI */ + {1151, 2, 201}, /* PSALTERPAHLAVI */ + {1063, 2, 202}, /* OLDTURKIC */ + {1056, 2, 203}, /* OLDHUNGARIAN */ + { 662, 2, 204}, /* HANIFIROHINGYA */ + {1185, 2, 205}, /* RUMINUMERALSYMBOLS */ + {1184, 2, 205}, /* RUMI */ + {1423, 2, 206}, /* YEZIDI */ + {1061, 2, 207}, /* OLDSOGDIAN */ + {1240, 2, 208}, /* SOGDIAN */ + { 371, 2, 209}, /* CHORASMIAN */ + { 535, 2, 210}, /* ELYMAIC */ + { 285, 2, 211}, /* BRAHMI */ + { 750, 2, 212}, /* KAITHI */ + {1243, 2, 213}, /* SORASOMPENG */ + { 359, 2, 214}, /* CHAKMA */ + { 862, 2, 215}, /* MAHAJANI */ + {1215, 2, 216}, /* SHARADA */ + {1228, 2, 217}, /* SINHALAARCHAICNUMBERS */ + { 776, 2, 218}, /* KHOJKI */ + { 975, 2, 219}, /* MULTANI */ + { 777, 2, 220}, /* KHUDAWADI */ + { 624, 2, 221}, /* GRANTHA */ + { 999, 2, 222}, /* NEWA */ + {1341, 2, 223}, /* TIRHUTA */ + {1222, 2, 224}, /* SIDDHAM */ + { 961, 2, 225}, /* MODI */ + { 970, 2, 226}, /* MONGOLIANSUPPLEMENT */ + { 969, 2, 226}, /* MONGOLIANSUP */ + {1311, 2, 227}, /* TAKRI */ + { 178, 2, 228}, /* AHOM */ + { 508, 2, 229}, /* DOGRA */ + {1396, 2, 230}, /* WARANGCITI */ + { 506, 2, 231}, /* DIVESAKURU */ + { 990, 2, 232}, /* NANDINAGARI */ + {1435, 2, 233}, /* ZANABAZARSQUARE */ + {1245, 2, 234}, /* SOYOMBO */ + {1109, 2, 235}, /* PAUCINHAU */ + { 259, 2, 236}, /* BHAIKSUKI */ + { 913, 2, 237}, /* MARCHEN */ + { 915, 2, 238}, /* MASARAMGONDI */ + { 640, 2, 239}, /* GUNJALAGONDI */ + { 867, 2, 240}, /* MAKASAR */ + { 837, 2, 241}, /* LISUSUPPLEMENT */ + { 836, 2, 241}, /* LISUSUP */ + {1316, 2, 242}, /* TAMILSUPPLEMENT */ + {1315, 2, 242}, /* TAMILSUP */ + { 454, 2, 243}, /* CUNEIFORM */ + { 456, 2, 244}, /* CUNEIFORMNUMBERSANDPUNCTUATION */ + { 455, 2, 244}, /* CUNEIFORMNUMBERS */ + { 522, 2, 245}, /* EARLYDYNASTICCUNEIFORM */ + { 531, 2, 246}, /* EGYPTIANHIEROGLYPHS */ + { 530, 2, 247}, /* EGYPTIANHIEROGLYPHFORMATCONTROLS */ + { 195, 2, 248}, /* ANATOLIANHIEROGLYPHS */ + { 244, 2, 249}, /* BAMUMSUPPLEMENT */ + { 243, 2, 249}, /* BAMUMSUP */ + { 971, 2, 250}, /* MRO */ + { 247, 2, 251}, /* BASSAVAH */ + {1100, 2, 252}, /* PAHAWHHMONG */ + { 928, 2, 253}, /* MEDEFAIDRIN */ + { 941, 2, 254}, /* MIAO */ + { 701, 2, 255}, /* IDEOGRAPHICSYMBOLSANDPUNCTUATION */ + { 700, 2, 255}, /* IDEOGRAPHICSYMBOLS */ + {1319, 2, 256}, /* TANGUT */ + {1320, 2, 257}, /* TANGUTCOMPONENTS */ + { 771, 2, 258}, /* KHITANSMALLSCRIPT */ + {1322, 2, 259}, /* TANGUTSUPPLEMENT */ + {1321, 2, 259}, /* TANGUTSUP */ + { 756, 2, 260}, /* KANASUPPLEMENT */ + { 755, 2, 260}, /* KANASUP */ + { 754, 2, 261}, /* KANAEXTENDEDA */ + { 753, 2, 261}, /* KANAEXTA */ + {1235, 2, 262}, /* SMALLKANAEXTENSION */ + {1234, 2, 262}, /* SMALLKANAEXT */ + {1042, 2, 263}, /* NUSHU */ + { 519, 2, 264}, /* DUPLOYAN */ + {1219, 2, 265}, /* SHORTHANDFORMATCONTROLS */ + { 300, 2, 266}, /* BYZANTINEMUSICALSYMBOLS */ + { 299, 2, 266}, /* BYZANTINEMUSIC */ + { 977, 2, 267}, /* MUSICALSYMBOLS */ + { 976, 2, 267}, /* MUSIC */ + { 197, 2, 268}, /* ANCIENTGREEKMUSICALNOTATION */ + { 196, 2, 268}, /* ANCIENTGREEKMUSIC */ + { 922, 2, 269}, /* MAYANNUMERALS */ + {1309, 2, 270}, /* TAIXUANJINGSYMBOLS */ + {1308, 2, 270}, /* TAIXUANJING */ + { 449, 2, 271}, /* COUNTINGRODNUMERALS */ + { 448, 2, 271}, /* COUNTINGROD */ + { 918, 2, 272}, /* MATHEMATICALALPHANUMERICSYMBOLS */ + { 917, 2, 272}, /* MATHALPHANUM */ + {1284, 2, 273}, /* SUTTONSIGNWRITING */ + { 616, 2, 274}, /* GLAGOLITICSUPPLEMENT */ + { 615, 2, 274}, /* GLAGOLITICSUP */ + {1045, 2, 275}, /* NYIAKENGPUACHUEHMONG */ + {1394, 2, 276}, /* WANCHO */ + { 936, 2, 277}, /* MENDEKIKAKUI */ + { 170, 2, 278}, /* ADLAM */ + { 712, 2, 279}, /* INDICSIYAQNUMBERS */ + {1093, 2, 280}, /* OTTOMANSIYAQNUMBERS */ + { 208, 2, 281}, /* ARABICMATHEMATICALALPHABETICSYMBOLS */ + { 207, 2, 281}, /* ARABICMATH */ + { 865, 2, 282}, /* MAHJONGTILES */ + { 864, 2, 282}, /* MAHJONG */ + { 510, 2, 283}, /* DOMINOTILES */ + { 509, 2, 283}, /* DOMINO */ + {1131, 2, 284}, /* PLAYINGCARDS */ + { 549, 2, 285}, /* ENCLOSEDALPHANUMERICSUPPLEMENT */ + { 550, 2, 285}, /* ENCLOSEDALPHANUMSUP */ + { 554, 2, 286}, /* ENCLOSEDIDEOGRAPHICSUPPLEMENT */ + { 553, 2, 286}, /* ENCLOSEDIDEOGRAPHICSUP */ + { 951, 2, 287}, /* MISCELLANEOUSSYMBOLSANDPICTOGRAPHS */ + { 955, 2, 287}, /* MISCPICTOGRAPHS */ + { 544, 2, 288}, /* EMOTICONS */ + {1073, 2, 289}, /* ORNAMENTALDINGBATS */ + {1355, 2, 290}, /* TRANSPORTANDMAPSYMBOLS */ + {1354, 2, 290}, /* TRANSPORTANDMAP */ + { 184, 2, 291}, /* ALCHEMICALSYMBOLS */ + { 183, 2, 291}, /* ALCHEMICAL */ + { 605, 2, 292}, /* GEOMETRICSHAPESEXTENDED */ + { 604, 2, 292}, /* GEOMETRICSHAPESEXT */ + {1273, 2, 293}, /* SUPPLEMENTALARROWSC */ + {1266, 2, 293}, /* SUPARROWSC */ + {1276, 2, 294}, /* SUPPLEMENTALSYMBOLSANDPICTOGRAPHS */ + {1282, 2, 294}, /* SUPSYMBOLSANDPICTOGRAPHS */ + { 370, 2, 295}, /* CHESSSYMBOLS */ + {1292, 2, 296}, /* SYMBOLSANDPICTOGRAPHSEXTENDEDA */ + {1291, 2, 296}, /* SYMBOLSANDPICTOGRAPHSEXTA */ + {1293, 2, 297}, /* SYMBOLSFORLEGACYCOMPUTING */ + { 399, 2, 298}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONB */ + { 386, 2, 298}, /* CJKEXTB */ + { 400, 2, 299}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONC */ + { 387, 2, 299}, /* CJKEXTC */ + { 401, 2, 300}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIOND */ + { 388, 2, 300}, /* CJKEXTD */ + { 402, 2, 301}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONE */ + { 389, 2, 301}, /* CJKEXTE */ + { 403, 2, 302}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONF */ + { 390, 2, 302}, /* CJKEXTF */ + { 382, 2, 303}, /* CJKCOMPATIBILITYIDEOGRAPHSSUPPLEMENT */ + { 384, 2, 303}, /* CJKCOMPATIDEOGRAPHSSUP */ + { 404, 2, 304}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONG */ + { 391, 2, 304}, /* CJKEXTG */ + {1303, 2, 305}, /* TAGS */ + {1377, 2, 306}, /* VARIATIONSELECTORSSUPPLEMENT */ + {1392, 2, 306}, /* VSSUP */ + {1277, 2, 307}, /* SUPPLEMENTARYPRIVATEUSEAREAA */ + {1279, 2, 307}, /* SUPPUAA */ + {1278, 2, 308}, /* SUPPLEMENTARYPRIVATEUSEAREAB */ + {1280, 2, 308}, /* SUPPUAB */ + {1027, 3, 0}, /* NOTREORDERED */ + { 1, 3, 0}, /* 0 */ + {1028, 3, 0}, /* NR */ + { 167, 3, 1}, /* ABOVE */ + { 75, 3, 1}, /* 230 */ + { 166, 3, 1}, /* A */ + { 169, 3, 2}, /* ABOVERIGHT */ + { 76, 3, 2}, /* 232 */ + { 201, 3, 2}, /* AR */ + { 253, 3, 3}, /* BELOW */ + { 69, 3, 3}, /* 220 */ + { 236, 3, 3}, /* B */ + { 230, 3, 4}, /* ATTACHEDABOVERIGHT */ + { 65, 3, 4}, /* 216 */ + { 225, 3, 4}, /* ATAR */ + { 231, 3, 5}, /* ATTACHEDBELOW */ + { 62, 3, 5}, /* 202 */ + { 226, 3, 5}, /* ATB */ + {1096, 3, 6}, /* OVERLAY */ + { 2, 3, 6}, /* 1 */ + {1095, 3, 6}, /* OV */ + { 726, 3, 7}, /* IOTASUBSCRIPT */ + { 80, 3, 7}, /* 240 */ + { 729, 3, 7}, /* IS */ + { 512, 3, 8}, /* DOUBLEBELOW */ + { 77, 3, 8}, /* 233 */ + { 483, 3, 8}, /* DB */ + { 511, 3, 9}, /* DOUBLEABOVE */ + { 78, 3, 9}, /* 234 */ + { 478, 3, 9}, /* DA */ + { 255, 3, 10}, /* BELOWRIGHT */ + { 70, 3, 10}, /* 222 */ + { 283, 3, 10}, /* BR */ + { 168, 3, 11}, /* ABOVELEFT */ + { 73, 3, 11}, /* 228 */ + { 181, 3, 11}, /* AL */ + { 321, 3, 12}, /* CCC10 */ + { 21, 3, 12}, /* 10 */ + { 324, 3, 13}, /* CCC11 */ + { 33, 3, 13}, /* 11 */ + { 326, 3, 14}, /* CCC12 */ + { 37, 3, 14}, /* 12 */ + { 329, 3, 15}, /* CCC13 */ + { 40, 3, 15}, /* 13 */ + { 333, 3, 16}, /* CCC14 */ + { 45, 3, 16}, /* 14 */ + { 334, 3, 17}, /* CCC15 */ + { 46, 3, 17}, /* 15 */ + { 335, 3, 18}, /* CCC16 */ + { 48, 3, 18}, /* 16 */ + { 336, 3, 19}, /* CCC17 */ + { 49, 3, 19}, /* 17 */ + { 337, 3, 20}, /* CCC18 */ + { 51, 3, 20}, /* 18 */ + { 338, 3, 21}, /* CCC19 */ + { 52, 3, 21}, /* 19 */ + { 339, 3, 22}, /* CCC20 */ + { 56, 3, 22}, /* 20 */ + { 340, 3, 23}, /* CCC21 */ + { 63, 3, 23}, /* 21 */ + { 341, 3, 24}, /* CCC22 */ + { 68, 3, 24}, /* 22 */ + { 342, 3, 25}, /* CCC23 */ + { 74, 3, 25}, /* 23 */ + { 343, 3, 26}, /* CCC24 */ + { 79, 3, 26}, /* 24 */ + { 344, 3, 27}, /* CCC25 */ + { 81, 3, 27}, /* 25 */ + { 349, 3, 28}, /* CCC30 */ + { 95, 3, 28}, /* 30 */ + { 350, 3, 29}, /* CCC31 */ + { 100, 3, 29}, /* 31 */ + { 351, 3, 30}, /* CCC32 */ + { 101, 3, 30}, /* 32 */ + { 346, 3, 31}, /* CCC27 */ + { 83, 3, 31}, /* 27 */ + { 347, 3, 32}, /* CCC28 */ + { 84, 3, 32}, /* 28 */ + { 348, 3, 33}, /* CCC29 */ + { 85, 3, 33}, /* 29 */ + { 352, 3, 34}, /* CCC33 */ + { 102, 3, 34}, /* 33 */ + { 353, 3, 35}, /* CCC34 */ + { 103, 3, 35}, /* 34 */ + { 354, 3, 36}, /* CCC35 */ + { 104, 3, 36}, /* 35 */ + { 355, 3, 37}, /* CCC36 */ + { 105, 3, 37}, /* 36 */ + {1034, 3, 38}, /* NUKTA */ + { 142, 3, 38}, /* 7 */ + {1011, 3, 38}, /* NK */ + {1383, 3, 39}, /* VIRAMA */ + { 158, 3, 39}, /* 9 */ + {1390, 3, 39}, /* VR */ + { 356, 3, 40}, /* CCC84 */ + { 157, 3, 40}, /* 84 */ + { 357, 3, 41}, /* CCC91 */ + { 165, 3, 41}, /* 91 */ + { 322, 3, 42}, /* CCC103 */ + { 31, 3, 42}, /* 103 */ + { 323, 3, 43}, /* CCC107 */ + { 32, 3, 43}, /* 107 */ + { 325, 3, 44}, /* CCC118 */ + { 36, 3, 44}, /* 118 */ + { 327, 3, 45}, /* CCC122 */ + { 38, 3, 45}, /* 122 */ + { 328, 3, 46}, /* CCC129 */ + { 39, 3, 46}, /* 129 */ + { 330, 3, 47}, /* CCC130 */ + { 42, 3, 47}, /* 130 */ + { 331, 3, 48}, /* CCC132 */ + { 43, 3, 48}, /* 132 */ + { 229, 3, 49}, /* ATTACHEDABOVE */ + { 64, 3, 49}, /* 214 */ + { 224, 3, 49}, /* ATA */ + { 254, 3, 50}, /* BELOWLEFT */ + { 67, 3, 50}, /* 218 */ + { 268, 3, 50}, /* BL */ + { 811, 3, 51}, /* LEFT */ + { 71, 3, 51}, /* 224 */ + { 783, 3, 51}, /* L */ + { 757, 3, 52}, /* KANAVOICING */ + { 151, 3, 52}, /* 8 */ + { 782, 3, 52}, /* KV */ + { 345, 3, 53}, /* CCC26 */ + { 82, 3, 53}, /* 26 */ + { 667, 3, 54}, /* HANREADING */ + { 136, 3, 54}, /* 6 */ + { 666, 3, 54}, /* HANR */ + {1172, 3, 55}, /* RIGHT */ + { 72, 3, 55}, /* 226 */ + {1164, 3, 55}, /* R */ + { 332, 3, 56}, /* CCC133 */ + { 44, 3, 56}, /* 133 */ + { 232, 3, 57}, /* ATTACHEDBELOWLEFT */ + { 57, 3, 57}, /* 200 */ + { 227, 3, 57}, /* ATBL */ + {1020, 4, 0}, /* NONE */ + {1017, 4, 1}, /* NOBREAK */ + { 994, 4, 1}, /* NB */ + { 424, 4, 2}, /* COMPAT */ + { 413, 4, 2}, /* COM */ + {1267, 4, 3}, /* SUPER */ + {1263, 4, 3}, /* SUP */ + { 592, 4, 4}, /* FRACTION */ + { 591, 4, 4}, /* FRA */ + { 307, 4, 5}, /* CANONICAL */ + { 304, 4, 5}, /* CAN */ + {1258, 4, 6}, /* SUB */ + { 589, 4, 7}, /* FONT */ + { 374, 4, 8}, /* CIRCLE */ + { 546, 4, 8}, /* ENC */ + {1401, 4, 9}, /* WIDE */ + {1381, 4, 10}, /* VERTICAL */ + {1380, 4, 10}, /* VERT */ + {1254, 4, 11}, /* SQUARE */ + {1253, 4, 11}, /* SQR */ + { 731, 4, 12}, /* ISOLATED */ + { 730, 4, 12}, /* ISO */ + { 584, 4, 13}, /* FINAL */ + { 583, 4, 13}, /* FIN */ + { 717, 4, 14}, /* INITIAL */ + { 716, 4, 14}, /* INIT */ + { 930, 4, 15}, /* MEDIAL */ + { 927, 4, 15}, /* MED */ + {1231, 4, 16}, /* SMALL */ + {1236, 4, 16}, /* SML */ + { 993, 4, 17}, /* NARROW */ + { 991, 4, 17}, /* NAR */ + { 998, 5, 0}, /* NEUTRAL */ + { 984, 5, 0}, /* N */ + { 993, 5, 1}, /* NARROW */ + { 986, 5, 1}, /* NA */ + { 193, 5, 2}, /* AMBIGUOUS */ + { 166, 5, 2}, /* A */ + {1401, 5, 3}, /* WIDE */ + {1393, 5, 3}, /* W */ + { 649, 5, 4}, /* HALFWIDTH */ + { 643, 5, 4}, /* H */ + { 594, 5, 5}, /* FULLWIDTH */ + { 578, 5, 5}, /* F */ + {1363, 6, 0}, /* UNASSIGNED */ + { 410, 6, 0}, /* CN */ + { 443, 6, 1}, /* CONTROL */ + { 319, 6, 1}, /* CC */ + { 411, 6, 1}, /* CNTRL */ + {1248, 6, 2}, /* SPACESEPARATOR */ + {1441, 6, 2}, /* ZS */ + {1090, 6, 3}, /* OTHERPUNCTUATION */ + {1133, 6, 3}, /* PO */ + { 457, 6, 4}, /* CURRENCYSYMBOL */ + {1199, 6, 4}, /* SC */ + {1069, 6, 5}, /* OPENPUNCTUATION */ + {1150, 6, 5}, /* PS */ + { 408, 6, 6}, /* CLOSEPUNCTUATION */ + {1115, 6, 6}, /* PE */ + { 921, 6, 7}, /* MATHSYMBOL */ + {1230, 6, 7}, /* SM */ + { 482, 6, 8}, /* DASHPUNCTUATION */ + {1112, 6, 8}, /* PD */ + { 486, 6, 9}, /* DECIMALNUMBER */ + { 997, 6, 9}, /* ND */ + { 504, 6, 9}, /* DIGIT */ + {1371, 6, 10}, /* UPPERCASELETTER */ + { 851, 6, 10}, /* LU */ + { 964, 6, 11}, /* MODIFIERSYMBOL */ + {1229, 6, 11}, /* SK */ + { 428, 6, 12}, /* CONNECTORPUNCTUATION */ + {1110, 6, 12}, /* PC */ + { 845, 6, 13}, /* LOWERCASELETTER */ + { 838, 6, 13}, /* LL */ + {1091, 6, 14}, /* OTHERSYMBOL */ + {1237, 6, 14}, /* SO */ + {1085, 6, 15}, /* OTHERLETTER */ + { 840, 6, 15}, /* LO */ + { 718, 6, 16}, /* INITIALPUNCTUATION */ + {1130, 6, 16}, /* PI */ + { 590, 6, 17}, /* FORMAT */ + { 358, 6, 17}, /* CF */ + {1089, 6, 18}, /* OTHERNUMBER */ + {1015, 6, 18}, /* NO */ + { 585, 6, 19}, /* FINALPUNCTUATION */ + {1117, 6, 19}, /* PF */ + {1342, 6, 20}, /* TITLECASELETTER */ + { 850, 6, 20}, /* LT */ + { 962, 6, 21}, /* MODIFIERLETTER */ + { 839, 6, 21}, /* LM */ + {1023, 6, 22}, /* NONSPACINGMARK */ + { 960, 6, 22}, /* MN */ + { 555, 6, 23}, /* ENCLOSINGMARK */ + { 926, 6, 23}, /* ME */ + {1249, 6, 24}, /* SPACINGMARK */ + { 925, 6, 24}, /* MC */ + { 822, 6, 25}, /* LETTERNUMBER */ + {1014, 6, 25}, /* NL */ + { 834, 6, 26}, /* LINESEPARATOR */ + {1439, 6, 26}, /* ZL */ + {1103, 6, 27}, /* PARAGRAPHSEPARATOR */ + {1440, 6, 27}, /* ZP */ + {1283, 6, 28}, /* SURROGATE */ + { 453, 6, 28}, /* CS */ + {1147, 6, 29}, /* PRIVATEUSE */ + { 412, 6, 29}, /* CO */ + {1079, 6, 30}, /* OTHER */ + { 301, 6, 30}, /* C */ + { 302, 6, 30}, /* C& */ + { 820, 6, 31}, /* LETTER */ + { 783, 6, 31}, /* L */ + { 784, 6, 31}, /* L& */ + { 914, 6, 32}, /* MARK */ + { 860, 6, 32}, /* M */ + { 419, 6, 32}, /* COMBININGMARK */ + { 861, 6, 32}, /* M& */ + {1035, 6, 33}, /* NUMBER */ + { 984, 6, 33}, /* N */ + { 985, 6, 33}, /* N& */ + {1154, 6, 34}, /* PUNCTUATION */ + {1098, 6, 34}, /* P */ + {1153, 6, 34}, /* PUNCT */ + {1099, 6, 34}, /* P& */ + {1290, 6, 35}, /* SYMBOL */ + {1188, 6, 35}, /* S */ + {1189, 6, 35}, /* S& */ + {1212, 6, 36}, /* SEPARATOR */ + {1432, 6, 36}, /* Z */ + {1433, 6, 36}, /* Z& */ + { 315, 6, 37}, /* CASEDLETTER */ + { 808, 6, 37}, /* LC */ + { 222, 6, 38}, /* ASSIGNED */ + {1079, 7, 0}, /* OTHER */ + {1416, 7, 0}, /* XX */ + { 443, 7, 1}, /* CONTROL */ + { 410, 7, 1}, /* CN */ + { 823, 7, 2}, /* LF */ + { 452, 7, 3}, /* CR */ + { 573, 7, 4}, /* EXTEND */ + { 570, 7, 4}, /* EX */ + {1144, 7, 5}, /* PREPEND */ + {1141, 7, 5}, /* PP */ + {1249, 7, 6}, /* SPACINGMARK */ + {1230, 7, 6}, /* SM */ + { 783, 7, 7}, /* L */ + {1372, 7, 8}, /* V */ + {1299, 7, 9}, /* T */ + {1443, 7, 10}, /* ZWJ */ + { 852, 7, 11}, /* LV */ + { 854, 7, 12}, /* LVT */ + {1166, 7, 13}, /* REGIONALINDICATOR */ + {1171, 7, 13}, /* RI */ + { 525, 7, 14}, /* EBASE */ + { 524, 7, 14}, /* EB */ + { 526, 7, 15}, /* EBASEGAZ */ + { 527, 7, 15}, /* EBG */ + { 538, 7, 16}, /* EMODIFIER */ + { 536, 7, 16}, /* EM */ + { 618, 7, 17}, /* GLUEAFTERZWJ */ + { 597, 7, 17}, /* GAZ */ + {1026, 8, 0}, /* NOTAPPLICABLE */ + { 986, 8, 0}, /* NA */ + { 810, 8, 1}, /* LEADINGJAMO */ + { 783, 8, 1}, /* L */ + {1389, 8, 2}, /* VOWELJAMO */ + {1372, 8, 2}, /* V */ + {1352, 8, 3}, /* TRAILINGJAMO */ + {1299, 8, 3}, /* T */ + { 853, 8, 4}, /* LVSYLLABLE */ + { 852, 8, 4}, /* LV */ + { 855, 8, 5}, /* LVTSYLLABLE */ + { 854, 8, 5}, /* LVT */ + { 986, 9, 0}, /* NA */ + {1345, 9, 1}, /* TOP */ + {1172, 9, 2}, /* RIGHT */ + { 278, 9, 3}, /* BOTTOM */ + { 811, 9, 4}, /* LEFT */ + { 812, 9, 5}, /* LEFTANDRIGHT */ + {1351, 9, 6}, /* TOPANDRIGHT */ + {1349, 9, 7}, /* TOPANDLEFT */ + {1350, 9, 8}, /* TOPANDLEFTANDRIGHT */ + {1346, 9, 9}, /* TOPANDBOTTOM */ + {1385, 9, 10}, /* VISUALORDERLEFT */ + {1347, 9, 11}, /* TOPANDBOTTOMANDLEFT */ + { 280, 9, 12}, /* BOTTOMANDRIGHT */ + {1348, 9, 13}, /* TOPANDBOTTOMANDRIGHT */ + {1097, 9, 14}, /* OVERSTRUCK */ + { 279, 9, 15}, /* BOTTOMANDLEFT */ + {1079, 10, 0}, /* OTHER */ + { 436, 10, 1}, /* CONSONANTPLACEHOLDER */ + {1035, 10, 2}, /* NUMBER */ + {1287, 10, 3}, /* SYLLABLEMODIFIER */ + { 266, 10, 4}, /* BINDU */ + {1384, 10, 5}, /* VISARGA */ + {1388, 10, 6}, /* VOWELINDEPENDENT */ + { 429, 10, 7}, /* CONSONANT */ + {1387, 10, 8}, /* VOWELDEPENDENT */ + {1034, 10, 9}, /* NUKTA */ + { 233, 10, 10}, /* AVAGRAHA */ + {1383, 10, 11}, /* VIRAMA */ + { 310, 10, 12}, /* CANTILLATIONMARK */ + { 430, 10, 13}, /* CONSONANTDEAD */ + { 600, 10, 14}, /* GEMINATIONMARK */ + { 435, 10, 15}, /* CONSONANTMEDIAL */ + { 966, 10, 16}, /* MODIFYINGLETTER */ + { 441, 10, 17}, /* CONSONANTWITHSTACKER */ + {1155, 10, 18}, /* PUREKILLER */ + { 437, 10, 19}, /* CONSONANTPRECEDINGREPHA */ + {1344, 10, 20}, /* TONEMARK */ + { 434, 10, 21}, /* CONSONANTKILLER */ + { 432, 10, 22}, /* CONSONANTHEADLETTER */ + { 439, 10, 23}, /* CONSONANTSUBJOINED */ + { 725, 10, 24}, /* INVISIBLESTACKER */ + {1167, 10, 25}, /* REGISTERSHIFTER */ + { 440, 10, 26}, /* CONSONANTSUCCEEDINGREPHA */ + { 431, 10, 27}, /* CONSONANTFINAL */ + {1386, 10, 28}, /* VOWEL */ + {1343, 10, 29}, /* TONELETTER */ + { 433, 10, 30}, /* CONSONANTINITIALPOSTFIXED */ + {1021, 10, 31}, /* NONJOINER */ + { 743, 10, 32}, /* JOINER */ + { 286, 10, 33}, /* BRAHMIJOININGNUMBER */ + {1037, 10, 34}, /* NUMBERJOINER */ + { 438, 10, 35}, /* CONSONANTPREFIXED */ + {1018, 11, 0}, /* NOJOININGGROUP */ + {1418, 11, 1}, /* YEH */ + { 185, 11, 2}, /* ALEF */ + {1397, 11, 3}, /* WAW */ + { 252, 11, 4}, /* BEH */ + {1325, 11, 5}, /* TEHMARBUTA */ + { 646, 11, 6}, /* HAH */ + { 479, 11, 7}, /* DAL */ + {1168, 11, 8}, /* REH */ + {1206, 11, 9}, /* SEEN */ + {1191, 11, 10}, /* SAD */ + {1304, 11, 11}, /* TAH */ + { 180, 11, 12}, /* AIN */ + { 595, 11, 13}, /* GAF */ + { 580, 11, 14}, /* FARSIYEH */ + { 582, 11, 15}, /* FEH */ + {1158, 11, 16}, /* QAF */ + { 749, 11, 17}, /* KAF */ + { 785, 11, 18}, /* LAM */ + { 931, 11, 19}, /* MEEM */ + {1025, 11, 20}, /* NOON */ + { 675, 11, 21}, /* HEH */ + {1285, 11, 22}, /* SWASHKAF */ + {1044, 11, 23}, /* NYA */ + { 780, 11, 24}, /* KNOTTEDHEH */ + { 676, 11, 25}, /* HEHGOAL */ + { 651, 11, 26}, /* HAMZAONHEHGOAL */ + {1326, 11, 26}, /* TEHMARBUTAGOAL */ + {1420, 11, 27}, /* YEHWITHTAIL */ + {1419, 11, 28}, /* YEHBARREE */ + { 182, 11, 29}, /* ALAPH */ + { 258, 11, 30}, /* BETH */ + { 596, 11, 31}, /* GAMAL */ + { 480, 11, 32}, /* DALATHRISH */ + { 671, 11, 33}, /* HE */ + {1298, 11, 34}, /* SYRIACWAW */ + {1434, 11, 35}, /* ZAIN */ + { 677, 11, 36}, /* HETH */ + {1331, 11, 37}, /* TETH */ + {1430, 11, 38}, /* YUDH */ + {1431, 11, 39}, /* YUDHHE */ + { 762, 11, 40}, /* KAPH */ + { 786, 11, 41}, /* LAMADH */ + { 945, 11, 42}, /* MIM */ + {1041, 11, 43}, /* NUN */ + {1208, 11, 44}, /* SEMKATH */ + { 586, 11, 45}, /* FINALSEMKATH */ + { 520, 11, 46}, /* E */ + {1115, 11, 47}, /* PE */ + {1170, 11, 48}, /* REVERSEDPE */ + {1192, 11, 49}, /* SADHE */ + {1159, 11, 50}, /* QAPH */ + {1218, 11, 51}, /* SHIN */ + {1324, 11, 52}, /* TAW */ + {1437, 11, 53}, /* ZHAIN */ + { 768, 11, 54}, /* KHAPH */ + { 581, 11, 55}, /* FE */ + { 298, 11, 56}, /* BURUSHASKIYEHBARREE */ + { 873, 11, 57}, /* MALAYALAMNGA */ + { 870, 11, 58}, /* MALAYALAMJA */ + { 876, 11, 59}, /* MALAYALAMNYA */ + { 879, 11, 60}, /* MALAYALAMTTA */ + { 874, 11, 61}, /* MALAYALAMNNA */ + { 875, 11, 62}, /* MALAYALAMNNNA */ + { 869, 11, 63}, /* MALAYALAMBHA */ + { 877, 11, 64}, /* MALAYALAMRA */ + { 871, 11, 65}, /* MALAYALAMLLA */ + { 872, 11, 66}, /* MALAYALAMLLLA */ + { 878, 11, 67}, /* MALAYALAMSSA */ + {1183, 11, 68}, /* ROHINGYAYEH */ + {1257, 11, 69}, /* STRAIGHTWAW */ + { 173, 11, 70}, /* AFRICANFEH */ + { 175, 11, 71}, /* AFRICANQAF */ + { 174, 11, 72}, /* AFRICANNOON */ + { 885, 11, 73}, /* MANICHAEANALEPH */ + { 887, 11, 74}, /* MANICHAEANBETH */ + { 891, 11, 75}, /* MANICHAEANGIMEL */ + { 888, 11, 76}, /* MANICHAEANDALETH */ + { 909, 11, 77}, /* MANICHAEANWAW */ + { 911, 11, 78}, /* MANICHAEANZAYIN */ + { 892, 11, 79}, /* MANICHAEANHETH */ + { 906, 11, 80}, /* MANICHAEANTETH */ + { 910, 11, 81}, /* MANICHAEANYODH */ + { 894, 11, 82}, /* MANICHAEANKAPH */ + { 895, 11, 83}, /* MANICHAEANLAMEDH */ + { 889, 11, 84}, /* MANICHAEANDHAMEDH */ + { 907, 11, 85}, /* MANICHAEANTHAMEDH */ + { 896, 11, 86}, /* MANICHAEANMEM */ + { 897, 11, 87}, /* MANICHAEANNUN */ + { 903, 11, 88}, /* MANICHAEANSAMEKH */ + { 886, 11, 89}, /* MANICHAEANAYIN */ + { 899, 11, 90}, /* MANICHAEANPE */ + { 902, 11, 91}, /* MANICHAEANSADHE */ + { 900, 11, 92}, /* MANICHAEANQOPH */ + { 901, 11, 93}, /* MANICHAEANRESH */ + { 904, 11, 94}, /* MANICHAEANTAW */ + { 898, 11, 95}, /* MANICHAEANONE */ + { 890, 11, 96}, /* MANICHAEANFIVE */ + { 905, 11, 97}, /* MANICHAEANTEN */ + { 908, 11, 98}, /* MANICHAEANTWENTY */ + { 893, 11, 99}, /* MANICHAEANHUNDRED */ + { 664, 11, 100}, /* HANIFIROHINGYAPA */ + { 663, 11, 101}, /* HANIFIROHINGYAKINNAYA */ + {1022, 12, 0}, /* NONJOINING */ + {1357, 12, 0}, /* U */ + {1353, 12, 1}, /* TRANSPARENT */ + {1299, 12, 1}, /* T */ + { 517, 12, 2}, /* DUALJOINING */ + { 477, 12, 2}, /* D */ + {1173, 12, 3}, /* RIGHTJOINING */ + {1164, 12, 3}, /* R */ + { 741, 12, 4}, /* JOINCAUSING */ + { 301, 12, 4}, /* C */ + { 813, 12, 5}, /* LEFTJOINING */ + { 783, 12, 5}, /* L */ + {1367, 13, 0}, /* UNKNOWN */ + {1416, 13, 0}, /* XX */ + { 419, 13, 1}, /* COMBININGMARK */ + { 409, 13, 1}, /* CM */ + { 290, 13, 2}, /* BREAKAFTER */ + { 238, 13, 2}, /* BA */ + { 833, 13, 3}, /* LINEFEED */ + { 823, 13, 3}, /* LF */ + { 882, 13, 4}, /* MANDATORYBREAK */ + { 267, 13, 4}, /* BK */ + { 313, 13, 5}, /* CARRIAGERETURN */ + { 452, 13, 5}, /* CR */ + {1247, 13, 6}, /* SPACE */ + {1246, 13, 6}, /* SP */ + { 571, 13, 7}, /* EXCLAMATION */ + { 570, 13, 7}, /* EX */ + {1162, 13, 8}, /* QUOTATION */ + {1161, 13, 8}, /* QU */ + { 189, 13, 9}, /* ALPHABETIC */ + { 181, 13, 9}, /* AL */ + {1143, 13, 10}, /* PREFIXNUMERIC */ + {1142, 13, 10}, /* PR */ + {1140, 13, 11}, /* POSTFIXNUMERIC */ + {1133, 13, 11}, /* PO */ + {1069, 13, 12}, /* OPENPUNCTUATION */ + {1068, 13, 12}, /* OP */ + { 407, 13, 13}, /* CLOSEPARENTHESIS */ + { 450, 13, 13}, /* CP */ + { 714, 13, 14}, /* INFIXNUMERIC */ + { 729, 13, 14}, /* IS */ + { 693, 13, 15}, /* HYPHEN */ + { 692, 13, 15}, /* HY */ + { 293, 13, 16}, /* BREAKSYMBOLS */ + {1286, 13, 16}, /* SY */ + {1038, 13, 17}, /* NUMERIC */ + {1033, 13, 17}, /* NU */ + { 408, 13, 18}, /* CLOSEPUNCTUATION */ + { 405, 13, 18}, /* CL */ + {1002, 13, 19}, /* NEXTLINE */ + {1014, 13, 19}, /* NL */ + { 617, 13, 20}, /* GLUE */ + { 612, 13, 20}, /* GL */ + { 193, 13, 21}, /* AMBIGUOUS */ + { 179, 13, 21}, /* AI */ + { 291, 13, 22}, /* BREAKBEFORE */ + { 250, 13, 22}, /* BB */ + { 674, 13, 23}, /* HEBREWLETTER */ + { 685, 13, 23}, /* HL */ + { 426, 13, 24}, /* COMPLEXCONTEXT */ + {1190, 13, 24}, /* SA */ + { 739, 13, 25}, /* JL */ + { 747, 13, 26}, /* JV */ + { 746, 13, 27}, /* JT */ + {1024, 13, 28}, /* NONSTARTER */ + {1029, 13, 28}, /* NS */ + {1444, 13, 29}, /* ZWSPACE */ + {1442, 13, 29}, /* ZW */ + {1443, 13, 30}, /* ZWJ */ + { 292, 13, 31}, /* BREAKBOTH */ + { 237, 13, 31}, /* B2 */ + { 723, 13, 32}, /* INSEPARABLE */ + { 709, 13, 32}, /* IN */ + { 724, 13, 32}, /* INSEPERABLE */ + {1405, 13, 33}, /* WORDJOINER */ + {1402, 13, 33}, /* WJ */ + { 698, 13, 34}, /* IDEOGRAPHIC */ + { 694, 13, 34}, /* ID */ + { 525, 13, 35}, /* EBASE */ + { 524, 13, 35}, /* EB */ + { 427, 13, 36}, /* CONDITIONALJAPANESESTARTER */ + { 375, 13, 36}, /* CJ */ + { 644, 13, 37}, /* H2 */ + { 645, 13, 38}, /* H3 */ + {1283, 13, 39}, /* SURROGATE */ + {1213, 13, 39}, /* SG */ + { 442, 13, 40}, /* CONTINGENTBREAK */ + { 318, 13, 40}, /* CB */ + {1166, 13, 41}, /* REGIONALINDICATOR */ + {1171, 13, 41}, /* RI */ + { 538, 13, 42}, /* EMODIFIER */ + { 536, 13, 42}, /* EM */ + {1015, 14, 0}, /* NO */ + { 984, 14, 0}, /* N */ + {1421, 14, 1}, /* YES */ + {1417, 14, 1}, /* Y */ + { 923, 14, 2}, /* MAYBE */ + { 860, 14, 2}, /* M */ + {1015, 15, 0}, /* NO */ + { 984, 15, 0}, /* N */ + {1421, 15, 1}, /* YES */ + {1417, 15, 1}, /* Y */ + {1020, 16, 0}, /* NONE */ + { 485, 16, 1}, /* DECIMAL */ + { 484, 16, 1}, /* DE */ + { 504, 16, 2}, /* DIGIT */ + { 496, 16, 2}, /* DI */ + {1038, 16, 3}, /* NUMERIC */ + {1033, 16, 3}, /* NU */ + { 988, 17, 0}, /* NAN */ + { 1, 17, 1}, /* 0 */ + { 2, 17, 2}, /* 1 */ + { 53, 17, 3}, /* 2 */ + { 86, 17, 4}, /* 3 */ + { 109, 17, 5}, /* 4 */ + { 126, 17, 6}, /* 5 */ + { 136, 17, 7}, /* 6 */ + { 142, 17, 8}, /* 7 */ + { 151, 17, 9}, /* 8 */ + { 158, 17, 10}, /* 9 */ + { 12, 17, 11}, /* 1/4 */ + { 7, 17, 12}, /* 1/2 */ + { 90, 17, 13}, /* 3/4 */ + { 5, 17, 14}, /* 1/16 */ + { 18, 17, 15}, /* 1/8 */ + { 87, 17, 16}, /* 3/16 */ + { 48, 17, 17}, /* 16 */ + { 21, 17, 18}, /* 10 */ + { 22, 17, 19}, /* 100 */ + { 23, 17, 20}, /* 1000 */ + { 6, 17, 21}, /* 1/160 */ + { 13, 17, 22}, /* 1/40 */ + { 94, 17, 23}, /* 3/80 */ + { 8, 17, 24}, /* 1/20 */ + { 3, 17, 25}, /* 1/10 */ + { 89, 17, 26}, /* 3/20 */ + { 14, 17, 27}, /* 1/5 */ + { 88, 17, 28}, /* 3/2 */ + { 128, 17, 29}, /* 5/2 */ + { 144, 17, 30}, /* 7/2 */ + { 159, 17, 31}, /* 9/2 */ + { 35, 17, 32}, /* 11/2 */ + { 41, 17, 33}, /* 13/2 */ + { 47, 17, 34}, /* 15/2 */ + { 50, 17, 35}, /* 17/2 */ + { 0, 17, 36}, /* -1/2 */ + { 56, 17, 37}, /* 20 */ + { 95, 17, 38}, /* 30 */ + { 111, 17, 39}, /* 40 */ + { 131, 17, 40}, /* 50 */ + { 137, 17, 41}, /* 60 */ + { 146, 17, 42}, /* 70 */ + { 152, 17, 43}, /* 80 */ + { 160, 17, 44}, /* 90 */ + { 24, 17, 45}, /* 10000 */ + { 49, 17, 46}, /* 17 */ + { 51, 17, 47}, /* 18 */ + { 52, 17, 48}, /* 19 */ + { 17, 17, 49}, /* 1/7 */ + { 20, 17, 50}, /* 1/9 */ + { 9, 17, 51}, /* 1/3 */ + { 54, 17, 52}, /* 2/3 */ + { 55, 17, 53}, /* 2/5 */ + { 91, 17, 54}, /* 3/5 */ + { 110, 17, 55}, /* 4/5 */ + { 15, 17, 56}, /* 1/6 */ + { 129, 17, 57}, /* 5/6 */ + { 93, 17, 58}, /* 3/8 */ + { 130, 17, 59}, /* 5/8 */ + { 145, 17, 60}, /* 7/8 */ + { 33, 17, 61}, /* 11 */ + { 37, 17, 62}, /* 12 */ + { 132, 17, 63}, /* 500 */ + { 133, 17, 64}, /* 5000 */ + { 134, 17, 65}, /* 50000 */ + { 25, 17, 66}, /* 100000 */ + { 40, 17, 67}, /* 13 */ + { 45, 17, 68}, /* 14 */ + { 46, 17, 69}, /* 15 */ + { 63, 17, 70}, /* 21 */ + { 68, 17, 71}, /* 22 */ + { 74, 17, 72}, /* 23 */ + { 79, 17, 73}, /* 24 */ + { 81, 17, 74}, /* 25 */ + { 82, 17, 75}, /* 26 */ + { 83, 17, 76}, /* 27 */ + { 84, 17, 77}, /* 28 */ + { 85, 17, 78}, /* 29 */ + { 100, 17, 79}, /* 31 */ + { 101, 17, 80}, /* 32 */ + { 102, 17, 81}, /* 33 */ + { 103, 17, 82}, /* 34 */ + { 104, 17, 83}, /* 35 */ + { 105, 17, 84}, /* 36 */ + { 106, 17, 85}, /* 37 */ + { 107, 17, 86}, /* 38 */ + { 108, 17, 87}, /* 39 */ + { 116, 17, 88}, /* 41 */ + { 117, 17, 89}, /* 42 */ + { 118, 17, 90}, /* 43 */ + { 120, 17, 91}, /* 44 */ + { 121, 17, 92}, /* 45 */ + { 122, 17, 93}, /* 46 */ + { 123, 17, 94}, /* 47 */ + { 124, 17, 95}, /* 48 */ + { 125, 17, 96}, /* 49 */ + { 28, 17, 97}, /* 100000000 */ + { 30, 17, 98}, /* 1000000000000 */ + { 57, 17, 99}, /* 200 */ + { 96, 17, 100}, /* 300 */ + { 112, 17, 101}, /* 400 */ + { 138, 17, 102}, /* 600 */ + { 147, 17, 103}, /* 700 */ + { 153, 17, 104}, /* 800 */ + { 161, 17, 105}, /* 900 */ + { 58, 17, 106}, /* 2000 */ + { 97, 17, 107}, /* 3000 */ + { 113, 17, 108}, /* 4000 */ + { 139, 17, 109}, /* 6000 */ + { 148, 17, 110}, /* 7000 */ + { 154, 17, 111}, /* 8000 */ + { 162, 17, 112}, /* 9000 */ + { 59, 17, 113}, /* 20000 */ + { 98, 17, 114}, /* 30000 */ + { 114, 17, 115}, /* 40000 */ + { 140, 17, 116}, /* 60000 */ + { 149, 17, 117}, /* 70000 */ + { 155, 17, 118}, /* 80000 */ + { 163, 17, 119}, /* 90000 */ + { 34, 17, 120}, /* 11/12 */ + { 60, 17, 121}, /* 200000 */ + { 99, 17, 122}, /* 300000 */ + { 115, 17, 123}, /* 400000 */ + { 135, 17, 124}, /* 500000 */ + { 141, 17, 125}, /* 600000 */ + { 150, 17, 126}, /* 700000 */ + { 156, 17, 127}, /* 800000 */ + { 164, 17, 128}, /* 900000 */ + { 4, 17, 129}, /* 1/12 */ + { 127, 17, 130}, /* 5/12 */ + { 143, 17, 131}, /* 7/12 */ + { 11, 17, 132}, /* 1/320 */ + { 19, 17, 133}, /* 1/80 */ + { 16, 17, 134}, /* 1/64 */ + { 10, 17, 135}, /* 1/32 */ + { 92, 17, 136}, /* 3/64 */ + { 66, 17, 137}, /* 216000 */ + { 119, 17, 138}, /* 432000 */ + { 26, 17, 139}, /* 1000000 */ + { 29, 17, 140}, /* 10000000000 */ + { 27, 17, 141}, /* 10000000 */ + { 61, 17, 142}, /* 20000000 */ + {1367, 18, 0}, /* UNKNOWN */ + {1446, 18, 0}, /* ZZZZ */ + { 421, 18, 1}, /* COMMON */ + {1445, 18, 1}, /* ZYYY */ + { 790, 18, 2}, /* LATIN */ + { 806, 18, 2}, /* LATN */ + { 275, 18, 3}, /* BOPOMOFO */ + { 274, 18, 3}, /* BOPO */ + { 715, 18, 4}, /* INHERITED */ + {1438, 18, 4}, /* ZINH */ + {1157, 18, 4}, /* QAAI */ + { 631, 18, 5}, /* GREEK */ + { 635, 18, 5}, /* GREK */ + { 446, 18, 6}, /* COPTIC */ + { 445, 18, 6}, /* COPT */ + {1156, 18, 6}, /* QAAC */ + { 466, 18, 7}, /* CYRILLIC */ + { 476, 18, 7}, /* CYRL */ + { 216, 18, 8}, /* ARMENIAN */ + { 218, 18, 8}, /* ARMN */ + { 673, 18, 9}, /* HEBREW */ + { 672, 18, 9}, /* HEBR */ + { 203, 18, 10}, /* ARABIC */ + { 202, 18, 10}, /* ARAB */ + {1295, 18, 11}, /* SYRIAC */ + {1294, 18, 11}, /* SYRC */ + {1335, 18, 12}, /* THAANA */ + {1334, 18, 12}, /* THAA */ + {1012, 18, 13}, /* NKO */ + {1013, 18, 13}, /* NKOO */ + {1193, 18, 14}, /* SAMARITAN */ + {1194, 18, 14}, /* SAMR */ + { 881, 18, 15}, /* MANDAIC */ + { 880, 18, 15}, /* MAND */ + { 493, 18, 16}, /* DEVANAGARI */ + { 492, 18, 16}, /* DEVA */ + { 257, 18, 17}, /* BENGALI */ + { 256, 18, 17}, /* BENG */ + { 641, 18, 18}, /* GURMUKHI */ + { 642, 18, 18}, /* GURU */ + { 638, 18, 19}, /* GUJARATI */ + { 639, 18, 19}, /* GUJR */ + {1071, 18, 20}, /* ORIYA */ + {1074, 18, 20}, /* ORYA */ + {1314, 18, 21}, /* TAMIL */ + {1317, 18, 21}, /* TAML */ + {1328, 18, 22}, /* TELUGU */ + {1327, 18, 22}, /* TELU */ + { 761, 18, 23}, /* KANNADA */ + { 779, 18, 23}, /* KNDA */ + { 868, 18, 24}, /* MALAYALAM */ + { 959, 18, 24}, /* MLYM */ + {1227, 18, 25}, /* SINHALA */ + {1226, 18, 25}, /* SINH */ + {1336, 18, 26}, /* THAI */ + { 788, 18, 27}, /* LAO */ + { 789, 18, 27}, /* LAOO */ + {1337, 18, 28}, /* TIBETAN */ + {1338, 18, 28}, /* TIBT */ + { 978, 18, 29}, /* MYANMAR */ + { 983, 18, 29}, /* MYMR */ + { 607, 18, 30}, /* GEORGIAN */ + { 606, 18, 30}, /* GEOR */ + { 654, 18, 31}, /* HANGUL */ + { 653, 18, 31}, /* HANG */ + { 560, 18, 32}, /* ETHIOPIC */ + { 559, 18, 32}, /* ETHI */ + { 367, 18, 33}, /* CHEROKEE */ + { 366, 18, 33}, /* CHER */ + { 305, 18, 34}, /* CANADIANABORIGINAL */ + { 309, 18, 34}, /* CANS */ + {1050, 18, 35}, /* OGHAM */ + {1049, 18, 35}, /* OGAM */ + {1186, 18, 36}, /* RUNIC */ + {1187, 18, 36}, /* RUNR */ + {1300, 18, 37}, /* TAGALOG */ + {1333, 18, 37}, /* TGLG */ + { 668, 18, 38}, /* HANUNOO */ + { 665, 18, 38}, /* HANO */ + { 297, 18, 39}, /* BUHID */ + { 296, 18, 39}, /* BUHD */ + {1302, 18, 40}, /* TAGBANWA */ + {1301, 18, 40}, /* TAGB */ + { 772, 18, 41}, /* KHMER */ + { 774, 18, 41}, /* KHMR */ + { 968, 18, 42}, /* MONGOLIAN */ + { 967, 18, 42}, /* MONG */ + { 825, 18, 43}, /* LIMBU */ + { 824, 18, 43}, /* LIMB */ + {1305, 18, 44}, /* TAILE */ + {1312, 18, 44}, /* TALE */ + {1001, 18, 45}, /* NEWTAILUE */ + {1313, 18, 45}, /* TALU */ + { 295, 18, 46}, /* BUGINESE */ + { 294, 18, 46}, /* BUGI */ + {1306, 18, 47}, /* TAITHAM */ + { 787, 18, 47}, /* LANA */ + { 240, 18, 48}, /* BALINESE */ + { 239, 18, 48}, /* BALI */ + {1260, 18, 49}, /* SUNDANESE */ + {1259, 18, 49}, /* SUND */ + { 248, 18, 50}, /* BATAK */ + { 249, 18, 50}, /* BATK */ + { 819, 18, 51}, /* LEPCHA */ + { 818, 18, 51}, /* LEPC */ + {1054, 18, 52}, /* OLCHIKI */ + {1055, 18, 52}, /* OLCK */ + { 288, 18, 53}, /* BRAILLE */ + { 287, 18, 53}, /* BRAI */ + { 614, 18, 54}, /* GLAGOLITIC */ + { 613, 18, 54}, /* GLAG */ + {1339, 18, 55}, /* TIFINAGH */ + {1332, 18, 55}, /* TFNG */ + { 652, 18, 56}, /* HAN */ + { 661, 18, 56}, /* HANI */ + { 684, 18, 57}, /* HIRAGANA */ + { 683, 18, 57}, /* HIRA */ + { 763, 18, 58}, /* KATAKANA */ + { 752, 18, 58}, /* KANA */ + {1424, 18, 59}, /* YI */ + {1425, 18, 59}, /* YIII */ + { 835, 18, 60}, /* LISU */ + {1373, 18, 61}, /* VAI */ + {1374, 18, 61}, /* VAII */ + { 242, 18, 62}, /* BAMUM */ + { 241, 18, 62}, /* BAMU */ + {1289, 18, 63}, /* SYLOTINAGRI */ + {1288, 18, 63}, /* SYLO */ + {1119, 18, 64}, /* PHAGSPA */ + {1118, 18, 64}, /* PHAG */ + {1197, 18, 65}, /* SAURASHTRA */ + {1196, 18, 65}, /* SAUR */ + { 767, 18, 66}, /* KAYAHLI */ + { 751, 18, 66}, /* KALI */ + {1169, 18, 67}, /* REJANG */ + {1178, 18, 67}, /* RJNG */ + { 737, 18, 68}, /* JAVANESE */ + { 736, 18, 68}, /* JAVA */ + { 360, 18, 69}, /* CHAM */ + {1307, 18, 70}, /* TAIVIET */ + {1323, 18, 70}, /* TAVT */ + { 932, 18, 71}, /* MEETEIMAYEK */ + { 973, 18, 71}, /* MTEI */ + { 829, 18, 72}, /* LINEARB */ + { 827, 18, 72}, /* LINB */ + { 857, 18, 73}, /* LYCIAN */ + { 856, 18, 73}, /* LYCI */ + { 312, 18, 74}, /* CARIAN */ + { 311, 18, 74}, /* CARI */ + {1057, 18, 75}, /* OLDITALIC */ + { 732, 18, 75}, /* ITAL */ + { 622, 18, 76}, /* GOTHIC */ + { 621, 18, 76}, /* GOTH */ + {1059, 18, 77}, /* OLDPERMIC */ + {1116, 18, 77}, /* PERM */ + {1361, 18, 78}, /* UGARITIC */ + {1360, 18, 78}, /* UGAR */ + {1060, 18, 79}, /* OLDPERSIAN */ + {1414, 18, 79}, /* XPEO */ + { 491, 18, 80}, /* DESERET */ + { 515, 18, 80}, /* DSRT */ + {1216, 18, 81}, /* SHAVIAN */ + {1217, 18, 81}, /* SHAW */ + {1078, 18, 82}, /* OSMANYA */ + {1077, 18, 82}, /* OSMA */ + {1075, 18, 83}, /* OSAGE */ + {1076, 18, 83}, /* OSGE */ + { 533, 18, 84}, /* ELBASAN */ + { 532, 18, 84}, /* ELBA */ + { 317, 18, 85}, /* CAUCASIANALBANIAN */ + { 176, 18, 85}, /* AGHB */ + { 828, 18, 86}, /* LINEARA */ + { 826, 18, 86}, /* LINA */ + { 464, 18, 87}, /* CYPRIOT */ + { 451, 18, 87}, /* CPRT */ + { 708, 18, 88}, /* IMPERIALARAMAIC */ + { 217, 18, 88}, /* ARMI */ + {1102, 18, 89}, /* PALMYRENE */ + {1101, 18, 89}, /* PALM */ + { 987, 18, 90}, /* NABATAEAN */ + { 995, 18, 90}, /* NBAT */ + { 670, 18, 91}, /* HATRAN */ + { 669, 18, 91}, /* HATR */ + {1125, 18, 92}, /* PHOENICIAN */ + {1124, 18, 92}, /* PHNX */ + { 859, 18, 93}, /* LYDIAN */ + { 858, 18, 93}, /* LYDI */ + { 940, 18, 94}, /* MEROITICHIEROGLYPHS */ + { 938, 18, 94}, /* MERO */ + { 939, 18, 95}, /* MEROITICCURSIVE */ + { 937, 18, 95}, /* MERC */ + { 770, 18, 96}, /* KHAROSHTHI */ + { 769, 18, 96}, /* KHAR */ + {1062, 18, 97}, /* OLDSOUTHARABIAN */ + {1195, 18, 97}, /* SARB */ + {1058, 18, 98}, /* OLDNORTHARABIAN */ + { 992, 18, 98}, /* NARB */ + { 884, 18, 99}, /* MANICHAEAN */ + { 883, 18, 99}, /* MANI */ + { 234, 18, 100}, /* AVESTAN */ + { 235, 18, 100}, /* AVST */ + { 722, 18, 101}, /* INSCRIPTIONALPARTHIAN */ + {1149, 18, 101}, /* PRTI */ + { 721, 18, 102}, /* INSCRIPTIONALPAHLAVI */ + {1122, 18, 102}, /* PHLI */ + {1151, 18, 103}, /* PSALTERPAHLAVI */ + {1123, 18, 103}, /* PHLP */ + {1063, 18, 104}, /* OLDTURKIC */ + {1072, 18, 104}, /* ORKH */ + {1056, 18, 105}, /* OLDHUNGARIAN */ + { 691, 18, 105}, /* HUNG */ + { 662, 18, 106}, /* HANIFIROHINGYA */ + {1182, 18, 106}, /* ROHG */ + {1423, 18, 107}, /* YEZIDI */ + {1422, 18, 107}, /* YEZI */ + {1061, 18, 108}, /* OLDSOGDIAN */ + {1241, 18, 108}, /* SOGO */ + {1240, 18, 109}, /* SOGDIAN */ + {1239, 18, 109}, /* SOGD */ + { 371, 18, 110}, /* CHORASMIAN */ + { 372, 18, 110}, /* CHRS */ + { 535, 18, 111}, /* ELYMAIC */ + { 534, 18, 111}, /* ELYM */ + { 285, 18, 112}, /* BRAHMI */ + { 284, 18, 112}, /* BRAH */ + { 750, 18, 113}, /* KAITHI */ + { 781, 18, 113}, /* KTHI */ + {1243, 18, 114}, /* SORASOMPENG */ + {1242, 18, 114}, /* SORA */ + { 359, 18, 115}, /* CHAKMA */ + { 303, 18, 115}, /* CAKM */ + { 862, 18, 116}, /* MAHAJANI */ + { 863, 18, 116}, /* MAHJ */ + {1215, 18, 117}, /* SHARADA */ + {1220, 18, 117}, /* SHRD */ + { 776, 18, 118}, /* KHOJKI */ + { 775, 18, 118}, /* KHOJ */ + { 975, 18, 119}, /* MULTANI */ + { 974, 18, 119}, /* MULT */ + { 777, 18, 120}, /* KHUDAWADI */ + {1224, 18, 120}, /* SIND */ + { 624, 18, 121}, /* GRANTHA */ + { 623, 18, 121}, /* GRAN */ + { 999, 18, 122}, /* NEWA */ + {1341, 18, 123}, /* TIRHUTA */ + {1340, 18, 123}, /* TIRH */ + {1222, 18, 124}, /* SIDDHAM */ + {1221, 18, 124}, /* SIDD */ + { 961, 18, 125}, /* MODI */ + {1311, 18, 126}, /* TAKRI */ + {1310, 18, 126}, /* TAKR */ + { 178, 18, 127}, /* AHOM */ + { 508, 18, 128}, /* DOGRA */ + { 507, 18, 128}, /* DOGR */ + {1396, 18, 129}, /* WARANGCITI */ + {1395, 18, 129}, /* WARA */ + { 506, 18, 130}, /* DIVESAKURU */ + { 503, 18, 130}, /* DIAK */ + { 990, 18, 131}, /* NANDINAGARI */ + { 989, 18, 131}, /* NAND */ + {1435, 18, 132}, /* ZANABAZARSQUARE */ + {1436, 18, 132}, /* ZANB */ + {1245, 18, 133}, /* SOYOMBO */ + {1244, 18, 133}, /* SOYO */ + {1109, 18, 134}, /* PAUCINHAU */ + {1108, 18, 134}, /* PAUC */ + { 259, 18, 135}, /* BHAIKSUKI */ + { 260, 18, 135}, /* BHKS */ + { 913, 18, 136}, /* MARCHEN */ + { 912, 18, 136}, /* MARC */ + { 915, 18, 137}, /* MASARAMGONDI */ + { 620, 18, 137}, /* GONM */ + { 640, 18, 138}, /* GUNJALAGONDI */ + { 619, 18, 138}, /* GONG */ + { 867, 18, 139}, /* MAKASAR */ + { 866, 18, 139}, /* MAKA */ + { 454, 18, 140}, /* CUNEIFORM */ + {1415, 18, 140}, /* XSUX */ + { 531, 18, 141}, /* EGYPTIANHIEROGLYPHS */ + { 529, 18, 141}, /* EGYP */ + { 195, 18, 142}, /* ANATOLIANHIEROGLYPHS */ + { 686, 18, 142}, /* HLUW */ + { 971, 18, 143}, /* MRO */ + { 972, 18, 143}, /* MROO */ + { 247, 18, 144}, /* BASSAVAH */ + { 246, 18, 144}, /* BASS */ + {1100, 18, 145}, /* PAHAWHHMONG */ + { 687, 18, 145}, /* HMNG */ + { 928, 18, 146}, /* MEDEFAIDRIN */ + { 929, 18, 146}, /* MEDF */ + { 941, 18, 147}, /* MIAO */ + {1132, 18, 147}, /* PLRD */ + {1319, 18, 148}, /* TANGUT */ + {1318, 18, 148}, /* TANG */ + {1042, 18, 149}, /* NUSHU */ + {1030, 18, 149}, /* NSHU */ + { 771, 18, 150}, /* KHITANSMALLSCRIPT */ + { 778, 18, 150}, /* KITS */ + { 519, 18, 151}, /* DUPLOYAN */ + { 518, 18, 151}, /* DUPL */ + {1223, 18, 152}, /* SIGNWRITING */ + {1214, 18, 152}, /* SGNW */ + {1045, 18, 153}, /* NYIAKENGPUACHUEHMONG */ + { 688, 18, 153}, /* HMNP */ + {1394, 18, 154}, /* WANCHO */ + {1399, 18, 154}, /* WCHO */ + { 936, 18, 155}, /* MENDEKIKAKUI */ + { 935, 18, 155}, /* MEND */ + { 170, 18, 156}, /* ADLAM */ + { 171, 18, 156}, /* ADLM */ + { 765, 18, 157}, /* KATAKANAORHIRAGANA */ + { 689, 18, 157}, /* HRKT */ + {1079, 19, 0}, /* OTHER */ + {1416, 19, 0}, /* XX */ + {1246, 19, 1}, /* SP */ + { 823, 19, 2}, /* LF */ + { 452, 19, 3}, /* CR */ + {1256, 19, 4}, /* STERM */ + {1255, 19, 4}, /* ST */ + { 406, 19, 5}, /* CLOSE */ + { 405, 19, 5}, /* CL */ + {1200, 19, 6}, /* SCONTINUE */ + {1199, 19, 6}, /* SC */ + { 228, 19, 7}, /* ATERM */ + { 223, 19, 7}, /* AT */ + {1038, 19, 8}, /* NUMERIC */ + {1033, 19, 8}, /* NU */ + {1369, 19, 9}, /* UPPER */ + {1368, 19, 9}, /* UP */ + { 843, 19, 10}, /* LOWER */ + { 840, 19, 10}, /* LO */ + {1211, 19, 11}, /* SEP */ + {1205, 19, 11}, /* SE */ + { 590, 19, 12}, /* FORMAT */ + { 588, 19, 12}, /* FO */ + {1064, 19, 13}, /* OLETTER */ + { 809, 19, 13}, /* LE */ + { 573, 19, 14}, /* EXTEND */ + { 570, 19, 14}, /* EX */ + {1079, 20, 0}, /* OTHER */ + {1416, 20, 0}, /* XX */ + { 823, 20, 1}, /* LF */ + {1000, 20, 2}, /* NEWLINE */ + {1014, 20, 2}, /* NL */ + { 452, 20, 3}, /* CR */ + {1407, 20, 4}, /* WSEGSPACE */ + { 513, 20, 5}, /* DOUBLEQUOTE */ + { 514, 20, 5}, /* DQ */ + {1225, 20, 6}, /* SINGLEQUOTE */ + {1252, 20, 6}, /* SQ */ + { 943, 20, 7}, /* MIDNUM */ + { 960, 20, 7}, /* MN */ + { 944, 20, 8}, /* MIDNUMLET */ + { 924, 20, 8}, /* MB */ + {1038, 20, 9}, /* NUMERIC */ + {1033, 20, 9}, /* NU */ + { 942, 20, 10}, /* MIDLETTER */ + { 958, 20, 10}, /* ML */ + { 186, 20, 11}, /* ALETTER */ + { 809, 20, 11}, /* LE */ + { 576, 20, 12}, /* EXTENDNUMLET */ + { 570, 20, 12}, /* EX */ + { 590, 20, 13}, /* FORMAT */ + { 588, 20, 13}, /* FO */ + { 573, 20, 14}, /* EXTEND */ + { 674, 20, 15}, /* HEBREWLETTER */ + { 685, 20, 15}, /* HL */ + {1443, 20, 16}, /* ZWJ */ + { 763, 20, 17}, /* KATAKANA */ + { 748, 20, 17}, /* KA */ + {1166, 20, 18}, /* REGIONALINDICATOR */ + {1171, 20, 18}, /* RI */ + { 525, 20, 19}, /* EBASE */ + { 524, 20, 19}, /* EB */ + { 526, 20, 20}, /* EBASEGAZ */ + { 527, 20, 20}, /* EBG */ + { 538, 20, 21}, /* EMODIFIER */ + { 536, 20, 21}, /* EM */ + { 618, 20, 22}, /* GLUEAFTERZWJ */ + { 597, 20, 22}, /* GAZ */ }; -/* property values: 6272 bytes. */ - /* Codepoints which expand on full case-folding. */ - RE_UINT16 re_expand_on_folding[] = { 223, 304, 329, 496, 912, 944, 1415, 7830, 7831, 7832, 7833, 7834, 7838, 8016, 8018, 8020, @@ -3216,4231 +3254,9697 @@ RE_UINT16 re_expand_on_folding[] = { 8131, 8132, 8134, 8135, 8140, 8146, 8147, 8150, 8151, 8162, 8163, 8164, 8166, 8167, 8178, 8179, 8180, 8182, 8183, 8188, 64256, 64257, 64258, 64259, - 64260, 64261, 64262, 64275, 64276, 64277, 64278, 64279, + 64260, 64261, 64262, 64275, 64276, 64277, 64278, 64279 }; -/* expand_on_folding: 208 bytes. */ - -/* General_Category. */ - -static RE_UINT8 re_general_category_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 28, - 29, 26, 30, 31, 32, 33, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 34, 35, 35, 35, 35, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 26, 57, 58, 59, 59, 59, 59, 59, 26, 26, 60, 59, 59, 59, 59, 59, - 59, 59, 26, 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 26, 62, 59, 63, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 64, 26, 65, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 66, 67, 59, 59, 59, 59, 68, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 69, 70, 71, 72, 73, 74, 59, 59, - 75, 76, 59, 59, 77, 59, 78, 79, 80, 81, 73, 82, 83, 84, 59, 59, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 85, 26, 26, 26, 26, 26, 26, 26, 86, 87, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 88, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 89, 59, 59, 59, 59, 59, 59, 26, 90, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 91, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 92, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 92, +/* Alphabetic. */ +static RE_UINT8 re_alphabetic_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10, + 10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38, + 10, 10, 10, 10, 10, 39, 10, 10, 40, 10, 41, 42, 43, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 44, 13, 13, 13, 45, 46, 13, + 13, 13, 13, 47, 13, 13, 13, 13, 13, 13, 48, 10, 10, 10, 49, 10, + 13, 13, 13, 13, 50, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; -static RE_UINT16 re_general_category_stage_2[] = { - 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, - 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31, - 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39, - 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13, - 13, 13, 13, 42, 9, 43, 11, 11, 44, 45, 32, 46, 47, 48, 49, 50, - 51, 52, 48, 48, 53, 32, 54, 55, 48, 48, 48, 48, 48, 56, 57, 58, - 59, 60, 48, 32, 61, 48, 48, 48, 48, 48, 62, 63, 64, 48, 65, 66, - 48, 67, 68, 69, 48, 70, 71, 72, 72, 72, 48, 73, 72, 74, 75, 32, - 76, 48, 48, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 83, 84, 91, 92, 93, 94, 95, 96, 97, 84, 98, 99, 100, 88, 101, - 102, 83, 84, 103, 104, 105, 88, 106, 107, 108, 109, 110, 111, 112, 94, 113, - 114, 115, 84, 116, 117, 118, 88, 119, 120, 115, 84, 121, 122, 123, 88, 124, - 125, 115, 48, 126, 127, 128, 88, 129, 130, 131, 48, 132, 133, 134, 94, 135, - 136, 48, 48, 137, 138, 139, 72, 72, 140, 48, 141, 142, 143, 144, 72, 72, - 145, 146, 147, 148, 149, 48, 150, 151, 152, 153, 32, 154, 155, 156, 72, 72, - 48, 48, 157, 158, 159, 160, 161, 162, 163, 164, 9, 9, 165, 11, 11, 166, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 167, 168, 48, 48, 167, 48, 48, 169, 170, 171, 48, 48, - 48, 170, 48, 48, 48, 172, 173, 174, 48, 175, 9, 9, 9, 9, 9, 176, - 177, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 178, 48, 179, 180, 48, 48, 48, 48, 181, 182, - 183, 184, 48, 185, 48, 186, 183, 187, 48, 48, 48, 188, 189, 190, 191, 192, - 193, 191, 48, 48, 194, 48, 48, 195, 196, 48, 197, 48, 48, 48, 48, 198, - 48, 199, 200, 201, 202, 48, 203, 204, 48, 48, 205, 48, 206, 207, 208, 208, - 48, 209, 48, 48, 48, 210, 211, 212, 191, 191, 213, 214, 72, 72, 72, 72, - 215, 48, 48, 216, 217, 159, 218, 219, 220, 48, 221, 64, 48, 48, 222, 223, - 48, 48, 224, 225, 226, 64, 48, 227, 228, 9, 9, 229, 230, 231, 232, 233, - 11, 11, 234, 27, 27, 27, 235, 236, 11, 237, 27, 27, 32, 32, 32, 238, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 239, 13, 13, 13, 13, 13, 13, - 240, 241, 240, 240, 241, 242, 240, 243, 244, 244, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 260, 72, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 270, 271, 272, 273, 208, 274, 275, 208, 276, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 278, 208, 279, 208, 208, 208, 208, 280, 208, 281, 277, 282, 208, 283, 284, 208, - 208, 208, 285, 72, 286, 72, 269, 269, 269, 287, 208, 208, 208, 208, 288, 269, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 289, 290, 208, 208, 291, - 208, 208, 208, 208, 208, 208, 292, 208, 208, 208, 208, 208, 208, 208, 208, 208, - 208, 208, 208, 208, 208, 208, 293, 294, 269, 295, 208, 208, 296, 277, 297, 277, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, - 277, 277, 277, 277, 277, 277, 277, 277, 298, 299, 277, 277, 277, 300, 277, 301, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 208, 208, 208, 277, 302, 208, 208, 303, 208, 304, 208, 208, 208, 208, 208, 208, - 9, 9, 305, 11, 11, 306, 307, 308, 13, 13, 13, 13, 13, 13, 309, 310, - 11, 11, 311, 48, 48, 48, 312, 313, 48, 314, 315, 315, 315, 315, 32, 32, - 316, 317, 318, 319, 320, 72, 72, 72, 208, 321, 208, 208, 208, 208, 208, 322, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, 72, 324, - 325, 326, 327, 328, 136, 48, 48, 48, 48, 329, 177, 48, 48, 48, 48, 330, - 331, 48, 48, 136, 48, 48, 48, 48, 199, 332, 48, 71, 208, 208, 322, 48, - 208, 333, 334, 208, 335, 336, 208, 208, 334, 208, 208, 336, 208, 208, 208, 208, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 198, 208, 208, 208, 208, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 72, - 48, 337, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 150, 208, 208, 208, 285, 48, 48, 227, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 338, 48, 339, 72, 13, 13, 340, 341, 13, 342, 48, 48, 48, 48, 343, 344, - 31, 345, 346, 347, 13, 13, 13, 348, 349, 350, 351, 352, 353, 72, 72, 354, - 355, 48, 356, 357, 48, 48, 48, 358, 359, 48, 48, 360, 361, 191, 32, 362, - 64, 48, 363, 48, 364, 365, 48, 150, 76, 48, 48, 366, 367, 368, 369, 370, - 48, 48, 371, 372, 373, 374, 48, 375, 48, 48, 48, 376, 377, 378, 379, 380, - 381, 382, 315, 11, 11, 383, 384, 11, 11, 11, 11, 11, 48, 48, 385, 191, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 386, 48, 387, 48, 48, 205, - 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, - 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 203, 48, 48, 48, 48, 48, 48, 206, 72, 72, - 390, 391, 392, 393, 394, 48, 48, 48, 48, 48, 48, 395, 396, 397, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 398, 72, 48, 48, 48, 48, 399, 48, 48, 400, 72, 72, 401, - 32, 402, 32, 403, 404, 405, 406, 407, 48, 48, 48, 48, 48, 48, 48, 408, - 409, 2, 3, 4, 5, 410, 411, 412, 48, 413, 48, 199, 414, 415, 416, 417, - 418, 48, 171, 419, 203, 203, 72, 72, 48, 48, 48, 48, 48, 48, 48, 71, - 420, 269, 269, 421, 270, 270, 270, 422, 423, 324, 424, 72, 72, 208, 208, 425, - 72, 72, 72, 72, 72, 72, 72, 72, 48, 150, 48, 48, 48, 100, 426, 427, - 48, 48, 428, 48, 429, 48, 48, 430, 48, 431, 48, 48, 432, 433, 72, 72, - 9, 9, 434, 11, 11, 48, 48, 48, 48, 203, 191, 9, 9, 435, 11, 436, - 48, 48, 400, 48, 48, 48, 437, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 314, 48, 198, 400, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 438, 48, 48, 439, 48, 440, 48, 441, 48, 199, 442, 72, 72, 72, 48, 443, - 48, 444, 48, 445, 72, 72, 72, 72, 48, 48, 48, 446, 269, 447, 269, 269, - 448, 449, 48, 450, 451, 452, 48, 453, 48, 454, 72, 72, 455, 48, 456, 457, - 48, 48, 48, 458, 48, 459, 48, 460, 48, 461, 462, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 195, 72, 72, 72, 9, 9, 9, 463, 11, 11, 11, 464, - 48, 48, 465, 191, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 269, 466, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 454, 467, 48, 62, 468, 72, 72, 72, 72, 72, 72, 72, 72, 48, 314, - 469, 48, 48, 470, 471, 447, 472, 473, 220, 48, 48, 474, 475, 48, 195, 191, - 476, 48, 477, 478, 479, 48, 48, 480, 220, 48, 48, 481, 482, 483, 484, 485, - 48, 97, 486, 487, 72, 72, 72, 72, 488, 489, 490, 48, 48, 491, 492, 191, - 493, 83, 84, 494, 495, 496, 497, 498, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 499, 500, 501, 72, 72, 48, 48, 48, 502, 503, 191, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 48, 48, 504, 505, 506, 507, 72, 72, - 48, 48, 48, 508, 509, 191, 510, 72, 48, 48, 511, 512, 191, 72, 72, 72, - 48, 172, 513, 514, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 486, 515, 72, 72, 72, 72, 72, 72, 9, 9, 11, 11, 147, 516, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 517, 48, 48, 518, 519, 72, - 520, 48, 48, 521, 522, 523, 48, 48, 524, 525, 526, 72, 48, 48, 48, 195, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 84, 48, 504, 527, 528, 147, 174, 529, 48, 530, 531, 532, 72, 72, 72, 72, - 533, 48, 48, 534, 535, 191, 536, 48, 537, 538, 191, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 48, 539, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 269, 540, 541, 542, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 206, 72, 72, 72, 72, 72, 72, - 270, 270, 270, 270, 270, 270, 543, 544, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 386, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 199, 545, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 314, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 195, 48, 199, 368, 72, 72, 72, 72, 72, 72, 48, 203, 546, - 48, 48, 48, 547, 548, 549, 550, 551, 48, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 9, 9, 11, 11, 269, 552, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 553, 554, 555, 555, 556, 557, 72, 72, 72, 72, 558, 72, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 400, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 559, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 199, 72, 72, 72, 559, 560, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 205, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 48, 48, 71, 150, 195, 561, 562, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, - 208, 208, 563, 208, 208, 208, 564, 565, 566, 208, 567, 208, 208, 208, 568, 72, - 208, 208, 208, 208, 569, 72, 72, 72, 72, 72, 72, 72, 72, 72, 269, 570, - 208, 208, 208, 208, 208, 285, 269, 451, 72, 72, 72, 72, 72, 72, 72, 72, - 9, 571, 11, 572, 573, 574, 240, 9, 575, 576, 577, 578, 579, 9, 571, 11, - 580, 581, 11, 582, 583, 584, 585, 9, 586, 11, 9, 571, 11, 572, 573, 11, - 240, 9, 575, 585, 9, 586, 11, 9, 571, 11, 587, 9, 588, 589, 590, 591, - 11, 592, 9, 593, 594, 595, 596, 11, 597, 9, 598, 11, 599, 600, 600, 600, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, - 32, 32, 32, 601, 32, 32, 602, 603, 604, 605, 45, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 606, 607, 608, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 150, 609, 610, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 48, 48, 611, 612, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 613, 614, 72, 72, - 9, 9, 575, 11, 615, 368, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 484, 269, 269, 616, 617, 72, 72, 72, 72, - 484, 269, 618, 619, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 620, 48, 621, 622, 623, 624, 625, 626, 627, 205, 628, 205, 72, 72, 72, 629, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 208, 208, 324, 208, 208, 208, 208, 208, 208, 322, 333, 630, 630, 630, 208, 323, - 174, 208, 208, 208, 208, 208, 631, 208, 208, 208, 631, 72, 72, 72, 632, 208, - 633, 208, 208, 324, 568, 634, 323, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 635, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, 631, 286, - 208, 208, 208, 208, 208, 208, 208, 322, 208, 208, 208, 208, 208, 568, 324, 72, - 324, 208, 208, 208, 636, 175, 208, 208, 636, 208, 637, 72, 72, 72, 72, 72, - 638, 208, 208, 208, 208, 208, 208, 639, 208, 208, 640, 208, 641, 208, 208, 208, - 208, 208, 208, 208, 208, 322, 637, 642, 633, 323, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 314, 72, 72, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 204, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 203, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 643, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 100, 72, - 48, 203, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 644, 72, 645, 645, 645, 645, 645, 645, 72, 72, 72, 72, 72, 72, 72, 72, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 646, +static RE_UINT8 re_alphabetic_table_2[] = { + 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 7, 8, 9, 10, 4, 11, + 4, 4, 4, 4, 12, 4, 4, 4, 4, 13, 14, 4, 15, 16, 17, 18, + 19, 4, 20, 21, 4, 4, 22, 23, 24, 4, 25, 4, 4, 26, 27, 28, + 29, 30, 31, 32, 0, 33, 34, 35, 4, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 48, 52, 53, 54, 55, 56, 0, + 57, 58, 59, 60, 57, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 0, 75, 76, 77, 0, 78, 0, 79, 80, 81, 82, 0, 0, + 4, 83, 24, 4, 84, 4, 85, 86, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 87, 4, 88, 89, 90, 4, 91, 4, 73, 0, 92, 4, 4, 93, + 72, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 94, 1, 4, 4, 95, 96, 97, 97, 98, 4, 99, 100, 0, + 0, 4, 4, 31, 4, 101, 4, 102, 103, 104, 24, 105, 4, 106, 107, 0, + 108, 4, 103, 109, 0, 110, 78, 0, 4, 111, 112, 0, 4, 113, 4, 114, + 4, 115, 116, 117, 118, 65, 0, 119, 4, 4, 4, 4, 4, 4, 0, 120, + 4, 4, 4, 4, 4, 4, 4, 4, 93, 4, 121, 117, 4, 122, 123, 124, + 0, 0, 0, 125, 126, 0, 0, 0, 127, 128, 129, 4, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 130, 4, 107, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 131, 103, 4, 4, 4, 4, 132, 4, 85, 4, 133, 115, 134, 134, 4, + 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 136, 137, 72, 4, 138, 72, 4, 86, 139, 13, 4, 4, 140, 4, 0, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 82, + 4, 4, 4, 4, 30, 0, 24, 117, 4, 4, 4, 4, 4, 4, 4, 4, + 141, 142, 4, 143, 4, 4, 4, 92, 144, 145, 4, 4, 146, 4, 147, 148, + 149, 150, 4, 97, 4, 4, 151, 152, 27, 101, 153, 82, 4, 154, 135, 155, + 4, 115, 156, 157, 4, 103, 158, 159, 160, 161, 86, 162, 4, 4, 4, 32, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 163, 164, 108, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 165, 4, 4, 166, 0, 167, 168, 169, 4, 4, 26, 170, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 117, 24, 4, 171, 4, 150, 172, + 0, 0, 0, 173, 4, 4, 4, 82, 0, 1, 1, 174, 4, 103, 175, 0, + 176, 177, 178, 0, 4, 4, 4, 73, 0, 0, 4, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 4, 180, 0, 4, 25, 101, 73, 117, 4, 181, 0, + 4, 4, 4, 4, 117, 24, 182, 108, 4, 183, 4, 60, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 115, 102, 150, 0, 0, 0, 0, + 184, 185, 102, 115, 103, 0, 0, 186, 102, 166, 0, 0, 4, 187, 0, 0, + 188, 102, 0, 82, 82, 0, 79, 189, 4, 102, 102, 153, 26, 0, 0, 0, + 4, 4, 15, 0, 4, 153, 4, 153, 4, 150, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 190, 0, 0, 82, 191, 192, 0, 0, 24, 189, 115, + 4, 4, 192, 0, 145, 31, 24, 15, 4, 153, 193, 194, 4, 4, 195, 0, + 196, 197, 0, 0, 198, 118, 4, 15, 39, 48, 199, 60, 0, 0, 0, 0, + 4, 4, 200, 201, 4, 4, 202, 0, 0, 0, 0, 0, 4, 203, 204, 0, + 4, 103, 205, 0, 4, 206, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, + 4, 31, 0, 0, 0, 4, 4, 207, 208, 209, 210, 0, 0, 211, 29, 212, + 4, 213, 24, 4, 214, 0, 4, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 215, 216, 78, 217, 171, 218, 0, 0, 219, 220, 221, 222, 223, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, 224, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 166, 0, 0, 0, + 4, 4, 4, 140, 4, 4, 4, 4, 4, 4, 60, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 31, 103, 0, 0, 0, 24, 156, 4, 92, 60, 226, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 227, 4, 228, 0, 0, 229, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 230, + 4, 4, 4, 4, 4, 4, 102, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 103, 0, 231, 193, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 108, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 232, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 33, 4, 234, 235, 236, 4, 237, 238, 239, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 240, 241, 86, 33, 33, 131, 131, 215, 215, 242, 0, + 243, 244, 0, 0, 0, 0, 0, 0, 4, 245, 246, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 247, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 189, 0, 4, 4, 248, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 236, 249, 250, 251, 252, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 162, 162, 107, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 117, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 179, 4, 4, 4, 4, 4, 4, + 117, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 254, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 78, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 32, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_general_category_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, - 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 17, 18, 19, 1, 20, 20, 21, 22, 23, 24, 25, - 26, 27, 15, 2, 28, 29, 27, 30, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 31, 11, 11, 11, 32, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 33, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32, - 32, 32, 32, 32, 11, 34, 34, 16, 34, 32, 32, 11, 34, 11, 16, 11, - 11, 34, 32, 11, 32, 16, 11, 34, 32, 32, 32, 11, 34, 16, 32, 11, - 34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34, - 34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32, - 32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32, - 16, 16, 39, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 41, 41, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, - 40, 40, 42, 41, 41, 41, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, - 43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 42, 32, 44, 45, 16, 10, - 44, 44, 41, 46, 11, 47, 47, 11, 34, 11, 11, 11, 11, 11, 11, 11, - 11, 48, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34, - 16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 49, 34, 32, 34, 11, - 32, 50, 43, 43, 51, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16, - 48, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 47, 52, 2, 2, 2, - 16, 16, 16, 16, 53, 54, 55, 56, 57, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 58, 59, 60, 43, 59, 44, 44, 44, 44, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 62, - 36, 63, 64, 44, 44, 44, 44, 44, 65, 65, 65, 8, 9, 66, 2, 67, - 43, 43, 43, 43, 43, 60, 68, 2, 69, 36, 36, 36, 36, 70, 43, 43, - 7, 7, 7, 7, 7, 2, 2, 36, 71, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 72, 43, 43, 43, 73, 50, 43, 43, 74, 75, 76, 43, 43, 36, - 7, 7, 7, 7, 7, 36, 77, 78, 2, 2, 2, 2, 2, 2, 2, 79, - 70, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 80, 62, 36, - 36, 36, 36, 43, 43, 43, 43, 43, 71, 44, 44, 44, 44, 44, 44, 44, - 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, - 43, 43, 40, 21, 2, 81, 57, 20, 36, 36, 36, 43, 43, 75, 43, 43, - 43, 43, 75, 43, 75, 43, 43, 44, 2, 2, 2, 2, 2, 2, 2, 64, - 36, 36, 36, 36, 70, 43, 44, 64, 36, 36, 36, 36, 36, 61, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 36, 36, 61, 36, 36, 36, 36, 44, - 44, 57, 43, 43, 43, 43, 43, 43, 43, 82, 43, 43, 43, 43, 43, 43, - 43, 83, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 71, 84, - 85, 43, 43, 43, 83, 84, 85, 84, 70, 43, 43, 43, 36, 36, 36, 36, - 36, 43, 2, 7, 7, 7, 7, 7, 86, 36, 36, 36, 36, 36, 36, 36, - 70, 84, 62, 36, 36, 36, 61, 62, 61, 62, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 61, 36, 36, 36, 61, 61, 44, 36, 36, 44, 71, 84, - 85, 43, 80, 87, 88, 87, 85, 61, 44, 44, 44, 87, 44, 44, 36, 62, - 36, 43, 44, 7, 7, 7, 7, 7, 36, 20, 27, 27, 27, 56, 63, 80, - 57, 83, 62, 36, 36, 61, 44, 62, 61, 36, 62, 61, 36, 44, 80, 84, - 85, 80, 44, 57, 80, 57, 43, 44, 57, 44, 44, 44, 62, 36, 61, 61, - 44, 44, 44, 7, 7, 7, 7, 7, 43, 36, 70, 64, 44, 44, 44, 44, - 57, 83, 62, 36, 36, 36, 36, 62, 36, 62, 36, 36, 36, 36, 36, 36, - 61, 36, 62, 36, 36, 44, 71, 84, 85, 43, 43, 57, 83, 87, 85, 44, - 61, 44, 44, 44, 44, 44, 44, 44, 66, 44, 44, 44, 62, 43, 43, 43, - 57, 84, 62, 36, 36, 36, 61, 62, 61, 36, 62, 36, 36, 44, 71, 85, - 85, 43, 80, 87, 88, 87, 85, 44, 44, 44, 44, 83, 44, 44, 36, 62, - 78, 27, 27, 27, 44, 44, 44, 44, 44, 71, 62, 36, 36, 61, 44, 36, - 61, 36, 36, 44, 62, 61, 61, 36, 44, 62, 61, 44, 36, 61, 44, 36, - 36, 36, 36, 36, 36, 44, 44, 84, 83, 88, 44, 84, 88, 84, 85, 44, - 61, 44, 44, 87, 44, 44, 44, 44, 27, 89, 67, 67, 56, 90, 44, 44, - 83, 84, 71, 36, 36, 36, 61, 36, 61, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 44, 62, 43, 83, 84, 88, 43, 80, 43, 43, 44, - 44, 44, 57, 80, 36, 61, 44, 44, 44, 44, 44, 91, 27, 27, 27, 89, - 70, 84, 72, 36, 36, 36, 61, 36, 36, 36, 62, 36, 36, 44, 71, 85, - 84, 84, 88, 83, 88, 84, 43, 44, 44, 44, 87, 88, 44, 44, 44, 61, - 62, 61, 44, 44, 44, 44, 44, 44, 43, 84, 62, 36, 36, 36, 61, 36, - 36, 36, 36, 36, 36, 70, 71, 84, 85, 43, 80, 84, 88, 84, 85, 77, - 44, 44, 36, 92, 27, 27, 27, 93, 27, 27, 27, 27, 89, 36, 36, 36, - 44, 84, 62, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 36, 36, 36, - 36, 62, 36, 36, 36, 36, 62, 44, 36, 36, 36, 61, 44, 80, 44, 87, - 84, 43, 80, 80, 84, 84, 84, 84, 44, 84, 64, 44, 44, 44, 44, 44, - 62, 36, 36, 36, 36, 36, 36, 36, 70, 36, 43, 43, 43, 80, 44, 94, - 36, 36, 36, 75, 43, 43, 43, 60, 7, 7, 7, 7, 7, 2, 44, 44, - 62, 61, 61, 36, 36, 61, 36, 36, 36, 36, 62, 62, 36, 36, 36, 36, - 70, 36, 43, 43, 43, 43, 71, 44, 36, 36, 61, 81, 43, 43, 43, 44, - 7, 7, 7, 7, 7, 44, 36, 36, 77, 67, 2, 2, 2, 2, 2, 2, - 2, 95, 95, 67, 43, 67, 67, 67, 7, 7, 7, 7, 7, 27, 27, 27, - 27, 27, 50, 50, 50, 4, 4, 84, 36, 36, 36, 36, 62, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 61, 44, 57, 43, 43, 43, 43, 43, 43, 83, - 43, 43, 60, 43, 36, 36, 70, 43, 43, 43, 43, 43, 57, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 80, 67, 67, 67, 67, 76, 67, 67, 90, 67, - 2, 2, 95, 67, 21, 64, 44, 44, 36, 36, 36, 36, 36, 92, 85, 43, - 83, 43, 43, 43, 85, 83, 85, 71, 7, 7, 7, 7, 7, 2, 2, 2, - 36, 36, 36, 84, 43, 36, 36, 43, 71, 84, 96, 92, 84, 84, 84, 36, - 70, 43, 71, 36, 36, 36, 36, 36, 36, 83, 85, 83, 84, 84, 85, 92, - 7, 7, 7, 7, 7, 84, 85, 67, 11, 11, 11, 48, 44, 44, 48, 44, - 16, 16, 16, 16, 16, 53, 45, 16, 36, 36, 36, 36, 61, 36, 36, 44, - 36, 36, 36, 61, 61, 36, 36, 44, 61, 36, 36, 44, 36, 36, 36, 61, - 61, 36, 36, 44, 36, 36, 36, 36, 36, 36, 36, 61, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 61, 57, 43, 2, 2, 2, 2, 97, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 98, 44, 67, 67, 67, 67, 67, 44, 44, 44, - 11, 11, 11, 44, 16, 16, 16, 44, 99, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 77, 72, 100, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 101, 102, 44, 36, 36, 36, 36, 36, 63, 2, 103, - 104, 36, 36, 36, 61, 44, 44, 44, 36, 36, 36, 36, 36, 36, 61, 36, - 36, 43, 80, 44, 44, 44, 44, 44, 36, 43, 60, 64, 44, 44, 44, 44, - 36, 43, 44, 44, 44, 44, 44, 44, 61, 43, 44, 44, 44, 44, 44, 44, - 36, 36, 43, 85, 43, 43, 43, 84, 84, 84, 84, 83, 85, 43, 43, 43, - 43, 43, 2, 86, 2, 66, 70, 44, 7, 7, 7, 7, 7, 44, 44, 44, - 27, 27, 27, 27, 27, 44, 44, 44, 2, 2, 2, 105, 2, 59, 43, 68, - 36, 106, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 44, 44, - 36, 36, 70, 71, 36, 36, 36, 36, 36, 36, 36, 36, 70, 61, 44, 44, - 36, 36, 36, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 61, - 43, 83, 84, 85, 83, 84, 44, 44, 84, 83, 84, 84, 85, 43, 44, 44, - 90, 44, 2, 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 44, - 36, 36, 61, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 44, 44, - 36, 36, 36, 36, 36, 44, 44, 44, 7, 7, 7, 7, 7, 98, 44, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 36, 36, 36, 70, 83, 85, 44, 2, - 36, 36, 92, 83, 43, 43, 43, 80, 83, 83, 85, 43, 43, 43, 83, 84, - 84, 85, 43, 43, 43, 43, 80, 57, 2, 2, 2, 86, 2, 2, 2, 44, - 43, 43, 43, 43, 43, 43, 43, 107, 43, 43, 96, 36, 36, 36, 36, 36, - 36, 36, 83, 43, 43, 83, 83, 84, 84, 83, 96, 36, 36, 36, 44, 44, - 95, 67, 67, 67, 67, 50, 43, 43, 43, 43, 67, 67, 67, 67, 90, 44, - 43, 96, 36, 36, 36, 36, 36, 36, 92, 43, 43, 84, 43, 85, 43, 36, - 36, 36, 36, 83, 43, 84, 85, 85, 43, 84, 44, 44, 44, 44, 2, 2, - 36, 36, 84, 84, 84, 84, 43, 43, 43, 43, 84, 43, 44, 91, 2, 2, - 7, 7, 7, 7, 7, 44, 62, 36, 36, 36, 36, 36, 40, 40, 40, 2, - 16, 16, 16, 16, 108, 44, 44, 44, 11, 11, 11, 11, 11, 47, 48, 11, - 2, 2, 2, 2, 44, 44, 44, 44, 43, 60, 43, 43, 43, 43, 43, 43, - 83, 43, 43, 43, 71, 36, 70, 36, 36, 36, 71, 92, 43, 61, 44, 44, - 16, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 45, 16, 16, - 16, 16, 16, 16, 45, 16, 16, 16, 16, 16, 16, 16, 16, 109, 40, 40, - 43, 43, 43, 43, 43, 57, 43, 43, 32, 32, 32, 16, 16, 16, 16, 32, - 16, 16, 16, 16, 11, 11, 11, 11, 16, 16, 16, 44, 11, 11, 11, 44, - 16, 16, 16, 16, 48, 48, 48, 48, 16, 16, 16, 16, 16, 16, 16, 44, - 16, 16, 16, 16, 110, 110, 110, 110, 16, 16, 108, 16, 11, 11, 111, 112, - 41, 16, 108, 16, 11, 11, 111, 41, 16, 16, 44, 16, 11, 11, 113, 41, - 16, 16, 16, 16, 11, 11, 114, 41, 44, 16, 108, 16, 11, 11, 111, 115, - 116, 116, 116, 116, 116, 117, 65, 65, 118, 118, 118, 2, 119, 120, 119, 120, - 2, 2, 2, 2, 121, 65, 65, 122, 2, 2, 2, 2, 123, 124, 2, 125, - 126, 2, 127, 128, 2, 2, 2, 2, 2, 9, 126, 2, 2, 2, 2, 129, - 65, 65, 68, 65, 65, 65, 65, 65, 130, 44, 27, 27, 27, 8, 127, 131, - 27, 27, 27, 27, 27, 8, 127, 102, 40, 40, 40, 40, 40, 40, 81, 44, - 20, 20, 20, 20, 20, 20, 20, 20, 43, 43, 43, 43, 43, 43, 132, 51, - 133, 51, 133, 43, 43, 43, 43, 43, 80, 44, 44, 44, 44, 44, 44, 44, - 67, 134, 67, 135, 67, 34, 11, 16, 11, 32, 135, 67, 49, 11, 11, 67, - 67, 67, 134, 134, 134, 11, 11, 136, 11, 11, 35, 36, 39, 67, 16, 11, - 8, 8, 49, 16, 16, 26, 67, 137, 27, 27, 27, 27, 27, 27, 27, 27, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 138, 139, 103, 140, 67, 44, 44, - 8, 8, 141, 67, 67, 8, 67, 67, 141, 26, 67, 141, 67, 67, 67, 141, - 67, 67, 67, 67, 67, 67, 67, 8, 67, 141, 141, 67, 67, 67, 67, 67, - 67, 67, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 67, 67, 67, 67, 4, 4, 67, 67, 8, 67, 67, 67, 142, 143, 67, 67, - 67, 67, 67, 67, 67, 67, 141, 67, 67, 67, 67, 67, 67, 26, 8, 8, - 8, 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, - 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 44, 44, 44, 44, - 67, 67, 67, 67, 67, 90, 44, 44, 27, 27, 27, 27, 27, 27, 67, 67, - 67, 67, 67, 67, 67, 27, 27, 27, 67, 67, 67, 26, 67, 67, 67, 67, - 26, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, 8, 8, - 67, 67, 67, 67, 67, 67, 67, 26, 67, 67, 67, 67, 4, 4, 4, 4, - 4, 4, 4, 27, 27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, - 8, 8, 127, 144, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, - 8, 127, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 144, 8, 8, 8, - 8, 8, 8, 8, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, - 8, 8, 141, 26, 8, 8, 141, 67, 67, 67, 44, 67, 67, 67, 67, 67, - 67, 67, 67, 44, 67, 67, 67, 67, 11, 11, 11, 11, 11, 11, 11, 47, - 16, 16, 16, 16, 16, 16, 16, 108, 32, 11, 32, 34, 34, 34, 34, 11, - 32, 32, 34, 16, 16, 16, 40, 11, 32, 32, 137, 67, 67, 135, 34, 146, - 43, 32, 44, 44, 91, 2, 97, 2, 16, 16, 16, 147, 44, 44, 147, 44, - 36, 36, 36, 36, 44, 44, 44, 52, 64, 44, 44, 44, 44, 44, 44, 57, - 36, 36, 36, 61, 44, 44, 44, 44, 36, 36, 36, 61, 36, 36, 36, 61, - 2, 119, 119, 2, 123, 124, 119, 2, 2, 2, 2, 6, 2, 105, 119, 2, - 119, 4, 4, 4, 4, 2, 2, 86, 2, 2, 2, 2, 2, 118, 2, 2, - 105, 148, 2, 2, 2, 2, 2, 2, 67, 67, 67, 67, 67, 55, 67, 67, - 67, 67, 44, 44, 44, 44, 44, 44, 67, 67, 67, 44, 44, 44, 44, 44, - 67, 67, 67, 67, 67, 67, 44, 44, 1, 2, 149, 150, 4, 4, 4, 4, - 4, 67, 4, 4, 4, 4, 151, 152, 153, 103, 103, 103, 103, 43, 43, 84, - 154, 40, 40, 67, 103, 155, 63, 67, 36, 36, 36, 61, 57, 156, 157, 69, - 36, 36, 36, 36, 36, 63, 40, 69, 44, 44, 62, 36, 36, 36, 36, 36, - 67, 27, 27, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, - 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27, - 158, 27, 27, 27, 27, 27, 27, 27, 36, 36, 106, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 159, 2, 7, 7, 7, 7, 7, 36, 44, 44, - 32, 32, 32, 32, 32, 32, 32, 70, 51, 160, 43, 43, 43, 43, 43, 86, - 32, 32, 32, 32, 32, 32, 40, 43, 36, 36, 36, 103, 103, 103, 103, 103, - 43, 2, 2, 2, 44, 44, 44, 44, 41, 41, 41, 157, 40, 40, 40, 40, - 41, 32, 32, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, - 45, 16, 16, 16, 34, 34, 34, 32, 32, 32, 32, 32, 42, 161, 34, 35, - 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 11, 11, 32, - 11, 11, 32, 32, 32, 32, 32, 32, 44, 32, 11, 47, 44, 44, 44, 44, - 44, 44, 44, 62, 40, 35, 36, 36, 36, 71, 36, 71, 36, 70, 36, 36, - 36, 92, 85, 83, 67, 67, 44, 44, 27, 27, 27, 67, 162, 44, 44, 44, - 36, 36, 2, 2, 44, 44, 44, 44, 84, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 84, 84, 84, 84, 84, 84, 84, 84, 43, 44, 44, 44, 44, 2, - 43, 36, 36, 36, 2, 72, 72, 70, 36, 36, 36, 43, 43, 43, 43, 2, - 36, 36, 36, 70, 43, 43, 43, 43, 43, 84, 44, 44, 44, 44, 44, 91, - 36, 70, 84, 43, 43, 84, 43, 84, 163, 2, 2, 2, 2, 2, 2, 52, - 7, 7, 7, 7, 7, 44, 44, 2, 36, 36, 70, 69, 36, 36, 36, 36, - 7, 7, 7, 7, 7, 36, 36, 61, 36, 36, 36, 36, 70, 43, 43, 83, - 85, 83, 85, 80, 44, 44, 44, 44, 36, 70, 36, 36, 36, 36, 83, 44, - 7, 7, 7, 7, 7, 44, 2, 2, 69, 36, 36, 77, 67, 92, 83, 36, - 71, 43, 71, 70, 71, 36, 36, 43, 70, 61, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 62, 106, 2, 36, 36, 36, 36, 36, 92, 43, 84, - 2, 106, 164, 80, 44, 44, 44, 44, 62, 36, 36, 61, 62, 36, 36, 61, - 62, 36, 36, 61, 44, 44, 44, 44, 16, 16, 16, 16, 16, 112, 40, 40, - 16, 16, 16, 16, 44, 44, 44, 44, 36, 92, 85, 84, 83, 163, 85, 44, - 36, 36, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 44, 62, 36, 36, - 165, 165, 165, 165, 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, 166, 166, - 16, 16, 16, 108, 44, 44, 44, 44, 44, 147, 16, 16, 44, 44, 62, 71, - 36, 36, 36, 36, 167, 36, 36, 36, 36, 36, 36, 61, 36, 36, 61, 61, - 36, 62, 61, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41, - 41, 44, 44, 44, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 145, 44, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 162, 44, - 2, 2, 2, 168, 128, 44, 44, 44, 6, 169, 170, 145, 145, 145, 145, 145, - 145, 145, 128, 168, 128, 2, 125, 171, 2, 64, 2, 2, 151, 145, 145, 128, - 2, 172, 8, 173, 66, 2, 44, 44, 36, 36, 61, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 61, 79, 91, 2, 3, 2, 4, 5, 6, 2, - 16, 16, 16, 16, 16, 17, 18, 127, 128, 4, 2, 36, 36, 36, 36, 36, - 69, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 40, - 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 61, 44, - 20, 174, 56, 175, 26, 8, 141, 90, 44, 44, 44, 44, 79, 65, 67, 44, - 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 61, 36, 62, - 2, 64, 44, 176, 27, 27, 27, 27, 27, 27, 44, 55, 67, 67, 67, 67, - 103, 103, 140, 27, 89, 67, 67, 67, 67, 67, 67, 67, 67, 27, 67, 90, - 90, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 50, 44, - 177, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 44, 44, - 27, 27, 44, 44, 44, 44, 62, 36, 150, 36, 36, 36, 36, 178, 44, 44, - 36, 36, 36, 43, 43, 80, 44, 44, 36, 36, 36, 36, 36, 36, 36, 91, - 36, 36, 44, 44, 36, 36, 36, 36, 179, 103, 103, 44, 44, 44, 44, 44, - 11, 11, 11, 11, 16, 16, 16, 16, 11, 11, 44, 44, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 44, 44, 36, 36, 44, 44, 44, 44, 44, 91, - 36, 36, 36, 44, 61, 36, 36, 36, 36, 36, 36, 62, 61, 44, 61, 62, - 36, 36, 36, 91, 27, 27, 27, 27, 36, 36, 36, 77, 158, 27, 27, 27, - 44, 44, 44, 176, 27, 27, 27, 27, 36, 61, 36, 44, 44, 176, 27, 27, - 36, 36, 36, 27, 27, 27, 44, 91, 36, 36, 36, 36, 36, 44, 44, 91, - 36, 36, 36, 36, 44, 44, 27, 36, 44, 27, 27, 27, 27, 27, 27, 27, - 70, 43, 57, 80, 44, 44, 43, 43, 36, 36, 62, 36, 62, 36, 36, 36, - 36, 36, 36, 44, 43, 80, 44, 57, 27, 27, 27, 27, 98, 44, 44, 44, - 2, 2, 2, 2, 64, 44, 44, 44, 36, 36, 36, 36, 36, 36, 180, 30, - 36, 36, 36, 36, 36, 36, 180, 27, 36, 36, 36, 36, 78, 36, 36, 36, - 36, 36, 70, 80, 44, 176, 27, 27, 2, 2, 2, 64, 44, 44, 44, 44, - 36, 36, 36, 44, 91, 2, 2, 2, 36, 36, 36, 44, 27, 27, 27, 27, - 36, 61, 44, 44, 27, 27, 27, 27, 36, 44, 44, 44, 91, 2, 64, 44, - 44, 44, 44, 44, 176, 27, 27, 27, 11, 47, 44, 44, 44, 44, 44, 44, - 16, 108, 44, 44, 44, 27, 27, 27, 36, 36, 43, 43, 44, 44, 44, 44, - 27, 27, 27, 27, 27, 27, 27, 98, 27, 27, 27, 93, 44, 44, 44, 44, - 177, 27, 30, 2, 2, 44, 44, 44, 85, 96, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 43, 60, 2, 2, 2, 44, - 27, 27, 27, 7, 7, 7, 7, 7, 44, 44, 44, 44, 44, 44, 44, 57, - 84, 85, 43, 83, 85, 60, 181, 2, 2, 44, 44, 44, 44, 44, 79, 44, - 43, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, 85, 43, - 43, 43, 80, 7, 7, 7, 7, 7, 2, 2, 92, 88, 44, 44, 44, 44, - 36, 70, 2, 61, 44, 44, 44, 44, 36, 92, 84, 43, 43, 43, 43, 83, - 96, 36, 63, 2, 59, 43, 60, 44, 7, 7, 7, 7, 7, 63, 63, 2, - 176, 27, 27, 27, 27, 27, 27, 27, 27, 27, 98, 44, 44, 44, 44, 44, - 36, 36, 36, 36, 36, 36, 84, 85, 43, 84, 83, 43, 2, 2, 2, 80, - 36, 36, 36, 61, 61, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 62, - 36, 36, 36, 36, 63, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 70, - 84, 85, 43, 43, 43, 80, 44, 44, 43, 84, 62, 36, 36, 36, 61, 62, - 61, 36, 62, 36, 36, 57, 71, 84, 83, 84, 88, 87, 88, 87, 84, 44, - 61, 44, 44, 87, 44, 44, 62, 36, 36, 84, 44, 43, 43, 43, 80, 44, - 43, 43, 80, 44, 44, 44, 44, 44, 36, 36, 92, 84, 43, 43, 43, 43, - 84, 43, 83, 71, 36, 63, 2, 2, 7, 7, 7, 7, 7, 91, 91, 71, - 84, 85, 43, 43, 83, 83, 84, 85, 83, 43, 36, 72, 44, 44, 44, 44, - 36, 36, 36, 36, 36, 36, 36, 92, 84, 43, 43, 44, 84, 84, 43, 85, - 60, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 36, 43, 44, - 84, 85, 43, 43, 43, 83, 85, 85, 60, 2, 61, 44, 44, 44, 44, 44, - 2, 2, 2, 2, 2, 2, 64, 44, 36, 36, 36, 36, 36, 70, 85, 84, - 43, 43, 43, 85, 61, 44, 44, 44, 84, 43, 43, 85, 43, 43, 44, 44, - 7, 7, 7, 7, 7, 27, 2, 95, 43, 43, 43, 43, 85, 60, 44, 44, - 27, 98, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 44, 36, 36, 36, - 92, 84, 43, 43, 44, 43, 84, 84, 71, 72, 88, 44, 44, 44, 44, 44, - 70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 83, 70, 43, 60, - 2, 2, 2, 59, 44, 44, 44, 44, 70, 43, 43, 83, 85, 43, 36, 36, - 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 83, 43, 2, 72, 2, - 2, 64, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 85, - 63, 2, 2, 44, 44, 44, 44, 44, 2, 36, 36, 36, 36, 36, 36, 36, - 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 87, 43, 43, 43, - 83, 43, 85, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36, - 70, 43, 43, 80, 44, 80, 43, 57, 43, 43, 43, 70, 44, 44, 44, 44, - 36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 84, 84, 88, - 43, 87, 85, 85, 61, 44, 44, 44, 36, 70, 83, 163, 64, 44, 44, 44, - 27, 27, 89, 67, 67, 67, 56, 20, 162, 67, 67, 67, 67, 67, 67, 67, - 67, 44, 44, 44, 44, 44, 44, 91, 103, 103, 103, 103, 103, 103, 103, 178, - 2, 2, 64, 44, 44, 44, 44, 44, 65, 65, 65, 65, 68, 44, 44, 44, - 43, 43, 60, 44, 44, 44, 44, 44, 43, 43, 43, 60, 2, 2, 67, 67, - 40, 40, 95, 44, 44, 44, 44, 44, 7, 7, 7, 7, 7, 176, 27, 27, - 27, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 62, 36, - 27, 27, 27, 30, 2, 64, 44, 44, 36, 36, 36, 36, 36, 61, 44, 57, - 92, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 44, 44, 44, 57, 43, 74, 40, 40, 40, 40, 40, 40, - 40, 86, 44, 44, 44, 44, 44, 44, 36, 61, 44, 44, 44, 44, 44, 44, - 44, 44, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 44, 50, 60, - 65, 65, 44, 44, 44, 44, 44, 44, 67, 67, 67, 90, 55, 67, 67, 67, - 67, 67, 182, 85, 43, 67, 182, 84, 84, 183, 65, 65, 65, 82, 43, 43, - 43, 76, 50, 43, 43, 43, 67, 67, 67, 67, 67, 67, 67, 43, 43, 67, - 67, 67, 67, 67, 90, 44, 44, 44, 67, 43, 76, 44, 44, 44, 44, 44, - 27, 27, 44, 44, 44, 44, 44, 44, 11, 11, 11, 11, 11, 16, 16, 16, - 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, - 16, 16, 108, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 47, 11, 44, 47, 48, 47, 48, 11, 47, 11, - 11, 11, 11, 16, 16, 147, 147, 16, 16, 16, 147, 16, 16, 16, 16, 16, - 16, 16, 11, 48, 11, 47, 48, 11, 11, 11, 47, 11, 11, 11, 47, 16, - 16, 16, 16, 16, 11, 48, 11, 47, 11, 11, 47, 47, 44, 11, 11, 11, - 47, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11, - 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 44, 11, 11, 11, 11, - 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, - 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, - 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, - 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 44, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 43, 43, 43, 76, 67, 50, 43, 43, - 43, 43, 43, 43, 43, 43, 76, 67, 67, 67, 50, 67, 67, 67, 67, 67, - 67, 67, 76, 21, 2, 2, 44, 44, 44, 44, 44, 44, 44, 57, 43, 43, - 43, 43, 43, 80, 43, 43, 43, 43, 43, 43, 43, 43, 80, 57, 43, 43, - 43, 57, 80, 43, 43, 80, 44, 44, 43, 43, 43, 74, 40, 40, 40, 44, - 7, 7, 7, 7, 7, 44, 44, 77, 36, 36, 36, 36, 36, 36, 43, 43, - 7, 7, 7, 7, 7, 44, 44, 94, 36, 36, 61, 176, 27, 27, 27, 27, - 43, 43, 43, 80, 44, 44, 44, 44, 16, 16, 43, 43, 43, 74, 44, 44, - 27, 27, 27, 27, 27, 27, 158, 27, 184, 27, 98, 44, 44, 44, 44, 44, - 27, 27, 27, 27, 27, 27, 27, 158, 27, 27, 27, 27, 27, 27, 27, 44, - 36, 36, 62, 36, 36, 36, 36, 36, 62, 61, 61, 62, 62, 36, 36, 36, - 36, 61, 36, 36, 62, 62, 44, 44, 44, 61, 44, 62, 62, 62, 62, 36, - 62, 61, 61, 62, 62, 62, 62, 62, 62, 61, 61, 62, 36, 61, 36, 36, - 36, 61, 36, 36, 62, 36, 61, 61, 36, 36, 36, 36, 36, 62, 36, 36, - 62, 36, 62, 36, 36, 62, 36, 36, 8, 44, 44, 44, 44, 44, 44, 44, - 55, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 44, - 44, 44, 44, 67, 67, 67, 67, 67, 67, 90, 44, 44, 44, 44, 44, 44, - 67, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 25, 41, 41, - 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 67, 44, - 67, 67, 67, 67, 67, 67, 55, 67, 67, 55, 67, 90, 44, 67, 67, 67, - 67, 90, 55, 67, 67, 90, 44, 67, 67, 67, 67, 67, 67, 90, 55, 67, - 67, 67, 44, 44, 67, 90, 44, 44, 36, 44, 44, 44, 44, 44, 44, 44, - 79, 44, 44, 44, 44, 44, 44, 44, 65, 65, 65, 65, 65, 65, 65, 65, - 166, 166, 166, 166, 166, 166, 166, 44, +static RE_UINT8 re_alphabetic_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, + 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 32, 0, 0, 0, + 0, 0, 223, 188, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, + 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 0, 0, + 0, 0, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, 0, 0, 255, 7, + 255, 255, 255, 254, 0, 192, 255, 255, 255, 255, 239, 31, 254, 225, 0, 156, + 0, 0, 255, 255, 0, 224, 255, 255, 255, 255, 3, 0, 0, 252, 255, 255, + 255, 7, 48, 4, 255, 255, 255, 252, 255, 31, 0, 0, 255, 255, 255, 1, + 255, 7, 0, 0, 255, 255, 223, 255, 255, 0, 240, 255, 248, 3, 255, 255, + 255, 255, 255, 239, 255, 223, 225, 255, 15, 0, 254, 255, 239, 159, 249, 255, + 255, 253, 197, 227, 159, 89, 128, 176, 15, 0, 3, 16, 238, 135, 249, 255, + 255, 253, 109, 195, 135, 25, 2, 94, 0, 0, 63, 0, 238, 191, 251, 255, + 255, 253, 237, 227, 191, 27, 1, 0, 15, 0, 0, 30, 238, 159, 249, 255, + 159, 25, 192, 176, 15, 0, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, + 199, 29, 129, 0, 239, 223, 253, 255, 255, 253, 255, 227, 223, 29, 96, 7, + 15, 0, 0, 0, 255, 253, 239, 227, 223, 29, 96, 64, 15, 0, 6, 0, + 255, 223, 253, 255, 255, 255, 255, 231, 223, 93, 240, 128, 15, 0, 0, 252, + 238, 255, 127, 252, 255, 255, 251, 47, 127, 128, 95, 255, 0, 0, 12, 0, + 254, 255, 255, 255, 255, 255, 255, 7, 127, 32, 0, 0, 214, 247, 255, 255, + 175, 255, 255, 59, 95, 32, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, + 255, 31, 254, 255, 3, 255, 255, 254, 255, 255, 255, 31, 255, 255, 127, 249, + 255, 255, 0, 60, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, + 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, + 255, 255, 0, 0, 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, + 255, 223, 15, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 207, 255, + 255, 1, 128, 16, 255, 7, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, + 255, 15, 255, 1, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 0, 0, + 255, 255, 255, 15, 254, 255, 31, 0, 128, 0, 0, 128, 255, 255, 239, 255, + 239, 15, 0, 0, 255, 243, 0, 252, 191, 255, 3, 0, 255, 255, 127, 0, + 0, 224, 0, 252, 255, 255, 255, 63, 255, 1, 255, 255, 0, 222, 111, 4, + 128, 255, 31, 0, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, + 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, + 80, 189, 255, 243, 224, 67, 0, 0, 0, 0, 192, 255, 255, 127, 255, 255, + 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, 0, 128, 0, 0, + 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 224, 224, 255, 255, 255, + 255, 127, 0, 0, 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 240, 143, + 0, 0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, 252, 7, 0, 0, + 0, 0, 224, 255, 191, 255, 255, 255, 255, 0, 0, 0, 47, 0, 0, 0, + 0, 0, 252, 232, 255, 255, 7, 0, 255, 255, 247, 255, 255, 255, 0, 124, + 255, 63, 0, 0, 255, 255, 127, 252, 5, 0, 0, 56, 255, 255, 60, 0, + 126, 126, 126, 0, 127, 127, 255, 255, 255, 3, 255, 255, 15, 0, 255, 255, + 127, 248, 255, 255, 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 224, + 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, + 0, 0, 255, 15, 0, 0, 223, 255, 192, 255, 255, 255, 252, 252, 252, 28, + 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 31, 0, + 255, 255, 1, 0, 15, 255, 62, 0, 255, 255, 15, 255, 255, 0, 255, 255, + 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, 255, 255, 255, 192, + 111, 240, 239, 254, 31, 0, 0, 0, 255, 27, 3, 0, 128, 0, 255, 255, + 63, 0, 0, 0, 240, 0, 255, 255, 255, 255, 71, 0, 30, 192, 0, 20, + 255, 255, 251, 255, 255, 255, 159, 64, 127, 189, 255, 191, 159, 25, 129, 224, + 187, 7, 0, 128, 3, 0, 0, 0, 179, 0, 0, 0, 255, 255, 63, 127, + 0, 0, 0, 63, 17, 0, 0, 0, 255, 255, 63, 1, 0, 0, 0, 128, + 127, 242, 111, 255, 255, 255, 191, 153, 7, 0, 0, 0, 255, 252, 255, 255, + 26, 0, 0, 0, 255, 255, 231, 127, 255, 255, 255, 32, 255, 253, 255, 255, + 255, 255, 127, 127, 0, 0, 252, 255, 255, 254, 127, 0, 127, 251, 255, 255, + 255, 255, 127, 180, 203, 0, 0, 0, 191, 253, 255, 255, 255, 127, 123, 1, + 0, 0, 1, 0, 127, 0, 0, 0, 248, 255, 255, 224, 255, 135, 255, 255, + 255, 128, 255, 255, 11, 0, 3, 0, 255, 255, 255, 0, 0, 0, 7, 0, + 255, 7, 255, 31, 255, 1, 255, 67, 255, 255, 255, 223, 100, 222, 255, 235, + 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, + 63, 255, 255, 255, 253, 255, 255, 247, 247, 15, 0, 0, 127, 255, 255, 249, + 219, 7, 0, 0, 255, 31, 128, 63, 0, 64, 0, 0, 255, 15, 0, 0, + 143, 8, 0, 0, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, + 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255 }; -static RE_UINT8 re_general_category_stage_4[] = { - 15, 15, 12, 23, 23, 23, 25, 23, 20, 21, 23, 24, 23, 19, 9, 9, - 24, 24, 24, 23, 23, 1, 1, 1, 1, 20, 23, 21, 26, 22, 26, 2, - 2, 2, 2, 20, 24, 21, 24, 15, 25, 25, 27, 23, 26, 27, 5, 28, - 24, 16, 27, 26, 27, 24, 11, 11, 26, 11, 5, 29, 11, 23, 1, 24, - 1, 2, 2, 24, 2, 1, 2, 5, 5, 5, 1, 3, 3, 2, 5, 2, - 4, 4, 26, 26, 4, 26, 6, 6, 0, 0, 4, 2, 1, 23, 1, 0, - 0, 1, 24, 1, 27, 6, 7, 7, 0, 4, 2, 23, 19, 0, 0, 27, - 27, 25, 0, 6, 19, 6, 23, 6, 6, 23, 5, 0, 0, 5, 5, 23, - 23, 0, 16, 16, 23, 25, 27, 27, 16, 0, 4, 5, 5, 6, 6, 5, - 23, 5, 6, 16, 6, 4, 4, 6, 6, 27, 5, 27, 27, 5, 0, 16, - 6, 0, 4, 0, 16, 6, 6, 8, 8, 8, 8, 6, 23, 4, 0, 8, - 8, 0, 11, 27, 27, 0, 0, 23, 5, 8, 11, 5, 0, 25, 23, 27, - 8, 5, 23, 11, 11, 0, 19, 5, 12, 5, 5, 20, 21, 0, 10, 10, - 10, 5, 19, 23, 5, 4, 7, 0, 2, 0, 2, 4, 3, 3, 3, 26, - 2, 26, 0, 26, 1, 26, 26, 0, 12, 12, 12, 16, 19, 19, 28, 29, - 20, 28, 13, 14, 16, 12, 23, 28, 29, 23, 23, 22, 22, 23, 24, 20, - 21, 23, 23, 12, 11, 4, 21, 4, 6, 7, 7, 6, 1, 27, 27, 1, - 27, 2, 2, 27, 10, 1, 2, 10, 10, 11, 24, 27, 27, 20, 21, 27, - 21, 24, 21, 20, 2, 6, 0, 2, 20, 23, 27, 4, 5, 10, 19, 20, - 21, 21, 27, 10, 19, 4, 10, 4, 6, 26, 26, 4, 27, 11, 4, 23, - 7, 23, 26, 1, 25, 27, 8, 23, 4, 8, 18, 18, 17, 17, 5, 24, - 23, 20, 19, 22, 22, 20, 22, 22, 24, 19, 24, 0, 24, 26, 25, 0, - 0, 11, 6, 11, 10, 0, 23, 10, 5, 11, 23, 16, 27, 8, 8, 16, - 25, 11, -}; +RE_UINT32 re_get_alphabetic(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* General_Category: 13674 bytes. */ - -RE_UINT32 re_get_general_category(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 9; - code = ch ^ (f << 9); - pos = (RE_UINT32)re_general_category_stage_1[f] << 5; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_general_category_stage_2[pos + f] << 3; - f = code >> 1; - code ^= f << 1; - pos = (RE_UINT32)re_general_category_stage_3[pos + f] << 1; - value = re_general_category_stage_4[pos + code]; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* Block. */ + v = re_alphabetic_table_1[field_2]; + v = re_alphabetic_table_2[(v << 5) | field_1]; + v = re_alphabetic_table_3[(v << 2) | field_0]; -static RE_UINT8 re_block_stage_1[] = { + return (v >> offset) & 0x1; +} + +/* Alphanumeric. */ +static RE_UINT8 re_alphanumeric_table_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, - 13, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 16, 17, 18, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, 36, 36, - 36, 39, 36, 36, 36, 36, 36, 36, 36, 36, 40, 41, 42, 42, 42, 42, - 42, 42, 43, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 36, 36, 45, - 36, 36, 36, 36, 46, 47, 48, 36, 49, 36, 50, 51, 52, 53, 54, 36, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 57, 57, 57, 58, 59, 60, - 60, 60, 60, 61, 62, 62, 62, 62, 62, 62, 63, 36, 36, 36, 64, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 65, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, -}; - -static RE_UINT16 re_block_stage_2[] = { - 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, - 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 14, 15, 16, 16, 16, - 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 19, 20, 21, 21, 22, 22, - 23, 23, 24, 25, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, - 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, - 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, - 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, - 41, 41, 41, 41, 41, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 46, 46, 46, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 48, 49, 49, 49, 50, 51, 52, 53, 54, 54, 54, 54, - 55, 55, 55, 55, 55, 56, 57, 57, 58, 58, 59, 60, 61, 61, 61, 62, - 63, 64, 64, 64, 64, 65, 66, 66, 67, 67, 67, 67, 68, 68, 69, 69, - 70, 70, 71, 72, 73, 74, 75, 76, 77, 77, 77, 77, 78, 78, 79, 79, - 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, - 82, 82, 82, 83, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 92, 92, - 93, 93, 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, - 95, 95, 96, 97, 97, 97, 97, 97, 98, 98, 98, 98, 99, 100, 100, 100, - 101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 103, 104, - 105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 107, 107, 107, 107, - 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, - 110, 110, 110, 111, 112, 112, 112, 112, 113, 114, 115, 115, 116, 116, 116, 117, - 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 121, - 122, 122, 123, 123, 123, 124, 124, 124, 125, 126, 127, 127, 128, 129, 130, 131, - 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, - 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 135, 135, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 138, 139, 140, 141, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 143, 143, 143, 144, 144, 144, 145, 146, 146, 146, 146, 146, 146, 146, - 147, 148, 149, 149, 150, 150, 150, 151, 152, 153, 154, 155, 156, 156, 156, 157, - 158, 158, 158, 159, 160, 160, 160, 161, 162, 163, 164, 165, 166, 166, 167, 167, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 170, 170, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 172, 172, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 177, 178, 178, 178, 178, 178, - 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, - 179, 180, 181, 182, 183, 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, 185, - 186, 186, 186, 186, 187, 187, 187, 187, 188, 188, 189, 189, 190, 191, 192, 193, - 26, 26, 26, 26, 194, 195, 195, 196, 197, 198, 199, 200, 201, 202, 202, 26, - 203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 26, 26, 26, 26, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 26, 26, 26, 26, - 214, 214, 215, 216, 217, 218, 26, 219, 220, 221, 26, 26, 222, 223, 223, 223, - 224, 224, 224, 225, 226, 26, 227, 227, 228, 228, 229, 230, 231, 232, 26, 26, - 233, 233, 234, 26, 235, 235, 235, 235, 236, 236, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 237, 26, 26, 26, 26, 238, 239, 240, 241, 26, 26, 26, 242, - 243, 243, 243, 243, 244, 244, 245, 246, 247, 247, 248, 249, 250, 250, 250, 251, - 252, 252, 253, 26, 254, 255, 256, 256, 257, 257, 257, 257, 26, 26, 26, 26, - 258, 258, 258, 258, 259, 259, 259, 26, 26, 26, 26, 26, 260, 260, 260, 260, - 261, 261, 261, 262, 263, 263, 264, 26, 265, 265, 26, 26, 26, 26, 26, 26, - 266, 266, 267, 26, 26, 268, 268, 268, 26, 26, 26, 26, 26, 269, 269, 269, - 270, 270, 271, 272, 272, 273, 274, 274, 26, 26, 26, 26, 26, 26, 26, 26, - 275, 275, 275, 276, 277, 277, 26, 26, 278, 278, 278, 279, 279, 280, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 281, 26, 26, 26, 26, 26, 26, 282, 282, - 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, - 284, 284, 284, 284, 285, 285, 285, 285, 285, 285, 286, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, - 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, - 287, 288, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 289, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 291, 292, 26, 26, 293, 294, 295, 295, 295, 295, 296, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 297, 297, 297, 26, 26, 26, 298, 298, 298, 298, 298, 26, 26, 299, - 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, - 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, - 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, 26, 26, 26, 26, 26, 26, 26, 26, - 302, 302, 302, 302, 302, 302, 302, 302, 303, 304, 305, 306, 307, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 307, 26, 26, 26, 26, 26, 26, 26, 26, - 308, 308, 308, 308, 308, 309, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 310, 310, 310, 310, 310, 310, 310, 310, 311, 311, 311, 311, 311, 311, 311, 311, - 312, 312, 313, 26, 26, 26, 26, 314, 315, 315, 315, 316, 26, 26, 26, 26, - 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, - 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, - 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - 318, 318, 318, 318, 318, 319, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 320, 321, 26, 26, 26, 26, 26, 26, 322, 322, 323, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 324, 324, 26, 26, 26, 26, 26, 26, 26, 26, - 325, 325, 325, 325, 325, 325, 325, 26, 326, 326, 326, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 327, 328, 328, 26, 26, 329, 329, 330, 26, 26, 26, 26, 26, - 331, 331, 331, 331, 331, 331, 331, 331, 26, 26, 26, 26, 26, 26, 26, 26, - 332, 333, 334, 334, 334, 335, 335, 335, 336, 336, 336, 336, 336, 336, 336, 336, - 337, 337, 337, 337, 337, 337, 337, 337, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 339, 339, 340, 341, 342, 342, 342, 342, 343, 343, 343, 343, 344, 344, 344, 344, - 345, 345, 345, 345, 345, 345, 345, 345, 346, 346, 346, 346, 346, 346, 346, 346, - 347, 347, 347, 348, 349, 349, 349, 349, 26, 26, 26, 26, 26, 26, 26, 26, - 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, - 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, - 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, - 350, 350, 350, 350, 350, 350, 350, 26, 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, 352, 352, 352, 352, 352, - 352, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, - 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, - 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, - 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, - 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, - 353, 353, 353, 353, 353, 354, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 356, - 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, - 357, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 358, 358, 358, 358, 26, 26, 26, 26, 359, 359, 359, 359, 359, 359, 359, 360, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, -}; - -static RE_UINT16 re_block_stage_3[] = { - 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, - 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, - 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, - 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, - 18, 18, 18, 18, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, - 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, - 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, - 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, - 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, - 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, - 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, - 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, - 49, 49, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 52, 52, - 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, - 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, - 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 62, 62, - 62, 62, 62, 62, 63, 63, 64, 64, 64, 64, 64, 64, 65, 65, 66, 66, - 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 69, - 70, 70, 70, 70, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 73, 73, - 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, - 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, - 78, 78, 78, 78, 79, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, - 82, 82, 82, 82, 83, 83, 83, 83, 84, 84, 84, 84, 85, 85, 85, 85, - 86, 86, 86, 86, 87, 87, 87, 87, 88, 88, 88, 88, 89, 89, 89, 89, - 89, 89, 90, 90, 91, 91, 91, 91, 92, 92, 92, 92, 93, 93, 93, 93, - 94, 94, 94, 94, 95, 95, 95, 95, 96, 96, 96, 96, 97, 97, 97, 97, - 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, - 101, 101, 101, 101, 102, 102, 102, 102, 103, 103, 103, 103, 104, 104, 104, 104, - 105, 105, 105, 105, 20, 20, 106, 106, 107, 107, 107, 107, 108, 108, 108, 108, - 109, 109, 109, 109, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, - 111, 111, 112, 112, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 115, 115, - 116, 116, 116, 116, 117, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 119, - 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, - 122, 122, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, 125, 125, 125, 125, - 126, 126, 126, 126, 127, 127, 127, 127, 128, 128, 128, 128, 129, 129, 129, 129, - 129, 129, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, 133, 133, 133, 133, - 134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 136, 136, 136, 136, - 137, 137, 137, 137, 138, 138, 138, 138, 139, 139, 139, 139, 140, 140, 140, 140, - 141, 141, 141, 141, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 144, 144, - 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 146, 146, 146, 146, - 147, 147, 147, 147, 147, 147, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149, - 150, 150, 150, 150, 151, 151, 151, 151, 152, 152, 152, 152, 153, 153, 153, 153, - 154, 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, 155, 156, 156, 157, 157, - 158, 158, 159, 159, 159, 159, 160, 160, 160, 160, 161, 161, 161, 161, 161, 161, - 162, 162, 162, 162, 162, 162, 163, 163, 164, 164, 164, 164, 165, 165, 165, 165, - 166, 166, 166, 166, 167, 167, 167, 167, 167, 167, 168, 168, 168, 168, 168, 168, - 168, 168, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 171, 171, 171, 171, - 172, 172, 172, 172, 173, 173, 173, 173, 173, 173, 174, 174, 174, 174, 175, 175, - 175, 175, 175, 175, 176, 176, 176, 176, 177, 177, 177, 177, 178, 178, 178, 178, - 178, 178, 179, 179, 179, 179, 179, 179, 180, 180, 180, 180, 180, 180, 181, 181, - 181, 181, 181, 181, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183, 183, - 183, 183, 20, 20, 184, 184, 184, 184, 185, 185, 185, 185, 186, 186, 186, 186, - 187, 187, 187, 187, 188, 188, 188, 188, 188, 188, 20, 20, 189, 189, 189, 189, - 190, 190, 190, 190, 191, 191, 191, 191, 192, 192, 192, 192, 193, 193, 193, 193, - 194, 194, 194, 194, 195, 195, 195, 195, 196, 196, 196, 196, 197, 197, 197, 197, - 198, 198, 198, 198, 199, 199, 199, 199, 200, 200, 200, 200, 201, 201, 201, 201, - 201, 201, 20, 20, 202, 202, 202, 202, 202, 202, 20, 20, 203, 203, 203, 203, - 204, 204, 204, 204, 205, 205, 205, 205, 206, 206, 206, 206, 206, 206, 207, 207, - 207, 207, 207, 207, 207, 207, 20, 20, 208, 208, 208, 208, 209, 209, 209, 209, - 210, 210, 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, 212, 212, 212, 212, - 212, 212, 213, 213, 213, 213, 213, 213, 214, 214, 214, 214, 215, 215, 215, 215, - 216, 216, 216, 216, 216, 216, 20, 20, 217, 217, 217, 217, 217, 217, 218, 218, - 218, 218, 218, 218, 219, 219, 219, 219, 220, 220, 220, 220, 221, 221, 221, 221, - 222, 222, 222, 222, 223, 223, 223, 223, 224, 224, 224, 224, 225, 225, 225, 225, - 225, 225, 20, 20, 226, 226, 226, 226, 227, 227, 227, 227, 227, 227, 20, 20, - 228, 228, 228, 228, 229, 229, 229, 229, 230, 230, 230, 230, 230, 230, 231, 231, - 231, 231, 231, 231, 231, 231, 20, 20, 232, 232, 232, 232, 233, 233, 233, 233, - 233, 233, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 236, 236, 236, 236, - 236, 236, 20, 20, 237, 237, 237, 237, 238, 238, 238, 238, 239, 239, 239, 239, - 240, 240, 240, 240, 241, 241, 241, 241, 241, 241, 20, 20, 242, 242, 242, 242, - 242, 242, 243, 243, 244, 244, 244, 244, 245, 245, 245, 245, 246, 246, 246, 246, - 246, 246, 20, 20, 20, 20, 247, 247, 247, 247, 247, 247, 248, 248, 248, 248, - 248, 248, 20, 20, 249, 249, 249, 249, 250, 250, 250, 250, 251, 251, 251, 251, - 252, 252, 252, 252, 253, 253, 253, 253, 254, 254, 254, 254, 255, 255, 255, 255, - 255, 255, 256, 256, 256, 256, 256, 256, 256, 256, 257, 257, 257, 257, 257, 257, - 258, 258, 258, 258, 259, 259, 20, 20, 260, 260, 260, 260, 261, 261, 261, 261, - 262, 262, 262, 262, 262, 262, 20, 20, 263, 263, 263, 263, 264, 264, 264, 264, - 265, 265, 265, 265, 266, 266, 266, 266, 267, 267, 267, 267, 267, 267, 20, 20, - 268, 268, 268, 268, 268, 268, 20, 20, 269, 269, 269, 269, 269, 269, 20, 20, - 270, 270, 270, 270, 271, 271, 271, 271, 272, 272, 272, 272, 20, 20, 273, 273, - 273, 273, 273, 273, 274, 274, 274, 274, 274, 274, 20, 20, 275, 275, 275, 275, - 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 278, 278, 278, 278, - 279, 279, 279, 279, 280, 280, 280, 280, 281, 281, 281, 281, 282, 282, 282, 282, - 282, 282, 283, 283, 283, 283, 283, 283, 284, 284, 284, 284, 285, 285, 285, 285, - 286, 286, 286, 286, 287, 287, 287, 287, 288, 288, 288, 288, 289, 289, 289, 289, - 289, 289, 290, 290, 290, 290, 290, 290, 291, 291, 291, 291, 292, 292, 292, 292, - 293, 293, 293, 293, 294, 294, 294, 294, 294, 294, 295, 295, 295, 295, 295, 295, - 295, 295, 20, 20, 296, 296, 296, 296, 297, 297, 297, 297, 298, 298, 298, 298, - 298, 298, 20, 20, 299, 299, 299, 299, 300, 300, 300, 300, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10, + 10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38, + 10, 10, 10, 10, 10, 39, 10, 10, 40, 10, 41, 42, 43, 10, 44, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, 13, 13, 13, 46, 47, 13, + 13, 13, 13, 48, 13, 13, 13, 13, 13, 13, 49, 10, 10, 10, 50, 10, + 13, 13, 13, 13, 51, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; -static RE_UINT16 re_block_stage_4[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, - 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, - 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, - 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, - 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, - 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, - 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, - 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, - 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, - 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, - 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, - 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, - 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, - 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, - 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, - 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, - 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, - 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, - 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, - 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, - 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, - 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, - 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, - 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, - 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, - 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, - 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, - 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, - 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, - 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, - 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, - 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, - 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, - 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, - 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, - 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, - 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, - 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, - 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, - 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, 95, - 96, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, - 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, - 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, - 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103, - 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, - 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, - 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, - 110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 111, 111, - 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113, - 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, - 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, - 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, - 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, - 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, - 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, - 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, - 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129, - 130, 130, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, - 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, - 134, 134, 134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, - 136, 136, 136, 136, 136, 136, 136, 136, 137, 137, 137, 137, 137, 137, 137, 137, - 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 139, 139, 139, 139, 139, 139, - 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 141, 141, 141, - 142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 143, 143, - 144, 144, 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 145, 145, - 146, 146, 146, 146, 146, 146, 146, 146, 147, 147, 147, 147, 147, 147, 147, 147, - 148, 148, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149, 149, 149, 149, 149, - 150, 150, 150, 150, 150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, - 152, 152, 152, 152, 152, 152, 152, 152, 153, 153, 153, 153, 153, 153, 153, 153, - 154, 154, 154, 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, 155, 155, 155, - 156, 156, 156, 156, 156, 156, 156, 156, 157, 157, 157, 157, 157, 157, 157, 157, - 158, 158, 158, 158, 158, 158, 158, 158, 159, 159, 159, 159, 159, 159, 159, 159, - 160, 160, 160, 160, 160, 160, 160, 160, 161, 161, 161, 161, 161, 161, 161, 161, - 162, 162, 162, 162, 162, 162, 162, 162, 163, 163, 163, 163, 163, 163, 163, 163, - 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, 165, 165, 165, 165, - 166, 166, 166, 166, 166, 166, 166, 166, 167, 167, 167, 167, 167, 167, 167, 167, - 168, 168, 168, 168, 168, 168, 168, 168, 169, 169, 169, 169, 169, 169, 169, 169, - 170, 170, 170, 170, 170, 170, 170, 170, 171, 171, 171, 171, 171, 171, 171, 171, - 172, 172, 172, 172, 172, 172, 172, 172, 173, 173, 173, 173, 173, 173, 173, 173, - 174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175, - 176, 176, 176, 176, 176, 176, 176, 176, 177, 177, 177, 177, 177, 177, 177, 177, - 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 179, 179, 179, 179, 179, - 180, 180, 180, 180, 180, 180, 180, 180, 181, 181, 181, 181, 181, 181, 181, 181, - 182, 182, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183, 183, 183, 183, - 184, 184, 184, 184, 184, 184, 184, 184, 185, 185, 185, 185, 185, 185, 185, 185, - 186, 186, 186, 186, 186, 186, 186, 186, 187, 187, 187, 187, 187, 187, 187, 187, - 188, 188, 188, 188, 188, 188, 188, 188, 189, 189, 189, 189, 189, 189, 189, 189, - 190, 190, 190, 190, 190, 190, 190, 190, 191, 191, 191, 191, 191, 191, 191, 191, - 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193, - 194, 194, 194, 194, 194, 194, 194, 194, 195, 195, 195, 195, 195, 195, 195, 195, - 196, 196, 196, 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, 197, 197, 197, - 198, 198, 198, 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, 199, 199, 199, - 200, 200, 200, 200, 200, 200, 200, 200, 201, 201, 201, 201, 201, 201, 201, 201, - 202, 202, 202, 202, 202, 202, 202, 202, 203, 203, 203, 203, 203, 203, 203, 203, - 204, 204, 204, 204, 204, 204, 204, 204, 205, 205, 205, 205, 205, 205, 205, 205, - 206, 206, 206, 206, 206, 206, 206, 206, 207, 207, 207, 207, 207, 207, 207, 207, - 208, 208, 208, 208, 208, 208, 208, 208, 209, 209, 209, 209, 209, 209, 209, 209, - 210, 210, 210, 210, 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, 211, 211, - 212, 212, 212, 212, 212, 212, 212, 212, 213, 213, 213, 213, 213, 213, 213, 213, - 214, 214, 214, 214, 214, 214, 214, 214, 215, 215, 215, 215, 215, 215, 215, 215, - 216, 216, 216, 216, 216, 216, 216, 216, 217, 217, 217, 217, 217, 217, 217, 217, - 218, 218, 218, 218, 218, 218, 218, 218, 219, 219, 219, 219, 219, 219, 219, 219, - 220, 220, 220, 220, 220, 220, 220, 220, 221, 221, 221, 221, 221, 221, 221, 221, - 222, 222, 222, 222, 222, 222, 222, 222, 223, 223, 223, 223, 223, 223, 223, 223, - 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 225, 225, - 226, 226, 226, 226, 226, 226, 226, 226, 227, 227, 227, 227, 227, 227, 227, 227, - 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 229, 229, - 230, 230, 230, 230, 230, 230, 230, 230, 231, 231, 231, 231, 231, 231, 231, 231, - 232, 232, 232, 232, 232, 232, 232, 232, 233, 233, 233, 233, 233, 233, 233, 233, - 234, 234, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 235, 235, 235, 235, - 236, 236, 236, 236, 236, 236, 236, 236, 237, 237, 237, 237, 237, 237, 237, 237, - 238, 238, 238, 238, 238, 238, 238, 238, 239, 239, 239, 239, 239, 239, 239, 239, - 240, 240, 240, 240, 240, 240, 240, 240, 241, 241, 241, 241, 241, 241, 241, 241, - 242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 243, 243, 243, 243, 243, - 244, 244, 244, 244, 244, 244, 244, 244, 245, 245, 245, 245, 245, 245, 245, 245, - 246, 246, 246, 246, 246, 246, 246, 246, 247, 247, 247, 247, 247, 247, 247, 247, - 248, 248, 248, 248, 248, 248, 248, 248, 249, 249, 249, 249, 249, 249, 249, 249, - 250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, 251, 251, 251, - 252, 252, 252, 252, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 253, 253, - 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, - 256, 256, 256, 256, 256, 256, 256, 256, 257, 257, 257, 257, 257, 257, 257, 257, - 258, 258, 258, 258, 258, 258, 258, 258, 259, 259, 259, 259, 259, 259, 259, 259, - 260, 260, 260, 260, 260, 260, 260, 260, 261, 261, 261, 261, 261, 261, 261, 261, - 262, 262, 262, 262, 262, 262, 262, 262, 263, 263, 263, 263, 263, 263, 263, 263, - 264, 264, 264, 264, 264, 264, 264, 264, 265, 265, 265, 265, 265, 265, 265, 265, - 266, 266, 266, 266, 266, 266, 266, 266, 267, 267, 267, 267, 267, 267, 267, 267, - 268, 268, 268, 268, 268, 268, 268, 268, 269, 269, 269, 269, 269, 269, 269, 269, - 270, 270, 270, 270, 270, 270, 270, 270, 271, 271, 271, 271, 271, 271, 271, 271, - 272, 272, 272, 272, 272, 272, 272, 272, 273, 273, 273, 273, 273, 273, 273, 273, - 274, 274, 274, 274, 274, 274, 274, 274, 275, 275, 275, 275, 275, 275, 275, 275, - 276, 276, 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 277, - 278, 278, 278, 278, 278, 278, 278, 278, 279, 279, 279, 279, 279, 279, 279, 279, - 280, 280, 280, 280, 280, 280, 280, 280, 281, 281, 281, 281, 281, 281, 281, 281, - 282, 282, 282, 282, 282, 282, 282, 282, 283, 283, 283, 283, 283, 283, 283, 283, - 284, 284, 284, 284, 284, 284, 284, 284, 285, 285, 285, 285, 285, 285, 285, 285, - 286, 286, 286, 286, 286, 286, 286, 286, 287, 287, 287, 287, 287, 287, 287, 287, - 288, 288, 288, 288, 288, 288, 288, 288, 289, 289, 289, 289, 289, 289, 289, 289, - 290, 290, 290, 290, 290, 290, 290, 290, 291, 291, 291, 291, 291, 291, 291, 291, - 292, 292, 292, 292, 292, 292, 292, 292, 293, 293, 293, 293, 293, 293, 293, 293, - 294, 294, 294, 294, 294, 294, 294, 294, 295, 295, 295, 295, 295, 295, 295, 295, - 296, 296, 296, 296, 296, 296, 296, 296, 297, 297, 297, 297, 297, 297, 297, 297, - 298, 298, 298, 298, 298, 298, 298, 298, 299, 299, 299, 299, 299, 299, 299, 299, - 300, 300, 300, 300, 300, 300, 300, 300, +static RE_UINT16 re_alphanumeric_table_2[] = { + 0, 1, 2, 2, 0, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 6, 7, 0, 0, 8, 9, 10, 11, 5, 12, + 5, 5, 5, 5, 13, 5, 5, 5, 5, 14, 15, 5, 16, 17, 18, 19, + 20, 5, 21, 22, 5, 5, 23, 24, 25, 5, 26, 5, 5, 27, 5, 28, + 29, 30, 31, 32, 0, 33, 34, 35, 5, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 48, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 58, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 0, 76, 77, 78, 0, 79, 80, 81, 82, 83, 84, 0, 0, + 5, 85, 86, 5, 87, 5, 88, 89, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 90, 5, 91, 92, 93, 5, 94, 5, 74, 0, 95, 5, 5, 96, + 73, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 97, 2, 5, 5, 98, 99, 100, 100, 101, 5, 102, 103, 80, + 1, 5, 5, 31, 5, 104, 5, 105, 106, 107, 108, 109, 5, 110, 111, 0, + 112, 5, 106, 113, 111, 114, 79, 0, 5, 115, 116, 0, 5, 117, 5, 118, + 5, 119, 120, 87, 121, 66, 0, 122, 5, 5, 5, 5, 5, 5, 0, 123, + 5, 5, 5, 5, 5, 5, 5, 5, 96, 5, 124, 87, 5, 125, 126, 127, + 0, 0, 0, 128, 129, 0, 0, 0, 130, 131, 132, 5, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 133, 5, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 134, 106, 5, 5, 5, 5, 135, 5, 88, 5, 136, 119, 137, 137, 5, + 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 139, 140, 73, 5, 141, 73, 5, 89, 142, 14, 5, 5, 143, 5, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 84, + 5, 5, 5, 5, 30, 0, 25, 87, 5, 5, 5, 5, 5, 5, 5, 5, + 144, 145, 5, 146, 5, 5, 5, 95, 147, 148, 5, 5, 149, 5, 150, 151, + 152, 153, 5, 100, 5, 5, 154, 155, 5, 104, 156, 84, 5, 157, 158, 106, + 5, 119, 159, 160, 5, 106, 161, 162, 163, 164, 89, 86, 5, 5, 5, 165, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 166, 167, 112, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 168, 5, 5, 169, 0, 170, 171, 172, 5, 5, 27, 173, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 87, 25, 5, 174, 5, 153, 175, + 0, 0, 0, 176, 5, 5, 5, 84, 1, 2, 2, 108, 5, 106, 177, 0, + 178, 179, 180, 0, 5, 5, 5, 74, 0, 0, 5, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 84, 5, 182, 0, 5, 26, 104, 74, 87, 5, 183, 0, + 5, 5, 5, 5, 87, 86, 184, 112, 5, 185, 5, 186, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 119, 105, 153, 0, 0, 0, 0, + 187, 188, 105, 119, 106, 0, 0, 189, 105, 169, 0, 0, 5, 190, 0, 0, + 191, 105, 0, 84, 84, 0, 81, 192, 5, 105, 105, 156, 27, 0, 0, 0, + 5, 5, 16, 0, 5, 156, 5, 156, 5, 193, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 194, 0, 0, 84, 195, 196, 0, 0, 25, 192, 119, + 5, 5, 196, 57, 148, 31, 25, 197, 5, 198, 199, 200, 5, 5, 201, 0, + 202, 203, 0, 0, 204, 121, 5, 197, 39, 48, 205, 186, 0, 0, 0, 0, + 5, 5, 206, 207, 5, 5, 208, 0, 0, 0, 0, 0, 5, 209, 210, 0, + 5, 106, 211, 0, 5, 212, 80, 0, 66, 165, 0, 0, 0, 0, 0, 0, + 5, 31, 0, 0, 0, 5, 5, 213, 214, 215, 216, 0, 0, 217, 29, 218, + 5, 219, 25, 5, 220, 0, 5, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 221, 222, 223, 224, 174, 225, 0, 0, 226, 227, 228, 229, 230, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, 231, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 169, 0, 0, 0, + 5, 5, 5, 143, 5, 5, 5, 5, 5, 5, 186, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 31, 106, 80, 0, 0, 25, 233, 5, 95, 234, 235, 95, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 0, 0, 0, 0, 5, 5, 236, 5, 237, 0, 0, 238, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 239, + 5, 5, 5, 5, 5, 5, 105, 0, 16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 106, 0, 240, 199, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 112, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 241, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 33, 5, 243, 244, 245, 5, 246, 247, 248, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 249, 250, 89, 33, 33, 134, 134, 221, 221, 251, 5, + 252, 253, 0, 0, 0, 0, 0, 0, 5, 254, 255, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 256, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 192, 0, 5, 5, 257, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 245, 258, 259, 260, 261, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 86, 86, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 87, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 181, 5, 5, 5, 5, 5, 5, + 87, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 263, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 79, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 32, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_alphanumeric_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 7, 0, 4, 32, 4, + 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, + 32, 0, 0, 0, 0, 0, 223, 188, 64, 215, 255, 255, 251, 255, 255, 255, + 255, 255, 191, 255, 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, + 255, 1, 0, 0, 0, 0, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, + 0, 0, 255, 7, 255, 255, 255, 254, 255, 195, 255, 255, 255, 255, 239, 31, + 254, 225, 255, 159, 0, 0, 255, 255, 0, 224, 255, 255, 255, 255, 3, 0, + 255, 7, 48, 4, 255, 255, 255, 252, 255, 31, 0, 0, 255, 255, 255, 1, + 255, 7, 0, 0, 255, 255, 223, 255, 255, 0, 240, 255, 248, 3, 255, 255, + 255, 255, 255, 239, 255, 223, 225, 255, 207, 255, 254, 255, 239, 159, 249, 255, + 255, 253, 197, 227, 159, 89, 128, 176, 207, 255, 3, 16, 238, 135, 249, 255, + 255, 253, 109, 195, 135, 25, 2, 94, 192, 255, 63, 0, 238, 191, 251, 255, + 255, 253, 237, 227, 191, 27, 1, 0, 207, 255, 0, 30, 238, 159, 249, 255, + 159, 25, 192, 176, 207, 255, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, + 199, 29, 129, 0, 192, 255, 0, 0, 239, 223, 253, 255, 255, 253, 255, 227, + 223, 29, 96, 7, 207, 255, 0, 0, 255, 253, 239, 227, 223, 29, 96, 64, + 207, 255, 6, 0, 255, 223, 253, 255, 255, 255, 255, 231, 223, 93, 240, 128, + 207, 255, 0, 252, 238, 255, 127, 252, 255, 255, 251, 47, 127, 128, 95, 255, + 192, 255, 12, 0, 254, 255, 255, 255, 255, 255, 255, 7, 127, 32, 255, 3, + 214, 247, 255, 255, 175, 255, 255, 59, 95, 32, 255, 243, 1, 0, 0, 0, + 255, 3, 0, 0, 255, 254, 255, 255, 255, 31, 254, 255, 3, 255, 255, 254, + 255, 255, 255, 31, 255, 255, 127, 249, 255, 3, 255, 255, 255, 255, 255, 63, + 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, + 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 0, 0, + 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, 255, 223, 15, 0, + 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 207, 255, 255, 1, 128, 16, + 255, 7, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, 255, 15, 255, 1, + 192, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 3, + 255, 255, 255, 15, 254, 255, 31, 0, 128, 0, 0, 128, 255, 255, 239, 255, + 239, 15, 255, 3, 255, 243, 255, 255, 191, 255, 3, 0, 255, 255, 127, 0, + 255, 227, 255, 255, 255, 1, 255, 255, 0, 222, 111, 4, 128, 255, 31, 0, + 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, + 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, 80, 189, 255, 243, + 224, 67, 0, 0, 0, 0, 192, 255, 255, 127, 255, 255, 31, 120, 12, 0, + 255, 128, 0, 0, 127, 127, 127, 127, 0, 128, 0, 0, 224, 0, 0, 0, + 254, 3, 62, 31, 255, 255, 127, 224, 224, 255, 255, 255, 255, 127, 0, 0, + 255, 31, 255, 255, 255, 15, 0, 0, 255, 127, 240, 143, 0, 0, 128, 255, + 252, 255, 255, 255, 255, 249, 255, 255, 252, 7, 0, 0, 0, 0, 224, 255, + 191, 255, 255, 255, 255, 0, 0, 0, 47, 0, 255, 3, 0, 0, 252, 232, + 255, 255, 7, 0, 255, 255, 247, 255, 0, 128, 255, 3, 255, 63, 255, 3, + 255, 255, 127, 252, 5, 0, 0, 56, 255, 255, 60, 0, 126, 126, 126, 0, + 127, 127, 255, 255, 255, 7, 255, 3, 15, 0, 255, 255, 127, 248, 255, 255, + 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, + 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 15, + 0, 0, 223, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, + 255, 63, 255, 63, 255, 255, 31, 0, 255, 255, 1, 0, 15, 255, 62, 0, + 255, 255, 15, 255, 255, 0, 255, 255, 15, 0, 0, 0, 63, 253, 255, 255, + 255, 255, 191, 145, 255, 255, 55, 0, 255, 255, 255, 192, 111, 240, 239, 254, + 31, 0, 0, 0, 255, 0, 255, 3, 255, 27, 3, 0, 128, 0, 255, 255, + 63, 0, 0, 0, 255, 1, 255, 3, 255, 255, 199, 255, 240, 0, 255, 255, + 255, 255, 71, 0, 30, 192, 255, 23, 255, 255, 251, 255, 255, 255, 159, 64, + 127, 189, 255, 191, 159, 25, 129, 224, 187, 7, 255, 131, 3, 0, 0, 0, + 179, 0, 255, 3, 255, 255, 63, 127, 0, 0, 0, 63, 17, 0, 255, 3, + 255, 255, 63, 1, 255, 3, 0, 128, 127, 242, 111, 255, 255, 255, 191, 153, + 7, 0, 255, 3, 255, 252, 255, 255, 26, 0, 0, 0, 255, 255, 231, 127, + 255, 255, 255, 32, 255, 253, 255, 255, 255, 255, 127, 127, 1, 0, 255, 3, + 0, 0, 252, 255, 255, 254, 127, 0, 127, 251, 255, 255, 255, 255, 127, 180, + 203, 0, 255, 3, 191, 253, 255, 255, 255, 127, 123, 1, 0, 0, 1, 0, + 127, 0, 0, 0, 255, 63, 0, 0, 15, 0, 255, 3, 248, 255, 255, 224, + 255, 135, 255, 255, 255, 128, 255, 255, 11, 0, 3, 0, 255, 255, 255, 0, + 0, 0, 7, 0, 255, 7, 255, 31, 255, 1, 255, 67, 255, 255, 255, 223, + 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, + 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 247, 207, 255, 255, + 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 128, 63, 255, 67, 0, 0, + 255, 15, 255, 3, 143, 8, 255, 3, 150, 254, 247, 10, 132, 234, 150, 170, + 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255 }; -/* Block: 13160 bytes. */ - -RE_UINT32 re_get_block(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 10; - code = ch ^ (f << 10); - pos = (RE_UINT32)re_block_stage_1[f] << 5; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_block_stage_2[pos + f] << 2; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_block_stage_3[pos + f] << 3; - value = re_block_stage_4[pos + code]; - - return value; -} - -/* Script. */ - -static RE_UINT8 re_script_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 9, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 14, 15, - 16, 17, 18, 19, 20, 14, 21, 14, 22, 14, 14, 14, 14, 23, 24, 24, - 25, 26, 14, 14, 14, 14, 27, 28, 14, 14, 29, 30, 31, 32, 33, 34, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 35, 7, 36, 37, 7, 38, 7, 7, 7, 39, 14, 40, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 41, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -}; +RE_UINT32 re_get_alphanumeric(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_script_stage_2[] = { - 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, - 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, - 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 80, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 82, 83, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 96, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 70, 70, 98, 99, 100, 101, 102, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 97, 113, 114, 115, 116, 117, 118, 97, 119, 119, 120, 97, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 97, 132, 97, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 97, 142, 143, 97, 144, 145, 146, 147, 97, - 148, 149, 97, 150, 151, 152, 97, 97, 153, 154, 155, 156, 97, 157, 97, 158, - 159, 159, 159, 159, 159, 159, 159, 160, 161, 159, 162, 97, 97, 97, 97, 97, - 163, 163, 163, 163, 163, 163, 163, 163, 164, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 165, 165, 165, 165, 166, 97, 97, 97, - 167, 167, 167, 167, 168, 169, 170, 171, 97, 97, 97, 97, 172, 173, 174, 175, - 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 177, - 176, 176, 176, 176, 176, 178, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 179, 180, 181, 182, 182, 183, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 184, 185, 97, 97, 97, 97, 97, 97, - 59, 186, 187, 188, 189, 190, 191, 97, 192, 193, 194, 59, 59, 195, 59, 196, - 197, 197, 197, 197, 197, 198, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 199, 97, 200, 97, 97, 201, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 202, 203, 204, 97, 97, 97, 97, 97, 205, 206, 207, 97, 208, 209, 97, 97, - 210, 211, 212, 213, 214, 97, 59, 59, 59, 59, 59, 59, 59, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 224, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 225, 70, - 226, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 227, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 228, 97, 97, 97, 97, 97, 97, 97, 97, - 70, 70, 70, 70, 229, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 230, 97, 231, 232, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT16 re_script_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, - 0, 0, 0, 0, 0, 4, 0, 4, 2, 2, 5, 2, 2, 2, 5, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 7, 8, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, - 12, 13, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 16, 17, 14, 14, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 20, 21, 21, 21, 22, 20, 21, 21, 21, 21, - 21, 23, 24, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 27, 28, 26, - 29, 30, 31, 32, 31, 31, 31, 31, 33, 34, 35, 31, 31, 31, 36, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 29, 31, 31, 31, 31, - 37, 38, 37, 37, 37, 37, 37, 37, 37, 39, 31, 31, 31, 31, 31, 31, - 40, 40, 40, 40, 40, 40, 41, 26, 42, 42, 42, 42, 42, 42, 42, 43, - 44, 44, 44, 44, 44, 45, 44, 46, 47, 47, 47, 48, 37, 49, 26, 26, - 26, 26, 26, 26, 31, 31, 50, 51, 26, 26, 52, 31, 53, 31, 31, 31, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 54, 56, 54, 54, 54, - 57, 58, 59, 60, 60, 61, 62, 63, 58, 64, 65, 66, 67, 60, 60, 68, - 69, 70, 71, 72, 72, 73, 74, 75, 70, 76, 77, 78, 79, 72, 80, 26, - 81, 82, 83, 84, 84, 85, 86, 87, 82, 88, 89, 26, 90, 84, 91, 92, - 93, 94, 95, 96, 96, 97, 98, 99, 94, 100, 101, 102, 103, 96, 96, 26, - 104, 105, 106, 107, 108, 105, 109, 110, 105, 106, 111, 26, 112, 109, 109, 113, - 114, 115, 116, 114, 114, 116, 114, 117, 115, 118, 119, 120, 121, 114, 122, 114, - 123, 124, 125, 123, 123, 125, 126, 127, 124, 128, 129, 130, 131, 123, 132, 26, - 133, 134, 135, 136, 136, 136, 136, 136, 134, 135, 137, 136, 138, 136, 136, 136, - 139, 140, 141, 142, 140, 140, 143, 144, 141, 145, 146, 140, 147, 140, 148, 26, - 149, 150, 150, 150, 150, 150, 150, 151, 150, 150, 150, 152, 26, 26, 26, 26, - 153, 154, 155, 155, 156, 155, 155, 157, 158, 157, 155, 159, 26, 26, 26, 26, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, 160, 162, 161, 160, - 160, 160, 160, 161, 160, 160, 160, 163, 160, 163, 164, 165, 26, 26, 26, 26, - 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 166, 167, 167, 167, 167, 168, 169, 167, 167, 167, 167, 167, 170, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 174, 173, 172, 172, 172, 172, - 172, 173, 172, 172, 172, 172, 173, 174, 173, 172, 174, 172, 172, 172, 172, 172, - 172, 172, 173, 172, 172, 172, 172, 172, 172, 172, 172, 175, 172, 172, 172, 176, - 172, 172, 172, 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, - 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, - 181, 181, 181, 182, 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 183, 185, - 186, 187, 188, 26, 189, 189, 190, 26, 191, 191, 192, 26, 193, 194, 195, 26, - 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 197, 196, 198, 196, 198, - 199, 200, 201, 202, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 203, - 201, 201, 201, 201, 201, 204, 180, 180, 180, 180, 180, 180, 180, 180, 205, 26, - 206, 206, 206, 207, 206, 208, 206, 208, 209, 206, 210, 210, 210, 211, 212, 26, - 213, 213, 213, 213, 213, 214, 213, 213, 213, 215, 213, 216, 196, 196, 196, 196, - 217, 217, 217, 218, 219, 219, 219, 219, 219, 219, 219, 220, 219, 219, 219, 221, - 219, 222, 219, 222, 219, 223, 9, 224, 26, 26, 26, 26, 26, 26, 26, 26, - 225, 225, 225, 225, 225, 225, 225, 225, 225, 226, 225, 225, 225, 225, 225, 227, - 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 230, 231, - 232, 232, 232, 232, 232, 232, 232, 233, 232, 234, 235, 235, 235, 235, 235, 235, - 18, 236, 167, 167, 167, 167, 167, 237, 228, 26, 238, 9, 239, 240, 241, 242, - 2, 2, 2, 2, 243, 244, 2, 2, 2, 2, 2, 245, 246, 247, 2, 248, - 2, 2, 2, 2, 2, 2, 2, 249, 9, 9, 9, 9, 9, 9, 9, 250, - 14, 14, 251, 251, 14, 14, 14, 14, 251, 251, 14, 252, 14, 14, 14, 251, - 14, 14, 14, 14, 14, 14, 253, 14, 253, 14, 254, 255, 14, 14, 256, 257, - 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 260, 261, - 0, 262, 2, 263, 0, 0, 0, 0, 26, 26, 9, 9, 9, 9, 264, 26, - 0, 0, 0, 0, 265, 266, 4, 0, 0, 267, 0, 0, 2, 2, 2, 2, - 2, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 262, 26, 26, 26, 0, 269, 26, 26, 0, 0, 0, 0, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, - 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 273, 273, 273, 273, 273, 274, 273, 273, 273, 273, 273, 274, 2, 2, 2, 2, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 275, 276, - 167, 167, 167, 167, 168, 169, 277, 277, 277, 277, 277, 277, 277, 278, 279, 278, - 172, 172, 174, 26, 174, 174, 174, 174, 174, 174, 174, 174, 18, 18, 18, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, - 280, 280, 280, 281, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 282, 26, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 26, 26, 26, 0, 284, - 285, 0, 0, 0, 286, 287, 0, 288, 289, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 291, 292, 293, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 295, - 296, 297, 297, 297, 297, 297, 298, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 299, 0, 0, 297, 297, 297, 300, 0, 0, 0, 0, 284, 26, 294, 294, - 171, 171, 171, 299, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 301, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 294, 294, 294, 294, 302, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 0, 0, 0, 0, 0, - 280, 280, 280, 280, 280, 280, 283, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 26, 26, - 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, - 303, 304, 303, 303, 303, 303, 303, 303, 305, 26, 306, 306, 306, 306, 306, 306, - 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, - 307, 307, 307, 307, 307, 308, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 26, - 0, 0, 0, 0, 310, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 311, 2, 2, 2, 2, 2, 2, 312, 26, 26, 26, 26, 26, 313, 2, - 314, 314, 314, 314, 314, 315, 0, 316, 317, 317, 317, 317, 317, 317, 317, 26, - 318, 318, 318, 318, 318, 318, 318, 318, 319, 320, 318, 321, 54, 54, 54, 54, - 322, 322, 322, 322, 322, 323, 324, 324, 324, 324, 325, 326, 171, 171, 171, 327, - 328, 328, 328, 328, 328, 328, 328, 328, 328, 329, 328, 330, 166, 166, 166, 331, - 332, 332, 332, 332, 332, 332, 333, 26, 332, 334, 332, 335, 166, 166, 166, 166, - 336, 336, 336, 336, 336, 336, 336, 336, 337, 26, 26, 338, 339, 339, 340, 26, - 341, 341, 341, 26, 174, 174, 2, 2, 2, 2, 2, 342, 343, 26, 178, 178, - 178, 178, 178, 178, 178, 178, 178, 178, 339, 339, 339, 339, 339, 344, 339, 345, - 171, 171, 171, 171, 346, 26, 171, 171, 299, 347, 171, 171, 171, 171, 171, 346, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 280, 280, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 348, 26, 26, 26, 26, - 349, 26, 350, 351, 25, 25, 352, 353, 354, 25, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 355, 26, 52, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 356, 26, 26, 31, 31, 31, 31, 31, 31, - 31, 31, 357, 31, 31, 31, 31, 31, 31, 26, 26, 26, 26, 26, 31, 51, - 9, 9, 0, 316, 9, 358, 0, 0, 0, 0, 359, 0, 262, 284, 50, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 360, - 361, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, 362, 294, 293, 294, - 294, 294, 294, 363, 171, 171, 171, 299, 364, 364, 364, 365, 262, 262, 26, 366, - 367, 368, 367, 367, 369, 367, 367, 370, 367, 371, 367, 371, 26, 26, 26, 26, - 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 372, - 373, 0, 0, 0, 0, 0, 374, 0, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 257, 0, 284, 375, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 376, - 377, 377, 377, 378, 379, 379, 379, 379, 379, 379, 380, 26, 381, 0, 0, 284, - 382, 382, 382, 382, 383, 384, 385, 385, 385, 386, 387, 387, 387, 387, 387, 388, - 389, 389, 389, 390, 391, 391, 391, 391, 392, 391, 393, 26, 26, 26, 26, 26, - 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 395, 395, 395, 395, 395, 395, - 396, 396, 396, 397, 396, 398, 399, 399, 399, 399, 400, 399, 399, 399, 399, 400, - 401, 401, 401, 401, 401, 26, 402, 402, 402, 402, 402, 402, 403, 404, 26, 26, - 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, - 405, 405, 405, 405, 405, 405, 406, 26, 405, 405, 407, 26, 405, 26, 26, 26, - 408, 409, 410, 410, 410, 410, 411, 412, 413, 413, 414, 413, 415, 415, 415, 415, - 416, 416, 416, 417, 418, 416, 26, 26, 26, 26, 26, 26, 419, 419, 420, 421, - 422, 422, 422, 423, 424, 424, 424, 425, 26, 26, 26, 26, 26, 26, 26, 26, - 426, 426, 426, 426, 427, 427, 427, 428, 427, 427, 429, 427, 427, 427, 427, 427, - 430, 431, 432, 433, 434, 434, 435, 436, 434, 437, 434, 437, 438, 438, 438, 438, - 439, 439, 439, 439, 26, 26, 26, 26, 440, 440, 440, 440, 441, 442, 441, 26, - 443, 443, 443, 443, 443, 443, 444, 445, 446, 446, 447, 446, 448, 448, 449, 448, - 450, 450, 451, 452, 26, 453, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 454, 454, 454, 454, 454, 454, 454, 454, 454, 455, 26, 26, 26, 26, 26, 26, - 456, 456, 456, 456, 456, 456, 457, 26, 456, 456, 456, 456, 456, 456, 457, 458, - 459, 459, 459, 459, 459, 26, 459, 460, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 31, 461, - 462, 462, 462, 462, 462, 26, 463, 463, 463, 463, 463, 464, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 465, 465, 466, 26, - 467, 467, 467, 467, 467, 467, 467, 467, 467, 468, 469, 467, 467, 467, 26, 470, - 471, 471, 471, 471, 471, 471, 471, 471, 472, 473, 474, 474, 474, 475, 474, 476, - 477, 477, 477, 477, 477, 477, 478, 477, 479, 26, 480, 480, 480, 480, 481, 26, - 482, 482, 482, 482, 482, 482, 482, 482, 482, 483, 482, 482, 484, 140, 485, 26, - 486, 486, 487, 486, 486, 486, 486, 488, 26, 26, 26, 26, 26, 26, 26, 26, - 489, 490, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 494, 495, 494, 496, - 497, 498, 499, 500, 500, 501, 502, 503, 498, 504, 505, 506, 507, 508, 508, 26, - 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 510, 26, 26, 26, 26, - 511, 511, 511, 511, 511, 511, 511, 511, 511, 26, 511, 512, 26, 26, 26, 26, - 513, 513, 513, 513, 513, 513, 514, 513, 513, 513, 513, 514, 26, 26, 26, 26, - 515, 515, 515, 515, 515, 515, 515, 515, 516, 26, 515, 517, 201, 518, 26, 26, - 519, 519, 519, 519, 519, 519, 519, 520, 519, 521, 26, 26, 26, 26, 26, 26, - 522, 522, 522, 523, 522, 524, 522, 522, 26, 26, 26, 26, 26, 26, 26, 26, - 525, 525, 525, 525, 525, 525, 525, 526, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 528, 529, - 26, 26, 26, 26, 530, 531, 530, 530, 530, 530, 530, 531, 532, 26, 26, 26, - 533, 533, 533, 533, 533, 533, 533, 533, 533, 26, 534, 534, 534, 534, 534, 534, - 534, 534, 534, 534, 535, 26, 26, 26, 536, 536, 536, 536, 536, 536, 536, 537, - 538, 539, 538, 538, 538, 538, 540, 538, 541, 26, 538, 538, 538, 542, 543, 543, - 543, 543, 544, 543, 543, 545, 546, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 547, 548, 549, 549, 549, 549, 547, 550, 549, 26, 549, 551, 552, 553, 554, 554, - 554, 555, 556, 557, 554, 558, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 559, 559, 559, 560, - 26, 26, 26, 26, 26, 26, 26, 26, 109, 109, 109, 109, 109, 109, 561, 562, - 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, - 563, 563, 563, 564, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 565, 566, 26, - 563, 563, 563, 563, 563, 563, 563, 563, 567, 26, 26, 26, 26, 26, 26, 26, - 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, - 568, 568, 568, 568, 568, 569, 568, 570, 26, 26, 26, 26, 26, 26, 26, 26, - 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, - 571, 571, 571, 571, 571, 571, 571, 571, 572, 26, 26, 26, 26, 26, 26, 26, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 573, 574, 574, 574, 575, 574, 576, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 577, 577, 577, 578, 578, 26, - 579, 579, 579, 579, 579, 579, 579, 579, 580, 26, 579, 581, 581, 579, 579, 582, - 579, 579, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 583, 583, 583, 583, 583, 583, 583, 583, - 583, 583, 583, 584, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 585, 585, 585, 585, 585, 585, 585, 585, 585, 586, 585, 585, 585, 585, 585, 585, - 585, 587, 585, 585, 26, 26, 26, 26, 26, 26, 26, 26, 588, 26, 26, 26, - 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, - 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 26, - 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 26, - 591, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 290, 291, 26, 26, 26, 26, 26, 26, 592, 26, 593, 26, 594, 594, - 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, - 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595, - 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 596, 598, - 596, 599, 596, 600, 284, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 26, - 0, 0, 0, 0, 262, 361, 0, 0, 0, 0, 0, 0, 601, 602, 0, 603, - 604, 605, 0, 0, 0, 606, 0, 0, 0, 0, 0, 0, 0, 607, 26, 26, - 14, 14, 14, 14, 14, 14, 14, 14, 251, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 284, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 26, 0, 0, 0, 607, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0, - 0, 0, 0, 259, 608, 609, 0, 610, 611, 0, 0, 0, 0, 0, 0, 0, - 612, 613, 259, 259, 0, 0, 0, 614, 615, 616, 617, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, 0, 0, - 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, - 618, 619, 26, 620, 621, 618, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 274, 273, 273, 622, 623, 624, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 625, 625, 625, 625, 625, 626, 625, 627, 625, 628, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 629, 629, 629, 629, 629, 629, 629, 630, - 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, 632, 631, 633, 26, 26, 26, 26, 26, - 634, 634, 634, 634, 634, 634, 634, 634, 634, 635, 634, 636, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 361, 0, - 0, 0, 0, 0, 0, 0, 637, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 361, 0, 0, 0, 0, 0, 0, 272, 26, 26, 26, 26, 26, 26, 26, 26, - 638, 31, 31, 31, 639, 640, 641, 642, 643, 644, 639, 645, 639, 641, 641, 646, - 31, 647, 31, 648, 649, 647, 31, 648, 26, 26, 26, 26, 26, 26, 355, 26, - 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 284, 26, 0, 262, 361, 0, 361, 0, 361, 0, 0, 0, 272, 26, - 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, - 0, 0, 0, 0, 0, 637, 26, 26, 26, 26, 26, 26, 650, 0, 0, 0, - 651, 26, 0, 0, 0, 0, 0, 284, 0, 607, 316, 26, 272, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 26, 0, 637, 0, 269, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 0, 284, 26, 26, - 0, 284, 0, 0, 0, 0, 0, 0, 0, 26, 0, 316, 0, 0, 0, 0, - 0, 26, 0, 0, 0, 272, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 614, 616, - 0, 0, 0, 0, 613, 652, 0, 0, 0, 613, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 26, 0, 272, 284, 269, - 269, 26, 272, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 653, 26, 26, 26, 26, 26, - 280, 280, 280, 280, 280, 280, 654, 26, 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 283, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 280, 348, 26, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 655, 26, 26, 26, - 280, 280, 280, 283, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 656, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 26, 26, -}; + v = re_alphanumeric_table_1[field_2]; + v = re_alphanumeric_table_2[(v << 5) | field_1]; + v = re_alphanumeric_table_3[(v << 2) | field_0]; -static RE_UINT8 re_script_stage_4[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, - 1, 1, 35, 35, 1, 1, 1, 1, 41, 41, 41, 41, 41, 41, 41, 41, - 3, 3, 3, 3, 1, 3, 3, 3, 0, 0, 3, 3, 3, 3, 1, 3, - 0, 0, 0, 0, 3, 1, 3, 1, 3, 3, 3, 0, 3, 0, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, - 3, 3, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 41, 41, 4, - 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 5, 1, 5, 0, 0, 5, 5, 5, - 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 0, 0, 0, 6, - 6, 6, 6, 6, 6, 0, 0, 0, 7, 7, 7, 7, 7, 1, 7, 7, - 7, 7, 7, 7, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 1, 7, 0, 7, 1, 1, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 7, 7, - 41, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 0, 8, 8, 8, 8, 0, 0, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 0, 0, 66, 66, 66, - 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 0, - 82, 82, 82, 82, 82, 82, 82, 0, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 0, 0, 95, 0, 8, 8, 8, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, - 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 1, 7, 7, 7, 7, 7, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 41, 41, 41, 41, 10, 10, 10, - 10, 10, 10, 10, 1, 1, 10, 10, 11, 11, 11, 11, 0, 11, 11, 11, - 11, 11, 11, 11, 11, 0, 0, 11, 11, 0, 0, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, - 11, 0, 11, 0, 0, 0, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, - 11, 0, 0, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 11, - 0, 0, 0, 0, 11, 11, 0, 11, 11, 11, 11, 11, 0, 0, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 0, 0, 12, 12, 12, 0, 12, 12, 12, - 12, 12, 12, 0, 0, 0, 0, 12, 12, 0, 0, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, - 12, 0, 12, 12, 0, 12, 12, 0, 12, 12, 0, 0, 12, 0, 12, 12, - 12, 0, 0, 12, 12, 12, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, - 0, 12, 12, 12, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 0, 0, 13, 13, 13, 0, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, - 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, - 13, 13, 0, 13, 13, 13, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, - 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, - 0, 13, 13, 13, 13, 13, 13, 13, 0, 14, 14, 14, 0, 14, 14, 14, - 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, - 14, 0, 14, 14, 0, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, - 14, 0, 0, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, - 0, 0, 0, 0, 14, 14, 0, 14, 14, 14, 14, 14, 0, 0, 14, 14, - 0, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, - 15, 0, 15, 15, 15, 15, 0, 0, 0, 15, 15, 0, 15, 0, 15, 15, - 0, 0, 0, 15, 15, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 0, 0, 0, 0, 15, 15, 15, 0, 0, 0, 0, 0, 0, 15, - 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, - 16, 0, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 16, 16, 16, - 16, 0, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 16, 16, 0, - 16, 16, 16, 0, 0, 0, 0, 0, 16, 16, 16, 16, 0, 0, 16, 16, - 0, 0, 0, 0, 0, 0, 0, 16, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 0, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 17, - 17, 0, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 17, 17, 0, - 0, 0, 0, 0, 0, 0, 17, 0, 17, 17, 17, 17, 0, 0, 17, 17, - 0, 17, 17, 0, 0, 0, 0, 0, 18, 18, 18, 18, 0, 18, 18, 18, - 18, 18, 18, 18, 18, 0, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 18, 18, 18, 18, - 18, 18, 18, 18, 0, 0, 18, 18, 0, 0, 19, 19, 0, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, - 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 19, 0, 0, 0, 0, 19, - 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, - 0, 0, 19, 19, 19, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 1, - 20, 20, 20, 20, 0, 0, 0, 0, 0, 21, 21, 0, 21, 0, 21, 21, - 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 0, 21, 0, 21, 21, 21, 21, 21, 21, 21, 0, 0, - 21, 21, 21, 21, 21, 0, 21, 0, 21, 21, 0, 0, 21, 21, 21, 21, - 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 0, 0, 0, 22, 22, 22, 22, 22, 0, 22, 22, - 22, 22, 22, 22, 22, 1, 1, 1, 1, 22, 22, 0, 0, 0, 0, 0, - 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 0, 24, 0, 0, 0, 0, 0, 24, 0, 0, - 24, 24, 24, 1, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 0, 0, - 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 0, 0, 26, 26, 26, - 26, 26, 26, 26, 26, 0, 0, 0, 26, 26, 0, 0, 0, 0, 0, 0, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, - 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 0, 0, 0, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 1, 1, 1, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, - 42, 42, 42, 42, 42, 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 1, 1, 0, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 0, 45, 45, 45, 0, 45, 45, 0, 0, 0, 0, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, - 31, 31, 0, 0, 0, 0, 0, 0, 32, 32, 1, 1, 32, 1, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, 0, 0, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, - 46, 46, 46, 46, 0, 0, 0, 0, 46, 0, 0, 0, 46, 46, 46, 46, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, - 47, 47, 47, 47, 47, 0, 0, 0, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 0, 0, 0, 0, 56, 56, 0, 0, 0, 0, 0, 0, - 56, 56, 56, 0, 0, 0, 56, 56, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 0, 0, 54, 54, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 0, 78, 78, 78, 78, 78, 0, 0, 78, - 78, 78, 0, 0, 0, 0, 0, 0, 78, 78, 78, 78, 78, 78, 0, 0, - 41, 41, 41, 41, 41, 41, 41, 0, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 0, 0, 0, 0, 62, 62, 62, 62, 62, 0, 0, 0, - 67, 67, 67, 67, 67, 67, 67, 67, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, 93, 93, - 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 68, 68, 68, 68, 68, - 68, 68, 0, 0, 0, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, - 4, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 0, 0, 24, 24, 24, - 41, 41, 41, 1, 41, 41, 41, 41, 41, 1, 41, 41, 41, 41, 41, 41, - 41, 1, 1, 1, 1, 41, 1, 1, 1, 1, 1, 1, 41, 1, 1, 1, - 41, 41, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 3, 3, - 3, 3, 3, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, - 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, - 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, - 41, 41, 0, 41, 41, 41, 41, 41, 3, 3, 3, 3, 3, 3, 0, 0, - 0, 3, 0, 3, 0, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, - 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, - 0, 0, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, - 1, 1, 1, 1, 41, 41, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, - 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 0, 0, 0, - 41, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, - 2, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, - 53, 53, 53, 53, 53, 53, 53, 53, 1, 1, 1, 1, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 0, 55, 55, 55, 55, 0, 0, 0, 0, - 0, 55, 55, 55, 55, 55, 55, 55, 58, 58, 58, 58, 58, 58, 58, 58, - 0, 0, 0, 0, 0, 0, 0, 58, 58, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 0, 0, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 36, 1, 36, - 1, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 25, 25, - 36, 36, 36, 36, 1, 1, 1, 1, 0, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, - 0, 41, 41, 1, 1, 33, 33, 33, 1, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 1, 1, 34, 34, 34, - 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, - 35, 35, 35, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 1, - 34, 34, 34, 34, 34, 34, 34, 1, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 0, - 83, 83, 83, 83, 83, 83, 83, 83, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 0, 0, 0, 0, 84, 84, 84, 84, 84, 84, 84, 84, - 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, - 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 0, 0, 0, 0, - 1, 1, 0, 0, 0, 0, 0, 0, 65, 65, 65, 65, 65, 65, 65, 65, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, - 0, 0, 0, 0, 0, 0, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 1, 72, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 73, 25, 25, 25, 25, 25, 0, 0, 0, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 1, - 85, 85, 0, 0, 0, 0, 85, 85, 23, 23, 23, 23, 23, 23, 23, 0, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 0, - 77, 77, 77, 77, 77, 77, 0, 0, 77, 77, 0, 0, 77, 77, 77, 77, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, - 0, 0, 0, 79, 79, 79, 79, 79, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 0, 0, 26, 26, 26, 26, 26, 26, 0, - 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, - 86, 86, 86, 86, 86, 86, 0, 0, 86, 86, 0, 0, 0, 0, 0, 0, - 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, - 36, 36, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, - 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 0, 6, 6, 6, 6, 6, 0, 6, 0, - 6, 6, 0, 6, 6, 0, 6, 6, 7, 7, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 1, 1, 0, 0, 7, 7, 7, 7, 7, 7, - 41, 41, 41, 41, 41, 41, 4, 4, 1, 1, 1, 0, 1, 1, 1, 1, - 7, 7, 7, 7, 7, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 34, 34, 34, 34, 34, 34, 34, 34, 1, 1, - 0, 0, 25, 25, 25, 25, 25, 25, 0, 0, 25, 25, 25, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, - 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 0, - 48, 48, 48, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, - 1, 1, 1, 1, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 41, 0, 0, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 0, 0, 0, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 0, 0, 0, 0, 0, 0, 0, 41, 1, 1, 1, 1, 1, 1, 1, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 0, 0, 0, 0, 0, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 0, 49, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 0, 0, 0, 0, 60, 60, 60, 60, 60, 60, 0, 0, - 40, 40, 40, 40, 40, 40, 40, 40, 50, 50, 50, 50, 50, 50, 50, 50, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, - 51, 51, 0, 0, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 0, 0, 0, 0, 106, 106, 106, 106, 106, 106, 106, 106, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 103, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 110, 0, 110, 110, 110, 110, 110, 110, 0, 0, - 52, 52, 52, 52, 52, 52, 0, 0, 52, 0, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 0, 52, - 52, 0, 0, 0, 52, 0, 0, 52, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 0, 87, 118, 118, 118, 118, 118, 118, 118, 118, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 128, 128, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 64, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 76, - 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, - 0, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, - 61, 61, 61, 61, 0, 61, 61, 0, 0, 0, 0, 0, 61, 61, 61, 61, - 61, 61, 61, 61, 0, 61, 61, 61, 0, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 0, 0, - 61, 61, 61, 0, 0, 0, 0, 61, 61, 0, 0, 0, 0, 0, 0, 0, - 88, 88, 88, 88, 88, 88, 88, 88, 116, 116, 116, 116, 116, 116, 116, 116, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 0, - 0, 0, 0, 112, 112, 112, 112, 112, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, - 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 0, 0, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, 0, 0, 0, 0, - 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 0, 0, 0, 0, 0, 0, - 0, 121, 121, 121, 121, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, - 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 0, 0, 0, 0, 0, 0, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, - 0, 0, 130, 130, 130, 130, 130, 130, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, - 148, 148, 148, 148, 148, 148, 148, 148, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 0, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 0, 0, 0, 0, 94, 94, 94, 94, 94, 94, - 0, 0, 0, 0, 0, 0, 0, 94, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 0, 0, 0, 0, 0, 0, 0, - 101, 101, 0, 0, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, - 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, 0, - 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 0, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 0, 129, 129, 129, 129, 129, 129, 129, 0, - 129, 0, 129, 129, 129, 129, 0, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 129, 129, 129, 129, 129, 129, 0, 129, 129, 129, 0, 0, 0, 0, 0, 0, - 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, - 123, 123, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 0, 107, 107, 107, - 107, 107, 107, 107, 107, 0, 0, 107, 107, 0, 0, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 107, 107, 107, 107, - 107, 0, 107, 107, 0, 107, 107, 107, 107, 107, 0, 41, 107, 107, 107, 107, - 107, 0, 0, 107, 107, 107, 0, 0, 107, 0, 0, 0, 0, 0, 0, 107, - 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 0, 0, 107, 107, - 107, 107, 107, 107, 107, 0, 0, 0, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 0, 135, 0, 135, 135, 135, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 122, 122, 122, 122, - 122, 122, 122, 122, 122, 122, 0, 0, 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 0, 0, 0, 114, 114, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 32, 32, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 0, 0, 0, 0, 0, 0, 0, 102, 102, 0, 0, 0, 0, 0, 0, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 126, 126, 126, - 126, 126, 126, 126, 0, 0, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 0, 0, 0, 0, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, - 150, 150, 150, 150, 150, 150, 150, 150, 0, 0, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 0, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 0, 0, 0, 0, 0, 0, 0, - 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, - 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, 0, 0, - 133, 133, 133, 133, 133, 0, 0, 0, 134, 134, 134, 134, 134, 134, 134, 134, - 0, 0, 134, 134, 134, 134, 134, 134, 0, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 0, 138, 138, 138, 138, 138, 138, 138, 0, - 138, 138, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 0, 0, 138, 0, 138, 138, 0, 138, 138, 138, 0, 0, 0, 0, 0, 0, - 143, 143, 143, 143, 143, 143, 0, 143, 143, 0, 143, 143, 143, 143, 143, 143, - 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, - 143, 143, 0, 143, 143, 143, 143, 143, 143, 0, 0, 0, 0, 0, 0, 0, - 143, 143, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 0, 0, 0, 0, 0, 0, 0, 15, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 15, 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 0, 0, 0, 0, 0, 0, 63, 63, 63, 63, 63, 63, 63, 0, - 63, 63, 63, 63, 63, 0, 0, 0, 63, 63, 63, 63, 0, 0, 0, 0, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 0, - 81, 0, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 0, 84, 0, 0, 0, 0, 0, 0, 0, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 0, - 115, 115, 0, 0, 0, 0, 115, 115, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 0, 0, 108, 108, 0, 108, 108, 108, 108, 108, - 0, 0, 0, 0, 0, 108, 108, 108, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 0, 0, 0, 0, 0, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 99, - 137, 139, 1, 1, 0, 0, 0, 0, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 0, 0, 0, 0, 0, 34, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, - 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 0, 0, 0, 0, - 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 0, - 105, 105, 105, 105, 105, 0, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, - 105, 105, 0, 0, 105, 105, 105, 105, 1, 1, 1, 1, 1, 1, 1, 41, - 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 41, 41, 41, 41, - 41, 41, 41, 1, 1, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, - 1, 1, 41, 41, 41, 41, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, - 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, - 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, - 0, 0, 0, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, - 57, 0, 0, 57, 57, 57, 57, 57, 57, 57, 0, 57, 57, 0, 57, 57, - 57, 57, 57, 0, 0, 0, 0, 0, 151, 151, 151, 151, 151, 151, 151, 151, - 151, 151, 151, 151, 151, 0, 0, 0, 151, 151, 151, 151, 151, 151, 0, 0, - 151, 151, 0, 0, 0, 0, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152, - 152, 152, 0, 0, 0, 0, 0, 152, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 0, 0, 113, 113, 113, 113, 113, 113, 113, 113, 0, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 0, 0, 0, 0, - 132, 132, 0, 0, 0, 0, 132, 132, 1, 1, 1, 1, 1, 0, 0, 0, - 7, 7, 7, 7, 0, 7, 7, 7, 0, 7, 7, 0, 7, 0, 0, 7, - 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, - 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, - 0, 7, 0, 7, 0, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, - 0, 7, 7, 7, 7, 0, 7, 0, 7, 7, 0, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 0, 7, 7, 7, - 0, 0, 0, 0, 0, 0, 1, 1, 33, 1, 1, 0, 0, 0, 0, 0, - 1, 1, 1, 0, 0, 0, 1, 1, 36, 36, 36, 36, 36, 36, 36, 0, - 36, 36, 36, 36, 36, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, -}; + return (v >> offset) & 0x1; +} -/* Script: 13928 bytes. */ - -RE_UINT32 re_get_script(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_script_stage_1[f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_script_stage_2[pos + f] << 4; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_script_stage_3[pos + f] << 3; - value = re_script_stage_4[pos + code]; - - return value; +/* Any. */ +RE_UINT32 re_get_any(RE_UINT32 codepoint) { + return 1; } -/* Script_Extensions. */ +/* ASCII_Hex_Digit. */ +RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 codepoint) { + if (0x30 <= codepoint && codepoint <= 0x39) + return 1; + if (0x41 <= codepoint && codepoint <= 0x46) + return 1; + if (0x61 <= codepoint && codepoint <= 0x66) + return 1; + + return 0; +} -static RE_UINT8 re_script_extensions_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 9, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 14, 15, - 16, 17, 18, 19, 20, 14, 21, 14, 22, 14, 14, 14, 14, 23, 24, 24, - 25, 26, 14, 14, 14, 14, 27, 28, 14, 14, 29, 30, 31, 32, 33, 34, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 35, 7, 36, 37, 7, 38, 7, 7, 7, 39, 14, 40, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 41, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -}; - -static RE_UINT8 re_script_extensions_stage_2[] = { - 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, - 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, - 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 80, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 81, - 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 84, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 97, - 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 70, 70, 99, 100, 101, 102, 103, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 98, 114, 115, 116, 117, 118, 119, 98, 120, 120, 121, 98, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 98, 133, 98, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 98, 143, 144, 98, 145, 146, 147, 148, 98, - 149, 150, 98, 151, 152, 153, 98, 98, 154, 155, 156, 157, 98, 158, 98, 159, - 160, 160, 160, 160, 160, 160, 160, 161, 162, 160, 163, 98, 98, 98, 98, 98, - 164, 164, 164, 164, 164, 164, 164, 164, 165, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 98, 166, 166, 166, 166, 167, 98, 98, 98, - 168, 168, 168, 168, 169, 170, 171, 172, 98, 98, 98, 98, 173, 174, 175, 176, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 178, - 177, 177, 177, 177, 177, 179, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 180, 181, 182, 183, 183, 184, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 98, 185, 186, 98, 98, 98, 98, 98, 98, - 59, 187, 188, 189, 190, 191, 192, 98, 193, 194, 195, 59, 59, 196, 59, 197, - 198, 198, 198, 198, 198, 199, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 200, 98, 201, 98, 98, 202, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 203, 204, 205, 98, 98, 98, 98, 98, 206, 207, 208, 98, 209, 210, 98, 98, - 211, 212, 213, 214, 215, 98, 59, 59, 59, 59, 59, 59, 59, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 225, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 226, 70, - 227, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 228, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 229, 98, 98, 98, 98, 98, 98, 98, 98, - 70, 70, 70, 70, 230, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 231, 98, 232, 233, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, -}; - -static RE_UINT16 re_script_extensions_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, - 0, 0, 0, 0, 0, 4, 0, 4, 2, 2, 5, 2, 2, 2, 5, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 7, 8, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 10, 9, 9, 9, 11, 2, 12, 13, - 14, 15, 16, 16, 17, 16, 16, 16, 16, 16, 16, 16, 18, 19, 16, 16, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 22, 23, 23, 23, 24, 22, 23, 23, 23, 23, - 23, 25, 26, 27, 27, 27, 27, 27, 27, 28, 27, 27, 27, 29, 30, 28, - 31, 32, 33, 34, 33, 33, 33, 33, 35, 36, 37, 33, 38, 39, 40, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 41, 31, 33, 33, 33, 33, - 42, 43, 42, 42, 42, 42, 42, 42, 42, 44, 33, 33, 33, 33, 33, 33, - 45, 45, 45, 45, 45, 45, 46, 28, 47, 47, 47, 47, 47, 47, 47, 48, - 49, 49, 49, 49, 49, 50, 49, 51, 52, 52, 52, 53, 42, 54, 28, 28, - 28, 28, 28, 28, 33, 33, 55, 56, 28, 28, 57, 33, 58, 33, 33, 33, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 59, 61, 62, 59, 59, - 63, 64, 65, 66, 66, 67, 68, 69, 64, 70, 71, 72, 73, 74, 66, 75, - 76, 77, 78, 79, 79, 80, 81, 82, 77, 83, 84, 85, 86, 87, 88, 28, - 89, 90, 91, 92, 92, 93, 94, 95, 90, 96, 97, 28, 98, 99, 100, 101, - 102, 103, 104, 105, 105, 106, 107, 108, 103, 109, 110, 111, 112, 105, 105, 28, - 113, 114, 115, 116, 117, 114, 118, 119, 114, 115, 120, 28, 121, 122, 123, 124, - 125, 126, 127, 125, 125, 127, 125, 128, 126, 129, 130, 131, 132, 125, 133, 125, - 134, 135, 136, 134, 134, 136, 137, 138, 135, 139, 140, 141, 142, 143, 144, 28, - 145, 146, 147, 148, 148, 148, 148, 148, 146, 147, 149, 148, 150, 148, 148, 148, - 151, 152, 153, 154, 152, 152, 155, 156, 153, 157, 158, 152, 159, 152, 160, 28, - 161, 162, 162, 162, 162, 162, 162, 163, 162, 162, 162, 164, 28, 28, 28, 28, - 165, 166, 167, 167, 168, 167, 167, 169, 170, 169, 167, 171, 28, 28, 28, 28, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 172, 172, 172, 174, 173, 172, - 172, 172, 172, 173, 172, 172, 172, 175, 172, 175, 176, 177, 28, 28, 28, 28, - 178, 178, 178, 178, 178, 178, 178, 178, 179, 180, 178, 178, 178, 178, 178, 178, - 178, 178, 178, 178, 181, 181, 181, 181, 182, 183, 181, 181, 181, 181, 181, 184, - 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 186, 186, 186, 186, 186, 186, 186, 186, 186, 187, 188, 187, 186, 186, 186, 186, - 186, 187, 186, 186, 186, 186, 187, 188, 187, 186, 188, 186, 186, 186, 186, 186, - 186, 186, 187, 186, 186, 186, 186, 186, 186, 186, 186, 189, 186, 186, 186, 190, - 186, 186, 186, 191, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, - 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, - 195, 195, 195, 196, 197, 197, 197, 197, 197, 197, 197, 197, 197, 198, 197, 199, - 200, 201, 202, 28, 203, 203, 204, 28, 205, 205, 206, 28, 207, 208, 209, 28, - 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 211, 210, 212, 210, 212, - 213, 214, 215, 216, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 217, - 215, 215, 215, 215, 215, 218, 194, 194, 194, 194, 194, 194, 194, 194, 219, 28, - 220, 220, 220, 221, 220, 222, 220, 222, 223, 220, 224, 224, 224, 225, 226, 28, - 227, 227, 227, 227, 227, 228, 227, 227, 227, 229, 227, 230, 210, 210, 210, 210, - 231, 231, 231, 232, 233, 233, 233, 233, 233, 233, 233, 234, 233, 233, 233, 235, - 233, 236, 233, 236, 233, 237, 9, 238, 28, 28, 28, 28, 28, 28, 28, 28, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 240, 239, 239, 239, 239, 239, 241, - 242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 243, 243, 243, 244, 245, - 246, 246, 246, 246, 246, 246, 246, 247, 246, 248, 249, 249, 249, 249, 249, 249, - 20, 250, 181, 181, 181, 181, 181, 251, 242, 28, 252, 253, 254, 255, 256, 257, - 2, 2, 2, 2, 258, 259, 2, 2, 2, 2, 2, 260, 261, 262, 2, 263, - 2, 2, 2, 2, 2, 2, 2, 264, 265, 9, 9, 9, 9, 9, 9, 266, - 16, 16, 267, 267, 16, 16, 16, 16, 267, 267, 16, 268, 16, 16, 16, 267, - 16, 16, 16, 16, 16, 16, 269, 16, 269, 16, 270, 271, 16, 16, 272, 273, - 0, 274, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 276, 0, 277, 278, - 0, 279, 2, 280, 0, 0, 0, 0, 28, 28, 9, 9, 9, 9, 281, 28, - 0, 0, 0, 0, 282, 283, 4, 0, 0, 284, 0, 0, 2, 2, 2, 2, - 2, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 279, 28, 28, 28, 0, 286, 28, 28, 0, 0, 0, 0, - 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, - 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 290, 290, 290, 290, 290, 291, 290, 290, 290, 290, 290, 291, 2, 2, 2, 2, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 292, 293, - 181, 181, 181, 181, 182, 183, 294, 294, 294, 294, 294, 294, 294, 295, 296, 295, - 186, 186, 188, 28, 188, 188, 188, 188, 188, 188, 188, 188, 20, 20, 20, 20, - 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, 28, 28, 28, 28, 28, 28, - 298, 298, 298, 299, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 300, 28, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 301, 28, 28, 28, 0, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 312, 312, 312, 312, 312, 312, - 312, 312, 313, 314, 315, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 317, - 318, 319, 319, 319, 319, 319, 320, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 321, 298, 298, 319, 319, 319, 322, 298, 298, 298, 298, 300, 28, 316, 316, - 185, 185, 185, 321, 298, 298, 298, 298, 298, 0, 0, 0, 185, 185, 185, 323, - 298, 298, 298, 298, 298, 298, 324, 0, 298, 325, 316, 316, 316, 316, 316, 326, - 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 298, 298, 298, 324, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 298, 298, 328, - 298, 298, 298, 298, 298, 298, 301, 28, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 28, 28, - 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, - 329, 330, 329, 329, 329, 329, 329, 329, 331, 28, 332, 332, 332, 332, 332, 332, - 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, - 333, 333, 333, 333, 333, 334, 28, 28, 20, 20, 20, 20, 20, 335, 20, 20, - 20, 20, 20, 20, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 28, - 0, 0, 0, 0, 337, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 338, 2, 2, 2, 2, 2, 2, 339, 28, 28, 28, 28, 28, 340, 2, - 341, 341, 341, 341, 341, 342, 343, 344, 345, 345, 345, 345, 345, 345, 345, 28, - 346, 346, 346, 346, 346, 346, 346, 346, 347, 348, 346, 349, 59, 59, 350, 59, - 351, 351, 351, 351, 351, 352, 353, 353, 353, 353, 354, 355, 185, 185, 185, 356, - 357, 357, 357, 357, 357, 357, 357, 357, 357, 358, 357, 359, 178, 178, 178, 360, - 361, 361, 361, 361, 361, 361, 362, 28, 361, 363, 361, 364, 178, 178, 178, 178, - 365, 365, 365, 365, 365, 365, 365, 365, 366, 28, 28, 367, 368, 368, 369, 28, - 370, 370, 370, 28, 188, 188, 2, 2, 2, 2, 2, 371, 372, 28, 192, 192, - 192, 192, 192, 192, 192, 192, 192, 192, 368, 368, 368, 368, 368, 373, 368, 374, - 185, 185, 185, 185, 375, 28, 185, 185, 321, 376, 185, 185, 185, 185, 185, 375, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 301, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 377, 28, 28, 28, 28, - 378, 28, 379, 380, 27, 27, 381, 382, 383, 27, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 384, 28, 57, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 385, 28, 28, 33, 33, 33, 33, 33, 33, - 33, 33, 386, 33, 33, 33, 33, 33, 33, 28, 28, 28, 28, 28, 387, 388, - 9, 9, 0, 389, 9, 390, 0, 0, 391, 0, 392, 0, 279, 302, 55, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 393, - 394, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, 395, 316, 315, 316, - 316, 316, 316, 396, 185, 185, 185, 321, 397, 397, 397, 398, 279, 279, 28, 399, - 400, 401, 400, 400, 402, 400, 400, 403, 400, 404, 400, 404, 28, 28, 28, 28, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 405, - 406, 407, 407, 407, 407, 407, 408, 409, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 273, 0, 302, 410, 28, 28, 28, 28, 28, 0, 0, 0, 0, 0, 411, - 412, 412, 412, 413, 414, 414, 414, 414, 414, 414, 415, 28, 416, 416, 416, 417, - 418, 418, 418, 418, 419, 420, 421, 421, 421, 422, 423, 423, 423, 423, 423, 424, - 425, 425, 425, 426, 427, 427, 427, 427, 428, 427, 429, 28, 28, 28, 28, 28, - 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 431, 431, 431, 431, 431, 431, - 432, 432, 432, 433, 432, 434, 435, 435, 435, 435, 436, 435, 435, 435, 435, 436, - 437, 437, 437, 437, 437, 28, 438, 438, 438, 438, 438, 438, 439, 440, 28, 28, - 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, - 441, 441, 441, 441, 441, 441, 442, 28, 441, 441, 443, 28, 441, 28, 28, 28, - 444, 445, 446, 446, 446, 446, 447, 448, 449, 449, 450, 449, 451, 451, 451, 451, - 452, 452, 452, 453, 454, 452, 28, 28, 28, 28, 28, 28, 455, 455, 456, 457, - 458, 458, 458, 459, 460, 460, 460, 461, 28, 28, 28, 28, 28, 28, 28, 28, - 462, 462, 462, 462, 463, 463, 463, 464, 463, 463, 465, 463, 463, 463, 463, 463, - 466, 467, 468, 469, 470, 470, 471, 472, 470, 473, 470, 473, 474, 474, 474, 474, - 475, 475, 475, 475, 28, 28, 28, 28, 476, 476, 476, 476, 477, 478, 477, 28, - 479, 479, 479, 479, 479, 479, 480, 481, 482, 482, 483, 482, 484, 484, 485, 484, - 486, 486, 487, 488, 28, 489, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 490, 490, 490, 490, 490, 490, 490, 490, 490, 491, 28, 28, 28, 28, 28, 28, - 492, 492, 492, 492, 492, 492, 493, 28, 492, 492, 492, 492, 492, 492, 493, 494, - 495, 495, 495, 495, 495, 28, 495, 496, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 33, 33, 33, 497, - 498, 498, 498, 498, 498, 28, 499, 499, 499, 499, 499, 500, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 501, 501, 502, 28, - 503, 503, 503, 503, 503, 503, 503, 503, 503, 504, 505, 503, 503, 503, 28, 506, - 507, 507, 507, 507, 507, 507, 507, 507, 508, 509, 510, 510, 510, 511, 510, 512, - 513, 513, 513, 513, 513, 513, 514, 513, 515, 28, 516, 516, 516, 516, 517, 28, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 519, 518, 518, 520, 152, 521, 28, - 522, 522, 523, 522, 522, 522, 522, 524, 28, 28, 28, 28, 28, 28, 28, 28, - 525, 526, 527, 528, 527, 529, 530, 530, 530, 530, 530, 530, 530, 531, 530, 532, - 533, 534, 535, 536, 536, 537, 538, 539, 534, 540, 541, 542, 543, 544, 544, 28, - 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 546, 28, 28, 28, 28, - 547, 547, 547, 547, 547, 547, 547, 547, 547, 28, 547, 548, 28, 28, 28, 28, - 549, 549, 549, 549, 549, 549, 550, 549, 549, 549, 549, 550, 28, 28, 28, 28, - 551, 551, 551, 551, 551, 551, 551, 551, 552, 28, 551, 553, 215, 554, 28, 28, - 555, 555, 555, 555, 555, 555, 555, 556, 555, 557, 28, 28, 28, 28, 28, 28, - 558, 558, 558, 559, 558, 560, 558, 558, 28, 28, 28, 28, 28, 28, 28, 28, - 561, 561, 561, 561, 561, 561, 561, 562, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 564, 565, - 28, 28, 28, 28, 566, 567, 566, 566, 566, 566, 566, 567, 568, 28, 28, 28, - 569, 569, 569, 569, 569, 569, 569, 569, 569, 28, 570, 570, 570, 570, 570, 570, - 570, 570, 570, 570, 571, 28, 28, 28, 572, 572, 572, 572, 572, 572, 572, 573, - 574, 575, 574, 574, 574, 574, 576, 574, 577, 28, 574, 574, 574, 578, 579, 579, - 579, 579, 580, 579, 579, 581, 582, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 583, 584, 585, 585, 585, 585, 583, 586, 585, 28, 585, 587, 588, 589, 590, 590, - 590, 591, 592, 593, 590, 594, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 595, 595, 595, 596, - 28, 28, 28, 28, 28, 28, 28, 28, 118, 118, 597, 118, 118, 118, 598, 599, - 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, - 600, 600, 600, 601, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 602, 603, 28, - 600, 600, 600, 600, 600, 600, 600, 600, 604, 28, 28, 28, 28, 28, 28, 28, - 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, - 605, 605, 605, 605, 605, 606, 605, 607, 28, 28, 28, 28, 28, 28, 28, 28, - 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, - 608, 608, 608, 608, 608, 608, 608, 608, 609, 28, 28, 28, 28, 28, 28, 28, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 610, 611, 611, 611, 612, 611, 613, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 614, 614, 614, 615, 615, 28, - 616, 616, 616, 616, 616, 616, 616, 616, 617, 28, 616, 618, 618, 616, 616, 619, - 616, 616, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 621, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 622, 622, 622, 622, 622, 622, 622, 622, 622, 623, 622, 622, 622, 622, 622, 622, - 622, 624, 622, 622, 28, 28, 28, 28, 28, 28, 28, 28, 625, 28, 28, 28, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 28, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 627, 28, - 628, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, - 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, - 312, 312, 312, 313, 28, 28, 28, 28, 28, 28, 629, 28, 630, 28, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632, - 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 634, 633, 635, - 633, 636, 633, 637, 638, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 28, - 0, 0, 0, 0, 279, 394, 0, 0, 0, 0, 0, 0, 639, 640, 0, 641, - 642, 643, 0, 0, 0, 644, 0, 0, 0, 0, 0, 0, 0, 645, 28, 28, - 16, 16, 16, 16, 16, 16, 16, 16, 267, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 302, 28, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, 28, 298, 298, 646, 645, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 276, 647, 648, 0, 649, 650, 0, 0, 0, 0, 0, 0, 0, - 651, 652, 276, 276, 0, 0, 0, 653, 654, 655, 656, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, - 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, - 657, 658, 28, 659, 660, 657, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 291, 290, 290, 661, 662, 663, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 664, 664, 664, 664, 664, 665, 664, 666, 664, 667, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 668, 668, 668, 668, 668, 668, 668, 669, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 671, 670, 672, 28, 28, 28, 28, 28, - 673, 673, 673, 673, 673, 673, 673, 673, 673, 674, 673, 675, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 394, 0, - 0, 0, 0, 0, 0, 0, 676, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 394, 0, 0, 0, 0, 0, 0, 289, 28, 28, 28, 28, 28, 28, 28, 28, - 677, 33, 33, 33, 678, 679, 680, 681, 682, 683, 678, 684, 678, 680, 680, 685, - 33, 686, 33, 687, 688, 686, 33, 687, 28, 28, 28, 28, 28, 28, 384, 28, - 0, 0, 0, 0, 0, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 302, 28, 0, 279, 394, 0, 394, 0, 394, 0, 0, 0, 289, 28, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 676, 0, 0, - 0, 0, 0, 0, 0, 676, 28, 28, 28, 28, 28, 28, 689, 0, 0, 0, - 690, 28, 0, 0, 0, 0, 0, 302, 0, 645, 377, 28, 289, 28, 28, 28, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 28, 0, 676, 0, 286, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302, 28, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 645, 0, 302, 28, 28, - 0, 302, 0, 0, 0, 0, 0, 0, 0, 28, 0, 389, 0, 0, 0, 0, - 0, 28, 0, 0, 0, 289, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 0, 650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 653, 655, - 0, 0, 0, 0, 652, 691, 0, 0, 0, 652, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302, 28, 0, 289, 302, 286, - 286, 28, 289, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 692, 28, 28, 28, 28, 28, - 298, 298, 298, 298, 298, 298, 693, 28, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 301, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 298, 377, 28, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 694, 28, 28, 28, - 298, 298, 298, 301, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 695, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 28, 28, -}; - -static RE_UINT8 re_script_extensions_stage_4[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, - 1, 1, 35, 35, 1, 1, 1, 1, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 3, 41, 41, 3, 41, 41, 41, 41, 41, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 1, 3, 3, 3, 0, 0, 3, 3, 3, 3, 1, 3, - 0, 0, 0, 0, 3, 1, 3, 1, 3, 3, 3, 0, 3, 0, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, - 3, 3, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 164, 162, 163, 163, 162, - 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 5, 157, 5, 0, 0, 5, 5, 5, - 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 0, 0, 0, 6, - 6, 6, 6, 6, 6, 0, 0, 0, 7, 7, 7, 7, 7, 1, 7, 7, - 7, 7, 7, 7, 185, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 185, 177, 0, 7, 185, 192, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 7, 7, - 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 7, 7, 7, 7, 7, 7, - 155, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 154, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, - 8, 8, 8, 0, 0, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 0, 0, 66, 66, 66, 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 0, 0, 82, 82, 82, 82, 82, 82, 82, 0, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 95, 0, - 8, 8, 8, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 7, 7, - 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, - 7, 7, 1, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 196, 195, 41, 41, 10, 10, 10, 10, 10, 10, 10, 199, 200, 188, 188, - 188, 188, 188, 188, 188, 188, 188, 188, 11, 11, 11, 11, 0, 11, 11, 11, - 11, 11, 11, 11, 11, 0, 0, 11, 11, 0, 0, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, - 11, 0, 11, 0, 0, 0, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, - 11, 0, 0, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 11, - 0, 0, 0, 0, 11, 11, 0, 11, 11, 11, 11, 11, 0, 0, 178, 178, - 178, 178, 178, 178, 178, 178, 178, 178, 11, 11, 11, 11, 11, 11, 11, 0, - 0, 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 12, - 12, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 0, 12, 12, 12, 12, 12, 12, 12, 0, 12, 12, 0, 12, 12, 0, - 12, 12, 0, 0, 12, 0, 12, 12, 12, 0, 0, 12, 12, 12, 0, 0, - 0, 12, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 0, 12, 0, - 0, 0, 0, 0, 0, 0, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 12, 12, 12, 12, 12, 12, 12, 0, 0, 13, 13, 13, 0, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, - 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, - 13, 13, 0, 13, 13, 13, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, - 13, 13, 13, 13, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 13, 13, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, - 0, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, - 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 0, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 0, 14, 14, 14, - 14, 14, 0, 0, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 0, 0, - 0, 0, 0, 0, 0, 0, 14, 14, 0, 0, 0, 0, 14, 14, 0, 14, - 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 15, 15, 0, 15, 15, 15, - 15, 15, 15, 0, 0, 0, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, - 0, 15, 15, 0, 15, 0, 15, 15, 0, 0, 0, 15, 15, 0, 0, 0, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, - 15, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 15, 15, 15, 15, - 15, 15, 15, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 0, 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, - 16, 16, 0, 0, 0, 16, 16, 16, 16, 0, 16, 16, 16, 16, 0, 0, - 0, 0, 0, 0, 0, 16, 16, 0, 16, 16, 16, 0, 0, 0, 0, 0, - 16, 16, 16, 16, 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 16, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, - 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, - 17, 17, 0, 0, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, 0, 0, - 0, 0, 0, 0, 0, 17, 17, 0, 0, 0, 0, 0, 0, 0, 17, 0, - 17, 17, 17, 17, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 0, 17, 17, 0, 0, 0, 0, 0, 18, 18, 18, 18, 0, 18, 18, 18, - 18, 18, 18, 18, 18, 0, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 18, 18, 18, 18, - 18, 18, 18, 18, 0, 0, 18, 18, 0, 0, 19, 19, 0, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, - 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 19, 0, 0, 0, 0, 19, - 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, - 0, 0, 19, 19, 19, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 1, - 20, 20, 20, 20, 0, 0, 0, 0, 0, 21, 21, 0, 21, 0, 21, 21, - 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 0, 21, 0, 21, 21, 21, 21, 21, 21, 21, 0, 0, - 21, 21, 21, 21, 21, 0, 21, 0, 21, 21, 0, 0, 21, 21, 21, 21, - 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 0, 0, 0, 22, 22, 22, 22, 22, 0, 22, 22, - 22, 22, 22, 22, 22, 1, 1, 1, 1, 22, 22, 0, 0, 0, 0, 0, - 23, 23, 23, 23, 23, 23, 23, 23, 179, 179, 179, 179, 179, 179, 179, 179, - 179, 179, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 0, 24, 0, 0, 0, 0, 0, 24, 0, 0, - 24, 24, 24, 169, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 0, 0, - 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 0, 0, 26, 26, 26, - 26, 26, 26, 26, 26, 0, 0, 0, 26, 26, 0, 0, 0, 0, 0, 0, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, - 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 0, 0, 0, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 1, 1, 1, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, - 42, 42, 42, 42, 42, 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 187, 187, 0, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 0, 45, 45, 45, 0, 45, 45, 0, 0, 0, 0, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, - 31, 31, 0, 0, 0, 0, 0, 0, 32, 32, 176, 176, 32, 176, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, 0, 0, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, - 46, 46, 46, 46, 0, 0, 0, 0, 46, 0, 0, 0, 46, 46, 46, 46, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, - 47, 47, 47, 47, 47, 0, 0, 0, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 0, 0, 0, 0, 56, 56, 0, 0, 0, 0, 0, 0, - 56, 56, 56, 0, 0, 0, 56, 56, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 0, 0, 54, 54, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 0, 78, 78, 78, 78, 78, 0, 0, 78, - 78, 78, 0, 0, 0, 0, 0, 0, 78, 78, 78, 78, 78, 78, 0, 0, - 41, 41, 41, 41, 41, 41, 41, 0, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 0, 0, 0, 0, 62, 62, 62, 62, 62, 0, 0, 0, - 67, 67, 67, 67, 67, 67, 67, 67, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, 93, 93, - 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 68, 68, 68, 68, 68, - 68, 68, 0, 0, 0, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, - 4, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 0, 0, 24, 24, 24, - 186, 10, 186, 165, 10, 158, 158, 167, 158, 167, 191, 10, 167, 167, 10, 10, - 167, 158, 10, 10, 10, 10, 10, 10, 10, 166, 158, 10, 10, 158, 10, 10, - 10, 10, 193, 165, 181, 158, 158, 11, 165, 165, 150, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, - 3, 3, 3, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 41, 41, 41, 41, 41, 41, - 41, 41, 0, 41, 41, 41, 41, 41, 3, 3, 3, 3, 3, 3, 0, 0, - 0, 3, 0, 3, 0, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, - 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, - 0, 0, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, - 1, 1, 1, 1, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 175, - 1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 0, - 2, 2, 2, 2, 2, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 2, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 0, 0, 0, 0, - 1, 1, 1, 0, 0, 0, 0, 0, 53, 53, 53, 53, 53, 53, 53, 53, - 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, - 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, - 58, 58, 58, 58, 58, 58, 58, 58, 0, 0, 0, 0, 0, 0, 0, 58, - 58, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 162, 1, 1, 1, 1, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 0, 0, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 190, 190, 189, 1, 36, 36, 36, - 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 1, 189, 190, 190, 190, 190, - 190, 190, 190, 190, 189, 189, 189, 189, 1, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 159, 159, 159, 159, 25, 25, 189, 173, 173, 173, 173, 173, 1, 189, - 36, 36, 36, 36, 183, 183, 36, 36, 0, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, - 0, 173, 173, 173, 173, 33, 33, 33, 173, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 190, 173, 34, 34, 34, - 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, - 35, 35, 35, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 1, - 36, 1, 1, 1, 1, 1, 1, 1, 36, 36, 36, 36, 1, 1, 1, 1, - 34, 34, 34, 34, 34, 34, 34, 36, 1, 1, 1, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 1, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 0, - 83, 83, 83, 83, 83, 83, 83, 83, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 162, - 84, 84, 84, 84, 84, 84, 84, 84, 1, 1, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 0, 0, 0, 0, 198, 198, 198, 197, 197, 197, 194, 194, - 194, 194, 0, 0, 0, 0, 0, 0, 65, 65, 65, 65, 65, 65, 65, 65, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, - 0, 0, 0, 0, 0, 0, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, - 10, 158, 10, 168, 10, 10, 10, 10, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 184, 72, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, - 25, 25, 25, 25, 25, 0, 0, 0, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 0, 160, 85, 85, 0, 0, 0, 0, 85, 85, - 23, 23, 23, 23, 23, 23, 23, 0, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 0, 77, 77, 77, 77, 77, 77, 0, 0, - 77, 77, 0, 0, 77, 77, 77, 77, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, 79, 79, 79, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 0, - 0, 26, 26, 26, 26, 26, 26, 0, 2, 2, 2, 1, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 2, 2, 86, 86, 86, 86, 86, 86, 0, 0, - 86, 86, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 0, 0, 0, 0, - 0, 0, 0, 25, 25, 25, 25, 25, 36, 36, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 5, 5, 5, 5, 5, - 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, - 6, 6, 6, 6, 6, 0, 6, 0, 6, 6, 0, 6, 6, 0, 6, 6, - 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 1, 1, - 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 156, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 156, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, - 41, 41, 41, 41, 41, 41, 4, 4, 1, 1, 1, 1, 1, 189, 189, 1, - 1, 1, 1, 0, 1, 1, 1, 1, 7, 7, 7, 7, 7, 0, 0, 1, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 190, 190, 190, 190, 190, 34, 34, - 34, 34, 34, 34, 34, 34, 173, 173, 0, 0, 25, 25, 25, 25, 25, 25, - 0, 0, 25, 25, 25, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48, 0, 48, - 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 0, 0, 0, 0, 0, - 161, 161, 161, 0, 0, 0, 0, 180, 180, 180, 180, 180, 180, 180, 180, 180, - 180, 180, 180, 180, 0, 0, 0, 161, 161, 161, 161, 161, 161, 161, 161, 161, - 3, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 41, 0, 0, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 0, 0, 0, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 0, 0, 0, 0, 0, 0, 0, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, 0, 0, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 0, 0, 0, 0, 0, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 0, 49, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 0, 0, 0, 0, 60, 60, 60, 60, 60, 60, 0, 0, - 40, 40, 40, 40, 40, 40, 40, 40, 50, 50, 50, 50, 50, 50, 50, 50, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, - 51, 51, 0, 0, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 0, 0, 0, 0, 106, 106, 106, 106, 106, 106, 106, 106, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 103, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 110, 0, 110, 110, 110, 110, 110, 110, 0, 0, - 52, 52, 52, 52, 52, 52, 0, 0, 52, 0, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 0, 52, - 52, 0, 0, 0, 52, 0, 0, 52, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 0, 87, 118, 118, 118, 118, 118, 118, 118, 118, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 128, 128, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 64, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 76, - 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, - 0, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, - 61, 61, 61, 61, 0, 61, 61, 0, 0, 0, 0, 0, 61, 61, 61, 61, - 61, 61, 61, 61, 0, 61, 61, 61, 0, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 0, 0, - 61, 61, 61, 0, 0, 0, 0, 61, 61, 0, 0, 0, 0, 0, 0, 0, - 88, 88, 88, 88, 88, 88, 88, 88, 116, 116, 116, 116, 116, 116, 116, 116, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 0, - 0, 0, 0, 112, 112, 112, 112, 112, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, - 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 0, 0, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, 0, 0, 0, 0, - 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 0, 0, 0, 0, 0, 0, - 0, 121, 121, 121, 121, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, - 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 0, 0, 0, 0, 0, 0, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, - 0, 0, 130, 130, 130, 130, 130, 130, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, - 148, 148, 148, 148, 148, 148, 148, 148, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 0, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 0, 0, 0, 0, 94, 94, 94, 94, 94, 94, - 0, 0, 0, 0, 0, 0, 0, 94, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 0, 0, 0, 0, 0, 0, 0, - 101, 101, 0, 0, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, - 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, 0, - 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 0, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 0, 129, 129, 129, 129, 129, 129, 129, 0, - 129, 0, 129, 129, 129, 129, 0, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 129, 129, 129, 129, 129, 129, 0, 129, 129, 129, 0, 0, 0, 0, 0, 0, - 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, - 123, 123, 0, 0, 0, 0, 0, 0, 107, 170, 107, 170, 0, 107, 107, 107, - 107, 107, 107, 107, 107, 0, 0, 107, 107, 0, 0, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 107, 107, 107, 107, - 107, 0, 107, 107, 0, 107, 107, 107, 107, 107, 0, 170, 170, 107, 107, 107, - 107, 0, 0, 107, 107, 107, 0, 0, 107, 0, 0, 0, 0, 0, 0, 107, - 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 0, 0, 107, 107, - 107, 107, 107, 107, 107, 0, 0, 0, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 0, 135, 0, 135, 135, 135, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 122, 122, 122, 122, - 122, 122, 122, 122, 122, 122, 0, 0, 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 0, 0, 0, 114, 114, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 32, 32, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 0, 0, 0, 0, 0, 0, 0, 102, 102, 0, 0, 0, 0, 0, 0, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 126, 126, 126, - 126, 126, 126, 126, 0, 0, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 0, 0, 0, 0, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, - 150, 150, 150, 150, 150, 150, 150, 150, 0, 0, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 0, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 0, 0, 0, 0, 0, 0, 0, - 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, - 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, 0, 0, - 133, 133, 133, 133, 133, 0, 0, 0, 134, 134, 134, 134, 134, 134, 134, 134, - 0, 0, 134, 134, 134, 134, 134, 134, 0, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 0, 138, 138, 138, 138, 138, 138, 138, 0, - 138, 138, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 0, 0, 138, 0, 138, 138, 0, 138, 138, 138, 0, 0, 0, 0, 0, 0, - 143, 143, 143, 143, 143, 143, 0, 143, 143, 0, 143, 143, 143, 143, 143, 143, - 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, - 143, 143, 0, 143, 143, 143, 143, 143, 143, 0, 0, 0, 0, 0, 0, 0, - 143, 143, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 0, 0, 0, 0, 0, 0, 0, 170, 170, 15, 170, 15, 15, 15, 15, - 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, - 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 0, 0, - 63, 63, 63, 63, 63, 63, 63, 0, 63, 63, 63, 63, 63, 0, 0, 0, - 63, 63, 63, 63, 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 0, 81, 0, 0, 0, 0, 0, 0, 0, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, - 84, 0, 0, 0, 0, 0, 0, 0, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 0, 115, 115, 0, 0, 0, 0, 115, 115, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, - 108, 108, 0, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 108, 108, 108, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 0, 0, 0, 0, 99, - 0, 0, 0, 0, 0, 0, 0, 99, 137, 139, 1, 1, 0, 0, 0, 0, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 0, 0, - 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34, 34, 34, 34, 139, 139, 139, 139, 139, 139, 139, 139, - 139, 139, 139, 139, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, 105, 105, - 105, 105, 105, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 0, 0, 0, - 105, 0, 0, 0, 0, 0, 0, 0, 105, 105, 0, 0, 105, 105, 105, 105, - 105, 105, 105, 105, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 41, - 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 41, 41, 41, 41, - 41, 41, 41, 1, 1, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, - 1, 1, 41, 41, 41, 41, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, - 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, - 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, - 0, 131, 131, 131, 131, 131, 131, 131, 57, 0, 0, 57, 57, 57, 57, 57, - 57, 57, 0, 57, 57, 0, 57, 57, 57, 57, 57, 0, 0, 0, 0, 0, - 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, - 151, 151, 151, 151, 151, 151, 0, 0, 151, 151, 0, 0, 0, 0, 151, 151, - 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 0, 0, 0, 0, 0, 152, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 0, 0, 113, - 113, 113, 113, 113, 113, 113, 113, 0, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 0, 0, 0, 0, 132, 132, 0, 0, 0, 0, 132, 132, - 1, 1, 1, 1, 1, 0, 0, 0, 7, 7, 7, 7, 0, 7, 7, 7, - 0, 7, 7, 0, 7, 0, 0, 7, 0, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 0, 7, 7, 7, 7, 0, 7, 0, 7, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 0, 7, 0, 7, 0, 7, 0, 7, 7, 7, - 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 7, 7, 7, 0, 7, 0, - 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, - 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 1, 1, - 33, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, - 36, 36, 36, 36, 36, 36, 36, 0, 36, 36, 36, 36, 36, 0, 0, 0, - 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -}; - -/* Script_Extensions: 14272 bytes. */ - -static RE_ScriptExt re_scripts_extensions_table[] = { - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 5, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 54, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 4, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 4, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 15, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 13, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 12, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 17, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 11, 59, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 23, 47, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 48, 52, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 17, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 10, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 33, 34, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 23, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 8, 9, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 11, 17, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 42, 43, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 92, 111, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 25, 33, 34, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 25, 33, 34, 35, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 14, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 8, 95, 112, 121, 132, 146, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 11, 14, 16, 17, 107, 124, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 12, 13, 92, 102, 109, 111, 114, 123, 124, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 10, 11, 12, 13, 14, 15, 16, 17, 18, 107, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 10, 11, 12, 13, 14, 15, 16, 17, 18, 100, 107, 124, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 12, 13, 17, 92, 102, 109, 111, 114, 123, 124, 142, 150, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 12, 13, 17, 18, 92, 102, 109, 111, 114, 123, 124, 142, 150, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 59, 102, 107, 111, 123, 124, 138, 142, 143, 150, 0}}, - {{ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 46, 59, 102, 107, 111, 123, 124, 138, 142, 143, 150}} -}; - -int re_get_script_extensions(RE_UINT32 ch, RE_UINT8* scripts) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - RE_UINT8* scr; - int count; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_script_extensions_stage_1[f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_script_extensions_stage_2[pos + f] << 4; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_script_extensions_stage_3[pos + f] << 3; - value = re_script_extensions_stage_4[pos + code]; - - scr = re_scripts_extensions_table[value].scripts; - scripts[0] = scr[0]; - count = 1; - - if (scr[0] != 0) { - while (count < RE_MAX_SCX && scr[count] != 0) { - scripts[count] = scr[count]; - ++count; - } - } - - return count; -} - -/* Word_Break. */ - -static RE_UINT8 re_word_break_stage_1[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 6, 7, 4, 8, - 9, 10, 11, 12, 13, 4, 14, 4, 4, 4, 4, 15, 4, 16, 17, 18, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 19, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static RE_UINT8 re_word_break_stage_2[] = { - 0, 1, 2, 2, 2, 3, 4, 5, 2, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 2, 2, 31, 32, 33, 34, 35, 2, 2, 2, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 2, 50, 2, 2, 51, 52, - 53, 54, 55, 56, 57, 57, 57, 57, 57, 58, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 59, 60, 61, 62, 63, 57, 57, 57, - 64, 65, 66, 67, 57, 68, 69, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 70, 2, 2, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 83, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 84, 85, 2, 2, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 57, 96, 97, 98, 2, 99, 100, 57, 2, 2, 101, 57, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 57, 57, 57, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 57, 122, 123, 57, 124, 125, 126, 127, 57, - 128, 129, 57, 130, 131, 132, 57, 57, 133, 134, 135, 136, 57, 137, 57, 57, - 2, 2, 2, 2, 2, 2, 2, 138, 139, 2, 140, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 2, 2, 2, 2, 2, 2, 2, 2, 141, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 142, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 2, 2, 2, 2, 143, 144, 145, 146, 57, 57, 57, 57, 147, 57, 148, 149, - 150, 57, 151, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 152, 153, 57, 57, 57, 57, 57, 57, - 57, 57, 154, 155, 156, 57, 57, 57, 157, 158, 159, 2, 2, 160, 161, 162, - 57, 57, 57, 57, 163, 164, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 165, 57, 166, 57, 57, 167, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 2, 168, 169, 57, 57, 57, 57, 57, 57, 57, 57, 57, 170, 171, 57, 57, - 57, 57, 172, 173, 57, 57, 57, 174, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 175, 57, 176, 177, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, -}; - -static RE_UINT8 re_word_break_stage_3[] = { - 0, 0, 1, 2, 0, 0, 0, 0, 3, 4, 0, 5, 6, 6, 7, 0, - 8, 9, 9, 9, 9, 9, 10, 11, 8, 9, 9, 9, 9, 9, 10, 0, - 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 0, 15, 13, 0, - 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 10, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 16, 9, 17, 0, 9, 9, 9, 9, 9, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 9, 19, 16, 20, - 0, 21, 10, 19, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, - 23, 18, 24, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, - 9, 9, 9, 9, 9, 10, 25, 26, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 27, 0, 28, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 29, - 30, 29, 0, 0, 31, 31, 31, 31, 31, 31, 32, 33, 34, 35, 0, 0, - 36, 37, 0, 38, 18, 18, 39, 40, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 41, 18, 18, 18, 18, 18, 6, 6, 42, 43, 44, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 45, 18, 46, 18, 47, 48, 24, 6, 6, 49, 50, - 0, 0, 0, 51, 52, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, - 18, 18, 39, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 53, 18, 18, 54, 0, 0, 0, - 6, 6, 49, 9, 9, 9, 9, 9, 9, 9, 41, 18, 18, 55, 56, 57, - 9, 9, 9, 9, 9, 53, 58, 18, 18, 59, 59, 60, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 59, 0, 9, 9, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 19, 9, 55, - 0, 0, 0, 0, 61, 18, 18, 18, 62, 18, 18, 18, 18, 18, 18, 18, - 18, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 53, 63, - 18, 18, 18, 18, 59, 18, 9, 9, 53, 64, 6, 6, 8, 9, 9, 9, - 59, 8, 9, 50, 50, 9, 9, 9, 9, 9, 19, 9, 26, 16, 55, 63, - 18, 65, 65, 66, 0, 61, 0, 22, 53, 64, 6, 6, 55, 0, 0, 67, - 28, 8, 10, 68, 50, 9, 9, 9, 9, 9, 19, 9, 19, 69, 55, 48, - 39, 61, 65, 60, 57, 0, 8, 26, 0, 64, 6, 6, 24, 70, 0, 0, - 28, 8, 9, 22, 22, 9, 9, 9, 9, 9, 19, 9, 19, 8, 55, 63, - 18, 29, 29, 60, 17, 0, 0, 0, 53, 64, 6, 6, 0, 0, 45, 18, - 28, 8, 9, 50, 50, 9, 9, 9, 9, 9, 19, 9, 19, 8, 55, 63, - 18, 65, 65, 60, 0, 71, 0, 22, 53, 64, 6, 6, 72, 0, 0, 0, - 73, 8, 10, 16, 19, 55, 69, 19, 68, 17, 10, 16, 9, 9, 55, 71, - 39, 71, 48, 60, 17, 61, 0, 0, 0, 64, 6, 6, 0, 0, 0, 0, - 18, 44, 9, 19, 19, 9, 9, 9, 9, 9, 19, 9, 9, 9, 55, 45, - 18, 48, 48, 60, 0, 30, 10, 0, 53, 64, 6, 6, 0, 0, 0, 0, - 59, 8, 9, 19, 19, 9, 9, 9, 9, 9, 19, 9, 9, 8, 55, 63, - 18, 48, 48, 60, 0, 30, 0, 13, 53, 64, 6, 6, 69, 0, 0, 0, - 18, 8, 9, 19, 19, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 63, - 18, 48, 48, 66, 0, 41, 0, 68, 53, 64, 6, 6, 0, 0, 16, 9, - 71, 8, 9, 9, 9, 10, 16, 9, 9, 9, 9, 9, 22, 9, 9, 72, - 9, 10, 74, 61, 18, 75, 18, 18, 0, 64, 6, 6, 71, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 18, 39, 0, - 0, 61, 18, 39, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 18, 18, 77, - 0, 0, 18, 60, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 60, 0, 6, 6, 76, 0, 0, 78, 57, 71, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 17, 28, 18, 18, 18, - 18, 48, 9, 59, 18, 18, 28, 18, 18, 18, 18, 18, 18, 18, 18, 77, - 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 18, 18, 18, 18, 39, - 6, 6, 76, 0, 0, 71, 60, 71, 48, 65, 18, 60, 28, 77, 0, 0, - 71, 18, 18, 29, 6, 6, 79, 60, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 22, 0, 72, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 19, 55, 9, 10, 19, 55, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 19, 55, 9, 9, 9, 9, 9, 9, 9, 9, 19, 55, 9, 10, - 19, 55, 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 19, 55, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 10, 28, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 9, 55, - 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 50, 9, 9, 9, 9, - 80, 9, 9, 9, 9, 9, 10, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 16, 9, 9, 17, 0, - 9, 9, 9, 19, 53, 77, 0, 0, 9, 9, 9, 9, 53, 77, 0, 0, - 9, 9, 9, 9, 53, 0, 0, 0, 9, 9, 9, 19, 81, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, - 18, 18, 18, 18, 18, 0, 0, 57, 6, 6, 76, 0, 0, 0, 0, 0, - 0, 0, 61, 82, 6, 6, 76, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 0, - 9, 83, 9, 9, 9, 9, 9, 9, 9, 9, 84, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 10, 18, 18, 18, 0, 18, 18, 18, 0, - 0, 64, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 41, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 28, 18, 39, 18, 18, 18, 18, 18, 18, 18, 65, - 6, 6, 76, 0, 6, 6, 76, 0, 0, 0, 0, 0, 18, 18, 18, 39, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 44, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, - 18, 44, 9, 0, 6, 6, 76, 0, 0, 0, 61, 18, 18, 0, 0, 0, - 85, 9, 9, 9, 9, 9, 9, 9, 59, 18, 18, 24, 6, 6, 49, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 53, 18, 18, 18, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 0, 0, - 6, 6, 76, 8, 6, 6, 49, 9, 9, 9, 9, 9, 9, 9, 9, 55, - 9, 9, 17, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 8, - 0, 0, 0, 0, 39, 18, 18, 18, 18, 18, 44, 52, 9, 47, 66, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 29, 18, - 9, 9, 9, 9, 9, 55, 9, 55, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 55, 9, 55, 9, 9, 25, 25, 9, 9, 9, 9, 9, 9, 9, 55, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 19, 9, 26, - 16, 19, 9, 17, 9, 16, 9, 0, 9, 9, 9, 17, 16, 19, 9, 17, - 86, 87, 87, 88, 0, 0, 89, 0, 0, 90, 91, 92, 0, 0, 0, 11, - 93, 94, 0, 0, 0, 93, 0, 95, 36, 96, 36, 36, 72, 0, 0, 68, - 0, 0, 0, 0, 9, 9, 9, 17, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 77, 0, 0, 0, - 13, 68, 16, 9, 9, 72, 8, 55, 0, 26, 19, 22, 9, 9, 55, 9, - 0, 8, 55, 13, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 68, 41, 24, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 0, 72, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 68, 0, 0, 0, 61, - 9, 9, 9, 9, 9, 10, 0, 0, 9, 10, 9, 10, 9, 10, 9, 10, - 9, 10, 9, 10, 9, 10, 9, 10, 18, 18, 18, 18, 18, 18, 18, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 97, 72, 0, 0, 0, 0, 0, 0, 0, 0, 71, 18, 98, 99, 68, 17, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 100, 101, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 102, - 0, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 10, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 102, 102, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, - 9, 9, 9, 17, 9, 9, 9, 9, 6, 6, 49, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 39, 18, 18, 104, - 9, 9, 9, 9, 9, 9, 9, 53, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 60, 0, 0, 0, - 0, 0, 0, 0, 0, 68, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 16, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 9, 9, - 105, 105, 41, 9, 9, 9, 9, 9, 41, 18, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 24, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, - 18, 60, 0, 0, 6, 6, 76, 0, 18, 18, 18, 18, 24, 9, 68, 106, - 6, 6, 49, 9, 9, 9, 9, 9, 9, 53, 18, 60, 9, 9, 9, 9, - 9, 41, 18, 18, 18, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 17, - 18, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 18, 18, - 77, 0, 0, 68, 6, 6, 76, 0, 0, 57, 0, 0, 6, 6, 76, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 59, 18, 18, 39, 0, 0, - 41, 9, 9, 60, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 61, 60, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 65, 77, 71, - 57, 0, 0, 0, 0, 0, 0, 0, 9, 9, 41, 18, 16, 107, 0, 0, - 8, 10, 8, 10, 8, 10, 0, 0, 9, 10, 9, 10, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 39, 60, 6, 6, 76, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, - 9, 10, 68, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 9, 10, 0, 0, 68, 9, 0, 108, 31, 31, 109, 31, 31, 32, 31, 110, - 111, 109, 31, 31, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 0, 0, 0, - 0, 0, 0, 0, 68, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 16, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, - 18, 18, 18, 18, 112, 94, 0, 0, 18, 18, 18, 18, 11, 93, 0, 0, - 0, 0, 0, 113, 5, 114, 0, 0, 0, 0, 0, 0, 9, 19, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 115, - 0, 116, 0, 5, 6, 6, 7, 0, 8, 9, 9, 9, 9, 9, 10, 11, - 8, 9, 9, 9, 9, 9, 10, 0, 0, 117, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 118, 9, 9, 9, 9, 9, 9, 9, 10, - 16, 9, 16, 9, 16, 9, 16, 17, 0, 0, 0, 0, 0, 0, 119, 0, - 9, 9, 9, 8, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, 10, 22, - 9, 9, 9, 55, 9, 9, 9, 55, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, - 9, 9, 9, 9, 9, 9, 9, 17, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 17, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 8, 9, 9, 9, 9, - 9, 9, 10, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 53, 39, 0, - 9, 9, 9, 9, 9, 9, 9, 55, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 8, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 55, 6, 6, 76, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, 0, - 9, 9, 9, 9, 9, 55, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, - 9, 55, 19, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 17, 50, - 9, 9, 9, 9, 9, 55, 0, 0, 9, 9, 9, 9, 9, 10, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 10, 55, 0, 0, - 9, 9, 9, 9, 9, 55, 0, 0, 9, 9, 9, 9, 9, 9, 55, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 16, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 59, 30, 0, 18, 9, 8, 8, 9, 9, 9, 9, 9, 9, 55, 39, 61, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 17, - 9, 9, 9, 9, 9, 9, 9, 17, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 107, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 0, 0, - 9, 9, 9, 9, 9, 55, 0, 0, 9, 9, 9, 9, 10, 0, 0, 0, - 9, 9, 9, 9, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 0, 0, 6, 6, 76, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 17, 0, 68, 0, 0, 9, 9, 9, 9, - 9, 53, 18, 18, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 10, 0, 0, - 85, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, - 18, 39, 0, 0, 0, 0, 0, 0, 0, 64, 6, 6, 0, 0, 0, 61, - 85, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 39, 14, - 0, 0, 0, 14, 9, 9, 9, 9, 9, 9, 17, 0, 6, 6, 76, 0, - 85, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 18, 18, 120, 6, 6, - 0, 107, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 41, 13, 0, 0, - 85, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 18, 18, - 44, 17, 28, 77, 6, 6, 121, 17, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 18, 18, 18, 0, 74, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 10, 19, 22, 9, 9, 9, 22, 9, 9, 17, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 41, 18, 18, 39, 0, 6, 6, 76, 0, - 18, 8, 9, 50, 50, 9, 9, 9, 9, 9, 19, 9, 19, 8, 23, 63, - 18, 65, 65, 60, 17, 61, 0, 8, 53, 71, 18, 77, 18, 77, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 59, 18, 18, - 18, 85, 10, 0, 6, 6, 76, 73, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, - 18, 22, 0, 0, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 60, 18, 18, - 77, 0, 0, 0, 0, 0, 9, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, - 77, 17, 0, 0, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 18, 18, 17, 0, - 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 28, 18, 18, 18, 0, 6, 6, 76, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 39, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 6, 6, 76, 0, 0, 0, 0, 68, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 16, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 59, 18, 71, 18, 122, 77, 0, 0, 0, 0, 0, 0, - 59, 18, 85, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 58, 39, - 0, 61, 0, 0, 59, 18, 18, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 53, 18, 18, 18, 60, 72, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 0, - 9, 9, 19, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 39, 18, 18, - 17, 0, 0, 0, 6, 6, 76, 0, 0, 0, 0, 0, 16, 9, 9, 9, - 9, 9, 9, 9, 71, 18, 18, 18, 18, 18, 28, 18, 18, 39, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 10, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 59, 39, 74, 29, - 18, 58, 0, 0, 6, 6, 76, 0, 9, 22, 19, 9, 9, 9, 9, 9, - 9, 9, 53, 39, 29, 18, 17, 0, 6, 6, 76, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 41, 39, 0, 0, - 9, 9, 9, 9, 9, 9, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 36, 36, 40, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 0, - 9, 9, 9, 9, 9, 9, 9, 10, 6, 6, 76, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 55, 18, 77, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 39, 0, 0, - 9, 0, 0, 0, 6, 6, 76, 0, 68, 9, 9, 9, 9, 9, 0, 8, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 10, 61, 59, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 0, 61, 85, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, - 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, 9, 9, 9, 17, - 9, 9, 17, 0, 9, 9, 55, 30, 36, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 60, 28, 123, 36, 124, 18, - 39, 28, 18, 0, 0, 0, 0, 0, 0, 0, 71, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 71, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 19, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 19, 13, 69, 8, 19, 9, 9, 22, 8, - 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 22, 10, 8, 9, 19, 9, 19, 9, 9, 9, 9, 9, 9, 22, 10, - 9, 26, 16, 9, 19, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 9, 9, 9, 9, 9, 9, - 19, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 10, 9, - 9, 9, 9, 9, 9, 19, 9, 9, 9, 9, 9, 9, 9, 19, 9, 9, - 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, - 9, 9, 19, 9, 9, 9, 9, 9, 9, 9, 19, 9, 9, 9, 9, 9, - 10, 9, 9, 64, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 39, 61, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 77, 0, 57, 0, 0, - 0, 77, 0, 0, 0, 0, 61, 18, 28, 18, 18, 18, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 39, 18, 18, 18, 18, 65, 18, 29, 48, 39, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 18, 85, 9, 55, - 6, 6, 76, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 6, 6, 76, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 17, 0, 0, 18, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 18, 85, 0, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 8, 9, 9, 9, 9, 9, 9, 69, 50, 8, 9, 10, 9, 25, 0, - 13, 68, 25, 8, 69, 50, 25, 25, 69, 50, 10, 9, 10, 9, 8, 26, - 9, 9, 22, 9, 9, 9, 9, 0, 8, 8, 22, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 55, 0, 9, 9, 9, 9, 9, 9, 55, 0, 9, 9, 9, 9, - 9, 9, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 126, 126, 126, 126, 126, 126, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 18, - 14, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, -}; - -static RE_UINT8 re_word_break_stage_4[] = { - 0, 0, 0, 0, 0, 0, 5, 6, 6, 4, 0, 0, 18, 0, 1, 0, - 0, 0, 0, 2, 13, 0, 14, 0, 15, 15, 15, 15, 15, 15, 12, 13, - 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 16, - 0, 6, 0, 0, 0, 0, 11, 0, 0, 9, 0, 0, 0, 11, 0, 12, - 0, 0, 11, 11, 11, 0, 0, 0, 7, 7, 7, 7, 11, 0, 11, 11, - 11, 11, 13, 11, 0, 0, 11, 12, 11, 11, 0, 11, 11, 11, 0, 7, - 7, 7, 11, 11, 0, 11, 0, 11, 11, 0, 11, 0, 11, 13, 0, 0, - 0, 7, 7, 7, 7, 7, 0, 7, 0, 7, 7, 0, 3, 3, 3, 3, - 3, 3, 3, 0, 0, 0, 0, 3, 3, 3, 3, 11, 12, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 0, 0, 13, 13, 0, 0, 7, 7, 7, 0, - 9, 0, 0, 0, 11, 11, 11, 7, 15, 15, 0, 15, 13, 0, 11, 11, - 7, 11, 11, 11, 0, 11, 7, 7, 7, 9, 0, 7, 7, 11, 11, 7, - 7, 0, 7, 7, 15, 15, 11, 11, 11, 0, 0, 11, 0, 0, 0, 9, - 11, 7, 11, 11, 11, 11, 7, 7, 7, 11, 0, 0, 11, 11, 0, 0, - 13, 0, 11, 0, 0, 7, 0, 0, 7, 7, 11, 7, 11, 7, 7, 7, - 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 9, 7, 7, 11, 7, 7, - 0, 0, 15, 15, 7, 0, 0, 7, 7, 7, 11, 0, 11, 0, 7, 0, - 0, 0, 0, 11, 0, 11, 11, 0, 11, 7, 0, 0, 0, 0, 7, 7, - 0, 11, 0, 0, 0, 0, 7, 11, 0, 0, 7, 0, 7, 0, 7, 0, - 15, 15, 0, 0, 7, 0, 0, 0, 0, 7, 0, 7, 15, 15, 7, 7, - 18, 11, 11, 11, 11, 0, 7, 7, 7, 7, 9, 0, 11, 7, 7, 11, - 11, 7, 11, 0, 7, 7, 7, 11, 18, 18, 18, 18, 18, 18, 18, 0, - 7, 17, 9, 9, 14, 14, 0, 0, 14, 0, 0, 12, 6, 6, 9, 9, - 9, 9, 9, 16, 16, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 18, - 9, 0, 9, 9, 18, 0, 0, 0, 0, 10, 10, 10, 10, 10, 0, 0, - 0, 7, 7, 10, 10, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 0, - 7, 7, 0, 11, 11, 11, 7, 11, 0, 11, 11, 7, 11, 7, 7, 0, - 0, 3, 7, 3, 3, 0, 3, 3, 3, 0, 3, 0, 3, 3, 0, 3, - 13, 0, 0, 12, 0, 16, 16, 16, 13, 12, 0, 0, 11, 0, 0, 9, - 0, 0, 0, 14, 0, 0, 10, 10, 10, 10, 7, 7, 0, 9, 9, 9, - 7, 0, 15, 15, 15, 15, 11, 0, 7, 11, 0, 11, 7, 7, 7, 9, - 9, 9, 9, 7, 0, 0, 8, 8, 8, 8, 8, 8, -}; - -/* Word_Break: 7116 bytes. */ - -RE_UINT32 re_get_word_break(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_word_break_stage_1[f] << 5; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_word_break_stage_2[pos + f] << 5; - f = code >> 2; - code ^= f << 2; - pos = (RE_UINT32)re_word_break_stage_3[pos + f] << 2; - value = re_word_break_stage_4[pos + code]; - - return value; -} - -/* Grapheme_Cluster_Break. */ - -static RE_UINT8 re_grapheme_cluster_break_stage_1[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 7, 8, 4, 9, - 10, 11, 4, 12, 4, 4, 13, 4, 4, 4, 4, 14, 4, 15, 16, 17, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 18, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static RE_UINT8 re_grapheme_cluster_break_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 3, 3, - 3, 3, 6, 3, 3, 3, 7, 8, 9, 10, 3, 11, 12, 13, 14, 15, - 16, 17, 3, 18, 19, 20, 21, 22, 23, 24, 23, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 3, 49, 50, 51, 52, 3, 3, 3, 3, 3, 53, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 54, 55, 56, 57, - 58, 3, 59, 3, 60, 3, 3, 3, 61, 62, 63, 3, 64, 65, 66, 67, - 68, 3, 3, 69, 3, 3, 3, 70, 3, 3, 3, 3, 3, 3, 3, 3, - 71, 72, 3, 73, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 74, 3, 75, 3, 76, 3, 3, 3, 3, 3, 3, 3, 3, - 77, 3, 78, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 79, 80, 81, 3, 3, 3, 3, - 82, 3, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 3, 3, 3, 93, - 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, - 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, - 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, - 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, - 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, - 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, - 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, - 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, - 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, - 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, - 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 101, 102, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 103, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 104, 3, 3, 1, 3, 3, 80, 105, - 3, 3, 3, 3, 3, 3, 3, 106, 3, 3, 3, 107, 3, 108, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 109, 3, 3, 110, 3, 3, 3, 3, - 3, 3, 3, 3, 111, 3, 3, 3, 3, 3, 3, 3, 3, 112, 3, 3, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 3, 3, 122, 34, 123, 3, 3, - 124, 125, 126, 127, 3, 3, 128, 129, 130, 131, 132, 3, 133, 3, 3, 3, - 134, 3, 3, 3, 3, 3, 3, 135, 136, 137, 138, 3, 3, 3, 3, 3, - 139, 3, 140, 3, 141, 142, 143, 3, 3, 3, 3, 144, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 145, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 146, 147, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 148, 149, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 150, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 151, 152, 3, 3, 153, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 154, 155, 156, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 157, 3, 3, 3, 147, 3, 3, 3, 3, 3, 3, 158, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 159, 3, 160, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 161, 3, 3, 3, 3, 3, 3, 3, 162, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 163, 4, 164, 164, 4, 4, 4, 165, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, -}; - -static RE_UINT8 re_grapheme_cluster_break_stage_3[] = { - 0, 1, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, - 0, 0, 0, 0, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, - 6, 7, 2, 2, 2, 2, 2, 2, 2, 2, 8, 5, 5, 5, 5, 9, - 10, 2, 2, 2, 2, 2, 2, 2, 11, 2, 5, 12, 2, 2, 2, 2, - 2, 6, 5, 5, 2, 2, 13, 2, 2, 2, 14, 15, 16, 17, 2, 2, - 2, 18, 19, 2, 2, 2, 5, 5, 5, 20, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 14, 5, 13, 2, 2, 2, 2, 2, 2, 6, 21, 22, - 2, 2, 14, 23, 24, 25, 2, 2, 2, 2, 2, 26, 2, 2, 2, 2, - 2, 2, 6, 5, 27, 5, 5, 5, 28, 2, 2, 2, 2, 2, 2, 29, - 30, 31, 8, 2, 32, 2, 2, 2, 33, 2, 2, 2, 2, 2, 2, 34, - 35, 36, 37, 2, 32, 2, 2, 38, 39, 2, 2, 2, 2, 2, 2, 40, - 41, 42, 19, 2, 2, 2, 43, 2, 44, 45, 2, 2, 32, 2, 2, 46, - 33, 2, 2, 2, 2, 2, 2, 47, 35, 36, 14, 2, 32, 2, 2, 2, - 48, 2, 2, 2, 2, 2, 2, 49, 50, 51, 37, 2, 2, 2, 2, 2, - 52, 2, 2, 2, 2, 2, 2, 14, 53, 17, 54, 2, 32, 2, 2, 2, - 33, 2, 2, 2, 2, 2, 2, 55, 56, 57, 54, 2, 32, 2, 2, 2, - 58, 2, 2, 2, 2, 2, 2, 59, 60, 61, 37, 2, 32, 2, 2, 2, - 62, 2, 2, 2, 2, 2, 2, 2, 2, 63, 64, 65, 2, 2, 62, 2, - 2, 2, 2, 2, 2, 2, 66, 20, 37, 67, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 66, 68, 2, 69, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 7, 2, 2, 70, 71, 2, 2, 2, 2, 2, 2, 8, 72, - 73, 74, 5, 8, 5, 5, 5, 68, 38, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 74, 75, 76, 2, 2, 77, 78, 13, 2, 79, 2, - 80, 22, 2, 22, 2, 2, 2, 2, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 2, 2, 2, 74, 2, 2, 2, 2, - 2, 2, 84, 2, 2, 2, 84, 2, 2, 2, 32, 2, 2, 2, 32, 2, - 2, 2, 2, 2, 2, 2, 85, 86, 87, 30, 21, 22, 2, 2, 2, 2, - 2, 88, 2, 2, 2, 2, 2, 2, 54, 2, 2, 2, 2, 19, 2, 2, - 2, 2, 2, 2, 89, 90, 91, 92, 2, 2, 37, 93, 2, 2, 2, 2, - 2, 2, 94, 67, 95, 96, 97, 16, 2, 2, 2, 2, 2, 2, 5, 67, - 98, 2, 2, 2, 2, 2, 99, 100, 101, 2, 2, 2, 2, 6, 21, 2, - 102, 2, 2, 2, 103, 104, 2, 2, 2, 2, 2, 2, 49, 105, 58, 2, - 2, 2, 2, 2, 106, 107, 108, 2, 2, 2, 109, 5, 75, 110, 111, 7, - 5, 5, 5, 5, 5, 5, 5, 23, 2, 112, 2, 2, 2, 113, 2, 2, - 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 5, 5, 5, 5, 13, 2, - 2, 2, 2, 2, 2, 37, 7, 2, 2, 2, 2, 2, 2, 2, 2, 37, - 2, 2, 2, 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, 46, 2, 2, - 2, 2, 2, 114, 2, 2, 2, 2, 2, 2, 2, 2, 2, 37, 109, 69, - 2, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, - 115, 116, 2, 2, 117, 2, 2, 2, 118, 2, 2, 2, 2, 2, 106, 119, - 120, 2, 2, 2, 5, 5, 7, 37, 2, 2, 2, 2, 14, 69, 2, 2, - 37, 5, 58, 2, 81, 81, 81, 121, 28, 2, 2, 2, 2, 2, 122, 123, - 124, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 2, 2, 125, 126, 2, - 116, 127, 2, 2, 2, 2, 2, 128, 2, 2, 2, 2, 2, 2, 129, 130, - 19, 2, 2, 2, 2, 131, 132, 2, 2, 2, 2, 2, 133, 134, 2, 2, - 135, 136, 136, 137, 136, 136, 136, 135, 136, 136, 137, 136, 136, 136, 135, 136, - 136, 137, 136, 136, 136, 135, 136, 136, 137, 136, 136, 136, 135, 136, 136, 137, - 136, 136, 136, 135, 136, 136, 137, 136, 136, 136, 135, 136, 136, 137, 136, 136, - 136, 135, 136, 136, 137, 136, 136, 136, 136, 135, 136, 136, 138, 2, 82, 82, - 139, 140, 83, 83, 83, 83, 83, 141, 2, 2, 2, 38, 2, 2, 2, 2, - 5, 5, 2, 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 0, 142, - 2, 2, 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 13, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 14, 20, 143, 99, 2, 2, 2, 2, 2, 144, - 2, 2, 2, 2, 54, 2, 2, 2, 2, 2, 2, 2, 99, 2, 2, 2, - 14, 5, 13, 2, 2, 2, 2, 2, 145, 2, 2, 2, 2, 2, 2, 5, - 67, 2, 2, 2, 2, 2, 2, 37, 102, 2, 2, 2, 2, 2, 146, 147, - 2, 148, 2, 2, 2, 2, 2, 2, 20, 2, 2, 2, 37, 149, 68, 2, - 150, 2, 2, 2, 2, 2, 116, 2, 102, 2, 2, 2, 2, 2, 151, 72, - 152, 79, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 153, 154, 38, - 2, 2, 2, 37, 97, 20, 2, 2, 155, 156, 37, 2, 157, 68, 68, 2, - 2, 2, 2, 2, 2, 2, 158, 5, 159, 2, 2, 38, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 160, 161, 162, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 37, 163, 164, 13, 2, 2, 165, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 97, 166, 13, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 167, 168, 2, 2, 2, 2, 74, 169, 21, 2, 2, - 2, 2, 2, 2, 2, 153, 5, 170, 2, 2, 171, 172, 173, 2, 2, 2, - 8, 20, 2, 2, 2, 2, 6, 174, 37, 2, 125, 92, 2, 2, 2, 2, - 175, 176, 72, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 177, 67, 168, - 2, 2, 46, 5, 5, 178, 179, 2, 2, 2, 2, 2, 2, 2, 180, 181, - 182, 2, 2, 2, 2, 2, 2, 2, 2, 183, 184, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 185, 2, 2, 2, 2, 2, 2, 2, 0, 186, - 2, 2, 2, 2, 2, 2, 68, 2, 2, 2, 2, 2, 2, 2, 67, 2, - 2, 37, 187, 119, 119, 119, 119, 119, 119, 37, 20, 2, 2, 2, 2, 2, - 2, 2, 2, 54, 142, 2, 2, 2, 2, 2, 2, 2, 188, 189, 190, 191, - 192, 21, 2, 2, 2, 193, 2, 2, 84, 2, 2, 2, 2, 2, 2, 2, - 5, 5, 5, 5, 5, 5, 67, 6, 5, 5, 5, 5, 5, 68, 22, 2, - 128, 2, 2, 6, 8, 5, 2, 2, 67, 5, 5, 194, 195, 20, 2, 2, - 2, 2, 2, 2, 2, 99, 2, 2, 2, 2, 67, 2, 2, 2, 2, 2, - 99, 20, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 196, 197, 197, 197, - 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 5, 5, 5, 5, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, -}; - -static RE_UINT8 re_grapheme_cluster_break_stage_4[] = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 2, 4, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 4, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, - 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, - 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, - 0, 5, 5, 0, 5, 5, 0, 5, 1, 1, 1, 1, 1, 1, 0, 0, - 5, 5, 5, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 1, 0, 5, - 5, 5, 5, 5, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, - 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 5, 5, 5, 0, 5, 5, 5, 5, 5, 0, 0, - 0, 5, 5, 5, 0, 0, 0, 0, 5, 5, 1, 5, 5, 5, 5, 5, - 5, 5, 5, 7, 0, 0, 0, 0, 0, 0, 5, 7, 5, 0, 7, 7, - 7, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 5, 7, 7, - 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 5, 7, 7, 5, 5, 5, 5, 0, 0, 7, - 7, 0, 0, 7, 7, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 7, 7, 7, 5, 5, 0, 0, 0, 0, 5, - 5, 0, 0, 5, 5, 5, 0, 0, 5, 5, 0, 0, 0, 5, 0, 0, - 7, 5, 5, 5, 5, 5, 0, 5, 5, 7, 0, 7, 7, 5, 0, 0, - 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 0, 5, 5, - 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, - 5, 7, 7, 0, 0, 0, 7, 7, 7, 0, 7, 7, 7, 5, 0, 0, - 5, 7, 7, 7, 5, 0, 0, 0, 5, 7, 7, 7, 7, 0, 5, 5, - 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 0, 7, 5, - 7, 7, 5, 7, 7, 0, 5, 7, 7, 0, 7, 7, 5, 5, 0, 0, - 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 5, 7, - 7, 5, 5, 5, 5, 0, 7, 7, 7, 0, 7, 7, 7, 5, 1, 0, - 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, - 7, 7, 5, 5, 5, 0, 5, 0, 7, 7, 7, 7, 7, 7, 7, 5, - 0, 5, 0, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, - 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 5, 0, 5, 0, 0, 0, 0, 7, 7, - 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 0, 5, 5, - 0, 0, 0, 0, 0, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, - 0, 5, 5, 7, 7, 5, 5, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 5, 5, 0, 0, 0, 0, 5, 5, 0, 5, 5, 5, 5, 0, 0, 0, - 0, 0, 5, 0, 7, 5, 5, 0, 8, 8, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, - 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 7, 5, - 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 5, 7, - 0, 0, 0, 5, 5, 5, 4, 0, 5, 5, 5, 7, 7, 7, 7, 5, - 5, 7, 7, 7, 0, 0, 0, 0, 7, 7, 5, 7, 7, 7, 7, 7, - 7, 5, 5, 5, 0, 0, 0, 0, 5, 7, 7, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 5, 7, 5, 0, 5, 0, 0, 5, 5, 5, - 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 7, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, - 5, 5, 5, 7, 5, 7, 7, 7, 7, 7, 5, 7, 7, 0, 0, 0, - 5, 5, 7, 0, 0, 0, 0, 0, 0, 7, 5, 5, 5, 5, 7, 7, - 5, 5, 7, 5, 5, 5, 0, 0, 5, 5, 7, 7, 7, 5, 7, 5, - 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, - 5, 5, 5, 5, 7, 7, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, - 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 5, 0, 0, 7, - 0, 0, 0, 4, 5, 13, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, - 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 5, 0, - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 7, 7, 5, 5, 7, - 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 5, 5, 0, 0, 8, 8, 8, 8, 8, 0, 0, 0, - 0, 0, 0, 5, 7, 7, 5, 5, 5, 5, 7, 7, 5, 5, 7, 7, - 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 7, - 7, 5, 5, 7, 7, 5, 5, 0, 0, 0, 0, 0, 5, 7, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 5, 0, 5, 5, 5, 0, 0, 5, - 5, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 7, 5, 5, 7, 7, - 0, 0, 0, 0, 0, 7, 5, 0, 0, 0, 0, 7, 7, 5, 7, 7, - 5, 7, 7, 0, 7, 5, 0, 0, 11, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, - 12, 12, 12, 12, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, - 4, 4, 4, 4, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5, 5, 0, - 5, 5, 5, 0, 0, 0, 0, 5, 7, 5, 7, 0, 0, 0, 0, 0, - 7, 7, 7, 5, 5, 5, 5, 7, 7, 5, 5, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 5, 5, 5, 5, 7, 5, 5, 5, - 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 7, 7, 7, 5, 5, - 7, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 5, - 5, 5, 7, 7, 5, 7, 5, 5, 5, 7, 7, 7, 7, 0, 0, 7, - 7, 0, 0, 7, 7, 7, 0, 0, 0, 0, 7, 7, 0, 0, 5, 5, - 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 5, 5, 5, 7, 5, 0, - 5, 7, 7, 5, 5, 5, 5, 5, 5, 7, 5, 7, 7, 5, 7, 5, - 5, 7, 5, 5, 0, 0, 0, 0, 7, 7, 5, 5, 5, 5, 0, 0, - 7, 7, 7, 7, 5, 5, 7, 5, 0, 0, 0, 0, 5, 5, 0, 0, - 5, 5, 5, 7, 7, 5, 7, 5, 0, 0, 0, 5, 7, 5, 7, 7, - 5, 5, 5, 5, 5, 5, 7, 5, 7, 7, 5, 5, 5, 5, 7, 5, - 7, 5, 5, 0, 0, 0, 0, 0, 0, 7, 7, 7, 5, 5, 5, 5, - 0, 0, 5, 5, 7, 7, 7, 7, 5, 0, 0, 0, 7, 0, 0, 0, - 5, 7, 1, 5, 5, 5, 5, 0, 0, 0, 0, 0, 1, 1, 1, 1, - 1, 1, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 7, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 7, 5, 5, 0, - 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 0, 5, 5, 0, 5, - 5, 5, 5, 5, 5, 5, 1, 5, 0, 0, 7, 7, 7, 7, 7, 0, - 5, 5, 0, 7, 7, 5, 7, 5, 0, 0, 0, 5, 5, 7, 7, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, - 0, 0, 0, 0, 0, 5, 7, 5, 5, 5, 0, 0, 0, 7, 5, 5, - 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 5, 5, 5, 0, 0, 5, 5, 5, 5, 0, 0, - 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5, 5, - 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, -}; - -/* Grapheme_Cluster_Break: 4400 bytes. */ - -RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_grapheme_cluster_break_stage_1[f] << 6; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_grapheme_cluster_break_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_grapheme_cluster_break_stage_3[pos + f] << 3; - value = re_grapheme_cluster_break_stage_4[pos + code]; - - return value; -} - -/* Sentence_Break. */ - -static RE_UINT8 re_sentence_break_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, - 15, 16, 17, 18, 19, 13, 20, 13, 21, 13, 13, 13, 13, 22, 7, 7, - 23, 24, 13, 13, 13, 13, 25, 26, 13, 13, 27, 28, 29, 30, 31, 13, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 32, 7, 33, 34, 7, 35, 7, 7, 7, 36, 13, 37, +/* Bidi_Class. */ +static RE_UINT8 re_bidi_class_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 17, 18, + 19, 13, 20, 21, 22, 23, 24, 25, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 26, 27, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 28, + 13, 13, 13, 13, 29, 30, 31, 13, 32, 13, 33, 34, 35, 36, 37, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -}; - -static RE_UINT8 re_sentence_break_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 34, 35, 36, 37, 38, 39, 34, 34, 34, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 64, 65, 64, 64, 66, 64, 64, 64, 64, 67, 68, - 64, 64, 64, 69, 64, 64, 64, 64, 70, 71, 72, 73, 74, 64, 64, 64, - 75, 76, 77, 78, 64, 64, 64, 64, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 79, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 80, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 81, 34, 34, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 94, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 34, 34, 95, 96, 97, 98, 34, 34, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 64, 109, 110, 111, 112, 113, 114, 64, 34, 34, 115, 64, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 64, 64, 64, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 64, 136, 137, 64, 138, 139, 140, 141, 64, - 142, 143, 64, 144, 145, 146, 64, 64, 147, 148, 149, 150, 64, 151, 64, 64, - 34, 34, 34, 34, 34, 34, 34, 152, 153, 34, 154, 64, 64, 64, 64, 64, - 34, 34, 34, 34, 34, 34, 34, 34, 155, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 34, 34, 34, 34, 156, 64, 64, 64, - 34, 34, 34, 34, 157, 158, 159, 160, 64, 64, 64, 64, 161, 162, 163, 164, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 165, - 34, 34, 34, 34, 34, 166, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 34, 34, 167, 34, 34, 168, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 169, 170, 64, 64, 64, 64, 64, 64, - 64, 64, 171, 172, 173, 64, 64, 64, 174, 175, 176, 177, 178, 179, 180, 181, - 64, 64, 64, 64, 182, 183, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 184, 64, 185, 64, 64, 186, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 34, 187, 188, 64, 64, 64, 64, 64, 64, 64, 64, 64, 189, 190, 64, 64, - 64, 64, 191, 192, 64, 64, 64, 64, 64, 64, 64, 64, 193, 64, 64, 64, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 194, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 195, 34, - 196, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 197, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 198, 64, 64, 64, 64, 64, 64, 64, 64, - 34, 34, 34, 34, 199, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 200, 64, 201, 202, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, -}; - -static RE_UINT8 re_sentence_break_stage_3[] = { - 0, 0, 1, 2, 0, 0, 0, 0, 3, 4, 5, 6, 7, 7, 8, 9, - 10, 11, 11, 11, 11, 11, 12, 13, 14, 15, 15, 15, 15, 15, 16, 13, - 0, 17, 0, 0, 0, 0, 0, 0, 18, 0, 19, 20, 0, 21, 19, 0, - 11, 11, 11, 11, 11, 22, 11, 23, 15, 15, 15, 15, 15, 24, 15, 15, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, - 26, 26, 27, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 28, 29, - 30, 31, 32, 33, 28, 31, 34, 28, 25, 31, 29, 31, 32, 26, 35, 34, - 36, 28, 31, 26, 26, 26, 26, 27, 25, 25, 25, 25, 30, 31, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 15, 33, 30, - 26, 23, 25, 25, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 37, 15, 15, 15, 15, 15, 15, 15, 15, 38, 36, - 39, 40, 36, 36, 41, 0, 0, 0, 15, 42, 0, 43, 0, 0, 0, 0, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 25, 45, 46, 47, - 0, 48, 22, 49, 32, 11, 11, 11, 50, 11, 11, 15, 15, 15, 15, 15, - 15, 15, 15, 51, 33, 34, 25, 25, 25, 25, 25, 25, 15, 52, 30, 32, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 25, 25, 25, 25, 25, 25, 25, 25, - 53, 44, 54, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 28, 26, 26, 29, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 10, 11, 11, 11, - 11, 11, 11, 11, 11, 22, 55, 56, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 57, 0, 58, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 59, - 60, 59, 0, 0, 36, 36, 36, 36, 36, 36, 61, 62, 36, 0, 0, 0, - 63, 64, 0, 65, 44, 44, 66, 67, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 68, 44, 44, 44, 44, 44, 7, 7, 69, 70, 71, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 72, 44, 73, 44, 74, 75, 76, 7, 7, 77, 78, - 79, 0, 0, 80, 81, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 44, - 44, 44, 66, 82, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 44, 44, 84, 0, 0, 0, - 7, 7, 77, 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 41, 85, 86, - 36, 36, 36, 36, 36, 83, 87, 44, 44, 88, 88, 89, 0, 9, 90, 91, - 36, 36, 36, 36, 36, 36, 88, 0, 36, 36, 61, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 92, 36, 41, - 0, 0, 0, 0, 93, 44, 44, 44, 94, 44, 44, 44, 44, 44, 44, 44, - 44, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 95, - 44, 44, 44, 44, 88, 44, 36, 36, 83, 96, 7, 7, 82, 36, 36, 36, - 88, 82, 36, 78, 78, 36, 36, 36, 36, 36, 92, 36, 43, 40, 41, 95, - 44, 97, 97, 98, 0, 93, 0, 99, 83, 100, 7, 7, 41, 0, 0, 101, - 58, 82, 61, 62, 78, 36, 36, 36, 36, 36, 92, 36, 92, 102, 41, 75, - 66, 93, 97, 89, 86, 0, 82, 43, 0, 100, 7, 7, 76, 103, 0, 0, - 58, 82, 36, 99, 99, 36, 36, 36, 36, 36, 92, 36, 92, 82, 41, 95, - 44, 59, 59, 89, 104, 0, 0, 0, 83, 100, 7, 7, 0, 0, 105, 44, - 58, 82, 36, 78, 78, 36, 36, 36, 36, 36, 92, 36, 92, 82, 41, 95, - 44, 97, 97, 89, 0, 106, 0, 99, 83, 100, 7, 7, 55, 0, 0, 0, - 107, 82, 61, 40, 92, 41, 102, 92, 62, 104, 61, 40, 36, 36, 41, 106, - 66, 106, 75, 89, 104, 93, 0, 0, 0, 100, 7, 7, 0, 0, 0, 0, - 44, 71, 36, 92, 92, 36, 36, 36, 36, 36, 92, 36, 36, 36, 41, 105, - 44, 75, 75, 89, 0, 60, 61, 0, 83, 100, 7, 7, 0, 0, 0, 0, - 88, 82, 36, 92, 92, 36, 36, 36, 36, 36, 92, 36, 36, 82, 41, 95, - 44, 75, 75, 89, 0, 60, 0, 108, 83, 100, 7, 7, 102, 0, 0, 0, - 44, 82, 36, 92, 92, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 95, - 44, 75, 75, 98, 0, 68, 0, 62, 83, 100, 7, 7, 0, 0, 40, 36, - 106, 82, 36, 36, 36, 61, 40, 36, 36, 36, 36, 36, 99, 36, 36, 55, - 36, 61, 109, 93, 44, 110, 44, 44, 0, 100, 7, 7, 106, 0, 0, 0, - 82, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 81, 44, 66, 0, - 36, 68, 44, 66, 7, 7, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 102, 92, 61, 36, 36, 36, 36, 36, 36, 112, 36, 36, 81, 44, 44, 84, - 36, 43, 44, 89, 7, 7, 111, 36, 0, 0, 0, 0, 0, 0, 0, 0, - 104, 0, 0, 0, 0, 0, 89, 0, 7, 7, 111, 0, 0, 113, 114, 115, - 36, 36, 82, 36, 36, 36, 36, 36, 36, 36, 36, 104, 58, 44, 44, 44, - 44, 75, 36, 88, 44, 44, 58, 44, 44, 44, 44, 44, 44, 44, 44, 116, - 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 44, 44, 117, - 7, 7, 118, 0, 36, 83, 76, 83, 95, 74, 44, 76, 88, 71, 36, 36, - 83, 44, 44, 87, 7, 7, 119, 89, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 50, 0, 120, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 92, 41, 36, 61, 92, 41, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 92, 41, 36, 36, 36, 36, 36, 36, 36, 36, 92, 41, 36, 61, - 92, 41, 36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 92, 41, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 61, 58, 121, 9, 122, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 123, 15, 39, - 82, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 124, 36, 36, 36, 36, - 125, 36, 36, 36, 36, 36, 126, 127, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 40, 36, 36, 104, 0, - 36, 36, 36, 92, 83, 116, 0, 0, 36, 36, 36, 36, 83, 128, 0, 0, - 36, 36, 36, 36, 83, 0, 0, 0, 36, 36, 36, 92, 129, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, - 44, 44, 44, 44, 44, 62, 0, 103, 7, 7, 111, 0, 0, 0, 0, 0, - 130, 0, 131, 132, 7, 7, 111, 0, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 104, 0, - 36, 133, 36, 36, 36, 36, 36, 36, 36, 36, 134, 0, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 61, 44, 44, 44, 0, 44, 44, 44, 0, - 0, 96, 7, 7, 36, 36, 36, 36, 36, 36, 36, 41, 36, 104, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 36, 36, 36, 36, - 36, 36, 41, 0, 7, 7, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 68, 44, 0, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 88, 44, 66, 44, 44, 44, 44, 44, 44, 44, 97, - 7, 7, 111, 0, 7, 7, 111, 0, 0, 62, 135, 0, 44, 44, 44, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 44, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, - 44, 71, 36, 0, 7, 7, 118, 136, 0, 0, 93, 44, 44, 0, 0, 0, - 117, 36, 36, 36, 36, 36, 36, 36, 88, 44, 44, 76, 7, 7, 77, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 44, 44, 44, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 44, 44, 9, 122, - 7, 7, 111, 82, 7, 7, 77, 36, 36, 36, 36, 36, 36, 36, 36, 137, - 15, 15, 42, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 82, - 0, 0, 0, 0, 66, 44, 44, 44, 44, 44, 71, 81, 36, 74, 98, 0, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 59, 44, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 34, 15, 27, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 15, 15, 11, 11, 15, 39, 11, 123, 15, 15, 11, 11, 15, 15, 11, 11, - 15, 39, 11, 123, 15, 15, 138, 138, 15, 15, 11, 11, 15, 15, 15, 39, - 15, 15, 11, 11, 15, 15, 11, 11, 15, 15, 11, 11, 15, 139, 11, 140, - 46, 139, 11, 141, 15, 46, 11, 0, 15, 15, 11, 141, 46, 139, 11, 141, - 142, 142, 143, 144, 145, 146, 147, 147, 0, 148, 149, 150, 0, 0, 151, 152, - 0, 153, 152, 0, 0, 0, 0, 154, 63, 155, 63, 63, 21, 0, 0, 156, - 0, 0, 0, 151, 15, 15, 15, 42, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 116, 0, 0, 0, - 48, 157, 158, 159, 23, 120, 10, 123, 0, 160, 49, 161, 11, 38, 162, 33, - 0, 163, 39, 164, 0, 0, 0, 0, 11, 11, 11, 11, 15, 15, 15, 15, - 165, 38, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 11, 11, - 11, 11, 11, 11, 15, 15, 15, 15, 15, 15, 39, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 147, 127, 0, 147, 147, 147, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 151, 0, 0, 0, 0, 0, 0, 0, 167, 147, 147, 0, 0, 0, 0, - 4, 147, 147, 147, 147, 147, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 22, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 24, 31, 168, 26, 32, 25, 29, 15, 33, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 42, 157, 169, 54, 0, 0, 0, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 170, 0, 21, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 62, 0, 0, 0, 93, - 36, 36, 36, 36, 36, 61, 0, 0, 36, 61, 36, 61, 36, 61, 36, 61, - 36, 61, 36, 61, 36, 61, 36, 61, 44, 44, 44, 44, 44, 44, 44, 44, - 147, 147, 147, 5, 0, 0, 0, 5, 147, 147, 5, 171, 0, 0, 0, 122, - 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 173, 82, 147, 147, 5, 147, 147, 174, 82, 36, 83, 44, 82, 41, 36, 104, - 82, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 61, 60, 82, 82, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 36, - 0, 82, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 82, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 61, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 61, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 0, - 36, 36, 36, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 175, - 36, 36, 36, 176, 36, 36, 36, 36, 7, 7, 77, 0, 0, 0, 0, 0, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 177, 66, 44, 44, 178, - 25, 25, 25, 25, 25, 25, 25, 179, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 180, 9, 0, 0, - 0, 0, 0, 0, 0, 62, 36, 36, 181, 25, 25, 25, 27, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 15, 15, 26, 30, - 25, 25, 182, 183, 25, 27, 25, 25, 25, 25, 31, 23, 11, 25, 25, 25, - 181, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 184, 36, - 185, 185, 68, 36, 36, 36, 36, 36, 68, 44, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 136, 0, 0, - 76, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, - 44, 89, 0, 136, 7, 7, 111, 0, 44, 44, 44, 44, 76, 36, 62, 186, - 7, 7, 77, 36, 36, 36, 36, 36, 36, 83, 44, 180, 36, 36, 36, 36, - 36, 68, 44, 44, 44, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 104, - 44, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 44, - 116, 0, 152, 62, 7, 7, 111, 0, 36, 81, 36, 36, 7, 7, 77, 61, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 88, 44, 44, 66, 0, 0, - 68, 36, 36, 89, 7, 7, 111, 187, 36, 36, 36, 36, 36, 61, 188, 76, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 95, 74, 71, 83, - 134, 0, 0, 0, 0, 0, 62, 41, 36, 36, 68, 44, 189, 190, 0, 0, - 82, 61, 82, 61, 82, 61, 0, 0, 36, 61, 36, 61, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 24, 15, 15, 15, 0, 0, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 191, 89, 7, 7, 111, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 36, 36, 36, 36, - 36, 61, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 24, 0, 0, 192, 15, 0, 193, 36, 36, 92, 36, 36, 61, 36, 43, - 99, 92, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, 0, - 0, 0, 0, 0, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 194, - 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 40, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 0, - 44, 44, 44, 44, 195, 4, 127, 0, 44, 44, 44, 44, 196, 174, 147, 147, - 147, 197, 127, 0, 6, 198, 199, 200, 145, 0, 0, 0, 36, 92, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 201, - 90, 0, 5, 6, 7, 7, 8, 9, 10, 11, 11, 11, 11, 11, 12, 13, - 14, 15, 15, 15, 15, 15, 16, 202, 203, 204, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 83, 36, 36, 36, 36, 36, 36, 36, 61, - 40, 36, 40, 36, 40, 36, 40, 104, 0, 0, 0, 0, 0, 0, 205, 0, - 36, 36, 36, 82, 36, 36, 36, 36, 36, 61, 36, 36, 36, 36, 61, 99, - 36, 36, 36, 41, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 104, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, - 36, 36, 36, 36, 36, 36, 36, 104, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 104, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 82, 36, 36, 36, 36, - 36, 36, 61, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 66, 0, - 36, 36, 36, 36, 36, 36, 36, 41, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 0, 36, 36, 82, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 41, 7, 7, 111, 0, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 0, 0, - 36, 36, 36, 36, 36, 41, 0, 0, 36, 36, 0, 0, 0, 0, 0, 0, - 36, 41, 92, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 99, 104, 78, - 36, 36, 36, 36, 36, 41, 0, 0, 36, 36, 36, 36, 36, 61, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 61, 41, 0, 0, - 36, 36, 36, 36, 36, 41, 0, 0, 36, 36, 36, 36, 36, 36, 41, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 40, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 88, 60, 0, 44, 36, 82, 82, 36, 36, 36, 36, 36, 36, 41, 66, 93, - 0, 0, 0, 0, 0, 136, 0, 0, 36, 36, 36, 36, 36, 36, 36, 104, - 36, 36, 36, 36, 36, 36, 36, 104, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 82, 36, 36, 36, 36, 36, 36, 190, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, - 36, 36, 36, 36, 36, 41, 0, 0, 36, 36, 36, 36, 61, 0, 0, 0, - 36, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 22, 0, 0, 0, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 0, 0, 7, 7, 111, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 104, 0, 62, 0, 0, 36, 36, 36, 36, - 36, 83, 44, 44, 116, 187, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 61, 0, 0, - 117, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, - 44, 191, 122, 0, 0, 0, 0, 0, 0, 100, 7, 7, 0, 0, 0, 93, - 117, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 66, 206, - 152, 0, 0, 20, 36, 36, 36, 36, 36, 36, 104, 0, 7, 7, 111, 0, - 117, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 44, 207, 7, 7, - 187, 190, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 68, 108, 0, 0, - 117, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 44, - 71, 208, 58, 209, 7, 7, 210, 176, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 99, 36, 36, 36, 36, 36, 36, 44, 44, 44, 211, 212, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 61, 92, 99, 36, 36, 36, 99, 36, 36, 213, 0, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 66, 0, 7, 7, 111, 0, - 44, 82, 36, 78, 78, 36, 36, 36, 36, 36, 92, 36, 92, 82, 214, 95, - 44, 97, 97, 89, 104, 93, 0, 82, 83, 106, 44, 116, 44, 116, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 88, 44, 44, - 44, 117, 215, 122, 7, 7, 111, 107, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 44, - 44, 99, 0, 0, 7, 7, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 89, 44, 44, - 216, 0, 187, 135, 135, 135, 36, 89, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 44, - 128, 104, 0, 0, 7, 7, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 44, 104, 0, - 7, 7, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 61, 58, 44, 44, 44, 0, 7, 7, 111, 79, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 66, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, - 15, 15, 15, 15, 15, 15, 15, 15, 7, 7, 111, 0, 0, 0, 0, 62, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 40, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 88, 44, 106, 44, 217, 116, 0, 0, 0, 0, 0, 0, - 88, 44, 117, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 87, 66, - 136, 93, 0, 0, 88, 44, 44, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 83, 44, 44, 44, 180, 218, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 104, 0, - 36, 36, 92, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 66, 44, 44, - 208, 0, 0, 0, 7, 7, 111, 0, 0, 0, 0, 0, 40, 36, 36, 36, - 36, 36, 36, 36, 106, 44, 44, 44, 44, 44, 58, 44, 44, 66, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 61, 99, 36, 36, 36, 36, 36, 36, 36, 36, 36, 88, 66, 109, 59, - 44, 87, 0, 0, 7, 7, 111, 0, 36, 99, 92, 36, 36, 36, 36, 36, - 36, 36, 83, 66, 59, 44, 104, 0, 7, 7, 111, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 68, 191, 122, 0, - 36, 36, 36, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 63, 63, 219, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, + 39, 40, 40, 40, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38 +}; + +static RE_UINT16 re_bidi_class_table_2[] = { + 0, 1, 2, 3, 4, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 8, 9, 10, 11, 11, 11, 12, 13, 7, 7, 14, + 7, 7, 7, 7, 15, 7, 7, 7, 7, 7, 7, 7, 16, 17, 18, 19, + 20, 21, 22, 23, 21, 21, 24, 25, 26, 27, 28, 21, 21, 29, 19, 30, + 31, 32, 33, 34, 19, 21, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 42, 46, 47, 45, 42, 48, 49, 41, 50, 51, 40, 52, 7, 53, 54, + 55, 56, 57, 58, 41, 42, 59, 40, 60, 61, 43, 40, 41, 7, 62, 7, + 7, 63, 64, 7, 7, 65, 66, 7, 67, 68, 7, 69, 70, 71, 72, 7, + 7, 73, 74, 75, 76, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 77, 7, 78, 7, 7, 7, + 79, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 80, 7, 7, 7, 81, 81, 82, 82, 7, 83, 84, 78, + 85, 7, 7, 7, 86, 87, 7, 7, 7, 88, 89, 7, 7, 7, 90, 91, + 92, 7, 93, 94, 7, 95, 96, 7, 97, 98, 52, 99, 60, 100, 7, 101, + 7, 102, 7, 7, 7, 7, 103, 104, 7, 7, 7, 7, 7, 7, 11, 105, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 7, 120, 91, 91, 91, + 121, 91, 91, 91, 91, 91, 91, 91, 91, 122, 7, 123, 124, 91, 91, 91, + 91, 125, 126, 91, 127, 7, 7, 128, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 129, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 7, 7, 7, 7, 7, 7, 7, 7, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 130, 131, 91, 91, 91, + 7, 7, 7, 7, 7, 7, 7, 132, 7, 7, 7, 133, 7, 7, 7, 11, + 91, 91, 134, 7, 135, 91, 91, 136, 91, 91, 91, 91, 91, 91, 122, 137, + 138, 139, 7, 7, 140, 79, 7, 141, 7, 7, 7, 7, 7, 7, 91, 142, + 143, 7, 144, 145, 7, 146, 147, 7, 7, 7, 7, 148, 7, 7, 90, 149, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 91, 91, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 144, 91, 125, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 150, 7, 7, 151, 56, 7, 7, 152, 91, 153, 7, 7, 154, 7, 7, 7, + 155, 156, 7, 157, 7, 7, 158, 159, 7, 160, 161, 7, 37, 162, 7, 163, + 7, 164, 165, 42, 7, 166, 41, 167, 7, 7, 7, 168, 7, 7, 7, 169, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 170, 171, 172, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 173, 21, 21, 21, 21, 174, 175, + 176, 177, 178, 179, 21, 21, 21, 180, 181, 2, 2, 182, 7, 7, 7, 183, + 7, 7, 7, 7, 7, 7, 7, 7, 184, 7, 91, 91, 185, 79, 7, 186, + 7, 7, 7, 7, 7, 7, 7, 187, 7, 7, 7, 188, 7, 7, 7, 7, + 19, 19, 19, 19, 19, 19, 19, 19, 189, 19, 19, 19, 19, 19, 19, 19, + 190, 191, 19, 19, 19, 19, 19, 192, 19, 193, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 21, 194, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 195, 19, 196, 19, 19, 19, 172, 29, 34, 19, 19, 19, 19, + 41, 197, 198, 199, 60, 200, 7, 7, 37, 201, 7, 202, 60, 203, 204, 7, + 7, 205, 7, 7, 7, 7, 133, 206, 60, 61, 96, 207, 7, 7, 7, 7, + 7, 197, 208, 7, 7, 209, 210, 7, 7, 7, 7, 7, 7, 211, 212, 7, + 7, 213, 96, 214, 7, 215, 7, 7, 77, 216, 7, 7, 7, 7, 7, 7, + 7, 217, 7, 7, 7, 7, 7, 7, 7, 218, 219, 7, 7, 7, 220, 96, + 221, 222, 223, 7, 224, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 225, 7, 7, 226, 227, 7, 7, 7, 228, 229, 7, 230, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 231, 7, 7, 7, 7, 7, 7, 232, 233, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 234, 7, 235, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 236, 7, 237, 7, 7, 238, + 7, 7, 7, 7, 239, 240, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 241, 242, 243, 7, 7, + 91, 91, 244, 7, 7, 7, 7, 7, 91, 91, 245, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 141, 7, 246, 7, 247, 7, 248, 7, 249, 250, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 11, 251, 11, 252, 253, 254, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 255, 256, 7, 7, 7, 7, 7, 7, 7, 235, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 257, 7, 7, 7, 7, 7, 7, 7, 7, + 19, 19, 19, 19, 19, 19, 258, 19, 19, 19, 259, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 172, 21, 21, 19, 19, 21, 21, 34, 19, 19, 19, 19, 19, + 21, 21, 21, 21, 21, 21, 21, 260, 19, 19, 19, 19, 19, 19, 19, 19, + 91, 261, 91, 91, 136, 262, 263, 122, 264, 247, 7, 265, 7, 266, 7, 7, + 7, 7, 7, 182, 7, 7, 7, 7, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 267, 185, 91, 91, 91, 136, 91, 91, 268, 269, + 261, 91, 270, 91, 271, 272, 7, 7, 91, 91, 91, 273, 91, 91, 129, 91, + 91, 91, 136, 274, 275, 276, 277, 7, 91, 91, 91, 91, 278, 91, 126, 279, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 280, + 281, 281, 281, 281, 281, 281, 281, 281, 11, 11, 11, 11, 11, 11, 11, 282, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281 +}; + +static RE_UINT8 re_bidi_class_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 4, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 2, + 4, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 7, 8, 7, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 1, + 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 8, 5, 6, 6, 6, 6, 5, 5, 5, 5, 0, 5, 5, 1, 5, 5, + 6, 6, 9, 9, 5, 0, 5, 5, 5, 9, 0, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 5, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 6, + 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 10, + 11, 10, 10, 11, 10, 10, 11, 10, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 12, 12, 12, 12, 12, 12, 5, 5, 13, 6, 6, 13, 8, 13, 5, 5, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 6, 12, 12, 13, 13, 13, + 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 12, 5, 10, + 10, 10, 10, 10, 10, 13, 13, 10, 10, 5, 10, 10, 10, 10, 13, 13, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 11, 11, 5, 5, 5, 5, 11, 11, 11, 10, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 11, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 11, 10, 10, 10, 11, 10, 10, 10, 10, 10, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 11, 11, 11, 11, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 12, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 10, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 10, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, + 0, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 10, 0, + 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 0, 0, 0, 0, 10, 10, 0, 0, 10, 10, 10, 0, 0, + 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 0, 10, 10, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, + 0, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 5, 5, 5, 5, 5, 6, 5, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, + 10, 0, 0, 0, 0, 0, 10, 10, 10, 0, 10, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 10, 0, 10, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 10, 10, 10, 10, 10, 0, 10, 10, 0, 0, 0, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, + 10, 0, 10, 10, 10, 10, 10, 10, 0, 10, 10, 0, 0, 10, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 10, 10, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 6, 0, 10, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10, 10, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, 0, + 5, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 10, 10, 10, 10, 10, 10, 10, 0, + 10, 0, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 10, 0, 0, 10, 10, 0, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 10, 10, 0, 0, 0, 10, 0, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 0, 11, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 4, 3, 14, 15, 16, 17, 18, 8, + 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, + 1, 1, 1, 1, 1, 1, 19, 20, 21, 22, 1, 1, 1, 1, 1, 1, + 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 7, 7, 5, 5, 5, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 5, 5, 5, 5, 0, 5, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, + 5, 5, 5, 5, 0, 5, 0, 5, 0, 5, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 7, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, + 4, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, + 5, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 10, 10, 10, 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 10, 0, 5, 5, 5, 5, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 10, 10, 10, 10, 0, 0, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 0, + 0, 10, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 10, 10, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, 10, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 10, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 7, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 5, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 13, 13, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 8, 5, 8, 0, 5, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, + 5, 5, 7, 7, 5, 5, 5, 0, 5, 6, 6, 5, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, + 0, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 7, 8, 7, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 5, 5, 5, 6, 6, 0, 5, 5, 5, 5, 5, 5, 5, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 1, 1, + 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, + 11, 10, 10, 10, 11, 10, 10, 11, 11, 11, 11, 11, 10, 10, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 11, 11, 11, 11, 10, + 11, 11, 11, 11, 11, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 5, 5, 5, 5, 5, 5, + 13, 13, 13, 13, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 10, 10, 0, 0, 10, 0, 10, 10, 0, 0, 0, 0, 0, 0, 10, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, 0, 10, + 10, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 10, 10, 0, 10, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 0, 10, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 10, 0, 0, + 10, 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 10, 0, + 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 10, 10, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, + 10, 0, 10, 10, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 0, 0, 0, 10, 0, 10, 10, 0, 10, + 10, 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 0, 0, 0, 10, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, + 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 10, 10, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 0, 10, 10, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 5, 5, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +RE_UINT32 re_get_bidi_class(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_bidi_class_table_1[field_2]; + v = re_bidi_class_table_2[(v << 5) | field_1]; + v = re_bidi_class_table_3[(v << 5) | field_0]; + + return v; +} + +/* Bidi_Control. */ +RE_UINT32 re_get_bidi_control(RE_UINT32 codepoint) { + if (codepoint == 0x061C) + return 1; + if (0x200E <= codepoint && codepoint <= 0x200F) + return 1; + if (0x202A <= codepoint && codepoint <= 0x202E) + return 1; + if (0x2066 <= codepoint && codepoint <= 0x2069) + return 1; + + return 0; +} + +/* Bidi_Mirrored. */ +static RE_UINT8 re_bidi_mirrored_table_1[] = { + 0, 1, 1, 2, 1, 3, 1, 1, 4, 5, 6, 7, 8, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +static RE_UINT8 re_bidi_mirrored_table_2[] = { + 0, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 7, 8, 9, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 22, 23, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 0, 0, 0, 0, 0, 0, 0, 36, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 41, 0, 0, 0, 0, 1, 2, 42, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, 47, 0, 48, 0 +}; + +static RE_UINT8 re_bidi_mirrored_table_3[] = { + 0, 0, 0, 0, 0, 3, 0, 80, 0, 0, 0, 40, 0, 8, 0, 8, + 0, 0, 0, 60, 0, 0, 0, 24, 0, 0, 0, 6, 96, 0, 0, 0, + 0, 0, 0, 96, 0, 96, 0, 0, 1, 0, 0, 0, 30, 63, 98, 188, + 87, 248, 15, 250, 255, 31, 60, 128, 245, 207, 255, 255, 255, 159, 7, 1, + 204, 255, 255, 193, 0, 62, 195, 255, 255, 63, 255, 255, 0, 15, 0, 0, + 3, 6, 0, 0, 0, 255, 63, 0, 121, 59, 120, 112, 252, 255, 0, 0, + 248, 255, 255, 249, 253, 255, 0, 1, 63, 194, 55, 31, 58, 3, 240, 51, + 0, 252, 255, 223, 83, 122, 48, 112, 0, 0, 128, 1, 48, 188, 25, 254, + 255, 255, 255, 255, 207, 191, 255, 255, 255, 255, 127, 80, 124, 112, 136, 47, + 0, 0, 0, 64, 60, 54, 0, 48, 255, 3, 0, 0, 0, 255, 243, 15, + 0, 0, 0, 126, 48, 0, 0, 0, 0, 0, 0, 168, 13, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 32, 0, 0, 128, 0, 0, 0, 2, 0, 0, + 8, 0, 0, 0 +}; + +RE_UINT32 re_get_bidi_mirrored(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_bidi_mirrored_table_1[field_2]; + v = re_bidi_mirrored_table_2[(v << 5) | field_1]; + v = re_bidi_mirrored_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Blank. */ +RE_UINT32 re_get_blank(RE_UINT32 codepoint) { + if (codepoint == 0x09) + return 1; + if (codepoint == 0x20) + return 1; + if (codepoint == 0xA0) + return 1; + if (codepoint == 0x1680) + return 1; + if (0x2000 <= codepoint && codepoint <= 0x200A) + return 1; + if (codepoint == 0x202F) + return 1; + if (codepoint == 0x205F) + return 1; + if (codepoint == 0x3000) + return 1; + + return 0; +} + +/* Block. */ +static RE_UINT8 re_block_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 16, 17, 18, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, 36, 36, + 36, 39, 36, 36, 36, 36, 36, 36, 36, 36, 40, 41, 42, 42, 42, 42, + 42, 42, 43, 44, 36, 36, 36, 36, 36, 36, 36, 36, 45, 36, 36, 46, + 36, 36, 36, 36, 47, 48, 49, 36, 50, 36, 51, 52, 53, 54, 55, 36, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 58, 58, 58, 59, 60, 61, + 61, 61, 61, 62, 63, 63, 63, 63, 63, 63, 64, 36, 36, 36, 65, 36, + 66, 66, 66, 66, 67, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 68, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70 +}; + +static RE_UINT16 re_block_table_2[] = { + 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 10, 10, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 14, 15, 16, 16, 16, + 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 19, 20, 21, 21, 22, 22, + 23, 23, 24, 25, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, + 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, + 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, + 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, + 41, 41, 41, 41, 41, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 46, 46, 46, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 48, 49, 49, 49, 50, 51, 52, 53, 54, 54, 54, 54, + 55, 55, 55, 55, 55, 56, 57, 57, 58, 58, 59, 60, 61, 61, 61, 62, + 63, 64, 64, 64, 64, 65, 66, 66, 67, 67, 67, 67, 68, 68, 69, 69, + 70, 70, 71, 72, 73, 74, 75, 76, 77, 77, 77, 77, 78, 78, 79, 79, + 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, + 82, 82, 82, 83, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 92, 92, + 93, 93, 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, + 95, 95, 96, 97, 97, 97, 97, 97, 98, 98, 98, 98, 99, 100, 100, 100, + 101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 103, 104, + 105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 107, 107, 107, 107, + 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, + 110, 110, 110, 111, 112, 112, 112, 112, 113, 114, 115, 115, 116, 116, 116, 117, + 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 121, + 122, 122, 123, 123, 123, 124, 124, 124, 125, 126, 127, 127, 128, 129, 130, 131, + 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 135, 135, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 138, 139, 140, 141, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 143, 143, 143, 144, 144, 144, 145, 146, 146, 146, 146, 146, 146, 146, + 147, 148, 149, 149, 150, 150, 150, 151, 152, 153, 154, 155, 156, 156, 156, 157, + 158, 158, 158, 159, 160, 160, 160, 161, 162, 163, 164, 165, 166, 166, 167, 167, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 170, 170, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 172, 172, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 177, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 179, 180, 181, 182, 183, 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, 185, + 186, 186, 186, 186, 187, 187, 187, 187, 188, 188, 189, 189, 190, 191, 192, 193, + 26, 26, 26, 26, 194, 195, 195, 196, 197, 198, 199, 200, 201, 202, 202, 26, + 203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 26, 26, 26, 26, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 26, 26, 26, 26, + 214, 214, 215, 216, 217, 218, 26, 219, 220, 221, 26, 26, 222, 223, 223, 223, + 224, 224, 224, 225, 226, 26, 227, 227, 228, 228, 229, 230, 231, 232, 26, 26, + 233, 233, 234, 26, 235, 235, 235, 235, 236, 236, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 237, 238, 238, 26, 26, 239, 240, 241, 242, 26, 243, 244, 245, + 246, 246, 246, 246, 247, 247, 248, 249, 250, 250, 251, 252, 253, 253, 253, 254, + 255, 255, 256, 26, 257, 258, 259, 259, 260, 260, 260, 260, 26, 26, 26, 26, + 261, 261, 261, 261, 262, 262, 262, 26, 26, 26, 26, 26, 263, 263, 263, 263, + 264, 264, 264, 265, 266, 266, 267, 26, 268, 268, 26, 26, 26, 26, 26, 26, + 269, 269, 270, 26, 26, 271, 271, 271, 272, 272, 272, 26, 26, 273, 273, 273, + 274, 274, 275, 276, 276, 277, 278, 278, 26, 26, 26, 26, 26, 26, 26, 26, + 279, 279, 279, 280, 281, 281, 26, 26, 282, 282, 282, 283, 283, 284, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 285, 26, 26, 26, 26, 26, 286, 287, 287, + 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, + 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, + 289, 289, 289, 289, 290, 290, 290, 290, 290, 290, 291, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, + 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, + 292, 293, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 296, 297, 26, 26, 298, 299, 300, 300, 300, 300, 301, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 302, 302, 302, 26, 26, 26, 303, 303, 303, 303, 303, 26, 26, 304, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, 308, 308, 308, 308, 309, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 310, 310, 310, 310, 310, 310, 310, 310, 311, 312, 313, 314, 315, 315, 315, 315, + 315, 315, 315, 315, 315, 315, 315, 315, 26, 26, 26, 26, 26, 26, 26, 26, + 316, 316, 316, 316, 316, 317, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 318, 318, 318, 318, 318, 318, 318, 318, 319, 319, 319, 319, 319, 319, 319, 319, + 320, 320, 321, 26, 26, 26, 26, 322, 323, 323, 323, 324, 26, 26, 26, 26, + 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, + 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, + 326, 326, 326, 326, 326, 327, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 328, 329, 26, 26, 26, 26, 26, 26, 330, 330, 331, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 332, 332, 26, 26, 26, 26, 26, 26, 26, 26, + 333, 333, 333, 333, 333, 333, 333, 26, 334, 334, 334, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 335, 336, 336, 26, 26, 337, 337, 338, 26, 26, 26, 26, 26, + 339, 339, 339, 339, 339, 339, 339, 339, 26, 26, 26, 26, 26, 26, 26, 26, + 340, 341, 342, 342, 342, 343, 343, 343, 344, 344, 344, 344, 344, 344, 344, 344, + 345, 345, 345, 345, 345, 345, 345, 345, 346, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, + 347, 347, 348, 349, 350, 350, 350, 350, 351, 351, 351, 351, 352, 352, 352, 352, + 353, 353, 353, 353, 353, 353, 353, 353, 354, 354, 354, 354, 354, 354, 354, 354, + 355, 355, 355, 356, 357, 357, 357, 357, 358, 358, 358, 358, 358, 358, 358, 358, + 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 26, 360, 360, 360, 360, 360, 360, 360, 360, + 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, + 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, + 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, + 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 361, 361, 361, 361, 361, 361, + 361, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 363, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 365, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, + 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, + 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, + 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 368, 26, 26, 26, 26, 26, + 369, 369, 369, 369, 26, 26, 26, 26, 370, 370, 370, 370, 370, 370, 370, 371, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, + 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, + 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, + 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373 +}; + +static RE_UINT16 re_block_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 104, 0, - 36, 36, 36, 36, 36, 36, 36, 61, 7, 7, 111, 136, 0, 0, 0, 0, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, + 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, + 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, + 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, + 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, + 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, + 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, + 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, + 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, + 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, + 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, + 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, + 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, + 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, + 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, + 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, + 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, + 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, + 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, + 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, + 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, + 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, + 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, + 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, + 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, + 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, + 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, + 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, + 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, + 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, + 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, + 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, + 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, + 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, + 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, + 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, + 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, + 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, + 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, + 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, + 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, + 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, + 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, + 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, + 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, + 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, + 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, + 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, + 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, + 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308 +}; + +RE_UINT32 re_get_block(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_block_table_1[field_2]; + v = re_block_table_2[(v << 5) | field_1]; + v = re_block_table_3[(v << 5) | field_0]; + + return v; +} + +/* Canonical_Combining_Class. */ +static RE_UINT8 re_canonical_combining_class_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 15, + 16, 9, 17, 18, 19, 20, 21, 22, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, + 9, 9, 9, 9, 26, 9, 9, 9, 27, 9, 28, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 +}; + +static RE_UINT8 re_canonical_combining_class_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, + 9, 0, 10, 11, 0, 0, 12, 13, 14, 15, 16, 0, 0, 0, 0, 17, + 18, 19, 20, 0, 0, 0, 21, 22, 0, 23, 24, 0, 0, 23, 25, 26, + 0, 23, 25, 0, 0, 23, 25, 0, 0, 23, 25, 0, 0, 0, 25, 0, + 0, 0, 27, 0, 0, 23, 25, 0, 0, 28, 25, 0, 0, 0, 29, 0, + 0, 30, 31, 0, 0, 32, 33, 0, 34, 35, 0, 36, 37, 0, 38, 0, + 0, 39, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 0, 0, 0, 0, 43, 0, + 0, 0, 0, 0, 0, 44, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, + 46, 0, 0, 47, 0, 48, 49, 0, 0, 50, 51, 52, 0, 53, 0, 54, + 0, 55, 0, 0, 0, 0, 56, 57, 0, 0, 0, 0, 0, 0, 58, 59, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 65, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 67, 68, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, + 70, 71, 0, 0, 0, 0, 51, 72, 0, 73, 74, 0, 0, 75, 76, 0, + 0, 0, 0, 0, 0, 77, 78, 79, 0, 0, 0, 0, 0, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, + 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 83, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 84, 85, 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, + 0, 0, 70, 63, 0, 90, 0, 0, 91, 92, 0, 75, 0, 0, 93, 0, + 0, 94, 0, 0, 0, 0, 0, 95, 0, 96, 25, 97, 0, 0, 0, 0, + 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 63, 100, 0, + 0, 63, 0, 0, 0, 101, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, + 0, 90, 0, 0, 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, 0, 76, + 0, 42, 105, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 107, 0, 108, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 109, 0, 110, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, + 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 114, 115, 0, 0, + 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 117, 118, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 121, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_canonical_combining_class_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 3, 3, 3, 3, 2, 4, 3, 3, 3, 3, + 3, 5, 5, 3, 3, 3, 3, 5, 5, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 6, 6, 6, 6, 6, 3, 3, 3, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 7, 1, 3, 3, 3, 1, 1, 1, 3, 3, 0, + 1, 1, 1, 3, 3, 3, 3, 1, 2, 3, 3, 1, 8, 9, 9, 8, + 9, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 1, 1, 1, 1, 3, 1, 1, 1, 10, 3, 1, 1, 1, 1, + 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, 3, 1, 1, 10, 11, 1, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 0, 25, + 0, 26, 27, 0, 1, 3, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 28, 29, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 28, 29, + 30, 34, 35, 1, 1, 3, 3, 1, 1, 1, 1, 1, 3, 1, 1, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, + 1, 1, 1, 3, 1, 0, 0, 1, 1, 0, 3, 1, 1, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 3, 1, 1, 3, 1, 1, 3, 3, 3, 1, 3, 3, 1, 3, 1, + 1, 1, 3, 1, 3, 1, 3, 1, 3, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 3, 1, 1, 3, 1, 1, 3, 1, 1, 1, 3, 3, 3, + 31, 32, 33, 1, 1, 1, 3, 1, 1, 3, 3, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, + 0, 1, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, + 0, 0, 0, 0, 0, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 43, 43, 43, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 46, 47, 0, 48, 0, 0, 0, 0, 0, 47, 47, 47, 47, 0, 0, + 47, 0, 1, 1, 39, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 38, 0, 39, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 1, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, + 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, 3, 0, 3, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 6, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, + 1, 0, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 9, 49, 3, + 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 11, 11, 3, 0, 1, 8, 3, 1, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 6, 6, 1, 1, 1, 1, 6, 6, 6, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 6, 6, 1, 3, 1, 6, 6, 3, 3, 3, 3, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 11, 2, 10, 51, 51, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 3, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, + 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 3, 0, 0, 0, 0, 39, + 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 3, 1, 1, 1, 3, 1, 3, 3, 3, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 38, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 39, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 38, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 39, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 39, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 39, 38, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 39, 0, + 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 0, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 4, 4, 6, 6, 6, 0, 0, 0, 55, 4, 4, + 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 0, 0, 1, 1, 1, 1, 1, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 38, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +RE_UINT32 re_get_canonical_combining_class(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_canonical_combining_class_table_1[field_2]; + v = re_canonical_combining_class_table_2[(v << 5) | field_1]; + v = re_canonical_combining_class_table_3[(v << 5) | field_0]; + + return v; +} + +/* Cased. */ +static RE_UINT8 re_cased_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 17, 2, 18, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_cased_table_2[] = { + 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 5, 6, 4, + 4, 4, 4, 4, 7, 8, 9, 10, 0, 0, 11, 12, 13, 14, 4, 15, + 4, 4, 4, 4, 16, 4, 4, 4, 4, 17, 18, 4, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 20, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 22, + 0, 0, 0, 0, 23, 21, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 22, 4, 24, 25, 4, 26, 27, 28, + 0, 0, 0, 29, 30, 0, 0, 0, 31, 32, 33, 4, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 35, 4, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 37, 38, 4, 4, 4, 4, 39, 4, 40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 41, 25, 0, 0, 0, 0, 42, 4, 4, 43, 4, 44, 45, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 5, 23, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 4, 4, 48, 0, 0, 46, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 51, 4, 51, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 52, 4, 53, 54, 55, 4, 56, 57, 58, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 59, 60, 5, 52, 52, 37, 37, 61, 61, 62, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 63, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 64, 64, 36, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_cased_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, + 255, 255, 255, 255, 255, 255, 255, 247, 240, 255, 255, 255, 255, 255, 239, 255, + 255, 255, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, + 0, 0, 207, 188, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, + 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 0, 255, 1, 0, 0, + 191, 32, 255, 255, 255, 255, 255, 231, 255, 255, 63, 63, 255, 1, 255, 255, + 63, 63, 255, 170, 255, 255, 255, 63, 255, 255, 223, 95, 220, 31, 207, 15, + 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, + 80, 189, 31, 242, 224, 67, 0, 0, 24, 0, 0, 0, 0, 0, 192, 255, + 255, 3, 0, 0, 255, 127, 255, 255, 255, 255, 255, 127, 31, 120, 12, 0, + 191, 32, 0, 0, 255, 63, 0, 0, 252, 255, 255, 255, 255, 120, 255, 255, + 252, 7, 0, 0, 0, 0, 96, 7, 0, 0, 255, 255, 127, 0, 248, 0, + 255, 255, 0, 0, 255, 255, 15, 255, 255, 255, 255, 15, 255, 255, 7, 0, + 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, + 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, + 253, 255, 255, 247, 255, 253, 255, 255, 247, 15, 0, 0, 15, 0, 0, 0, + 255, 3, 255, 255 +}; + +RE_UINT32 re_get_cased(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_cased_table_1[field_2]; + v = re_cased_table_2[(v << 5) | field_1]; + v = re_cased_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Case_Ignorable. */ +static RE_UINT8 re_case_ignorable_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 14, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 16, + 17, 9, 18, 19, 20, 21, 22, 23, 9, 9, 9, 9, 9, 24, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, 26, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 27, + 9, 9, 9, 9, 28, 9, 29, 9, 30, 9, 31, 9, 32, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 33, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 +}; + +static RE_UINT8 re_case_ignorable_table_2[] = { + 0, 1, 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 6, 6, 6, 6, 6, 7, 8, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 11, 12, 13, 14, + 15, 0, 16, 17, 0, 0, 18, 19, 20, 5, 21, 0, 0, 22, 0, 23, + 24, 25, 26, 0, 0, 0, 27, 6, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 33, 37, 38, 36, 33, 39, 40, 32, 41, 42, 43, 44, 0, 45, 0, + 46, 47, 48, 43, 32, 41, 49, 43, 50, 51, 34, 43, 32, 0, 52, 0, + 0, 53, 54, 0, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 62, 0, + 0, 63, 64, 65, 66, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 68, 69, 69, 0, 70, 71, 0, + 72, 0, 73, 0, 74, 75, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, + 77, 0, 78, 79, 0, 80, 3, 0, 81, 82, 44, 83, 50, 84, 0, 85, + 0, 86, 0, 87, 0, 0, 88, 89, 0, 90, 6, 91, 92, 6, 6, 93, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, + 97, 98, 0, 99, 100, 0, 5, 101, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 102, 0, 0, 0, 103, 0, 0, 0, 104, 0, 0, 0, 6, + 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 107, 0, 0, 108, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, + 111, 0, 0, 112, 113, 0, 0, 114, 6, 50, 0, 17, 115, 0, 0, 57, + 116, 117, 0, 0, 0, 0, 118, 119, 0, 120, 121, 0, 28, 122, 105, 74, + 0, 123, 124, 125, 0, 126, 127, 128, 0, 0, 92, 129, 0, 0, 0, 130, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 131, 50, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132, 133, 134, 0, 0, 0, 0, 135, 1, 2, 3, 17, 47, 0, 0, 136, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 138, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 139, 140, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 32, 143, 144, 135, 50, 145, 146, 0, 28, 147, 0, 148, 50, 149, 150, 0, + 0, 151, 0, 0, 0, 0, 135, 152, 50, 51, 3, 153, 0, 0, 0, 0, + 0, 143, 154, 0, 0, 155, 156, 0, 0, 0, 0, 0, 0, 157, 158, 0, + 0, 159, 3, 0, 0, 160, 0, 0, 67, 161, 0, 0, 0, 0, 0, 0, + 0, 162, 0, 0, 0, 0, 0, 0, 0, 163, 73, 0, 0, 0, 164, 3, + 165, 166, 167, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 169, 0, 0, 131, 170, 0, 0, 0, 171, 172, 0, 173, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 0, 177, 81, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 0, 178, 0, 0, 179, + 0, 0, 0, 0, 180, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 182, 183, 0, 0, + 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 185, 6, 186, 187, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 189, 190, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, 193, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, + 32, 6, 6, 6, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 133, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_case_ignorable_table_3[] = { + 0, 0, 0, 0, 128, 64, 0, 4, 0, 0, 0, 64, 1, 0, 0, 0, + 0, 161, 144, 1, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 48, 4, + 176, 0, 0, 0, 248, 3, 0, 0, 0, 0, 0, 130, 0, 0, 254, 255, + 255, 255, 255, 191, 182, 0, 0, 0, 0, 0, 16, 0, 63, 0, 255, 23, + 1, 248, 255, 255, 0, 0, 1, 0, 0, 0, 192, 191, 255, 61, 0, 0, + 0, 128, 2, 0, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 63, 36, + 0, 0, 192, 255, 255, 63, 0, 0, 0, 0, 0, 14, 0, 0, 248, 255, + 7, 0, 0, 0, 0, 0, 0, 20, 254, 33, 254, 0, 12, 0, 2, 0, + 2, 0, 0, 0, 0, 0, 0, 16, 30, 32, 0, 0, 12, 0, 0, 64, + 6, 0, 0, 0, 134, 57, 2, 0, 0, 0, 35, 0, 190, 33, 0, 0, + 12, 0, 0, 252, 0, 0, 0, 144, 30, 32, 96, 0, 12, 0, 0, 0, + 4, 0, 0, 0, 1, 32, 0, 0, 17, 0, 0, 0, 0, 0, 0, 192, + 193, 61, 96, 0, 64, 48, 0, 0, 3, 0, 0, 0, 0, 0, 0, 24, + 0, 4, 92, 0, 0, 0, 242, 7, 192, 127, 0, 0, 0, 0, 242, 31, + 64, 63, 0, 0, 0, 0, 0, 3, 0, 0, 160, 2, 0, 0, 254, 127, + 223, 224, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 0, 224, 253, 102, + 0, 0, 0, 195, 1, 0, 30, 0, 100, 32, 0, 32, 0, 0, 0, 224, + 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 176, 63, 64, 254, 143, 32, + 0, 120, 0, 0, 8, 0, 0, 0, 96, 0, 0, 0, 0, 2, 0, 0, + 135, 1, 4, 14, 0, 0, 128, 9, 0, 0, 64, 127, 229, 31, 248, 159, + 128, 0, 255, 255, 15, 0, 0, 0, 0, 0, 208, 23, 0, 248, 15, 0, + 60, 59, 0, 0, 64, 163, 3, 0, 0, 240, 207, 0, 0, 0, 0, 63, + 0, 0, 247, 255, 253, 33, 16, 3, 0, 240, 255, 255, 255, 7, 0, 1, + 0, 0, 0, 248, 255, 255, 255, 251, 0, 0, 0, 160, 3, 224, 0, 224, + 0, 224, 0, 96, 0, 248, 0, 3, 144, 124, 0, 0, 223, 255, 2, 128, + 0, 0, 255, 31, 255, 255, 1, 0, 0, 0, 0, 48, 0, 128, 3, 0, + 0, 128, 0, 128, 0, 128, 0, 0, 32, 0, 0, 0, 0, 60, 62, 8, + 0, 0, 0, 126, 0, 0, 0, 112, 0, 0, 32, 0, 0, 16, 0, 0, + 0, 128, 247, 191, 0, 0, 0, 240, 0, 0, 3, 0, 0, 7, 0, 0, + 68, 8, 0, 0, 96, 16, 0, 0, 48, 0, 0, 0, 255, 255, 3, 128, + 192, 63, 0, 0, 128, 255, 3, 0, 0, 0, 200, 51, 0, 126, 102, 0, + 8, 16, 0, 0, 0, 0, 1, 16, 0, 0, 157, 193, 2, 0, 0, 32, + 0, 48, 88, 0, 0, 14, 0, 0, 32, 33, 0, 0, 0, 0, 252, 255, + 255, 255, 8, 0, 255, 255, 0, 0, 0, 0, 36, 0, 0, 0, 0, 128, + 8, 0, 0, 14, 0, 0, 0, 32, 0, 0, 192, 7, 110, 240, 0, 0, + 0, 0, 0, 135, 240, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 255, + 127, 0, 0, 0, 0, 0, 120, 38, 0, 32, 0, 0, 128, 239, 31, 0, + 0, 0, 8, 0, 0, 0, 192, 127, 0, 158, 0, 0, 0, 128, 211, 64, + 248, 7, 0, 0, 192, 31, 31, 0, 92, 0, 0, 64, 0, 0, 248, 133, + 13, 0, 0, 0, 0, 0, 60, 176, 1, 0, 0, 48, 0, 0, 248, 167, + 0, 40, 191, 0, 188, 15, 0, 0, 0, 128, 255, 6, 0, 0, 0, 88, + 0, 0, 240, 12, 254, 7, 0, 0, 0, 0, 248, 121, 128, 0, 126, 14, + 0, 252, 127, 3, 0, 0, 127, 191, 255, 252, 109, 0, 0, 0, 126, 180, + 191, 0, 0, 0, 0, 0, 163, 0, 0, 0, 24, 0, 0, 0, 255, 1, + 0, 0, 31, 0, 0, 0, 127, 0, 0, 128, 255, 255, 27, 0, 0, 0, + 0, 0, 0, 96, 128, 3, 248, 255, 231, 15, 0, 0, 0, 60, 0, 0, + 28, 0, 0, 0, 255, 255, 127, 248, 255, 31, 32, 0, 16, 0, 0, 248, + 254, 255, 0, 0, 127, 255, 255, 249, 219, 7, 0, 0, 0, 0, 255, 63, + 0, 240, 0, 0, 240, 15, 0, 0 +}; + +RE_UINT32 re_get_case_ignorable(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_case_ignorable_table_1[field_2]; + v = re_case_ignorable_table_2[(v << 5) | field_1]; + v = re_case_ignorable_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Changes_When_Casefolded. */ +static RE_UINT8 re_changes_when_casefolded_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_changes_when_casefolded_table_2[] = { + 0, 0, 1, 0, 0, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, + 4, 12, 13, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, + 20, 21, 0, 4, 22, 4, 23, 4, 4, 24, 25, 0, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, + 0, 0, 0, 0, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 31, 4, 4, 4, 32, 33, 34, 35, 20, 36, 37, 38, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 21, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 41, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 42, 0, 43, 4, 4, 4, 44, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 45, 46, 0, 0, 0, 0, 47, 4, 48, 49, 50, 51, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 20, 20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 20, 54, 0, 0, 0, 52, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 20, 57, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_changes_when_casefolded_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 255, 255, 127, 255, + 85, 85, 85, 85, 85, 85, 85, 170, 170, 86, 85, 85, 85, 85, 85, 171, + 214, 206, 219, 177, 213, 210, 174, 17, 176, 173, 170, 74, 85, 85, 214, 85, + 85, 85, 5, 108, 122, 85, 0, 0, 32, 0, 0, 0, 0, 0, 69, 128, + 64, 215, 254, 255, 251, 15, 0, 0, 4, 128, 99, 85, 85, 85, 179, 230, + 255, 255, 255, 255, 255, 255, 0, 0, 1, 84, 85, 85, 171, 42, 85, 85, + 85, 85, 254, 255, 255, 255, 127, 0, 128, 0, 0, 0, 191, 32, 0, 0, + 0, 0, 0, 63, 255, 1, 255, 255, 255, 255, 255, 231, 85, 85, 21, 76, + 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, 0, 255, 0, 0, + 255, 255, 156, 31, 156, 31, 0, 15, 0, 31, 156, 31, 64, 12, 4, 0, + 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, + 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 5, 84, 85, 84, 85, + 85, 85, 0, 106, 85, 40, 69, 85, 85, 125, 95, 85, 244, 2, 0, 0, + 0, 0, 255, 255, 127, 0, 248, 0, 255, 0, 0, 0, 255, 255, 15, 0, + 255, 255, 7, 0, 3, 0, 0, 0 +}; + +RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_changes_when_casefolded_table_1[field_2]; + v = re_changes_when_casefolded_table_2[(v << 5) | field_1]; + v = re_changes_when_casefolded_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Changes_When_Casemapped. */ +static RE_UINT8 re_changes_when_casemapped_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_changes_when_casemapped_table_2[] = { + 0, 0, 1, 1, 0, 2, 3, 3, 4, 5, 4, 4, 6, 7, 8, 4, + 4, 9, 10, 11, 12, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, 18, + 4, 4, 4, 4, 19, 4, 4, 4, 4, 20, 21, 22, 23, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 24, 25, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 26, + 0, 0, 0, 0, 27, 25, 0, 0, 0, 0, 0, 28, 29, 0, 0, 0, + 4, 4, 4, 4, 30, 4, 4, 4, 26, 4, 31, 32, 4, 33, 34, 35, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 29, 4, 37, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 38, 4, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 40, 41, 42, 4, 4, 4, 43, 4, 44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 45, 46, 0, 0, 0, 0, 47, 4, 48, 49, 40, 50, 51, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 4, 4, 55, 0, 0, 53, 56, 46, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 57, 4, 57, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 58, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_changes_when_casemapped_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 255, 255, 127, 255, + 255, 255, 255, 255, 255, 255, 255, 254, 255, 223, 255, 247, 255, 243, 255, 179, + 240, 255, 255, 255, 253, 255, 15, 252, 255, 255, 223, 26, 107, 159, 38, 32, + 141, 31, 4, 96, 32, 0, 0, 0, 0, 0, 207, 184, 64, 215, 255, 255, + 251, 255, 255, 255, 255, 255, 227, 255, 255, 255, 191, 239, 3, 252, 255, 255, + 255, 255, 254, 255, 255, 255, 127, 0, 254, 255, 255, 255, 255, 0, 0, 0, + 191, 32, 255, 255, 255, 255, 255, 231, 255, 255, 63, 63, 255, 1, 255, 255, + 0, 0, 0, 34, 0, 64, 0, 0, 255, 255, 255, 79, 63, 63, 255, 170, + 255, 255, 255, 63, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, + 64, 12, 4, 0, 24, 0, 0, 0, 0, 0, 192, 255, 255, 3, 0, 0, + 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 109, 192, 15, 120, 12, 0, + 191, 32, 0, 0, 255, 63, 0, 0, 255, 255, 255, 15, 252, 255, 252, 255, + 255, 255, 0, 254, 255, 56, 223, 255, 252, 7, 0, 0, 0, 0, 96, 0, + 0, 0, 8, 0, 0, 0, 255, 255, 127, 0, 248, 0, 255, 255, 0, 0, + 255, 255, 15, 255, 255, 255, 7, 0, 15, 0, 0, 0 +}; + +RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_changes_when_casemapped_table_1[field_2]; + v = re_changes_when_casemapped_table_2[(v << 5) | field_1]; + v = re_changes_when_casemapped_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Changes_When_Lowercased. */ +static RE_UINT8 re_changes_when_lowercased_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, + 2, 10, 2, 11, 2, 2, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 14, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_changes_when_lowercased_table_2[] = { + 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, + 3, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, + 18, 19, 0, 3, 20, 3, 21, 3, 3, 22, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 25, + 0, 0, 0, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 28, 3, 3, 3, 29, 30, 31, 32, 30, 33, 34, 35, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 19, 37, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 38, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 39, 0, 40, 3, 3, 3, 41, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 42, 43, 0, 0, 0, 0, 44, 3, 45, 46, 47, 48, 49, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 18, 50, 0, 0, 0, 26, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 18, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 53, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_changes_when_lowercased_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 255, 255, 127, 127, 85, 85, 85, 85, + 85, 85, 85, 170, 170, 84, 85, 85, 85, 85, 85, 43, 214, 206, 219, 177, + 213, 210, 174, 17, 176, 173, 170, 74, 85, 85, 214, 85, 85, 85, 5, 108, + 122, 85, 0, 0, 0, 0, 69, 128, 64, 215, 254, 255, 251, 15, 0, 0, + 0, 128, 0, 85, 85, 85, 144, 230, 255, 255, 255, 255, 255, 255, 0, 0, + 1, 84, 85, 85, 171, 42, 85, 85, 85, 85, 254, 255, 255, 255, 127, 0, + 191, 32, 0, 0, 255, 255, 63, 0, 0, 0, 255, 255, 255, 255, 255, 231, + 85, 85, 21, 64, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, + 0, 255, 0, 0, 0, 255, 0, 31, 0, 31, 0, 15, 0, 31, 0, 31, + 64, 12, 4, 0, 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, + 157, 234, 37, 192, 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 5, + 84, 85, 84, 85, 85, 85, 0, 106, 85, 40, 69, 85, 85, 125, 95, 85, + 244, 2, 0, 0, 0, 0, 32, 0, 255, 0, 0, 0, 255, 255, 15, 0, + 255, 255, 7, 0, 3, 0, 0, 0 +}; + +RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_changes_when_lowercased_table_1[field_2]; + v = re_changes_when_lowercased_table_2[(v << 5) | field_1]; + v = re_changes_when_lowercased_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Changes_When_Titlecased. */ +static RE_UINT8 re_changes_when_titlecased_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_changes_when_titlecased_table_2[] = { + 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 5, 13, 14, 15, 16, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, + 0, 23, 24, 5, 25, 5, 26, 5, 5, 27, 0, 28, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, + 5, 5, 5, 5, 34, 5, 5, 5, 35, 36, 37, 38, 36, 39, 40, 41, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 23, 42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 43, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 23, 44, 45, 5, 5, 5, 46, 24, 47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 48, 49, 0, 0, 0, 0, 50, 5, 51, 52, 53, 54, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 23, 24, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 58, 59, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_changes_when_titlecased_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 0, 0, 0, 128, + 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 84, 85, 171, 170, 170, + 170, 170, 170, 212, 41, 17, 36, 70, 42, 33, 81, 162, 208, 86, 85, 181, + 170, 170, 43, 170, 168, 170, 10, 144, 133, 170, 223, 26, 107, 159, 38, 32, + 141, 31, 4, 96, 32, 0, 0, 0, 0, 0, 138, 56, 0, 0, 1, 0, + 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 47, 9, 0, 0, 255, 255, + 255, 255, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 170, 0, 0, + 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 63, 255, 1, 0, 0, + 0, 0, 0, 34, 0, 64, 0, 0, 170, 170, 234, 15, 255, 0, 63, 0, + 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, 255, 0, 223, 64, + 220, 0, 207, 0, 255, 0, 220, 0, 16, 0, 0, 0, 255, 3, 0, 0, + 255, 255, 255, 127, 98, 21, 72, 0, 10, 80, 8, 0, 191, 32, 0, 0, + 170, 42, 0, 0, 170, 170, 170, 10, 168, 170, 168, 170, 170, 170, 0, 148, + 170, 16, 154, 170, 170, 2, 160, 170, 8, 5, 0, 0, 0, 0, 64, 0, + 0, 0, 8, 0, 127, 0, 248, 0, 0, 255, 255, 255, 255, 255, 0, 0, + 0, 0, 0, 255, 255, 255, 255, 15, 255, 255, 7, 0, 252, 255, 255, 255, + 15, 0, 0, 0 +}; + +RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_changes_when_titlecased_table_1[field_2]; + v = re_changes_when_titlecased_table_2[(v << 5) | field_1]; + v = re_changes_when_titlecased_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Changes_When_Uppercased. */ +static RE_UINT8 re_changes_when_uppercased_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_changes_when_uppercased_table_2[] = { + 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 5, 13, 14, 15, 16, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, + 0, 23, 24, 5, 25, 5, 26, 5, 5, 27, 0, 28, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 30, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 33, 34, 0, 0, 0, + 5, 5, 5, 5, 35, 5, 5, 5, 36, 37, 38, 39, 24, 40, 41, 42, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 23, 43, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 44, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 23, 45, 46, 5, 5, 5, 47, 24, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 49, 50, 0, 0, 0, 0, 51, 5, 52, 53, 54, 55, 56, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 23, 24, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 59, 60, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_changes_when_uppercased_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 0, 0, 0, 128, + 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 84, 85, 171, 170, 170, + 170, 170, 170, 212, 41, 17, 36, 70, 42, 33, 81, 162, 96, 91, 85, 181, + 170, 170, 45, 170, 168, 170, 10, 144, 133, 170, 223, 26, 107, 159, 38, 32, + 141, 31, 4, 96, 32, 0, 0, 0, 0, 0, 138, 56, 0, 0, 1, 0, + 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 47, 9, 0, 0, 255, 255, + 255, 255, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 170, 0, 0, + 254, 255, 255, 255, 255, 0, 0, 0, 255, 255, 255, 231, 0, 0, 0, 63, + 255, 1, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 170, 170, 234, 15, + 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, + 255, 255, 223, 80, 220, 16, 207, 0, 255, 0, 220, 16, 16, 0, 0, 0, + 255, 3, 0, 0, 255, 255, 255, 127, 98, 21, 72, 0, 10, 80, 8, 0, + 191, 32, 0, 0, 170, 42, 0, 0, 170, 170, 170, 10, 168, 170, 168, 170, + 170, 170, 0, 148, 170, 16, 154, 170, 170, 2, 160, 170, 8, 5, 0, 0, + 0, 0, 64, 0, 0, 0, 8, 0, 127, 0, 248, 0, 0, 255, 255, 255, + 255, 255, 0, 0, 0, 0, 0, 255, 255, 255, 255, 15, 255, 255, 7, 0, + 252, 255, 255, 255, 15, 0, 0, 0 +}; + +RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_changes_when_uppercased_table_1[field_2]; + v = re_changes_when_uppercased_table_2[(v << 5) | field_1]; + v = re_changes_when_uppercased_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Dash. */ +static RE_UINT8 re_dash_table_1[] = { + 0, 1, 2, 2, 2, 3, 4, 2, 5, 2, 2, 6, 7, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, + 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_dash_table_2[] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 16, 17, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_dash_table_3[] = { + 0, 0, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 0, 0, 64, + 1, 0, 0, 0, 64, 0, 0, 0, 0, 0, 63, 0, 0, 0, 8, 0, + 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 4, 0, 0, 0, 128, 4, + 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 6, 0, + 0, 0, 0, 1, 8, 0, 0, 0 +}; + +RE_UINT32 re_get_dash(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_dash_table_1[field_2]; + v = re_dash_table_2[(v << 5) | field_1]; + v = re_dash_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Decomposition_Type. */ +static RE_UINT8 re_decomposition_type_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 14, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 16, 5, 5, 5, 5, 5, 5, 5, 5, 17, 18, + 5, 5, 5, 5, 19, 20, 21, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 22, 23, 5, 5, 5, 5, 5, 24, 25, 5, 26, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 +}; + +static RE_UINT8 re_decomposition_type_table_2[] = { + 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, + 11, 12, 0, 0, 0, 13, 14, 15, 0, 0, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 29, 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 34, 0, + 0, 35, 36, 0, 0, 0, 0, 0, 0, 0, 37, 0, 38, 0, 39, 0, + 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 39, 0, 0, 0, 42, 0, + 0, 43, 0, 0, 0, 43, 44, 0, 45, 0, 46, 47, 48, 49, 0, 0, + 0, 50, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 57, 58, 59, 0, 0, + 60, 60, 60, 60, 61, 60, 60, 62, 63, 60, 64, 65, 60, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 0, 0, 75, 76, 77, 78, 79, 80, 81, 0, + 82, 83, 84, 85, 86, 87, 0, 88, 0, 89, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 90, 78, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 94, 0, 0, 95, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, + 0, 0, 0, 0, 99, 0, 0, 43, 78, 78, 78, 78, 78, 78, 100, 0, + 101, 102, 103, 104, 105, 103, 104, 106, 0, 107, 78, 78, 108, 0, 0, 0, + 109, 78, 110, 111, 92, 92, 112, 113, 114, 114, 115, 116, 114, 114, 114, 117, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 120, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, 0, 0, 0, 0, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 123, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 60, 60, 60, 60, 60, 60, 60, 60, + 124, 125, 60, 126, 60, 60, 62, 0, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 135, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163, + 0, 0, 0, 0, 164, 165, 0, 0, 0, 166, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 172, 0, 173, 174, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 175, 175, 176, 175, 177, 178, 179, 175, 180, 181, 182, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 183, 175, 175, 175, 175, 175, 175, 175, 175, 184, 175, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 185, 186, 187, 188, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_decomposition_type_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 2, + 0, 0, 3, 3, 2, 2, 0, 0, 2, 3, 3, 0, 4, 4, 4, 0, + 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 0, 2, 2, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 2, + 2, 0, 0, 5, 5, 5, 5, 5, 5, 2, 0, 0, 5, 5, 5, 5, + 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, + 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 2, 2, 2, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, + 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, + 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 2, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 2, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, + 2, 2, 2, 5, 5, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 0, 0, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, + 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 5, 5, 0, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 5, 5, 2, 5, 2, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, 0, 0, + 5, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 0, 5, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, + 2, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 2, 0, + 5, 5, 2, 2, 2, 2, 2, 1, 2, 2, 2, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 0, 7, 2, 0, 0, 7, 7, 7, 7, 7, 0, 0, + 3, 2, 3, 0, 7, 0, 5, 0, 7, 0, 5, 5, 7, 7, 0, 7, + 7, 7, 0, 7, 7, 2, 2, 2, 2, 7, 0, 2, 7, 7, 7, 7, + 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 0, 2, 2, 0, 2, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 0, 5, 0, 0, 5, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 5, 5, 0, 0, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 0, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, 0, + 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, + 5, 0, 5, 0, 0, 5, 0, 5, 0, 5, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 5, 5, 0, 5, 5, 0, 5, 5, 0, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 2, 2, 0, 5, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 5, 5, 5, 5, 0, 0, 0, 5, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 0, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 5, 0, 5, 0, 0, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 5, 0, 5, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 0, + 5, 5, 0, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, + 12, 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, + 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, + 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, + 14, 15, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, + 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, + 12, 13, 14, 15, 12, 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, + 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 13, 14, 15, 12, 13, 12, 13, 12, 13, 12, 12, 13, + 12, 13, 12, 13, 12, 13, 14, 15, 14, 15, 12, 13, 12, 13, 12, 13, + 12, 13, 12, 13, 12, 13, 12, 13, 14, 12, 13, 14, 12, 13, 14, 15, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, + 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 13, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 13, 14, 14, 14, 14, 14, 14, 13, 14, 13, 13, 14, 14, 13, 13, + 14, 14, 13, 14, 13, 14, 13, 13, 14, 13, 13, 14, 13, 14, 13, 13, + 14, 13, 14, 14, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 13, 13, + 13, 13, 13, 14, 13, 13, 14, 13, 14, 14, 14, 13, 14, 14, 14, 14, + 0, 0, 14, 14, 14, 14, 13, 13, 14, 13, 13, 13, 13, 14, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 14, 14, 13, 13, 14, 13, 14, 13, 13, 13, 13, 13, + 13, 13, 13, 14, 14, 14, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 0, 10, 10, 2, 2, 2, 2, 2, 2, 2, + 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 16, 0, 0, 0, 0, + 12, 15, 12, 0, 12, 0, 12, 15, 12, 15, 12, 15, 12, 15, 12, 15, + 12, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, 14, 15, 12, 13, 12, + 13, 14, 15, 12, 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, + 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 12, 13, 12, 13, 12, + 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, + 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, + 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, + 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 12, + 13, 12, 13, 14, 15, 12, 13, 12, 13, 12, 13, 12, 13, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, + 0, 0, 17, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 17, 17, 17, + 0, 0, 17, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 17, 17, 17, 17, 17, 17, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, + 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, + 0, 0, 7, 0, 0, 7, 7, 0, 0, 7, 7, 7, 7, 0, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 7, 7, + 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 0, 0, 7, 7, 7, + 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 0, + 7, 7, 7, 7, 7, 0, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, + 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 7, 7, 0, 7, 0, 0, 7, 0, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 0, 7, 7, 7, 7, 0, 7, 0, 7, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 7, 0, 7, 0, 7, 0, 7, 7, 7, + 0, 7, 7, 0, 7, 0, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, + 0, 7, 7, 0, 7, 0, 0, 7, 7, 7, 7, 0, 7, 7, 7, 7, + 7, 7, 7, 0, 7, 7, 7, 7, 0, 7, 7, 7, 7, 0, 7, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, + 0, 7, 7, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0 +}; + +RE_UINT32 re_get_decomposition_type(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_decomposition_type_table_1[field_2]; + v = re_decomposition_type_table_2[(v << 5) | field_1]; + v = re_decomposition_type_table_3[(v << 5) | field_0]; + + return v; +} + +/* Default_Ignorable_Code_Point. */ +static RE_UINT8 re_default_ignorable_code_point_table_1[] = { + 0, 1, 2, 2, 3, 4, 5, 2, 6, 2, 2, 2, 7, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, + 2, 2, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 11, 11, 11, 11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_default_ignorable_code_point_table_2[] = { + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 12, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 +}; + +static RE_UINT8 re_default_ignorable_code_point_table_3[] = { + 0, 0, 0, 0, 0, 32, 0, 0, 0, 128, 0, 0, 0, 0, 0, 16, + 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 48, 0, 0, 120, 0, 0, + 0, 248, 0, 0, 0, 124, 0, 0, 255, 255, 0, 0, 16, 0, 0, 0, + 0, 0, 255, 1, 15, 0, 0, 0, 0, 0, 248, 7, 255, 255, 255, 255 +}; + +RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_default_ignorable_code_point_table_1[field_2]; + v = re_default_ignorable_code_point_table_2[(v << 5) | field_1]; + v = re_default_ignorable_code_point_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Deprecated. */ +RE_UINT32 re_get_deprecated(RE_UINT32 codepoint) { + if (codepoint == 0x0149) + return 1; + if (codepoint == 0x0673) + return 1; + if (codepoint == 0x0F77) + return 1; + if (codepoint == 0x0F79) + return 1; + if (0x17A3 <= codepoint && codepoint <= 0x17A4) + return 1; + if (0x206A <= codepoint && codepoint <= 0x206F) + return 1; + if (0x2329 <= codepoint && codepoint <= 0x232A) + return 1; + if (codepoint == 0x0E0001) + return 1; + + return 0; +} + +/* Diacritic. */ +static RE_UINT8 re_diacritic_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 9, 10, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, 12, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 14, + 15, 8, 16, 17, 18, 19, 20, 21, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 22, 23, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 24, 8, 8, 8, 25, 8, 26, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 +}; + +static RE_UINT8 re_diacritic_table_2[] = { + 0, 0, 1, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 5, 5, 5, 5, 6, 7, 8, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 11, 12, 13, 0, + 0, 0, 14, 0, 0, 0, 15, 16, 0, 4, 17, 0, 0, 18, 0, 19, + 20, 0, 0, 0, 0, 0, 0, 21, 0, 22, 23, 24, 0, 22, 25, 0, + 0, 22, 25, 0, 0, 22, 25, 26, 0, 22, 27, 0, 0, 0, 25, 0, + 0, 0, 25, 0, 0, 22, 25, 0, 0, 28, 25, 0, 0, 0, 29, 0, + 0, 0, 30, 0, 0, 31, 32, 0, 20, 33, 0, 0, 34, 0, 35, 0, + 0, 36, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 41, 0, 42, 0, 0, 0, 43, 44, 45, 0, 46, 0, 0, + 0, 47, 0, 48, 0, 0, 4, 49, 0, 50, 5, 17, 0, 0, 51, 52, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 58, 0, 0, 59, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 60, 61, 0, 0, 62, 5, 63, 0, 0, 64, 0, 0, 20, + 0, 0, 0, 0, 0, 0, 44, 65, 0, 66, 67, 0, 0, 67, 2, 68, + 0, 0, 0, 69, 0, 15, 70, 71, 0, 0, 72, 73, 0, 0, 0, 74, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 75, 0, 0, 0, 0, 0, 0, 0, 1, 2, 76, 77, 0, 0, 78, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 81, 0, 0, 0, 82, 0, 67, 0, 0, 83, 0, + 0, 84, 0, 0, 0, 0, 0, 85, 0, 22, 25, 86, 0, 0, 0, 0, + 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 15, 2, 0, + 0, 15, 0, 0, 0, 47, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, + 0, 81, 0, 0, 0, 0, 0, 0, 0, 90, 78, 0, 0, 0, 0, 2, + 0, 43, 91, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 93, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 94, 0, 95, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 62, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 98, 99, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 101, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_diacritic_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 129, 144, 1, + 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 224, 7, 0, 48, 4, + 48, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 2, 0, 0, 254, 255, + 251, 255, 255, 191, 22, 0, 0, 0, 0, 248, 135, 1, 0, 0, 0, 128, + 97, 28, 0, 0, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 63, 0, + 0, 0, 0, 3, 248, 255, 255, 127, 0, 0, 0, 16, 0, 32, 30, 0, + 0, 0, 2, 0, 0, 32, 0, 0, 0, 0, 0, 224, 0, 32, 32, 0, + 0, 0, 0, 24, 0, 4, 0, 0, 128, 95, 0, 0, 0, 0, 0, 4, + 0, 31, 0, 0, 0, 0, 160, 194, 220, 0, 0, 0, 64, 0, 0, 0, + 0, 0, 128, 6, 24, 62, 0, 0, 128, 191, 0, 12, 0, 254, 15, 32, + 0, 0, 0, 14, 0, 0, 224, 159, 0, 0, 255, 63, 0, 0, 16, 0, + 16, 0, 0, 0, 0, 248, 15, 0, 0, 12, 0, 0, 0, 0, 192, 0, + 0, 0, 0, 63, 255, 33, 144, 3, 0, 240, 255, 255, 240, 255, 0, 0, + 0, 0, 224, 227, 0, 0, 0, 160, 3, 224, 0, 224, 0, 224, 0, 96, + 0, 128, 3, 0, 0, 128, 0, 0, 0, 252, 0, 0, 0, 0, 0, 30, + 0, 128, 0, 176, 0, 0, 0, 48, 0, 0, 3, 0, 3, 0, 0, 0, + 0, 7, 0, 0, 255, 255, 3, 0, 0, 120, 0, 0, 0, 0, 8, 0, + 32, 0, 0, 0, 0, 0, 0, 56, 7, 0, 0, 0, 0, 0, 64, 0, + 0, 0, 0, 248, 0, 14, 0, 0, 0, 48, 0, 0, 255, 255, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 192, 8, 0, 0, 0, 96, 0, 0, 0, + 252, 0, 0, 0, 0, 0, 0, 6, 0, 0, 24, 0, 1, 28, 0, 0, + 0, 0, 96, 0, 0, 6, 0, 0, 192, 31, 31, 0, 68, 0, 0, 0, + 12, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 96, 128, 0, 0, 0, + 52, 0, 0, 0, 0, 0, 128, 0, 0, 0, 31, 0, 0, 0, 127, 0, + 0, 128, 255, 255, 128, 227, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, + 0, 240, 0, 0, 112, 7, 0, 0 +}; + +RE_UINT32 re_get_diacritic(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_diacritic_table_1[field_2]; + v = re_diacritic_table_2[(v << 5) | field_1]; + v = re_diacritic_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* East_Asian_Width. */ +static RE_UINT8 re_east_asian_width_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 2, 4, 5, 6, 7, 8, 9, 9, 9, + 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 12, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 13, 2, 2, 14, 14, 14, 14, 14, 14, 15, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 9, 9, 9, 9, + 9, 18, 9, 19, 2, 2, 2, 2, 2, 2, 2, 2, 20, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, 22, 23, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 24, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 24, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 26, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 26 +}; + +static RE_UINT8 re_east_asian_width_table_2[] = { + 0, 1, 1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 0, 0, 10, 0, + 0, 0, 11, 12, 0, 0, 13, 0, 14, 14, 14, 15, 16, 17, 18, 0, + 19, 14, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 23, 0, 24, 25, 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 0, 0, 41, 42, 0, 0, 0, 0, 0, 43, + 0, 0, 0, 14, 14, 14, 14, 44, 14, 14, 45, 46, 47, 48, 49, 50, + 51, 0, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 67, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 21, 21, 69, 21, 21, 21, 21, 21, 21, 70, 71, + 72, 73, 74, 21, 75, 21, 21, 21, 76, 77, 21, 21, 78, 21, 21, 79, + 73, 21, 80, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 81, 21, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 84, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 85, 86, 87, 88, 0, 0, 0, 0, 89, 90, 90, 91, 92, 93, 94, 95, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 97, + 21, 21, 21, 21, 21, 21, 70, 0, 98, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 73, 0, 99, 100, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 101, 0, 0, 0, 0, 0, 0, 0, 0, + 102, 0, 0, 0, 0, 0, 103, 0, 104, 105, 14, 106, 107, 108, 0, 0, + 109, 101, 110, 111, 0, 0, 0, 0, 21, 112, 21, 113, 69, 21, 114, 115, + 21, 73, 116, 21, 21, 21, 21, 117, 21, 118, 119, 120, 121, 102, 0, 122, + 21, 21, 123, 0, 21, 21, 124, 125, 0, 0, 0, 0, 0, 0, 0, 126, + 0, 0, 0, 0, 0, 0, 0, 0, 127, 128, 129, 130, 21, 21, 131, 21, + 0, 0, 0, 132, 133, 134, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 118, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 136 +}; + +static RE_UINT8 re_east_asian_width_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 2, 1, 1, 2, 1, 1, 2, 2, 0, 2, 0, 1, 2, 2, 1, + 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, + 2, 2, 0, 0, 0, 0, 2, 0, 2, 2, 2, 0, 2, 2, 0, 0, + 2, 0, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 2, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, + 2, 2, 2, 0, 2, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 2, 0, 2, 2, 2, 0, 2, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, + 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 2, + 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2, + 2, 0, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 0, + 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, + 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, + 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 2, 2, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, + 0, 0, 0, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 0, 2, 2, + 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, + 2, 0, 2, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 2, + 0, 0, 0, 0, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, + 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 2, 0, 0, 0, 0, 2, 2, 3, 2, 2, 2, 2, 2, + 2, 2, 3, 3, 2, 3, 2, 2, 2, 2, 3, 2, 2, 3, 2, 2, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, + 0, 0, 0, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 3, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, + 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4, + 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 0, 4, 4, 4, 4, 4, 4, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 3, 3, 3, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0 +}; + +RE_UINT32 re_get_east_asian_width(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_east_asian_width_table_1[field_2]; + v = re_east_asian_width_table_2[(v << 5) | field_1]; + v = re_east_asian_width_table_3[(v << 5) | field_0]; + + return v; +} + +/* Emoji. */ +static RE_UINT8 re_emoji_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +static RE_UINT8 re_emoji_table_2[] = { + 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 6, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, 10, 11, + 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32, 0, 0, 0, 0, 0, + 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 36, 37, 0, 0, 38, + 39, 40, 41, 0, 0, 0, 0, 0, 42, 43, 42, 42, 44, 42, 42, 45, + 42, 42, 42, 42, 42, 42, 42, 46, 42, 47, 48, 49, 50, 51, 52, 53, + 42, 42, 54, 0, 42, 42, 55, 56, 0, 0, 0, 0, 0, 0, 0, 57, + 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, 42, 42, 62, 42, + 0, 0, 0, 63, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_emoji_table_3[] = { + 0, 0, 0, 0, 8, 4, 255, 3, 0, 66, 0, 0, 0, 0, 0, 16, + 0, 2, 0, 0, 4, 0, 0, 2, 0, 0, 240, 3, 0, 6, 0, 0, + 0, 0, 0, 12, 0, 1, 0, 0, 0, 128, 0, 0, 0, 254, 15, 7, + 4, 0, 0, 0, 0, 12, 64, 0, 1, 0, 0, 0, 0, 0, 0, 120, + 31, 64, 50, 33, 77, 196, 0, 7, 5, 255, 15, 128, 105, 1, 0, 200, + 0, 0, 252, 26, 131, 12, 3, 96, 48, 193, 26, 0, 0, 6, 191, 39, + 36, 191, 84, 32, 2, 1, 24, 0, 144, 80, 184, 0, 24, 0, 0, 0, + 0, 0, 224, 0, 2, 0, 1, 128, 0, 0, 48, 0, 224, 0, 0, 24, + 0, 0, 33, 0, 0, 0, 1, 32, 0, 0, 128, 2, 16, 0, 0, 0, + 0, 0, 3, 192, 0, 64, 254, 7, 192, 255, 255, 255, 6, 0, 0, 4, + 0, 128, 252, 7, 0, 0, 3, 0, 255, 255, 255, 255, 243, 255, 255, 255, + 255, 255, 207, 206, 255, 255, 185, 255, 255, 255, 255, 191, 255, 255, 255, 63, + 0, 126, 255, 255, 255, 128, 249, 7, 128, 60, 97, 0, 48, 1, 6, 16, + 28, 0, 14, 112, 10, 129, 8, 252, 255, 255, 0, 0, 63, 248, 231, 0, + 63, 26, 249, 31, 255, 15, 0, 0, 0, 240, 255, 255, 255, 255, 255, 247, + 191, 255, 255, 255, 255, 255, 255, 253, 255, 239, 255, 255, 0, 0, 31, 7, + 127, 0, 255, 255, 255, 1, 127, 0, 7, 0, 127, 0 +}; + +RE_UINT32 re_get_emoji(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_emoji_table_1[field_2]; + v = re_emoji_table_2[(v << 5) | field_1]; + v = re_emoji_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Emoji_Component. */ +static RE_UINT8 re_emoji_component_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 5, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +static RE_UINT8 re_emoji_component_table_2[] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_emoji_component_table_3[] = { + 0, 0, 0, 0, 8, 4, 255, 3, 0, 32, 0, 0, 8, 0, 0, 0, + 0, 128, 0, 0, 192, 255, 255, 255, 0, 0, 0, 248, 0, 0, 15, 0, + 255, 255, 255, 255 +}; + +RE_UINT32 re_get_emoji_component(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_emoji_component_table_1[field_2]; + v = re_emoji_component_table_2[(v << 5) | field_1]; + v = re_emoji_component_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Emoji_Modifier. */ +RE_UINT32 re_get_emoji_modifier(RE_UINT32 codepoint) { + if (0x01F3FB <= codepoint && codepoint <= 0x01F3FF) + return 1; + + return 0; +} + +/* Emoji_Modifier_Base. */ +static RE_UINT8 re_emoji_modifier_base_table_1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_emoji_modifier_base_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, + 0, 0, 6, 7, 8, 9, 0, 0, 0, 0, 0, 10, 11, 0, 0, 0, + 0, 0, 12, 0, 0, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 17, 0, 18, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_emoji_modifier_base_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 2, 0, 60, 0, 0, + 32, 0, 0, 0, 156, 28, 0, 0, 204, 255, 1, 0, 192, 255, 255, 17, + 238, 128, 2, 0, 0, 4, 0, 0, 0, 0, 48, 4, 0, 0, 97, 0, + 224, 248, 0, 0, 8, 0, 112, 0, 1, 16, 0, 0, 0, 144, 0, 255, + 64, 0, 255, 115, 0, 0, 128, 0, 0, 0, 96, 11, 0, 224, 254, 63 +}; + +RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_emoji_modifier_base_table_1[field_2]; + v = re_emoji_modifier_base_table_2[(v << 5) | field_1]; + v = re_emoji_modifier_base_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Emoji_Presentation. */ +static RE_UINT8 re_emoji_presentation_table_1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_emoji_presentation_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 4, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 14, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 17, 0, 0, 0, 0, 0, + 18, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 20, 0, 0, 21, + 22, 23, 24, 0, 0, 0, 0, 0, 25, 26, 25, 27, 28, 25, 29, 30, + 25, 31, 32, 25, 25, 25, 25, 33, 25, 34, 35, 36, 37, 18, 0, 38, + 25, 25, 39, 0, 25, 25, 40, 41, 0, 0, 0, 0, 0, 0, 0, 42, + 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 25, 25, 47, 25, + 0, 0, 0, 48, 49, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_emoji_presentation_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 12, 0, 30, 9, 0, 0, 0, 0, 96, + 0, 0, 48, 0, 0, 255, 15, 0, 0, 0, 0, 128, 0, 0, 8, 0, + 2, 12, 0, 96, 48, 64, 16, 0, 0, 4, 44, 36, 32, 12, 0, 0, + 0, 1, 0, 0, 0, 80, 184, 0, 0, 0, 224, 0, 0, 0, 1, 128, + 0, 0, 0, 24, 0, 0, 33, 0, 16, 0, 0, 0, 0, 128, 0, 0, + 0, 64, 254, 7, 192, 255, 255, 255, 2, 0, 0, 4, 0, 128, 124, 7, + 0, 0, 3, 0, 255, 255, 255, 255, 1, 224, 191, 255, 255, 255, 255, 223, + 255, 255, 15, 0, 255, 135, 15, 0, 255, 255, 17, 255, 255, 255, 255, 127, + 253, 255, 255, 255, 255, 255, 255, 159, 255, 255, 255, 63, 0, 120, 255, 255, + 255, 0, 0, 4, 0, 0, 96, 0, 0, 0, 0, 248, 255, 255, 0, 0, + 63, 16, 231, 0, 0, 24, 240, 31, 255, 15, 0, 0, 0, 240, 255, 255, + 255, 255, 255, 247, 191, 255, 255, 255, 255, 255, 255, 253, 255, 239, 255, 255, + 0, 0, 31, 7, 127, 0, 255, 255, 255, 1, 127, 0, 7, 0, 127, 0 +}; + +RE_UINT32 re_get_emoji_presentation(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_emoji_presentation_table_1[field_2]; + v = re_emoji_presentation_table_2[(v << 5) | field_1]; + v = re_emoji_presentation_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Extended_Pictographic. */ +static RE_UINT8 re_extended_pictographic_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 9, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +static RE_UINT8 re_extended_pictographic_table_2[] = { + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 0, 0, 0, 0, 0, 0, 4, 0, 0, 5, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 8, 0, 9, 10, + 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 12, 13, 14, + 15, 16, 16, 16, 17, 16, 16, 16, 18, 19, 20, 21, 22, 23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 26, 0, 0, 0, 0, 0, + 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 29, 9, 0, 30, 31, 32, 16, 33, + 34, 35, 36, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 37, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 38, 39, 16, 16, 16, 16, 16, + 16, 16, 40, 0, 16, 16, 16, 16, 0, 0, 0, 41, 0, 0, 42, 16, + 43, 0, 44, 0, 45, 46, 16, 16, 47, 48, 49, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 38 +}; + +static RE_UINT8 re_extended_pictographic_table_3[] = { + 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 16, 0, 2, 0, 0, + 4, 0, 0, 2, 0, 0, 240, 3, 0, 6, 0, 0, 0, 0, 0, 12, + 0, 1, 0, 0, 0, 128, 0, 0, 0, 254, 15, 7, 4, 0, 0, 0, + 0, 12, 64, 0, 1, 0, 0, 0, 0, 0, 0, 120, 191, 255, 247, 255, + 255, 255, 255, 255, 63, 0, 255, 255, 63, 255, 87, 32, 2, 1, 24, 0, + 144, 80, 184, 0, 248, 0, 0, 0, 0, 0, 224, 0, 2, 0, 1, 128, + 0, 0, 48, 0, 224, 0, 0, 24, 0, 0, 33, 0, 0, 0, 1, 32, + 0, 0, 128, 2, 0, 224, 0, 0, 0, 240, 3, 192, 0, 64, 254, 7, + 0, 224, 255, 255, 63, 0, 0, 0, 254, 255, 0, 4, 0, 128, 252, 247, + 0, 254, 255, 255, 255, 255, 255, 7, 255, 255, 255, 63, 192, 255, 255, 255, + 255, 255, 0, 0, 0, 0, 240, 255, 0, 0, 224, 255, 0, 240, 0, 0, + 0, 255, 0, 252, 0, 255, 0, 0, 0, 192, 255, 255, 0, 240, 255, 255, + 255, 255, 255, 247, 191, 255, 255, 255 +}; + +RE_UINT32 re_get_extended_pictographic(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_extended_pictographic_table_1[field_2]; + v = re_extended_pictographic_table_2[(v << 5) | field_1]; + v = re_extended_pictographic_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Extender. */ +static RE_UINT8 re_extender_table_1[] = { + 0, 1, 2, 3, 4, 4, 5, 6, 4, 4, 4, 4, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 8, 9, 10, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, + 4, 4, 4, 4, 12, 13, 14, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 15, 16, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 17, 4, 18, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 +}; + +static RE_UINT8 re_extender_table_2[] = { + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 13, 0, 0, 14, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 6, + 0, 0, 0, 18, 0, 0, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_extender_table_3[] = { + 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 3, 0, 1, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 32, 0, 64, 0, 0, 0, 0, 4, 0, 0, + 8, 0, 0, 0, 128, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 8, + 32, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 96, 0, 0, 0, 112, + 0, 16, 0, 0, 0, 128, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32, + 0, 0, 24, 0, 192, 1, 0, 0, 0, 0, 0, 1, 12, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 48, 112, 0, 0, 0 +}; + +RE_UINT32 re_get_extender(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_extender_table_1[field_2]; + v = re_extender_table_2[(v << 5) | field_1]; + v = re_extender_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* General_Category. */ +static RE_UINT8 re_general_category_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 19, 20, 20, 21, 21, 21, 21, 21, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 13, 35, 34, 34, + 34, 36, 34, 34, 34, 34, 34, 34, 34, 34, 37, 38, 13, 13, 13, 13, + 13, 39, 13, 40, 34, 34, 34, 34, 34, 34, 34, 34, 41, 34, 34, 42, + 34, 34, 34, 34, 43, 44, 45, 34, 46, 34, 47, 48, 49, 50, 51, 34, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 52, 13, 13, 13, 53, 54, 13, + 13, 13, 13, 55, 13, 13, 13, 13, 13, 13, 56, 34, 34, 34, 57, 34, + 13, 13, 13, 13, 58, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 59, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 60, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 60 +}; + +static RE_UINT16 re_general_category_table_2[] = { + 0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 7, 15, 16, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 25, 26, 27, + 28, 29, 17, 7, 30, 7, 31, 7, 7, 32, 33, 17, 34, 35, 36, 37, + 38, 39, 40, 41, 39, 39, 42, 43, 44, 45, 46, 39, 39, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 54, 101, 102, 103, 54, 104, 105, 106, 107, 108, 109, 110, 54, + 39, 111, 112, 113, 114, 28, 115, 116, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 117, 39, 118, 119, 120, 39, 121, 39, 122, 123, 124, 28, 28, 125, + 126, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 127, 128, 39, 39, 129, 130, 131, 132, 133, 39, 134, 135, 136, + 137, 39, 138, 139, 140, 141, 39, 142, 143, 144, 145, 146, 39, 147, 148, 149, + 150, 39, 151, 152, 153, 154, 155, 54, 156, 157, 158, 159, 160, 161, 39, 162, + 39, 163, 164, 165, 166, 167, 168, 169, 17, 170, 171, 172, 173, 171, 22, 174, + 7, 7, 7, 7, 175, 7, 7, 7, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 200, 200, 200, 200, 200, 200, 200, 201, 202, 149, 203, 204, 205, 206, 207, + 149, 208, 209, 210, 211, 149, 149, 212, 149, 149, 149, 149, 149, 213, 214, 215, + 149, 149, 149, 216, 149, 149, 149, 149, 149, 149, 149, 217, 218, 149, 219, 220, + 149, 149, 149, 149, 149, 149, 149, 149, 200, 200, 200, 200, 221, 200, 222, 223, + 200, 200, 200, 200, 200, 200, 200, 200, 149, 224, 225, 226, 227, 149, 149, 149, + 28, 228, 229, 230, 7, 7, 7, 231, 17, 232, 39, 233, 234, 235, 235, 22, + 236, 237, 238, 54, 239, 149, 149, 240, 149, 149, 149, 149, 149, 149, 241, 242, + 243, 244, 98, 39, 245, 126, 39, 246, 247, 248, 39, 39, 249, 39, 149, 250, + 251, 252, 253, 149, 252, 254, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 149, 149, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 255, + 256, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 257, 149, 258, 165, 39, 39, 39, 39, 39, 39, 39, 39, + 259, 260, 7, 261, 262, 39, 39, 263, 264, 265, 7, 266, 267, 268, 269, 270, + 271, 272, 39, 273, 274, 275, 276, 277, 48, 278, 279, 255, 58, 280, 281, 282, + 39, 283, 284, 285, 39, 286, 287, 288, 289, 290, 291, 292, 17, 17, 39, 293, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 294, 295, 296, + 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, + 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 299, 39, 39, 300, 54, 301, 302, 303, 39, 39, 304, 305, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 306, 307, 39, 308, 39, 309, 310, + 311, 312, 313, 314, 39, 39, 39, 315, 316, 2, 317, 318, 319, 143, 320, 321, + 322, 323, 324, 54, 39, 39, 39, 325, 326, 327, 195, 328, 329, 330, 331, 332, + 54, 54, 54, 54, 255, 39, 333, 334, 39, 335, 336, 337, 338, 39, 339, 54, + 28, 340, 341, 39, 342, 343, 344, 345, 39, 346, 39, 347, 54, 54, 54, 54, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 234, 142, 309, 54, 54, 54, 54, + 348, 349, 350, 351, 143, 352, 54, 353, 354, 355, 54, 54, 39, 356, 357, 210, + 358, 359, 360, 361, 362, 54, 363, 364, 39, 365, 366, 367, 368, 369, 54, 54, + 39, 39, 370, 54, 28, 371, 17, 372, 39, 373, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 374, 39, 375, 54, 54, 362, 376, 377, 54, 54, 307, 378, 234, + 379, 380, 381, 382, 160, 383, 384, 385, 386, 387, 388, 389, 160, 390, 391, 392, + 393, 394, 54, 54, 395, 396, 397, 398, 399, 400, 401, 402, 54, 54, 54, 54, + 39, 403, 404, 405, 39, 406, 407, 54, 54, 54, 54, 54, 39, 408, 409, 54, + 39, 410, 411, 412, 39, 413, 414, 54, 122, 415, 54, 54, 54, 54, 54, 54, + 39, 416, 54, 54, 54, 28, 17, 417, 418, 419, 420, 54, 54, 421, 422, 423, + 424, 425, 426, 39, 427, 428, 39, 139, 54, 54, 54, 54, 54, 54, 54, 54, + 429, 430, 431, 432, 433, 434, 54, 54, 435, 436, 437, 438, 439, 414, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 440, 54, 54, 54, 54, 54, 441, 442, 443, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 300, 54, 54, 54, + 195, 195, 195, 444, 39, 39, 39, 39, 39, 39, 445, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 446, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 447, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 139, 143, 448, 54, 54, 307, 449, 39, 450, 451, 452, 453, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 28, 17, 454, 54, 54, 54, 39, 39, 455, 456, 457, 54, 54, 458, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 459, + 39, 39, 39, 39, 39, 39, 142, 54, 370, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 39, 39, 39, 39, 39, 39, 39, 143, 54, 460, 461, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 296, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 39, 39, 462, 463, 464, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 149, 149, 149, 149, 149, 149, 149, 241, 149, 465, 149, 466, 467, 468, 149, 469, + 149, 149, 470, 54, 54, 54, 54, 471, 149, 149, 472, 473, 54, 54, 54, 54, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 474, 475, 487, + 477, 488, 489, 490, 481, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 22, 502, 22, 503, 504, 505, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 506, 507, 54, 54, 54, 54, 54, 54, 39, 508, 509, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 39, 510, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 39, 39, 39, 39, 39, 511, 54, 28, 512, 513, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 514, 210, 515, 54, 54, 516, 517, 54, 54, 54, 54, 54, 54, + 518, 519, 520, 521, 522, 523, 54, 524, 54, 54, 54, 54, 54, 54, 54, 54, + 149, 525, 149, 149, 240, 526, 527, 241, 528, 149, 149, 149, 149, 529, 54, 530, + 531, 532, 533, 534, 54, 54, 54, 54, 149, 149, 149, 149, 149, 149, 149, 535, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 536, 537, 149, 149, 149, 240, 149, 149, 538, 539, + 525, 149, 540, 149, 541, 542, 54, 54, 149, 149, 149, 543, 149, 149, 544, 149, + 149, 149, 240, 545, 546, 547, 548, 54, 149, 149, 149, 149, 549, 149, 209, 550, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 342, 54, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 551, 39, 39, 39, 39, 39, 39, + 342, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 552, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 553, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 342, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 53, 54, 54, 54, 54, 54, + 554, 555, 555, 555, 54, 54, 54, 54, 22, 22, 22, 22, 22, 22, 22, 556, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 557 +}; + +static RE_UINT8 re_general_category_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 3, 3, 4, 3, 3, 3, 5, 6, 3, 7, 3, 8, 3, 3, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 7, 7, 7, 3, + 3, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 3, 6, 11, 12, + 11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 7, 6, 7, 1, + 2, 3, 4, 4, 4, 4, 14, 3, 11, 14, 15, 16, 7, 17, 14, 11, + 14, 7, 18, 18, 11, 13, 3, 3, 11, 18, 15, 19, 18, 18, 18, 3, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 7, 10, 10, 10, 10, 10, 10, 10, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 7, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 13, 10, 13, 10, 13, 10, 13, 10, + 13, 10, 13, 10, 13, 10, 13, 10, 13, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 10, 13, 10, 13, 10, 13, 13, + 13, 10, 10, 13, 10, 13, 10, 10, 13, 10, 10, 10, 13, 13, 10, 10, + 10, 10, 13, 10, 10, 13, 10, 10, 10, 13, 13, 13, 10, 10, 13, 10, + 10, 13, 10, 13, 10, 13, 10, 10, 13, 10, 13, 13, 10, 13, 10, 10, + 13, 10, 10, 10, 13, 10, 13, 10, 10, 13, 13, 15, 10, 13, 13, 13, + 15, 15, 15, 15, 10, 20, 13, 10, 20, 13, 10, 20, 13, 10, 13, 10, + 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 13, 10, 20, 13, 10, 13, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 13, 13, 13, 13, 13, 13, 10, 10, 13, 10, 10, 13, + 13, 10, 13, 10, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 15, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 11, 11, 11, 11, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 21, 21, 21, 21, 21, 11, 11, 11, 11, 11, 11, 11, 21, 11, 21, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 10, 13, 10, 13, 21, 11, 10, 13, 0, 0, 21, 13, 13, 13, 3, 10, + 0, 0, 0, 0, 11, 11, 10, 3, 10, 10, 10, 0, 10, 0, 10, 10, + 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, + 13, 13, 10, 10, 10, 13, 13, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 13, 13, 13, 13, 10, 13, 7, 10, 13, 10, 10, 13, 13, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 13, 14, 22, 22, 22, 22, 22, 23, 23, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 21, 3, 3, 3, 3, 3, 3, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 3, 8, 0, 0, 14, 14, 4, + 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 8, 22, + 3, 22, 22, 3, 22, 22, 3, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, + 15, 15, 15, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 7, 7, 7, 3, 3, 4, 3, 3, 14, 14, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 3, 17, 0, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 15, 15, + 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 3, 15, 22, 22, 22, 22, 22, 22, 22, 17, 14, 22, + 22, 22, 22, 22, 22, 21, 21, 22, 22, 14, 22, 22, 22, 22, 15, 15, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 14, 14, 15, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 17, + 15, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 21, 21, 14, 3, 3, 3, 21, 0, 0, 22, 4, 4, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 21, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 21, 22, 22, 22, 21, 22, 22, 22, 22, 22, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 0, 0, 3, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 17, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 24, 22, 15, 24, 24, + 24, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 24, 22, 24, 24, + 15, 22, 22, 22, 22, 22, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 22, 22, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 3, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 22, 24, 24, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, + 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 0, 0, 0, 15, 15, 15, 15, 0, 0, 22, 15, 24, 24, + 24, 22, 22, 22, 22, 0, 0, 24, 24, 0, 0, 24, 24, 22, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 15, 15, 0, 15, + 15, 15, 22, 22, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 15, 15, 4, 4, 18, 18, 18, 18, 18, 18, 14, 4, 15, 3, 22, 0, + 0, 22, 22, 24, 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, + 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 15, 0, 15, 15, 0, 15, 15, 0, 0, 22, 0, 24, 24, + 24, 22, 22, 0, 0, 0, 0, 22, 22, 0, 0, 22, 22, 22, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 22, 22, 15, 15, 15, 22, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 22, 24, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, + 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, 22, 15, 24, 24, + 24, 22, 22, 22, 22, 22, 0, 22, 22, 24, 0, 24, 24, 22, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 22, 22, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 3, 4, 0, 0, 0, 0, 0, 0, 0, 15, 22, 22, 22, 22, 22, 22, + 0, 22, 24, 24, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, + 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, 22, 15, 24, 22, + 24, 22, 22, 22, 22, 0, 0, 24, 24, 0, 0, 24, 24, 22, 0, 0, + 0, 0, 0, 0, 0, 22, 22, 24, 0, 0, 0, 0, 15, 15, 0, 15, + 15, 15, 22, 22, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 14, 15, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 15, 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, + 15, 0, 15, 15, 15, 15, 0, 0, 0, 15, 15, 0, 15, 0, 15, 15, + 0, 0, 0, 15, 15, 0, 0, 0, 15, 15, 15, 0, 0, 0, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 24, 24, + 22, 24, 24, 0, 0, 0, 24, 24, 24, 0, 24, 24, 24, 22, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 18, 18, 18, 14, 14, 14, 14, 14, 14, 4, 14, 0, 0, 0, 0, 0, + 22, 24, 24, 24, 22, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, + 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 22, 22, + 22, 24, 24, 24, 24, 0, 22, 22, 22, 0, 22, 22, 22, 22, 0, 0, + 0, 0, 0, 0, 0, 22, 22, 0, 15, 15, 15, 0, 0, 0, 0, 0, + 15, 15, 22, 22, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 3, 18, 18, 18, 18, 18, 18, 18, 14, + 15, 22, 24, 24, 3, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, + 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, 22, 15, 24, 22, + 24, 24, 24, 24, 24, 0, 22, 24, 24, 0, 24, 24, 22, 22, 0, 0, + 0, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 15, 15, 22, 22, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 22, 24, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, + 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 15, 24, 24, + 24, 22, 22, 22, 22, 0, 24, 24, 24, 0, 24, 24, 24, 22, 15, 14, + 0, 0, 0, 0, 15, 15, 15, 24, 18, 18, 18, 18, 18, 18, 18, 15, + 15, 15, 22, 22, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 15, 15, 15, 15, 15, 15, + 0, 22, 24, 24, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 22, 0, 0, 0, 0, 24, + 24, 24, 22, 22, 22, 0, 22, 0, 24, 24, 24, 24, 24, 24, 24, 24, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 24, 24, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 22, 15, 15, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, 4, + 15, 15, 15, 15, 15, 15, 21, 22, 22, 22, 22, 22, 22, 22, 22, 3, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 0, 0, 0, 0, + 0, 15, 15, 0, 15, 0, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 0, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 22, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 15, 0, 0, + 15, 15, 15, 15, 15, 0, 21, 0, 22, 22, 22, 22, 22, 22, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 15, 15, 15, 15, + 15, 14, 14, 14, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 14, 3, 14, 14, 14, 22, 22, 14, 14, 14, 14, 14, 14, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 14, 22, 14, 22, 14, 22, 5, 6, 5, 6, 24, 24, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, + 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24, + 22, 22, 22, 22, 22, 3, 22, 22, 15, 15, 15, 15, 15, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 14, 14, + 14, 14, 14, 14, 14, 14, 22, 14, 14, 14, 14, 14, 14, 0, 14, 14, + 3, 3, 3, 3, 3, 14, 14, 14, 14, 3, 3, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 22, 22, 22, + 22, 24, 22, 22, 22, 22, 22, 22, 24, 22, 22, 24, 24, 22, 22, 15, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, + 15, 15, 15, 15, 15, 15, 24, 24, 22, 22, 15, 15, 15, 15, 22, 22, + 22, 15, 24, 24, 24, 15, 15, 24, 24, 24, 24, 24, 24, 24, 15, 15, + 15, 22, 22, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 22, 24, 24, 22, 22, 24, 24, 24, 24, 24, 24, 22, 15, 24, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 24, 24, 24, 22, 14, 14, + 10, 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, 0, 0, 10, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 3, 21, 13, 13, 13, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 0, + 15, 0, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 22, 22, 22, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 0, 0, 13, 13, 13, 13, 13, 13, 0, 0, + 8, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 3, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 5, 6, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 3, 3, 25, 25, + 25, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, + 15, 15, 22, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 22, 22, 22, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, + 15, 0, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 22, 22, 24, 22, 22, 22, 22, 22, 22, 22, 24, 24, + 24, 24, 24, 24, 24, 24, 22, 24, 24, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 3, 3, 3, 21, 3, 3, 3, 4, 15, 22, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 8, 3, 3, 3, 3, 22, 22, 22, 17, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 15, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 22, 22, 22, 24, 24, 24, 24, 22, 22, 24, 24, 24, 0, 0, 0, 0, + 24, 24, 22, 24, 24, 24, 24, 24, 24, 22, 22, 22, 0, 0, 0, 0, + 14, 0, 0, 0, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 0, 0, 0, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 22, 22, 24, 24, 22, 0, 0, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 24, 22, 24, 22, 22, 22, 22, 22, 22, 22, 0, + 22, 24, 22, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, + 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 22, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 21, 3, 3, 3, 3, 3, 3, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 22, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 22, 24, 22, 22, 22, 22, 22, 24, 22, 24, 24, 24, + 24, 24, 22, 24, 24, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, + 3, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 22, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 24, 22, 22, 22, 22, 24, 24, 22, 22, 24, 22, 22, 22, 15, 15, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 22, 24, 22, 22, 24, 24, 24, 22, 24, 22, + 22, 22, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, + 15, 15, 15, 15, 24, 24, 24, 24, 24, 24, 24, 24, 22, 22, 22, 22, + 22, 22, 22, 22, 24, 24, 22, 22, 0, 0, 0, 3, 3, 3, 3, 3, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 15, 15, 15, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 21, 21, 21, 21, 21, 21, 3, 3, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 3, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 24, 22, 22, 22, 22, 22, 22, 22, 15, 15, 15, 15, 22, 15, 15, + 15, 15, 15, 15, 22, 15, 15, 24, 22, 22, 15, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, 21, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 0, 0, 10, 10, 10, 10, 10, 10, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 0, 0, 10, 10, 10, 10, 10, 10, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 10, 0, 10, 0, 10, 0, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 20, 20, 20, 20, 20, 20, 20, 20, + 13, 13, 13, 13, 13, 13, 13, 13, 20, 20, 20, 20, 20, 20, 20, 20, + 13, 13, 13, 13, 13, 13, 13, 13, 20, 20, 20, 20, 20, 20, 20, 20, + 13, 13, 13, 13, 13, 0, 13, 13, 10, 10, 10, 10, 20, 11, 13, 11, + 11, 11, 13, 13, 13, 0, 13, 13, 10, 10, 10, 10, 20, 11, 11, 11, + 13, 13, 13, 13, 0, 0, 13, 13, 10, 10, 10, 10, 0, 11, 11, 11, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 11, 11, 11, + 0, 0, 13, 13, 13, 0, 13, 13, 10, 10, 10, 10, 20, 11, 11, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17, 17, + 8, 8, 8, 8, 8, 8, 3, 3, 16, 19, 5, 16, 16, 19, 5, 16, + 3, 3, 3, 3, 3, 3, 3, 3, 26, 27, 17, 17, 17, 17, 17, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 16, 19, 3, 3, 3, 3, 12, + 12, 3, 3, 3, 7, 5, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 7, 3, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, + 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 18, 21, 0, 0, 18, 18, 18, 18, 18, 18, 7, 7, 7, 5, 6, 21, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 7, 7, 7, 5, 6, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, + 23, 22, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 10, 14, 14, 14, 14, 10, 14, 14, 13, 10, 10, 10, 13, 13, + 10, 10, 10, 13, 14, 10, 14, 14, 7, 10, 10, 10, 10, 10, 14, 14, + 14, 14, 14, 14, 10, 14, 10, 14, 10, 14, 10, 10, 10, 10, 14, 13, + 10, 10, 10, 10, 13, 15, 15, 15, 15, 13, 14, 14, 13, 13, 10, 10, + 7, 7, 7, 7, 7, 10, 13, 13, 13, 13, 14, 7, 14, 14, 13, 14, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 10, 13, 25, 25, 25, 25, 18, 14, 14, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 7, 7, 14, 14, 14, 14, + 7, 14, 14, 7, 14, 14, 7, 14, 14, 14, 14, 14, 14, 14, 7, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, + 14, 14, 7, 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 14, 14, 14, 14, 14, 14, 14, 14, 5, 6, 5, 6, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 7, 7, 14, 14, 14, 14, 14, 14, 14, 5, 6, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, + 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 5, 6, 5, 6, 5, 6, 5, 6, + 5, 6, 5, 6, 5, 6, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 7, 7, 7, 7, 7, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 6, 5, 6, 5, 6, 5, 6, 5, 6, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 5, 6, 5, 6, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 6, 7, 7, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 14, 14, 7, 7, 7, 7, 7, 7, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, + 10, 13, 10, 10, 10, 13, 13, 10, 13, 10, 13, 10, 13, 10, 10, 10, + 10, 13, 10, 13, 13, 10, 13, 13, 13, 13, 13, 13, 21, 21, 10, 10, + 10, 13, 10, 13, 13, 14, 14, 14, 14, 14, 14, 10, 13, 10, 13, 22, + 22, 22, 10, 13, 0, 0, 0, 0, 0, 3, 3, 3, 3, 18, 3, 3, + 13, 13, 13, 13, 13, 13, 0, 13, 0, 0, 0, 0, 0, 13, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 21, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, + 3, 3, 16, 19, 16, 19, 3, 3, 3, 16, 19, 3, 16, 19, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 8, 3, 3, 8, 3, 16, 19, 3, 3, + 16, 19, 5, 6, 5, 6, 5, 6, 5, 6, 3, 3, 3, 3, 3, 21, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, + 8, 3, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 14, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 2, 3, 3, 3, 14, 21, 15, 25, 5, 6, 5, 6, 5, 6, 5, 6, + 5, 6, 14, 14, 5, 6, 5, 6, 5, 6, 5, 6, 8, 5, 6, 6, + 14, 25, 25, 25, 25, 25, 25, 25, 25, 25, 22, 22, 22, 22, 24, 24, + 8, 21, 21, 21, 21, 21, 14, 14, 25, 25, 25, 21, 15, 3, 14, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 22, 22, 11, 11, 21, 21, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 21, 21, 21, 15, + 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 14, 14, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, + 14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 21, 3, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 15, 22, + 23, 23, 23, 3, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 3, 21, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 21, 21, 22, 22, + 15, 15, 15, 15, 15, 15, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 22, 22, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 11, 11, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 13, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 21, 13, 13, 13, 13, 13, 13, 13, 13, 10, 13, 10, 13, 10, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 21, 11, 11, 10, 13, 10, 13, 15, + 10, 13, 10, 13, 13, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 10, 10, 10, 10, 13, + 10, 10, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 0, 0, 10, 13, 10, 10, 10, 10, 13, 10, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 13, 15, 21, 21, 13, 15, 15, 15, 15, 15, + 15, 15, 22, 15, 15, 15, 22, 15, 15, 15, 15, 22, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 24, 24, 22, 22, 24, 14, 14, 14, 14, 22, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 14, 14, 4, 14, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 15, 15, 15, 15, 15, 15, 3, 3, 3, 15, 3, 15, 15, 22, + 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 22, 24, 24, 22, 22, 22, 22, 24, 24, 22, 22, 24, 24, + 24, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 3, 3, + 15, 15, 15, 15, 15, 22, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 15, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 24, + 24, 22, 22, 24, 24, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 22, 15, 15, 15, 15, 15, 15, 15, 15, 22, 24, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 3, 3, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 21, 15, 15, 15, 15, 15, 15, 14, 14, 14, 15, 24, 22, 24, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 22, 15, 22, 22, 22, 15, 15, 22, 22, 15, 15, 15, 15, 15, 22, 22, + 15, 22, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 21, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 22, 22, 24, 24, + 3, 3, 15, 21, 21, 24, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 0, + 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 11, 21, 21, 21, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 11, 11, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 15, 15, 15, 24, 24, 22, 24, 24, 22, 24, 24, 3, 24, 22, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 15, 22, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 15, 0, + 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 6, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 4, 14, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 3, 3, 3, 3, 3, 3, 3, 5, 6, 3, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 3, 8, 8, 12, 12, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 6, 5, 6, 5, 6, 3, 3, 5, 6, 3, 3, 3, 3, 12, 12, 12, + 3, 3, 3, 0, 3, 3, 3, 3, 8, 5, 6, 5, 6, 5, 6, 3, + 3, 3, 7, 8, 7, 7, 7, 0, 3, 4, 3, 3, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 17, + 0, 3, 3, 3, 4, 3, 3, 3, 5, 6, 3, 7, 3, 8, 3, 3, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 7, 7, 7, 3, + 11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 7, 6, 7, 5, + 6, 3, 5, 6, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 21, 21, + 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, + 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 0, 0, 0, + 4, 4, 7, 11, 14, 4, 4, 0, 14, 7, 7, 7, 7, 14, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 14, 14, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, + 3, 3, 3, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 14, 14, 14, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, + 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 25, 15, 15, 15, 15, 15, 15, 15, 15, 25, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 3, + 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 3, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 0, 0, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 0, 0, 15, 0, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 3, 18, 18, 18, 18, 18, 18, 18, 18, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 14, 14, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 0, 15, 15, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 18, 18, 18, 18, 18, 18, 0, 0, 0, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 18, 18, 15, 15, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 15, 22, 22, 22, 0, 22, 22, 0, 0, 0, 0, 0, 22, 22, 22, 22, + 15, 15, 15, 15, 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 0, 22, 22, 22, 0, 0, 0, 0, 22, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, 18, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, 18, 18, + 15, 15, 15, 15, 15, 15, 15, 15, 14, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 22, 22, 0, 0, 0, 0, 18, 18, 18, 18, 18, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, + 15, 15, 15, 15, 22, 22, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 22, 22, 8, 0, 0, + 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 18, 18, 18, 18, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 3, 3, 3, 3, 3, 3, 3, 0, 0, + 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 24, 24, 24, 22, 22, 22, 22, 24, 24, 22, 22, 3, 3, 17, 3, 3, + 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 24, 22, 22, 22, + 22, 22, 22, 22, 22, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 3, 3, 3, 3, 15, 24, 24, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 22, 3, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24, + 24, 15, 15, 15, 15, 3, 3, 3, 3, 22, 22, 22, 22, 3, 24, 22, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 3, 15, 3, 3, 3, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 24, 22, + 22, 22, 24, 24, 22, 24, 22, 22, 3, 3, 3, 3, 3, 3, 22, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 15, 15, 15, 15, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, + 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 22, 22, 24, 24, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, + 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 0, 22, 22, 15, 24, 24, + 22, 24, 24, 24, 24, 0, 0, 24, 24, 0, 0, 24, 24, 24, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 15, 15, 15, + 15, 15, 24, 24, 0, 0, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, + 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, + 24, 24, 22, 22, 22, 24, 22, 15, 15, 15, 15, 3, 3, 3, 3, 3, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 0, 3, 22, 15, + 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 24, 24, 24, 22, 22, 22, 22, 22, 22, 24, 22, 24, 24, 24, 24, 22, + 22, 24, 22, 22, 15, 15, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, + 24, 24, 22, 22, 22, 22, 0, 0, 24, 24, 24, 24, 22, 22, 24, 22, + 22, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 15, 15, 15, 15, 22, 22, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 22, 24, 22, + 22, 3, 3, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 24, 22, 24, 24, + 22, 22, 22, 22, 22, 22, 24, 22, 15, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 22, 22, 22, 22, 24, 22, 22, 22, 22, 22, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 3, 3, 3, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 24, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 24, 22, 22, 3, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 0, 0, 15, 15, 15, 15, + 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 24, 24, 24, 24, 24, 24, 0, 24, 24, 0, 0, 22, 22, 24, 22, 15, + 24, 15, 24, 22, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 24, 24, 24, 22, 22, 22, 22, 0, 0, 22, 22, 24, 24, 24, 24, + 22, 15, 3, 15, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 22, 22, 22, 22, 22, 22, 24, 15, 22, 22, 22, 22, 3, + 3, 3, 3, 3, 3, 3, 3, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 22, 22, 22, 22, 22, 22, 24, 24, 22, 22, 22, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 24, 22, 22, 3, 3, 3, 15, 3, 3, + 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, + 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, 24, 22, + 15, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, + 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 0, 24, 22, 22, 22, 22, 22, 22, + 22, 24, 22, 22, 24, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 22, 22, 22, 22, 22, 22, 0, 0, 0, 22, 0, 22, 22, 0, 22, + 22, 22, 22, 22, 22, 22, 15, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 24, 24, 24, 0, + 22, 22, 0, 24, 24, 22, 24, 22, 15, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 22, 22, 24, 24, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 4, 4, 4, + 4, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, + 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 22, 22, 22, 22, 22, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 22, 22, 22, 22, 22, 22, 22, 3, 3, 3, 3, 3, 14, 14, 14, 14, + 21, 21, 21, 21, 3, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 18, 18, 18, 18, 18, + 18, 18, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 3, 3, 3, 3, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 22, + 15, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 22, + 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 3, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 14, 22, 22, 3, + 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 24, 24, 22, 22, 22, 14, 14, 14, 24, 24, 24, + 24, 24, 24, 17, 17, 17, 17, 17, 17, 17, 17, 22, 22, 22, 22, 22, + 22, 22, 22, 14, 14, 22, 22, 22, 22, 22, 22, 22, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22, 22, 22, 22, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 22, 22, 22, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, + 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 0, 10, 10, + 0, 0, 10, 0, 0, 10, 10, 0, 0, 10, 10, 10, 10, 0, 10, 10, + 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 0, 13, 0, 13, 13, 13, + 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 10, 10, 0, 10, 10, 10, 10, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 0, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 0, 10, 10, 10, 10, 0, + 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, 10, 10, 10, 10, 10, 10, + 10, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 13, 13, 13, 13, + 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 7, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 7, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, + 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 13, 13, 13, 13, 13, 13, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 7, 13, 13, 13, 13, 13, 13, 10, 13, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 14, 14, 14, 14, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 14, 14, 14, + 14, 14, 14, 14, 14, 22, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 22, 14, 14, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 22, 22, + 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 22, 22, 22, 22, 22, + 22, 22, 0, 22, 22, 0, 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 15, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 4, + 15, 15, 15, 15, 15, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 22, 22, 22, 22, 22, 22, 22, 21, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 18, 18, 18, + 4, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, + 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 0, 15, 15, 0, 15, 0, 0, 15, 0, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 0, 15, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, 0, 15, 0, 15, 0, 15, 0, 15, 15, 15, + 0, 15, 15, 0, 15, 0, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, + 0, 15, 15, 0, 15, 0, 0, 15, 15, 15, 15, 0, 15, 15, 15, 15, + 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, + 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, 0 +}; + +RE_UINT32 re_get_general_category(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_general_category_table_1[field_2]; + v = re_general_category_table_2[(v << 5) | field_1]; + v = re_general_category_table_3[(v << 5) | field_0]; + + return v; +} + +/* Graph. */ +static RE_UINT8 re_graph_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 14, 13, 15, 16, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 17, 18, 18, 13, 13, 13, 13, 13, 13, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 18, 18, 13, 31, 18, 18, + 18, 32, 18, 18, 18, 18, 18, 18, 18, 18, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 18, 18, 18, 18, 18, 18, 18, 18, 37, 18, 18, 38, + 18, 18, 18, 18, 39, 40, 41, 18, 42, 18, 43, 44, 45, 46, 47, 18, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 48, 13, 13, 13, 49, 50, 13, + 13, 13, 13, 51, 13, 13, 13, 13, 13, 13, 52, 18, 18, 18, 53, 18, + 13, 13, 13, 13, 54, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56 +}; + +static RE_UINT16 re_graph_table_2[] = { + 0, 1, 2, 3, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 5, 6, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 8, 2, 9, 2, 10, 11, + 12, 2, 2, 2, 2, 2, 2, 2, 13, 2, 14, 2, 2, 15, 2, 16, + 2, 17, 18, 19, 0, 20, 21, 2, 2, 2, 2, 2, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 31, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 41, 45, 46, 47, 41, 2, 48, 49, 50, 51, 52, 53, + 1, 54, 55, 0, 56, 57, 58, 0, 2, 2, 59, 60, 61, 12, 62, 0, + 2, 2, 2, 2, 2, 2, 63, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 64, 2, 65, 66, 67, 2, 68, 2, 16, 69, 70, 2, 2, 71, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 72, 2, 2, 73, 74, 75, 76, 77, 2, 2, 78, 79, + 80, 2, 2, 73, 2, 81, 2, 82, 3, 83, 84, 85, 2, 86, 87, 2, + 88, 2, 3, 89, 79, 90, 91, 0, 2, 2, 86, 69, 2, 2, 2, 92, + 2, 93, 94, 2, 95, 16, 10, 96, 2, 2, 2, 2, 2, 2, 2, 97, + 2, 2, 2, 2, 2, 2, 2, 2, 71, 2, 98, 78, 2, 20, 99, 100, + 101, 102, 3, 103, 104, 2, 105, 106, 2, 2, 2, 2, 86, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 107, 19, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 108, 109, 2, 2, 2, + 2, 110, 3, 2, 2, 2, 2, 111, 2, 63, 2, 112, 75, 113, 113, 2, + 2, 2, 114, 0, 97, 2, 2, 76, 2, 2, 2, 2, 2, 2, 82, 115, + 1, 2, 1, 2, 8, 2, 2, 2, 116, 7, 2, 2, 110, 2, 2, 117, + 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 69, + 2, 2, 2, 2, 118, 2, 119, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 120, 2, 2, 2, 2, 2, 121, 2, 2, 2, 2, 2, 2, 122, 123, + 2, 124, 2, 121, 2, 2, 125, 2, 2, 2, 126, 69, 2, 2, 127, 3, + 2, 75, 128, 2, 2, 2, 129, 75, 130, 131, 2, 86, 2, 2, 2, 132, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 117, 133, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 90, 2, 2, 70, 0, 134, 135, 136, 2, 2, 2, 137, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 105, 2, 138, 2, 139, 140, + 70, 2, 141, 142, 2, 2, 2, 89, 1, 2, 2, 2, 2, 3, 143, 144, + 145, 146, 147, 0, 2, 2, 2, 96, 148, 149, 2, 2, 104, 91, 105, 78, + 0, 0, 0, 0, 69, 2, 106, 55, 2, 150, 81, 96, 151, 2, 152, 0, + 2, 2, 2, 2, 78, 153, 154, 55, 2, 10, 2, 155, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 75, 82, 139, 0, 0, 0, 0, + 156, 157, 109, 2, 3, 158, 0, 159, 160, 161, 0, 0, 2, 162, 138, 2, + 163, 164, 165, 2, 2, 0, 2, 166, 2, 167, 168, 169, 170, 171, 0, 0, + 2, 2, 172, 0, 2, 114, 2, 173, 2, 174, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 2, 175, 0, 0, 2, 10, 70, 0, 0, 105, 120, 75, + 2, 2, 176, 177, 2, 2, 178, 179, 2, 20, 10, 75, 2, 2, 2, 180, + 181, 3, 0, 0, 182, 153, 2, 183, 22, 184, 185, 186, 0, 0, 0, 0, + 2, 2, 187, 188, 2, 2, 174, 0, 0, 0, 0, 0, 2, 168, 78, 0, + 2, 2, 189, 190, 2, 73, 191, 0, 16, 86, 0, 0, 0, 0, 0, 0, + 2, 55, 0, 0, 0, 2, 2, 192, 193, 194, 195, 0, 0, 196, 4, 197, + 2, 2, 10, 2, 2, 198, 2, 73, 0, 0, 0, 0, 0, 0, 0, 0, + 199, 200, 201, 118, 138, 202, 0, 0, 203, 204, 174, 205, 206, 191, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 207, 2, 208, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 70, 0, 0, 0, + 2, 2, 2, 209, 2, 2, 2, 2, 2, 2, 210, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 73, 3, 212, 0, 0, 105, 213, 2, 2, 214, 215, 216, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 96, 0, 0, 0, 2, 2, 217, 2, 218, 0, 0, 219, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 121, + 2, 2, 2, 2, 2, 2, 82, 0, 172, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 220, 221, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 222, 223, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 82, 2, 224, 2, 2, 2, 2, 2, 172, + 2, 2, 225, 0, 0, 0, 0, 76, 2, 2, 75, 73, 0, 0, 0, 0, + 2, 2, 20, 2, 12, 226, 227, 2, 228, 229, 230, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 231, 2, 2, 2, 2, 2, 2, 2, 2, 232, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 233, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 235, 236, 0, 0, 0, 0, 0, 0, 2, 237, 212, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 161, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 238, 0, 2, 2, 239, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 2, 241, 0, 0, 1, 78, 0, 0, 0, 0, 0, 0, + 227, 242, 243, 244, 245, 246, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 86, 2, 2, 76, 248, 249, 82, 2, 2, 2, 2, 2, 250, 0, 251, + 252, 55, 253, 225, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 121, 254, 2, 2, 2, 76, 2, 2, 73, 120, + 86, 2, 174, 2, 10, 255, 0, 0, 2, 2, 2, 256, 2, 2, 145, 2, + 2, 2, 76, 257, 119, 258, 259, 0, 2, 2, 2, 2, 141, 2, 19, 260, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 78, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 241, 2, 2, 2, 2, 2, 2, + 78, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 261, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 91, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 19, 0, 0, 0, 0, 0, + 262, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 216, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 78 +}; + +static RE_UINT8 re_graph_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, + 255, 255, 255, 252, 240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 254, 255, + 255, 255, 127, 254, 255, 231, 254, 255, 255, 0, 255, 255, 255, 135, 31, 0, + 255, 255, 255, 223, 255, 191, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, + 255, 255, 255, 231, 255, 63, 255, 127, 255, 255, 255, 79, 255, 7, 0, 0, + 255, 255, 223, 255, 255, 0, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243, + 159, 121, 128, 176, 207, 255, 255, 127, 238, 135, 249, 255, 255, 253, 109, 211, + 135, 57, 2, 94, 192, 255, 127, 0, 238, 191, 251, 255, 255, 253, 237, 243, + 191, 59, 1, 0, 207, 255, 3, 254, 238, 159, 249, 255, 159, 57, 224, 176, + 207, 255, 255, 0, 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, + 192, 255, 255, 7, 255, 223, 253, 255, 255, 253, 255, 227, 223, 61, 96, 7, + 207, 255, 128, 255, 255, 253, 239, 243, 223, 61, 96, 64, 207, 255, 6, 0, + 223, 253, 240, 255, 207, 255, 255, 255, 238, 255, 127, 252, 255, 255, 251, 47, + 127, 132, 95, 255, 192, 255, 28, 0, 255, 255, 255, 135, 255, 255, 255, 15, + 214, 247, 255, 255, 175, 255, 255, 63, 95, 63, 255, 243, 255, 254, 255, 255, + 255, 31, 254, 255, 255, 255, 255, 254, 255, 223, 255, 7, 191, 32, 255, 255, + 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, + 255, 255, 61, 255, 255, 255, 255, 31, 255, 255, 255, 3, 255, 255, 63, 63, + 254, 255, 255, 31, 255, 255, 255, 1, 255, 223, 31, 0, 255, 255, 127, 0, + 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 255, 63, 255, 3, 255, 3, + 255, 127, 255, 3, 255, 7, 255, 255, 255, 255, 63, 0, 255, 15, 255, 15, + 241, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 199, + 255, 255, 255, 207, 255, 255, 255, 159, 255, 63, 255, 255, 1, 0, 0, 0, + 255, 255, 15, 240, 255, 255, 255, 248, 255, 227, 255, 255, 255, 1, 255, 255, + 255, 255, 255, 7, 255, 255, 255, 251, 63, 63, 255, 170, 223, 255, 207, 239, + 255, 255, 220, 127, 0, 248, 255, 255, 255, 124, 255, 255, 223, 255, 243, 255, + 255, 127, 255, 31, 0, 0, 255, 255, 255, 255, 1, 0, 127, 0, 0, 0, + 255, 255, 207, 255, 255, 255, 191, 255, 255, 127, 255, 255, 255, 255, 15, 254, + 255, 128, 1, 128, 127, 127, 127, 127, 255, 255, 7, 0, 0, 0, 255, 15, + 224, 255, 255, 255, 15, 0, 255, 255, 255, 31, 255, 255, 127, 0, 255, 255, + 255, 15, 0, 0, 255, 255, 255, 0, 252, 7, 0, 0, 0, 0, 224, 255, + 255, 31, 255, 3, 63, 192, 255, 3, 255, 255, 15, 128, 255, 191, 255, 195, + 255, 63, 255, 243, 7, 0, 0, 248, 126, 126, 126, 0, 127, 127, 255, 255, + 255, 63, 255, 3, 127, 248, 255, 255, 127, 0, 248, 224, 255, 255, 127, 95, + 219, 255, 255, 255, 3, 0, 248, 255, 255, 255, 252, 255, 255, 0, 0, 0, + 0, 0, 255, 63, 255, 255, 247, 255, 127, 15, 223, 255, 252, 252, 252, 28, + 127, 127, 0, 62, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, + 135, 255, 255, 255, 255, 255, 143, 255, 15, 224, 255, 255, 255, 255, 255, 191, + 15, 255, 63, 0, 255, 3, 255, 255, 255, 255, 15, 255, 15, 128, 0, 0, + 63, 253, 255, 255, 255, 255, 191, 145, 128, 255, 0, 0, 255, 255, 55, 248, + 255, 255, 255, 143, 255, 255, 255, 131, 255, 255, 255, 240, 111, 240, 239, 254, + 255, 255, 63, 135, 255, 1, 255, 1, 127, 248, 127, 0, 255, 255, 63, 254, + 255, 255, 63, 255, 255, 255, 7, 255, 255, 255, 3, 30, 0, 254, 0, 0, + 255, 1, 0, 0, 255, 255, 7, 252, 255, 0, 255, 3, 255, 59, 3, 0, + 255, 63, 252, 255, 255, 255, 0, 128, 3, 32, 255, 255, 255, 1, 255, 3, + 254, 255, 31, 0, 255, 255, 251, 255, 127, 189, 255, 191, 255, 7, 255, 3, + 255, 253, 237, 251, 159, 57, 129, 224, 207, 31, 31, 0, 255, 255, 255, 239, + 3, 0, 0, 0, 31, 0, 255, 3, 255, 31, 0, 0, 255, 3, 0, 0, + 255, 255, 7, 128, 127, 242, 111, 255, 255, 255, 191, 249, 127, 0, 255, 3, + 255, 252, 255, 255, 31, 0, 0, 0, 7, 0, 0, 0, 255, 253, 255, 255, + 255, 255, 127, 255, 63, 0, 255, 255, 255, 254, 127, 0, 127, 251, 255, 255, + 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251, 1, 0, 0, 1, 0, + 255, 255, 3, 128, 255, 127, 31, 0, 15, 0, 0, 0, 255, 127, 255, 1, + 255, 195, 0, 0, 255, 63, 63, 0, 63, 0, 255, 251, 251, 255, 255, 224, + 255, 255, 0, 0, 255, 135, 255, 255, 255, 128, 255, 255, 31, 0, 3, 0, + 0, 0, 7, 0, 240, 0, 255, 255, 255, 7, 255, 31, 255, 1, 255, 243, + 127, 254, 255, 255, 63, 0, 0, 0, 100, 222, 255, 235, 239, 255, 255, 255, + 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, + 255, 207, 255, 255, 255, 15, 0, 248, 254, 255, 0, 0, 127, 255, 255, 249, + 219, 7, 0, 0, 255, 31, 255, 63, 159, 255, 127, 0, 255, 15, 255, 195, + 0, 0, 254, 255, 255, 255, 31, 0, 150, 254, 247, 10, 132, 234, 150, 170, + 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 0, 0, 3, 0, + 255, 127, 254, 255, 254, 255, 254, 255, 255, 63, 0, 0, 192, 255, 255, 255, + 7, 0, 255, 255, 255, 1, 3, 0, 255, 31, 255, 31, 255, 63, 3, 0, + 255, 255, 255, 253, 255, 63, 31, 7, 255, 1, 127, 0, 7, 0, 127, 0, + 0, 0, 255, 3, 3, 0, 255, 255, 2, 0, 0, 0 +}; + +RE_UINT32 re_get_graph(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_graph_table_1[field_2]; + v = re_graph_table_2[(v << 5) | field_1]; + v = re_graph_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Grapheme_Base. */ +static RE_UINT8 re_grapheme_base_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 14, 13, 15, 16, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 18, 18, 13, 31, 18, 18, + 18, 32, 18, 18, 18, 18, 18, 18, 18, 18, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 18, 18, 18, 18, 18, 18, 18, 18, 37, 18, 18, 38, + 18, 18, 18, 18, 39, 40, 41, 18, 42, 18, 43, 44, 45, 46, 47, 18, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 48, 13, 13, 13, 49, 50, 13, + 13, 13, 13, 51, 13, 13, 13, 13, 13, 13, 52, 18, 18, 18, 53, 18, + 13, 13, 13, 13, 54, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18 +}; + +static RE_UINT16 re_grapheme_base_table_2[] = { + 0, 1, 1, 2, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 4, 5, 6, 1, 1, + 1, 1, 1, 1, 7, 1, 1, 1, 1, 8, 9, 1, 10, 11, 12, 13, + 14, 1, 15, 8, 1, 1, 16, 17, 18, 19, 20, 1, 1, 21, 1, 22, + 23, 24, 25, 15, 0, 26, 27, 0, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 0, 71, 72, 73, 0, 74, 75, 76, 77, 78, 79, 80, 0, + 1, 81, 82, 83, 84, 1, 85, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 86, 1, 87, 88, 89, 1, 90, 1, 91, 92, 93, 1, 1, 94, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 92, 1, 1, 95, 96, 97, 98, 99, 1, 100, 101, 102, + 103, 1, 1, 95, 104, 105, 1, 106, 2, 107, 108, 109, 1, 110, 111, 1, + 112, 1, 113, 114, 102, 115, 0, 0, 116, 117, 118, 119, 120, 121, 1, 122, + 1, 123, 124, 1, 125, 126, 127, 128, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 94, 1, 129, 130, 1, 26, 131, 132, + 133, 134, 1, 135, 136, 1, 0, 0, 1, 1, 1, 1, 110, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 137, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 138, 139, 1, 1, 1, + 1, 140, 2, 1, 1, 1, 1, 141, 1, 85, 1, 142, 143, 144, 144, 0, + 1, 1, 145, 0, 146, 1, 1, 147, 1, 1, 1, 1, 1, 1, 106, 148, + 1, 149, 68, 1, 150, 1, 1, 1, 151, 8, 1, 1, 140, 1, 1, 152, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 92, + 1, 1, 1, 1, 153, 1, 154, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 155, 1, 156, 130, 1, 1, 157, 1, 1, 1, 1, 1, 1, 158, 159, + 160, 161, 1, 162, 1, 1, 163, 164, 1, 165, 166, 92, 28, 167, 168, 169, + 1, 170, 171, 172, 1, 173, 174, 175, 176, 177, 1, 110, 1, 1, 1, 178, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 152, 179, 180, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 181, 1, 1, 93, 0, 182, 183, 184, 1, 1, 1, 185, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 186, 1, 187, 1, 27, 188, + 189, 186, 190, 191, 1, 1, 1, 92, 68, 1, 1, 1, 130, 2, 192, 193, + 194, 195, 196, 0, 1, 1, 1, 91, 197, 198, 1, 1, 136, 199, 186, 92, + 0, 0, 0, 0, 92, 1, 200, 201, 1, 202, 133, 106, 203, 1, 204, 0, + 1, 1, 1, 1, 130, 149, 205, 180, 1, 206, 1, 207, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 143, 106, 27, 0, 0, 0, 0, + 208, 209, 139, 1, 2, 210, 0, 211, 212, 213, 0, 0, 1, 214, 187, 1, + 215, 106, 216, 1, 1, 0, 1, 217, 1, 218, 219, 220, 221, 222, 0, 0, + 1, 1, 223, 0, 1, 145, 1, 224, 1, 225, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 1, 226, 0, 0, 1, 206, 227, 0, 0, 186, 155, 143, + 228, 162, 229, 19, 120, 230, 231, 232, 28, 233, 206, 234, 120, 235, 236, 237, + 238, 239, 0, 0, 240, 149, 2, 241, 44, 242, 243, 244, 0, 0, 0, 0, + 1, 162, 245, 246, 1, 247, 248, 0, 0, 0, 0, 0, 1, 249, 201, 0, + 1, 250, 251, 252, 1, 253, 254, 0, 91, 255, 0, 0, 0, 0, 0, 0, + 1, 256, 0, 0, 0, 1, 1, 257, 258, 259, 260, 0, 0, 261, 262, 263, + 264, 265, 266, 1, 267, 268, 1, 95, 0, 0, 0, 0, 0, 0, 0, 0, + 269, 270, 271, 153, 19, 272, 0, 0, 273, 200, 274, 275, 276, 254, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 278, 1, 279, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 93, 0, 0, 0, + 1, 1, 1, 280, 1, 1, 1, 1, 1, 1, 244, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 95, 2, 282, 0, 0, 186, 283, 1, 284, 285, 286, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 91, 0, 0, 0, 1, 1, 133, 1, 287, 0, 0, 288, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 162, + 1, 1, 1, 1, 1, 1, 106, 0, 223, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 289, 290, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 180, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 291, 292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 106, 1, 293, 1, 294, 295, 296, 1, 223, + 1, 1, 297, 0, 0, 0, 0, 147, 1, 1, 143, 95, 0, 0, 0, 0, + 1, 1, 26, 1, 298, 299, 300, 1, 301, 302, 303, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 304, 1, 1, 1, 1, 1, 1, 1, 1, 305, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 306, 0, 307, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 309, 282, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 310, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 311, 0, 1, 1, 312, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 313, 1, 314, 0, 0, 68, 130, 0, 0, 0, 0, 0, 0, + 300, 315, 316, 317, 318, 319, 0, 320, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 110, 1, 1, 147, 321, 322, 106, 1, 1, 1, 1, 1, 115, 0, 323, + 324, 180, 325, 326, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 162, 327, 1, 1, 1, 147, 1, 1, 95, 155, + 110, 1, 328, 1, 206, 329, 0, 0, 1, 1, 1, 330, 1, 1, 194, 1, + 1, 1, 147, 331, 154, 332, 333, 0, 1, 1, 1, 1, 190, 1, 15, 189, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 130, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 314, 1, 1, 1, 1, 1, 1, + 130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 231, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 199, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 15, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_grapheme_base_table_3[] = { + 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 223, 255, 255, + 0, 0, 255, 252, 240, 215, 255, 255, 251, 255, 255, 255, 7, 252, 255, 255, + 255, 255, 254, 255, 255, 255, 127, 254, 255, 231, 0, 0, 0, 0, 0, 64, + 73, 0, 255, 255, 255, 135, 31, 0, 192, 255, 0, 200, 255, 7, 0, 0, + 255, 255, 63, 64, 96, 194, 255, 255, 255, 63, 253, 255, 255, 255, 0, 0, + 0, 224, 255, 255, 63, 0, 2, 0, 255, 7, 240, 199, 255, 255, 63, 4, + 16, 1, 255, 127, 255, 255, 255, 65, 255, 255, 223, 255, 255, 0, 0, 0, + 248, 255, 255, 255, 255, 255, 255, 235, 1, 222, 1, 255, 243, 255, 255, 255, + 237, 159, 249, 255, 255, 253, 197, 163, 129, 89, 0, 176, 195, 255, 255, 63, + 232, 135, 249, 255, 255, 253, 109, 195, 1, 0, 0, 94, 192, 255, 92, 0, + 232, 191, 251, 255, 255, 253, 237, 227, 1, 26, 1, 0, 195, 255, 3, 2, + 236, 159, 249, 255, 255, 253, 237, 35, 129, 25, 0, 176, 195, 255, 255, 0, + 232, 199, 61, 214, 24, 199, 255, 131, 198, 29, 1, 0, 192, 255, 255, 7, + 238, 223, 253, 255, 255, 253, 255, 35, 30, 0, 0, 7, 195, 255, 128, 255, + 253, 223, 253, 255, 255, 253, 239, 99, 155, 13, 0, 64, 195, 255, 6, 0, + 252, 223, 253, 255, 255, 255, 255, 167, 193, 221, 112, 255, 195, 255, 255, 255, + 236, 255, 127, 252, 255, 255, 251, 47, 127, 0, 3, 127, 192, 255, 28, 0, + 254, 255, 255, 255, 255, 255, 13, 128, 127, 128, 255, 15, 214, 247, 255, 255, + 175, 255, 13, 32, 95, 0, 255, 243, 255, 255, 255, 252, 255, 255, 95, 253, + 255, 254, 255, 255, 255, 31, 0, 128, 32, 31, 0, 0, 0, 0, 0, 192, + 191, 223, 255, 7, 255, 31, 2, 153, 255, 255, 255, 60, 254, 255, 225, 255, + 155, 223, 255, 223, 191, 32, 255, 255, 255, 61, 127, 61, 255, 61, 255, 255, + 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 7, + 255, 255, 255, 31, 255, 255, 255, 3, 255, 255, 63, 63, 255, 255, 255, 1, + 255, 223, 3, 0, 255, 255, 99, 0, 255, 255, 3, 0, 255, 223, 1, 0, + 255, 255, 79, 192, 191, 1, 240, 31, 255, 3, 255, 3, 255, 7, 255, 3, + 159, 255, 255, 255, 255, 5, 255, 255, 255, 255, 63, 0, 120, 14, 251, 1, + 241, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 199, + 255, 255, 127, 198, 255, 255, 191, 0, 26, 224, 7, 0, 255, 63, 0, 0, + 240, 255, 255, 255, 255, 255, 15, 232, 251, 15, 255, 255, 255, 7, 240, 31, + 252, 255, 255, 255, 195, 196, 255, 255, 191, 92, 12, 240, 255, 15, 48, 248, + 255, 227, 255, 255, 255, 1, 255, 255, 255, 255, 255, 231, 255, 0, 8, 0, + 2, 222, 239, 4, 63, 63, 255, 170, 255, 255, 255, 63, 223, 255, 207, 239, + 255, 255, 220, 127, 255, 7, 255, 255, 255, 128, 255, 255, 0, 0, 243, 255, + 255, 127, 255, 31, 127, 0, 0, 0, 255, 255, 207, 255, 255, 255, 191, 255, + 255, 127, 255, 255, 255, 127, 12, 254, 255, 128, 1, 0, 255, 255, 127, 0, + 127, 127, 127, 127, 255, 255, 7, 0, 255, 255, 255, 251, 255, 255, 15, 0, + 0, 0, 255, 15, 255, 3, 255, 255, 255, 255, 127, 248, 224, 255, 255, 255, + 15, 0, 255, 255, 255, 31, 255, 255, 127, 0, 255, 255, 255, 15, 0, 0, + 255, 127, 8, 192, 255, 255, 252, 0, 252, 7, 0, 0, 0, 0, 224, 255, + 187, 247, 255, 255, 159, 15, 255, 3, 255, 255, 255, 0, 15, 192, 255, 3, + 0, 0, 252, 127, 63, 192, 255, 255, 127, 0, 12, 128, 255, 255, 55, 204, + 255, 191, 255, 195, 223, 255, 255, 127, 255, 129, 25, 0, 247, 47, 255, 243, + 255, 255, 255, 239, 255, 255, 98, 62, 5, 0, 0, 248, 255, 207, 63, 0, + 126, 126, 126, 0, 127, 127, 255, 255, 223, 30, 255, 3, 127, 248, 255, 255, + 255, 255, 255, 15, 255, 63, 255, 255, 127, 0, 248, 160, 255, 255, 127, 95, + 219, 255, 255, 255, 3, 0, 248, 255, 0, 0, 255, 255, 255, 255, 252, 255, + 0, 0, 255, 63, 0, 0, 255, 3, 255, 255, 247, 255, 127, 15, 223, 255, + 252, 252, 252, 28, 127, 127, 0, 48, 255, 239, 255, 255, 127, 255, 255, 183, + 255, 63, 255, 63, 135, 255, 255, 255, 255, 255, 143, 255, 1, 0, 0, 0, + 255, 255, 1, 0, 254, 255, 255, 15, 15, 224, 255, 255, 255, 255, 255, 191, + 15, 255, 63, 0, 255, 255, 15, 255, 255, 0, 255, 255, 15, 128, 0, 0, + 63, 253, 255, 255, 255, 255, 191, 145, 128, 255, 0, 0, 255, 255, 55, 248, + 255, 255, 255, 143, 255, 255, 255, 131, 255, 255, 255, 240, 1, 0, 239, 254, + 255, 1, 255, 1, 31, 248, 127, 0, 255, 255, 63, 254, 255, 255, 63, 255, + 255, 255, 7, 255, 255, 255, 3, 30, 0, 254, 0, 0, 255, 1, 0, 0, + 255, 255, 7, 252, 15, 0, 255, 3, 255, 35, 3, 0, 63, 0, 254, 3, + 253, 255, 255, 255, 128, 63, 252, 255, 255, 255, 135, 217, 3, 0, 255, 255, + 255, 1, 255, 3, 127, 16, 192, 255, 255, 255, 119, 0, 255, 255, 63, 128, + 255, 97, 255, 255, 254, 255, 31, 0, 255, 255, 251, 255, 255, 127, 44, 63, + 127, 189, 255, 191, 7, 0, 255, 3, 255, 253, 237, 163, 158, 57, 1, 224, + 15, 0, 0, 0, 163, 255, 255, 175, 3, 0, 0, 0, 255, 255, 6, 90, + 242, 0, 255, 3, 255, 127, 3, 79, 255, 255, 7, 88, 30, 0, 255, 3, + 255, 31, 0, 0, 255, 215, 64, 1, 255, 3, 0, 0, 67, 0, 255, 255, + 255, 127, 0, 9, 255, 255, 7, 128, 127, 242, 111, 255, 255, 255, 190, 161, + 119, 0, 255, 3, 255, 252, 255, 255, 255, 255, 15, 240, 30, 0, 0, 0, + 1, 248, 255, 255, 255, 255, 7, 134, 127, 0, 129, 241, 255, 3, 128, 252, + 7, 0, 0, 0, 255, 253, 255, 255, 255, 255, 0, 64, 63, 0, 255, 255, + 0, 2, 18, 0, 127, 251, 255, 255, 64, 0, 255, 3, 191, 253, 255, 255, + 255, 127, 88, 1, 255, 255, 231, 1, 0, 0, 1, 0, 255, 255, 3, 128, + 255, 127, 31, 0, 255, 127, 0, 0, 255, 195, 0, 0, 255, 63, 32, 0, + 255, 255, 128, 255, 63, 0, 255, 251, 251, 255, 255, 224, 255, 0, 248, 255, + 15, 0, 3, 0, 0, 0, 7, 0, 240, 0, 255, 255, 255, 7, 255, 31, + 255, 1, 255, 147, 127, 254, 255, 255, 95, 60, 0, 0, 24, 240, 255, 255, + 255, 195, 255, 255, 35, 0, 0, 0, 255, 255, 255, 223, 100, 222, 255, 235, + 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, + 63, 255, 255, 255, 255, 207, 255, 255, 0, 0, 128, 7, 0, 224, 223, 255, + 239, 15, 0, 0, 255, 31, 128, 63, 255, 15, 255, 131, 159, 255, 0, 0, + 15, 8, 255, 195, 0, 0, 254, 255, 255, 255, 31, 0, 150, 254, 247, 10, + 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, + 0, 0, 3, 0, 255, 127, 254, 255, 254, 255, 254, 255, 192, 255, 255, 255, + 7, 0, 255, 255, 255, 1, 3, 0, 63, 0, 0, 0, 255, 31, 255, 31, + 255, 0, 255, 3, 255, 63, 3, 0, 255, 255, 255, 253, 255, 63, 31, 7, + 255, 1, 127, 0, 7, 0, 127, 0 +}; + +RE_UINT32 re_get_grapheme_base(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_grapheme_base_table_1[field_2]; + v = re_grapheme_base_table_2[(v << 5) | field_1]; + v = re_grapheme_base_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Grapheme_Cluster_Break. */ +static RE_UINT8 re_grapheme_cluster_break_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 14, 15, 16, 21, 9, 9, 9, 9, 9, 9, 9, 9, 22, 23, + 24, 9, 25, 26, 27, 28, 29, 30, 9, 9, 9, 9, 9, 31, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 32, 33, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, + 9, 9, 9, 9, 35, 9, 36, 9, 37, 9, 38, 9, 39, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 40, 41, 41, 41, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 +}; + +static RE_UINT8 re_grapheme_cluster_break_table_2[] = { + 0, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 6, 1, 1, 1, 1, + 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 8, 9, 10, 1, + 11, 1, 12, 13, 1, 1, 14, 15, 16, 17, 18, 1, 1, 19, 1, 20, + 21, 22, 23, 1, 1, 1, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 34, 35, 38, 39, 30, 40, 41, 29, 42, 43, 44, 1, + 45, 46, 47, 29, 30, 48, 49, 29, 50, 51, 52, 29, 30, 1, 53, 54, + 1, 55, 56, 1, 1, 57, 58, 1, 59, 60, 1, 61, 62, 63, 64, 1, + 1, 65, 66, 67, 68, 1, 1, 1, 69, 69, 69, 70, 70, 71, 72, 72, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 73, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 74, 74, 75, 75, 1, 76, 77, 1, + 78, 1, 1, 1, 79, 80, 1, 1, 1, 81, 1, 1, 1, 1, 1, 1, + 82, 1, 83, 84, 1, 17, 85, 1, 86, 87, 88, 89, 90, 91, 1, 92, + 1, 93, 1, 1, 1, 1, 94, 95, 1, 1, 1, 1, 1, 1, 5, 96, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 97, 98, 1, 99, 1, 1, 17, 100, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 101, 1, 1, 1, 102, 1, 1, 1, 5, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 103, 1, 1, 104, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 105, 46, 1, 1, 106, 1, 1, 1, 1, 1, 1, 1, 1, + 107, 108, 1, 1, 109, 110, 111, 112, 1, 113, 114, 115, 26, 116, 117, 118, + 1, 119, 120, 121, 1, 122, 123, 124, 1, 1, 1, 1, 1, 1, 1, 125, + 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, + 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, + 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, + 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, + 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, + 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, + 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, + 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, + 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, + 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, + 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, + 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, + 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, + 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, + 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, + 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 133, 134, 135, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 136, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 6, 6, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 46, 1, 1, 137, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 138, + 1, 1, 1, 1, 1, 1, 1, 85, 1, 1, 1, 139, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 140, 141, 1, 1, 1, 1, 1, 79, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 142, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 143, 1, 1, 1, 1, 19, 1, 1, 1, 1, 1, + 144, 145, 146, 102, 90, 147, 148, 1, 149, 150, 151, 152, 90, 153, 154, 1, + 1, 155, 1, 1, 1, 1, 102, 156, 50, 51, 157, 158, 1, 1, 1, 1, + 1, 159, 160, 1, 1, 161, 162, 1, 1, 1, 1, 1, 1, 163, 164, 1, + 1, 165, 85, 1, 1, 166, 1, 1, 73, 167, 1, 1, 1, 1, 1, 1, + 1, 168, 1, 1, 1, 1, 1, 1, 1, 169, 170, 1, 1, 1, 171, 172, + 173, 174, 175, 1, 176, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 177, 1, 1, 178, 179, 1, 1, 1, 180, 181, 1, 182, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 183, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 184, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 185, 1, 186, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 187, 188, 189, 1, 1, 190, + 1, 1, 1, 1, 191, 192, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 193, 194, 195, 1, 1, + 1, 1, 196, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 5, 197, 5, 198, 199, 200, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 201, 202, 1, 1, 1, 1, 1, 1, 1, 186, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 203, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 186, 1, 1, 1, 204, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 205, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 206, + 3, 5, 5, 5, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 207, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 +}; + +static RE_UINT8 re_grapheme_cluster_break_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, + 0, 4, 4, 0, 4, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 5, 0, 4, + 4, 4, 4, 4, 4, 0, 0, 4, 4, 0, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 0, 4, 4, 4, 0, 4, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 4, 0, 6, 6, + 6, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 4, 6, 6, + 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 6, + 6, 4, 4, 4, 4, 0, 0, 6, 6, 0, 0, 6, 6, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 6, 6, + 6, 4, 4, 0, 0, 0, 0, 4, 4, 0, 0, 4, 4, 4, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 4, 4, 4, 4, 4, 0, 4, 4, 6, 0, 6, 6, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, + 6, 4, 4, 4, 4, 0, 0, 6, 6, 0, 0, 6, 6, 4, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, + 4, 6, 6, 0, 0, 0, 6, 6, 6, 0, 6, 6, 6, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 6, 6, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, + 4, 6, 6, 6, 6, 0, 4, 4, 4, 0, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 6, 4, + 6, 6, 4, 6, 6, 0, 4, 6, 6, 0, 6, 6, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 6, + 6, 4, 4, 4, 4, 0, 6, 6, 6, 0, 6, 6, 6, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, + 6, 6, 4, 4, 4, 0, 4, 0, 6, 6, 6, 6, 6, 6, 6, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 6, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 4, 0, 4, 0, 0, 0, 0, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, + 4, 4, 4, 4, 4, 0, 4, 4, 0, 0, 0, 0, 0, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, + 4, 6, 4, 4, 4, 4, 4, 4, 0, 4, 4, 6, 6, 4, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 6, 4, 4, 0, 0, 0, 0, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 6, 4, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 6, 6, + 6, 6, 6, 6, 6, 6, 4, 6, 6, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 6, 6, 6, 6, 4, 4, 6, 6, 6, 0, 0, 0, 0, + 6, 6, 4, 6, 6, 6, 6, 6, 6, 4, 4, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 4, 6, 6, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 4, 6, 4, 4, 4, 4, 4, 4, 4, 0, + 4, 0, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, + 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 6, 4, 6, 6, 6, + 6, 6, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 4, 4, 4, 4, 6, 6, 4, 4, 6, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 6, 4, 4, 6, 6, 6, 4, 6, 4, + 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, + 4, 4, 4, 4, 6, 6, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 6, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 6, 4, 4, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 10, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 6, 4, 4, 6, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 6, 6, 4, 4, 4, 4, 6, 6, 4, 4, 6, 6, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 6, + 6, 4, 4, 6, 6, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 4, 4, 4, 0, 0, 4, 4, 0, 0, 0, 0, 0, 4, 4, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4, 4, 6, 6, + 0, 0, 0, 0, 0, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 6, 4, 6, 6, 4, 6, 6, 0, 6, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 0, 4, 4, 0, 0, 0, 0, 0, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 4, 4, 4, 4, 6, 6, 4, 4, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 6, 4, 4, 4, + 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, + 6, 0, 5, 5, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 6, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 4, + 4, 4, 6, 6, 4, 6, 4, 4, 0, 0, 0, 0, 0, 0, 4, 0, + 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 6, 6, 6, 6, 0, 0, 6, 6, 0, 0, 6, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 6, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, + 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, + 6, 6, 4, 4, 4, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 6, 6, 4, 4, 4, 4, 4, 4, 6, 4, 6, 6, 4, 6, 4, + 4, 6, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 6, 6, 4, 4, 4, 4, 0, 0, 6, 6, 6, 6, 4, 4, 6, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 4, 6, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 4, 6, 6, + 4, 4, 4, 4, 4, 4, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 6, 6, 6, 6, 6, 0, 6, 6, 0, 0, 4, 4, 6, 4, 5, + 6, 5, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 6, 6, 4, 4, 4, 4, 0, 0, 4, 4, 6, 6, 6, 6, + 4, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 4, 4, 4, 4, 4, 6, 5, 4, 4, 4, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 4, 4, 6, 6, 4, 4, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 6, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 0, 6, 4, 4, 4, 4, 4, 4, + 4, 6, 4, 4, 6, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 4, 0, 4, 4, 0, 4, + 4, 4, 4, 4, 4, 4, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 0, + 4, 4, 0, 6, 6, 4, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 4, + 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 6, 4, 4, 4, 0, 0, 0, 6, 4, 4, + 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, + 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, + 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, + 4, 4, 0, 4, 4, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_grapheme_cluster_break_table_1[field_2]; + v = re_grapheme_cluster_break_table_2[(v << 5) | field_1]; + v = re_grapheme_cluster_break_table_3[(v << 5) | field_0]; + + return v; +} + +/* Grapheme_Extend. */ +static RE_UINT8 re_grapheme_extend_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 15, + 16, 9, 17, 18, 19, 20, 21, 22, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, + 9, 9, 9, 9, 26, 9, 27, 9, 28, 9, 29, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 30, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 +}; + +static RE_UINT8 re_grapheme_extend_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0, + 7, 0, 8, 9, 0, 0, 10, 11, 12, 13, 14, 0, 0, 15, 0, 16, + 17, 18, 19, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 30, 31, 34, 35, 26, 36, 37, 25, 38, 39, 40, 0, + 41, 42, 43, 25, 26, 44, 45, 25, 46, 47, 28, 25, 26, 0, 48, 0, + 0, 49, 50, 0, 0, 51, 52, 0, 53, 54, 0, 55, 56, 57, 58, 0, + 0, 59, 60, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 65, 65, 0, 66, 67, 0, + 68, 0, 0, 0, 69, 70, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, + 72, 0, 73, 74, 0, 13, 75, 0, 76, 77, 38, 78, 46, 79, 0, 80, + 0, 81, 0, 0, 0, 0, 82, 83, 0, 0, 0, 0, 0, 0, 1, 84, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 85, 0, 0, 0, 0, 0, 13, 86, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 89, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 91, 42, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, + 93, 94, 0, 0, 0, 0, 95, 96, 0, 97, 98, 0, 22, 99, 0, 100, + 0, 101, 102, 31, 0, 103, 26, 104, 0, 0, 0, 0, 0, 0, 0, 105, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, + 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 107, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 108, 109, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 111, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, + 26, 112, 113, 88, 46, 114, 0, 0, 22, 115, 0, 116, 46, 117, 118, 0, + 0, 119, 0, 0, 0, 0, 88, 120, 46, 47, 121, 122, 0, 0, 0, 0, + 0, 112, 123, 0, 0, 124, 125, 0, 0, 0, 0, 0, 0, 126, 127, 0, + 0, 128, 75, 0, 0, 129, 0, 0, 63, 130, 0, 0, 0, 0, 0, 0, + 0, 131, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 0, 134, 75, + 135, 136, 137, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 139, 0, 0, 140, 141, 0, 0, 0, 142, 143, 0, 144, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 146, 0, 147, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 0, 149, 0, 0, 150, + 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 153, 154, 0, 0, + 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 156, 1, 157, 158, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 160, 161, 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 163, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_grapheme_extend_table_3[] = { + 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 0, 248, 3, 0, 0, + 0, 0, 254, 255, 255, 255, 255, 191, 182, 0, 0, 0, 0, 0, 255, 7, + 0, 248, 255, 255, 0, 0, 1, 0, 0, 0, 192, 159, 159, 61, 0, 0, + 0, 0, 2, 0, 0, 0, 255, 255, 255, 7, 0, 0, 192, 255, 1, 0, + 0, 248, 15, 32, 0, 0, 192, 251, 239, 62, 0, 0, 0, 0, 0, 14, + 0, 0, 248, 255, 251, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 20, + 254, 33, 254, 0, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 80, + 30, 32, 128, 0, 12, 0, 0, 64, 6, 0, 0, 0, 0, 0, 0, 16, + 134, 57, 2, 0, 0, 0, 35, 0, 190, 33, 0, 0, 12, 0, 0, 252, + 0, 0, 0, 208, 30, 32, 224, 0, 4, 0, 0, 0, 0, 0, 0, 64, + 1, 32, 128, 0, 17, 0, 0, 0, 0, 0, 0, 192, 193, 61, 96, 0, + 0, 0, 0, 144, 68, 48, 96, 0, 3, 0, 0, 0, 0, 0, 0, 88, + 0, 132, 92, 128, 0, 0, 242, 7, 128, 127, 0, 0, 0, 0, 242, 31, + 0, 63, 0, 0, 0, 0, 0, 3, 0, 0, 160, 2, 0, 0, 254, 127, + 223, 224, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 0, 224, 253, 102, + 0, 0, 0, 195, 1, 0, 30, 0, 100, 32, 0, 32, 0, 0, 0, 224, + 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 176, 63, 64, 254, 15, 32, + 0, 56, 0, 0, 96, 0, 0, 0, 0, 2, 0, 0, 135, 1, 4, 14, + 0, 0, 128, 9, 0, 0, 64, 127, 229, 31, 248, 159, 1, 0, 0, 0, + 15, 0, 0, 0, 0, 0, 240, 23, 0, 248, 15, 0, 60, 59, 0, 0, + 64, 163, 3, 0, 0, 240, 207, 0, 0, 0, 247, 255, 253, 33, 16, 3, + 255, 255, 255, 251, 0, 16, 0, 0, 255, 255, 1, 0, 0, 128, 3, 0, + 0, 0, 0, 128, 0, 252, 0, 0, 0, 0, 0, 6, 0, 128, 247, 63, + 0, 0, 3, 0, 68, 8, 0, 0, 96, 16, 0, 0, 48, 0, 0, 0, + 255, 255, 3, 128, 192, 63, 0, 0, 128, 255, 3, 0, 0, 0, 200, 51, + 32, 0, 0, 0, 0, 126, 102, 0, 8, 16, 0, 0, 0, 0, 157, 193, + 0, 48, 64, 0, 32, 33, 0, 0, 0, 0, 0, 32, 0, 0, 192, 7, + 110, 240, 0, 0, 0, 0, 0, 135, 240, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 255, 127, 0, 0, 0, 0, 0, 120, 6, 128, 239, 31, 0, + 0, 0, 8, 0, 0, 0, 192, 127, 0, 158, 0, 0, 0, 128, 211, 64, + 248, 7, 0, 0, 1, 0, 128, 0, 192, 31, 31, 0, 92, 0, 0, 64, + 0, 0, 249, 165, 13, 0, 0, 0, 0, 128, 60, 176, 1, 0, 0, 48, + 0, 0, 248, 167, 0, 40, 191, 0, 188, 15, 0, 0, 0, 128, 255, 6, + 0, 0, 1, 88, 8, 0, 0, 0, 0, 0, 240, 12, 254, 7, 0, 0, + 0, 0, 248, 121, 128, 0, 126, 14, 0, 252, 127, 3, 0, 0, 127, 191, + 0, 0, 252, 255, 255, 252, 109, 0, 0, 0, 126, 180, 191, 0, 0, 0, + 0, 0, 163, 0, 0, 0, 24, 0, 0, 0, 31, 0, 0, 0, 127, 0, + 0, 128, 0, 0, 0, 128, 7, 0, 16, 0, 0, 0, 0, 0, 0, 96, + 160, 195, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, + 255, 255, 127, 248, 255, 31, 32, 0, 16, 0, 0, 248, 254, 255, 0, 0, + 127, 255, 255, 249, 219, 7, 0, 0, 0, 240, 0, 0, 240, 7, 0, 0 +}; + +RE_UINT32 re_get_grapheme_extend(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_grapheme_extend_table_1[field_2]; + v = re_grapheme_extend_table_2[(v << 5) | field_1]; + v = re_grapheme_extend_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Grapheme_Link. */ +static RE_UINT8 re_grapheme_link_table_1[] = { + 0, 0, 1, 2, 3, 4, 5, 0, 0, 0, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 9, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_grapheme_link_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 2, 1, 0, 0, 0, 3, 0, + 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, + 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 5, 0, 0, 10, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 14, 0, 0, 0, 0, 5, 0, 0, 0, 15, 0, 0, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 12, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 9, 0, + 0, 19, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 12, 0, 0, + 0, 12, 0, 0, 0, 16, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, + 0, 17, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 9, + 0, 7, 23, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_grapheme_link_table_3[] = { + 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 24, 0, 4, 0, 0, + 0, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 6, 0, 0, 16, 0, + 0, 0, 4, 0, 1, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 0, + 0, 0, 0, 128, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 8, 0, + 0, 0, 64, 0, 0, 0, 0, 2, 0, 0, 24, 0, 0, 0, 32, 0, + 4, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 96, 128, 0, 0, 0, + 48, 0, 0, 0, 0, 0, 128, 0 +}; + +RE_UINT32 re_get_grapheme_link(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_grapheme_link_table_1[field_2]; + v = re_grapheme_link_table_2[(v << 5) | field_1]; + v = re_grapheme_link_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Hangul_Syllable_Type. */ +static RE_UINT8 re_hangul_syllable_type_table_1[] = { + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, + 8, 9, 3, 4, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_hangul_syllable_type_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, + 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, + 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, + 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, + 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, + 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, + 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, + 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, + 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, + 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, + 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, + 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, + 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, + 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, + 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, + 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 13, 14, 15 +}; + +static RE_UINT8 re_hangul_syllable_type_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 +}; + +RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_hangul_syllable_type_table_1[field_2]; + v = re_hangul_syllable_type_table_2[(v << 5) | field_1]; + v = re_hangul_syllable_type_table_3[(v << 5) | field_0]; + + return v; +} + +/* Hex_Digit. */ +RE_UINT32 re_get_hex_digit(RE_UINT32 codepoint) { + if (0x30 <= codepoint && codepoint <= 0x39) + return 1; + if (0x41 <= codepoint && codepoint <= 0x46) + return 1; + if (0x61 <= codepoint && codepoint <= 0x66) + return 1; + if (0xFF10 <= codepoint && codepoint <= 0xFF19) + return 1; + if (0xFF21 <= codepoint && codepoint <= 0xFF26) + return 1; + if (0xFF41 <= codepoint && codepoint <= 0xFF46) + return 1; + + return 0; +} + +/* Hyphen. */ +static RE_UINT8 re_hyphen_table_1[] = { + 0, 1, 2, 2, 2, 2, 3, 2, 4, 2, 2, 5, 6, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_hyphen_table_2[] = { + 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0 +}; + +static RE_UINT8 re_hyphen_table_3[] = { + 0, 0, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 64, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 128, 0, 0, 0, 0, 8, 8, 0, 0, 0, + 32, 0, 0, 0 +}; + +RE_UINT32 re_get_hyphen(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_hyphen_table_1[field_2]; + v = re_hyphen_table_2[(v << 5) | field_1]; + v = re_hyphen_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* ID_Continue. */ +static RE_UINT8 re_id_continue_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 12, 12, + 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 17, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 9, 9, 12, 30, 9, 9, + 9, 31, 9, 9, 9, 9, 9, 9, 9, 9, 32, 33, 12, 12, 12, 12, + 12, 34, 12, 35, 9, 9, 9, 9, 9, 9, 9, 9, 36, 9, 9, 37, + 9, 9, 9, 9, 38, 39, 40, 9, 41, 9, 42, 43, 9, 9, 44, 9, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 45, 12, 12, 12, 46, 47, 12, + 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 49, 9, 9, 9, 50, 9, + 12, 12, 12, 12, 51, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 52, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 +}; + +static RE_UINT16 re_id_continue_table_2[] = { + 0, 1, 2, 3, 0, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 7, 8, 6, 6, 6, 9, 10, 11, 6, 12, + 6, 6, 6, 6, 13, 6, 6, 6, 6, 14, 15, 6, 16, 17, 18, 19, + 20, 6, 6, 21, 6, 6, 22, 23, 24, 6, 25, 6, 6, 26, 6, 27, + 6, 28, 29, 30, 0, 31, 32, 11, 6, 6, 6, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 43, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 53, 6, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 0, 70, 71, 72, 0, 73, 74, 75, 76, 77, 78, 79, 0, + 6, 6, 80, 6, 81, 6, 82, 83, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 84, 6, 85, 86, 87, 6, 88, 6, 89, 90, 91, 6, 6, 92, + 67, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 93, 3, 6, 6, 94, 95, 96, 97, 98, 6, 6, 99, 100, + 101, 6, 6, 102, 6, 103, 6, 104, 105, 106, 107, 108, 6, 109, 110, 0, + 29, 6, 105, 111, 112, 113, 114, 0, 6, 6, 115, 116, 6, 6, 6, 97, + 6, 117, 118, 81, 119, 89, 120, 68, 6, 6, 6, 6, 6, 6, 6, 121, + 6, 6, 6, 6, 6, 6, 6, 6, 92, 6, 122, 81, 6, 123, 124, 125, + 0, 126, 127, 128, 129, 0, 129, 130, 131, 132, 133, 6, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 41, 44, 209, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 191, 122, 0, - 36, 122, 0, 0, 7, 7, 111, 0, 62, 36, 36, 36, 36, 36, 0, 82, - 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 11, 11, 11, 11, 11, 11, 11, 15, 15, 15, 15, 15, 15, 15, 15, - 0, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 135, 105, 6, 6, 6, 6, 136, 6, 82, 6, 137, 138, 139, 139, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 61, 93, 88, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 0, 93, 117, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 61, 0, 0, 0, 0, 36, 0, 0, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 0, 36, 36, 36, 104, - 36, 36, 104, 0, 36, 36, 41, 220, 63, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 89, 58, 221, 63, 222, 44, - 66, 58, 44, 0, 0, 0, 0, 0, 0, 0, 106, 89, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 106, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 11, 11, 11, 11, 11, 159, 15, 15, 15, 15, 15, 15, 11, 11, 11, - 11, 11, 11, 159, 15, 139, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, - 159, 15, 15, 15, 15, 15, 15, 49, 48, 223, 10, 49, 11, 159, 170, 14, - 15, 14, 15, 15, 11, 11, 11, 11, 11, 11, 159, 15, 15, 15, 15, 15, - 15, 50, 22, 10, 11, 49, 11, 224, 15, 15, 15, 15, 15, 15, 50, 22, - 11, 160, 166, 11, 224, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, - 11, 159, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, 159, 15, - 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, 159, 15, 15, 15, 15, - 15, 15, 11, 11, 11, 11, 11, 11, 159, 15, 15, 15, 15, 15, 15, 11, - 11, 11, 11, 11, 11, 159, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, - 11, 11, 159, 15, 15, 15, 15, 15, 15, 39, 11, 11, 11, 11, 11, 11, - 224, 15, 15, 15, 15, 15, 24, 15, 33, 11, 11, 11, 11, 11, 22, 15, - 15, 15, 15, 15, 15, 139, 15, 11, 11, 11, 11, 11, 11, 224, 15, 15, - 15, 15, 15, 24, 15, 33, 11, 11, 11, 11, 11, 22, 15, 15, 15, 15, - 15, 15, 139, 15, 11, 11, 11, 11, 11, 11, 224, 15, 15, 15, 15, 15, - 24, 15, 27, 100, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 66, 93, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 116, 0, 86, 0, 0, - 0, 116, 122, 0, 0, 0, 93, 44, 58, 44, 44, 44, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 44, 66, 44, 44, 44, 44, 97, 44, 59, 75, 66, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 104, 44, 117, 36, 41, - 7, 7, 111, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 7, 7, 111, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 104, 0, 0, 44, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 11, 11, 11, 11, 11, 11, 11, 159, 15, 15, 15, 15, 15, 15, 15, - 15, 44, 117, 0, 7, 7, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 82, 36, 36, 36, 36, 36, 36, 102, 78, 82, 36, 61, 36, 112, 0, - 108, 62, 112, 82, 102, 78, 112, 112, 102, 78, 61, 36, 61, 36, 82, 43, - 36, 36, 99, 36, 36, 36, 36, 0, 82, 82, 99, 36, 36, 36, 36, 0, + 140, 141, 67, 6, 142, 67, 6, 83, 143, 14, 6, 6, 144, 6, 0, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 78, + 6, 6, 6, 6, 145, 0, 24, 81, 6, 6, 6, 6, 6, 6, 6, 6, + 146, 147, 6, 148, 6, 6, 6, 26, 149, 150, 6, 6, 151, 6, 152, 153, + 6, 154, 6, 97, 6, 6, 155, 156, 6, 157, 97, 78, 6, 6, 158, 105, + 6, 138, 159, 160, 6, 6, 161, 162, 163, 164, 83, 80, 6, 6, 6, 165, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 166, 167, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 157, 6, 6, 168, 0, 169, 170, 171, 6, 6, 26, 172, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 81, 24, 6, 173, 6, 174, 175, + 91, 176, 177, 178, 6, 6, 6, 78, 1, 2, 3, 107, 6, 105, 179, 0, + 180, 181, 182, 0, 6, 6, 6, 68, 0, 0, 6, 96, 0, 0, 0, 183, + 0, 0, 0, 0, 78, 6, 184, 114, 6, 185, 103, 68, 81, 6, 186, 0, + 6, 6, 6, 6, 81, 80, 187, 29, 6, 188, 6, 189, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 138, 104, 174, 0, 0, 0, 0, + 190, 191, 104, 138, 105, 0, 0, 192, 104, 168, 0, 0, 6, 193, 0, 0, + 194, 195, 0, 78, 78, 0, 75, 196, 6, 104, 104, 197, 26, 0, 0, 0, + 6, 6, 134, 0, 6, 197, 6, 197, 6, 198, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 199, 0, 0, 78, 200, 184, 0, 0, 24, 201, 138, + 6, 6, 196, 202, 6, 68, 24, 203, 6, 31, 204, 205, 6, 6, 206, 0, + 207, 208, 0, 0, 209, 119, 6, 210, 34, 211, 212, 213, 0, 0, 0, 0, + 6, 6, 214, 215, 6, 6, 216, 0, 0, 0, 0, 0, 6, 217, 218, 0, + 6, 6, 219, 0, 6, 102, 100, 0, 89, 115, 0, 0, 0, 0, 0, 0, + 6, 68, 0, 0, 0, 6, 6, 220, 221, 222, 223, 0, 0, 224, 225, 226, + 6, 105, 200, 6, 227, 0, 6, 102, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 5, 229, 230, 173, 231, 0, 0, 232, 233, 198, 234, 235, 100, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 236, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 168, 0, 0, 0, + 6, 6, 6, 144, 6, 6, 6, 6, 6, 6, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, - 11, 11, 123, 0, 11, 11, 11, 11, 11, 11, 123, 0, 11, 11, 11, 11, - 11, 11, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 102, 105, 100, 0, 0, 24, 108, 6, 138, 223, 237, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 127, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 104, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 41, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, 0, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 104, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 6, 0, 0, 0, 0, 6, 6, 238, 6, 239, 0, 0, 240, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 117, + 6, 6, 6, 6, 6, 6, 104, 0, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 105, 0, 241, 204, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 242, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 0, 0, + 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 31, 6, 248, 249, 250, 6, 251, 252, 253, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 254, 255, 83, 31, 31, 135, 135, 228, 228, 256, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 257, 6, 258, 259, 260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 261, 262, 0, 0, 0, 0, 0, 0, 6, 263, 264, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 168, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 265, 0, 6, 6, 115, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 250, 266, 267, 268, 269, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 81, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 96, 6, 6, 6, 6, 6, 6, + 81, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 271, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 114, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 91, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_id_continue_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 135, 254, 255, 255, 7, + 0, 4, 160, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, + 31, 80, 0, 0, 255, 255, 223, 188, 192, 215, 255, 255, 251, 255, 255, 255, + 255, 255, 191, 255, 251, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, + 255, 1, 254, 255, 255, 255, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, + 0, 0, 255, 7, 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159, + 0, 0, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 63, 36, + 255, 63, 0, 0, 255, 255, 255, 15, 255, 7, 0, 0, 255, 255, 223, 255, + 255, 0, 248, 255, 207, 255, 254, 255, 239, 159, 249, 255, 255, 253, 197, 243, + 159, 121, 128, 176, 207, 255, 3, 80, 238, 135, 249, 255, 255, 253, 109, 211, + 135, 57, 2, 94, 192, 255, 63, 0, 238, 191, 251, 255, 255, 253, 237, 243, + 191, 59, 1, 0, 207, 255, 0, 254, 238, 159, 249, 255, 159, 57, 224, 176, + 207, 255, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, + 192, 255, 0, 0, 255, 223, 253, 255, 255, 253, 255, 227, 223, 61, 96, 7, + 207, 255, 0, 0, 239, 223, 253, 255, 255, 253, 239, 243, 223, 61, 96, 64, + 207, 255, 6, 0, 223, 125, 240, 128, 207, 255, 0, 252, 238, 255, 127, 252, + 255, 255, 251, 47, 127, 132, 95, 255, 192, 255, 12, 0, 254, 255, 255, 255, + 255, 255, 255, 7, 255, 127, 255, 3, 214, 247, 255, 255, 175, 255, 255, 63, + 95, 63, 255, 243, 1, 0, 0, 3, 255, 3, 160, 194, 255, 254, 255, 255, + 255, 31, 254, 255, 223, 255, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, + 255, 3, 255, 255, 255, 255, 255, 63, 191, 32, 255, 255, 255, 255, 255, 247, + 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, + 255, 255, 61, 255, 255, 255, 255, 231, 0, 254, 3, 0, 255, 255, 0, 0, + 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, 255, 223, 31, 0, + 255, 255, 31, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 143, 48, + 255, 3, 0, 0, 0, 56, 255, 3, 255, 255, 255, 1, 255, 7, 255, 255, + 255, 255, 63, 0, 255, 255, 255, 127, 255, 15, 255, 15, 192, 255, 255, 255, + 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 7, 255, 255, 255, 159, + 255, 3, 255, 3, 128, 0, 255, 191, 1, 0, 0, 0, 255, 15, 255, 3, + 0, 248, 15, 0, 255, 255, 255, 0, 255, 227, 255, 255, 255, 1, 255, 255, + 0, 0, 247, 255, 255, 255, 255, 251, 63, 63, 255, 170, 255, 255, 223, 95, + 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 0, 128, 1, 0, 16, 0, + 0, 0, 2, 128, 0, 0, 255, 31, 226, 255, 1, 0, 132, 252, 47, 63, + 80, 253, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 255, 127, 255, 255, + 31, 248, 15, 0, 255, 128, 0, 128, 255, 255, 127, 0, 127, 127, 127, 127, + 224, 0, 0, 0, 254, 255, 62, 31, 255, 255, 127, 254, 224, 255, 255, 255, + 255, 127, 0, 0, 255, 31, 0, 0, 255, 31, 255, 255, 255, 15, 0, 0, + 255, 255, 240, 191, 0, 0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, + 252, 7, 0, 0, 0, 0, 224, 255, 255, 16, 0, 0, 63, 0, 255, 3, + 255, 255, 255, 232, 255, 63, 255, 255, 1, 128, 255, 3, 255, 63, 255, 3, + 255, 255, 127, 252, 7, 0, 0, 56, 255, 255, 124, 0, 126, 126, 126, 0, + 127, 127, 255, 255, 255, 55, 255, 3, 15, 0, 255, 255, 127, 248, 255, 255, + 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, + 0, 0, 248, 255, 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 15, + 255, 255, 24, 0, 0, 224, 0, 0, 0, 0, 223, 255, 252, 252, 252, 28, + 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 0, 0, 0, 32, + 255, 255, 1, 0, 0, 224, 255, 255, 15, 255, 62, 0, 255, 255, 15, 255, + 255, 0, 255, 255, 15, 0, 0, 0, 63, 253, 255, 255, 255, 255, 191, 145, + 255, 255, 55, 0, 255, 255, 255, 192, 111, 240, 239, 254, 255, 255, 63, 135, + 127, 0, 0, 0, 255, 255, 7, 0, 255, 0, 255, 3, 255, 27, 3, 0, + 128, 0, 255, 255, 31, 0, 0, 0, 192, 255, 0, 128, 255, 1, 255, 3, + 240, 0, 255, 255, 255, 255, 79, 0, 31, 222, 255, 23, 255, 255, 251, 255, + 255, 255, 255, 64, 127, 189, 255, 191, 255, 7, 255, 3, 255, 253, 237, 251, + 159, 57, 129, 224, 207, 31, 31, 0, 255, 7, 255, 195, 3, 0, 0, 0, + 191, 0, 255, 3, 255, 255, 63, 255, 1, 0, 0, 63, 17, 0, 255, 3, + 255, 3, 0, 128, 127, 242, 111, 255, 255, 255, 191, 249, 15, 0, 255, 3, + 255, 252, 255, 255, 255, 255, 255, 252, 27, 0, 0, 0, 255, 255, 255, 35, + 255, 253, 255, 255, 1, 0, 255, 3, 0, 0, 252, 255, 255, 254, 127, 0, + 127, 251, 255, 255, 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251, 1, + 0, 0, 1, 0, 248, 255, 255, 224, 255, 135, 255, 255, 255, 128, 255, 255, + 27, 0, 3, 0, 0, 0, 7, 0, 255, 7, 255, 31, 255, 1, 255, 99, + 224, 227, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, + 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, + 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, + 247, 207, 255, 255, 255, 255, 127, 248, 255, 31, 32, 0, 16, 0, 0, 248, + 254, 255, 0, 0, 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 255, 63, + 255, 67, 0, 0, 31, 0, 127, 0, 150, 254, 247, 10, 132, 234, 150, 170, + 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255 }; -static RE_UINT8 re_sentence_break_stage_4[] = { - 0, 0, 0, 0, 0, 6, 2, 6, 6, 1, 0, 0, 6, 12, 13, 0, - 0, 0, 0, 13, 13, 13, 0, 0, 14, 14, 11, 0, 10, 10, 10, 10, - 10, 10, 14, 0, 0, 0, 0, 12, 0, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 13, 0, 13, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 13, 0, 4, 0, 0, 6, 0, 0, 0, 0, 0, 7, 13, - 0, 5, 0, 0, 0, 7, 0, 0, 8, 8, 8, 0, 8, 8, 8, 7, - 7, 7, 7, 0, 8, 7, 8, 7, 7, 8, 7, 8, 7, 7, 8, 7, - 8, 8, 7, 8, 7, 8, 7, 7, 7, 8, 8, 7, 8, 7, 8, 8, - 7, 8, 8, 8, 7, 7, 8, 8, 8, 7, 7, 7, 8, 7, 7, 9, - 9, 9, 9, 9, 9, 7, 7, 7, 7, 9, 9, 9, 7, 7, 0, 0, - 0, 0, 9, 9, 9, 9, 0, 0, 7, 0, 0, 0, 9, 0, 9, 0, - 3, 3, 3, 3, 9, 0, 8, 7, 0, 0, 7, 7, 7, 7, 0, 8, - 0, 0, 8, 0, 8, 0, 8, 8, 8, 8, 0, 8, 7, 7, 7, 8, - 8, 7, 0, 8, 8, 7, 0, 3, 3, 3, 8, 7, 0, 9, 0, 0, - 0, 14, 0, 0, 7, 12, 0, 0, 0, 3, 3, 3, 3, 3, 0, 3, - 0, 3, 3, 0, 9, 9, 9, 0, 0, 0, 0, 9, 5, 5, 5, 5, - 5, 5, 0, 0, 14, 14, 0, 0, 3, 3, 3, 0, 5, 0, 12, 12, - 9, 9, 9, 3, 10, 10, 0, 10, 10, 0, 9, 9, 3, 9, 9, 9, - 12, 9, 3, 3, 3, 5, 0, 3, 3, 9, 9, 3, 3, 0, 3, 3, - 3, 3, 9, 9, 10, 10, 9, 9, 9, 0, 0, 9, 12, 12, 12, 0, - 0, 0, 0, 5, 9, 3, 9, 9, 0, 9, 9, 9, 9, 9, 3, 3, - 3, 9, 0, 0, 14, 12, 9, 0, 0, 3, 0, 0, 3, 3, 9, 3, - 9, 3, 3, 3, 3, 3, 0, 0, 0, 12, 0, 0, 0, 12, 12, 0, - 9, 0, 9, 9, 0, 0, 0, 3, 3, 3, 5, 3, 3, 9, 3, 3, - 12, 12, 10, 10, 3, 0, 0, 3, 3, 3, 9, 0, 9, 9, 0, 9, - 0, 0, 10, 10, 9, 0, 3, 0, 0, 9, 9, 0, 9, 3, 0, 0, - 9, 0, 0, 0, 0, 9, 3, 3, 0, 0, 3, 3, 0, 0, 3, 9, - 0, 0, 9, 0, 0, 0, 3, 0, 3, 0, 3, 0, 10, 10, 0, 0, - 0, 9, 0, 9, 0, 3, 0, 3, 0, 3, 13, 13, 13, 13, 3, 3, - 3, 0, 0, 0, 3, 3, 3, 9, 10, 10, 12, 12, 10, 10, 3, 3, - 0, 8, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 8, 8, 0, 0, - 9, 0, 12, 9, 6, 9, 9, 9, 9, 9, 9, 13, 13, 0, 0, 0, - 3, 12, 12, 0, 9, 0, 3, 3, 0, 0, 14, 12, 14, 12, 0, 3, - 3, 3, 5, 0, 9, 3, 3, 9, 9, 3, 9, 0, 12, 12, 12, 12, - 0, 0, 12, 12, 9, 9, 12, 12, 0, 8, 0, 8, 7, 0, 7, 7, - 8, 0, 7, 0, 8, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 5, - 3, 3, 5, 5, 0, 0, 0, 14, 14, 0, 0, 0, 13, 13, 13, 13, - 11, 0, 0, 0, 4, 4, 5, 5, 5, 5, 5, 6, 0, 13, 13, 0, - 12, 12, 0, 0, 0, 13, 13, 12, 0, 0, 0, 6, 5, 0, 5, 5, - 0, 13, 13, 7, 0, 0, 0, 8, 0, 0, 7, 8, 8, 8, 7, 7, - 8, 0, 8, 0, 8, 8, 0, 7, 9, 7, 0, 0, 0, 8, 7, 7, - 0, 0, 7, 0, 9, 9, 9, 8, 0, 0, 8, 8, 0, 0, 13, 13, - 8, 7, 7, 8, 7, 8, 7, 3, 7, 7, 0, 7, 0, 0, 12, 9, - 0, 0, 13, 0, 6, 14, 12, 0, 0, 13, 13, 13, 9, 9, 0, 12, - 9, 0, 12, 12, 8, 7, 9, 3, 3, 3, 0, 9, 7, 7, 3, 3, - 3, 3, 0, 12, 0, 0, 8, 7, 9, 0, 0, 8, 7, 8, 7, 9, - 7, 7, 7, 9, 9, 9, 3, 9, 0, 9, 9, 3, 0, 12, 12, 12, - 0, 0, 9, 3, 12, 12, 9, 9, 9, 3, 3, 0, 3, 3, 3, 12, - 0, 0, 0, 7, 0, 9, 3, 9, 9, 9, 13, 13, 14, 14, 0, 14, - 0, 14, 14, 0, 13, 0, 0, 13, 0, 14, 12, 12, 14, 13, 13, 13, - 13, 13, 13, 0, 9, 0, 0, 5, 0, 13, 0, 13, 13, 12, 13, 13, - 14, 0, 9, 9, 0, 5, 5, 5, 0, 5, 12, 12, 3, 0, 10, 10, - 9, 12, 12, 0, 3, 12, 0, 0, 10, 10, 9, 0, 12, 12, 0, 12, - 12, 0, 3, 0, 9, 12, 0, 0, 9, 9, 0, 3, 9, 9, 9, 12, - 3, 0, 12, 12, 3, 9, 0, 9, 12, 9, 0, 0, 5, 0, 0, 0, - 0, 3, 3, 12, 3, 3, 3, 5, 5, 5, 5, 3, 0, 8, 8, 0, - 8, 0, 7, 7, -}; +RE_UINT32 re_get_id_continue(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* Sentence_Break: 8564 bytes. */ - -RE_UINT32 re_get_sentence_break(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_sentence_break_stage_1[f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_sentence_break_stage_2[pos + f] << 5; - f = code >> 2; - code ^= f << 2; - pos = (RE_UINT32)re_sentence_break_stage_3[pos + f] << 2; - value = re_sentence_break_stage_4[pos + code]; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* Math. */ + v = re_id_continue_table_1[field_2]; + v = re_id_continue_table_2[(v << 5) | field_1]; + v = re_id_continue_table_3[(v << 2) | field_0]; -static RE_UINT8 re_math_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; + return (v >> offset) & 0x1; +} -static RE_UINT8 re_math_stage_2[] = { - 0, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 7, - 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2, +/* Ideographic. */ +static RE_UINT8 re_ideographic_table_1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, + 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 2, 2, 2, 2, + 2, 7, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 11, 12, 2, + 2, 2, 2, 13, 2, 2, 2, 2, 2, 2, 14, 0, 0, 0, 15, 0, + 2, 2, 2, 2, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_math_stage_3[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, - 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15, 15, 16, 17, 18, 19, - 4, 4, 4, 4, 4, 4, 20, 21, 22, 23, 4, 4, 4, 4, 4, 15, - 4, 4, 4, 4, 15, 15, 15, 15, 15, 15, 15, 15, 24, 25, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 26, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 27, 4, 4, 28, 29, 4, 30, - 15, 31, 32, 33, 34, 35, 15, 15, 15, 15, 36, 15, 15, 15, 15, 37, - 4, 4, 4, 4, 4, 4, 4, 4, 38, 39, 40, 41, 4, 4, 4, 4, +static RE_UINT8 re_ideographic_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 5, 3, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, + 3, 3, 3, 3, 3, 3, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 12, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 13, 0, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 14, 3, 3, 3, 3, 3, 3, + 13, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 15, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 16, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 17, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_math_stage_4[] = { - 0, 0, 0, 0, 0, 8, 0, 112, 0, 0, 0, 64, 0, 0, 0, 80, - 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 128, 0, 0, 0, 128, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 115, 0, - 192, 1, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 28, 0, - 17, 0, 4, 0, 30, 0, 0, 124, 0, 124, 0, 0, 0, 0, 0, 0, - 0, 0, 255, 31, 98, 248, 0, 0, 132, 252, 47, 63, 16, 179, 251, 241, - 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 126, 195, 240, - 255, 255, 255, 47, 48, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 0, 15, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, - 0, 0, 0, 248, 255, 255, 191, 0, 0, 0, 1, 240, 7, 0, 0, 0, - 0, 0, 0, 0, 3, 192, 255, 240, 195, 140, 15, 0, 148, 31, 0, 255, - 96, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 15, 224, 0, 0, - 0, 0, 0, 0, 0, 0, 255, 255, 159, 31, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 126, 1, 0, 0, - 0, 8, 0, 112, 0, 0, 0, 80, 0, 0, 0, 80, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 30, 0, 0, 255, 255, 223, 255, 255, 255, 255, 255, - 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 255, 255, 255, 255, - 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 63, 255, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255, - 239, 255, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, - 255, 251, 255, 15, 238, 251, 255, 15, 0, 0, 0, 0, 0, 0, 3, 0, +static RE_UINT8 re_ideographic_table_3[] = { + 0, 0, 0, 0, 192, 0, 0, 0, 254, 3, 0, 7, 255, 255, 255, 255, + 255, 255, 255, 31, 255, 63, 255, 255, 255, 255, 255, 3, 16, 0, 0, 0, + 255, 255, 255, 0, 255, 255, 63, 0, 255, 1, 0, 0, 0, 0, 255, 255, + 255, 255, 255, 15, 255, 255, 255, 63, 255, 255, 31, 0, 3, 0, 255, 255, + 1, 0, 0, 0, 255, 7, 0, 0 }; -/* Math: 628 bytes. */ - -RE_UINT32 re_get_math(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_math_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_math_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_math_stage_3[pos + f] << 6; - pos += code; - value = (re_math_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; +RE_UINT32 re_get_ideographic(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_ideographic_table_1[field_2]; + v = re_ideographic_table_2[(v << 5) | field_1]; + v = re_ideographic_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; } -/* Alphabetic. */ +/* IDS_Binary_Operator. */ +RE_UINT32 re_get_ids_binary_operator(RE_UINT32 codepoint) { + if (0x2FF0 <= codepoint && codepoint <= 0x2FF1) + return 1; + if (0x2FF4 <= codepoint && codepoint <= 0x2FFB) + return 1; + + return 0; +} -static RE_UINT8 re_alphabetic_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 21, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 23, 24, 5, 25, 26, +/* ID_Start. */ +static RE_UINT8 re_id_start_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 12, 12, + 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 17, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 9, 9, 12, 30, 9, 9, + 9, 31, 9, 9, 9, 9, 9, 9, 9, 9, 32, 33, 12, 12, 12, 12, + 12, 34, 12, 35, 9, 9, 9, 9, 9, 9, 9, 9, 36, 9, 9, 37, + 9, 9, 9, 9, 9, 38, 9, 9, 39, 9, 40, 41, 9, 9, 9, 9, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 42, 12, 12, 12, 43, 44, 12, + 12, 12, 12, 45, 12, 12, 12, 12, 12, 12, 46, 9, 9, 9, 47, 9, + 12, 12, 12, 12, 48, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -7455,3134 +12959,5435 @@ static RE_UINT8 re_alphabetic_stage_1[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; -static RE_UINT8 re_alphabetic_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 32, 31, 31, 31, 31, 31, 31, 31, 33, 34, 35, 31, - 36, 37, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39, - 1, 1, 1, 1, 40, 1, 41, 42, 43, 44, 45, 46, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 47, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 48, 49, 1, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 1, 59, 60, 61, 62, 63, 64, 65, 31, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 31, 78, 79, 80, 31, - 1, 1, 1, 81, 82, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 84, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 85, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 86, 87, 31, 31, 88, 89, - 1, 1, 1, 1, 1, 1, 1, 90, 1, 1, 91, 31, 31, 31, 31, 31, - 1, 92, 93, 31, 31, 31, 31, 31, 31, 31, 31, 31, 94, 31, 31, 31, - 31, 31, 31, 31, 95, 96, 97, 98, 31, 31, 31, 31, 31, 31, 31, 31, - 99, 100, 101, 31, 31, 31, 31, 31, 102, 103, 31, 31, 31, 31, 104, 31, - 31, 105, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 1, 1, 106, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 107, 108, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 109, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 110, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 111, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_alphabetic_stage_3[] = { +static RE_UINT8 re_id_start_table_2[] = { 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 7, 8, 9, 10, 4, 11, - 4, 4, 4, 4, 12, 4, 4, 4, 4, 13, 14, 4, 15, 16, 17, 18, - 19, 4, 20, 21, 4, 4, 22, 23, 24, 4, 25, 4, 4, 26, 27, 28, - 29, 30, 31, 32, 0, 33, 34, 35, 4, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 48, 52, 53, 54, 55, 56, 0, - 57, 58, 59, 60, 57, 61, 62, 63, 57, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 0, 74, 75, 76, 0, 77, 0, 78, 79, 80, 81, 0, 0, - 4, 82, 24, 4, 83, 4, 84, 85, 4, 4, 86, 4, 87, 88, 89, 4, - 90, 4, 72, 0, 91, 4, 4, 92, 71, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 93, 1, 4, 4, 94, 95, 96, 96, 97, 4, 98, 99, 0, - 0, 4, 4, 31, 4, 100, 4, 101, 102, 103, 24, 104, 4, 105, 106, 0, - 107, 4, 102, 108, 0, 109, 0, 0, 4, 110, 111, 0, 4, 112, 4, 113, - 4, 114, 115, 116, 117, 64, 0, 118, 4, 4, 4, 4, 4, 4, 0, 119, - 92, 4, 120, 116, 4, 121, 122, 123, 0, 0, 0, 124, 125, 0, 0, 0, - 126, 127, 128, 4, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 129, 4, 106, 4, 130, 102, 4, 4, 4, 4, 131, - 4, 84, 4, 132, 114, 133, 133, 4, 0, 134, 0, 0, 0, 0, 0, 0, - 135, 136, 71, 4, 137, 71, 4, 85, 138, 13, 4, 4, 139, 72, 0, 24, - 4, 4, 4, 4, 4, 101, 0, 0, 4, 4, 4, 4, 4, 4, 4, 91, - 4, 4, 4, 4, 30, 0, 24, 116, 140, 141, 4, 142, 4, 4, 4, 91, - 143, 144, 4, 4, 145, 4, 146, 143, 147, 148, 4, 96, 4, 4, 149, 150, - 27, 100, 151, 81, 4, 152, 134, 153, 4, 114, 154, 155, 4, 102, 156, 157, - 158, 159, 85, 160, 4, 4, 4, 32, 4, 4, 4, 4, 4, 161, 162, 107, - 4, 4, 4, 163, 4, 4, 164, 0, 165, 166, 167, 4, 4, 26, 168, 4, - 4, 116, 24, 4, 169, 4, 148, 170, 0, 0, 0, 171, 4, 4, 4, 81, - 0, 1, 1, 172, 4, 102, 173, 0, 174, 175, 176, 0, 4, 4, 4, 72, - 0, 0, 4, 177, 0, 0, 0, 0, 0, 0, 0, 0, 81, 4, 178, 0, - 4, 25, 100, 72, 116, 4, 179, 0, 4, 4, 4, 4, 116, 24, 180, 107, - 4, 160, 4, 60, 0, 0, 0, 0, 4, 114, 101, 148, 0, 0, 0, 0, - 181, 182, 101, 114, 102, 0, 0, 183, 101, 164, 0, 0, 4, 184, 0, 0, - 185, 101, 0, 81, 81, 0, 78, 186, 4, 101, 101, 151, 26, 0, 0, 0, - 4, 4, 15, 0, 4, 151, 4, 151, 4, 148, 0, 0, 0, 0, 0, 0, - 81, 187, 188, 0, 0, 0, 0, 114, 4, 4, 188, 0, 144, 31, 24, 15, - 4, 151, 189, 190, 4, 4, 191, 0, 192, 193, 0, 0, 194, 117, 4, 15, - 39, 48, 195, 60, 0, 0, 0, 0, 4, 4, 196, 0, 4, 4, 197, 0, - 0, 0, 0, 0, 4, 198, 199, 0, 4, 102, 200, 0, 4, 201, 0, 0, - 64, 32, 0, 0, 0, 0, 0, 0, 4, 31, 0, 0, 0, 4, 4, 202, - 0, 0, 0, 0, 0, 203, 29, 204, 4, 205, 24, 4, 206, 0, 4, 31, - 207, 208, 77, 209, 169, 210, 0, 0, 211, 212, 213, 214, 215, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 114, 4, 4, 4, 4, 164, 0, 0, 0, - 4, 4, 4, 139, 4, 4, 4, 4, 4, 4, 60, 0, 0, 0, 0, 0, - 4, 139, 0, 0, 0, 0, 0, 0, 4, 4, 216, 0, 0, 0, 0, 0, - 4, 31, 102, 0, 0, 0, 24, 154, 4, 91, 60, 217, 91, 0, 0, 0, - 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 218, 4, 219, 0, 0, 220, - 4, 4, 4, 4, 4, 4, 4, 221, 4, 4, 4, 4, 4, 4, 4, 151, - 102, 0, 222, 223, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 107, - 4, 4, 4, 224, 225, 0, 0, 0, 4, 4, 226, 4, 227, 228, 229, 4, - 230, 231, 232, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 233, 234, 85, - 226, 226, 130, 130, 207, 207, 235, 0, 236, 237, 0, 0, 0, 0, 0, 0, - 4, 238, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 240, - 4, 4, 4, 4, 4, 4, 186, 0, 4, 4, 241, 0, 0, 0, 0, 0, - 229, 242, 243, 244, 245, 246, 0, 0, 0, 24, 247, 247, 106, 0, 0, 0, - 4, 4, 4, 4, 4, 4, 114, 0, 4, 177, 4, 4, 4, 4, 4, 4, - 116, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 248, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 77, 116, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 0, 7, 8, 9, 4, 10, + 4, 4, 4, 4, 11, 4, 4, 4, 4, 12, 13, 4, 14, 0, 15, 16, + 0, 4, 17, 18, 4, 4, 19, 20, 21, 22, 23, 4, 4, 24, 25, 26, + 27, 28, 29, 17, 0, 30, 31, 0, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 45, 49, 50, 51, 52, 46, 0, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 0, + 68, 69, 67, 0, 70, 71, 72, 0, 73, 0, 74, 75, 76, 0, 0, 0, + 4, 77, 78, 79, 80, 4, 81, 82, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 83, 4, 84, 85, 86, 4, 87, 4, 88, 0, 22, 4, 4, 89, + 68, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 90, 1, 4, 4, 91, 92, 93, 93, 94, 4, 95, 96, 0, + 0, 4, 4, 29, 4, 97, 4, 98, 99, 0, 15, 100, 4, 101, 102, 0, + 103, 4, 104, 0, 0, 105, 0, 0, 106, 95, 107, 0, 108, 109, 4, 110, + 4, 111, 112, 113, 114, 115, 0, 116, 4, 4, 4, 4, 4, 4, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 89, 4, 117, 113, 4, 118, 119, 120, + 0, 0, 0, 121, 122, 0, 0, 0, 123, 124, 125, 4, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 126, 99, 4, 4, 4, 4, 127, 4, 81, 4, 128, 103, 129, 129, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 130, 131, 68, 4, 132, 68, 4, 82, 106, 12, 4, 4, 133, 4, 0, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 134, + 4, 4, 4, 4, 75, 0, 15, 113, 4, 4, 4, 4, 4, 4, 4, 4, + 135, 136, 4, 137, 113, 4, 4, 22, 138, 139, 4, 4, 140, 4, 141, 142, + 143, 144, 4, 95, 139, 95, 0, 145, 25, 146, 67, 134, 32, 147, 148, 149, + 4, 14, 150, 151, 4, 152, 153, 154, 155, 156, 82, 157, 4, 4, 4, 144, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 158, 159, 160, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 161, 4, 4, 162, 0, 163, 164, 165, 4, 4, 93, 166, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 113, 15, 4, 167, 4, 31, 168, + 0, 0, 0, 169, 4, 4, 4, 134, 0, 1, 1, 170, 4, 99, 171, 0, + 172, 173, 174, 0, 4, 4, 4, 88, 0, 0, 4, 104, 0, 0, 0, 0, + 0, 0, 0, 0, 134, 4, 175, 0, 4, 23, 176, 98, 113, 4, 177, 0, + 4, 4, 4, 4, 113, 15, 178, 160, 4, 179, 4, 111, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 103, 98, 31, 0, 0, 0, 0, + 180, 181, 98, 103, 99, 0, 0, 182, 98, 162, 0, 0, 4, 183, 0, 0, + 184, 98, 0, 134, 134, 0, 74, 185, 4, 98, 98, 147, 93, 0, 0, 0, + 4, 4, 14, 0, 4, 147, 4, 147, 4, 111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 186, 0, 0, 134, 187, 110, 0, 0, 15, 185, 103, + 108, 188, 0, 0, 108, 22, 15, 14, 108, 67, 189, 190, 108, 147, 191, 0, + 192, 193, 0, 0, 194, 114, 99, 0, 48, 45, 195, 56, 0, 0, 0, 0, + 4, 104, 196, 56, 4, 22, 197, 0, 0, 0, 0, 0, 4, 133, 198, 0, + 4, 22, 199, 0, 4, 200, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, + 4, 193, 0, 0, 0, 4, 4, 201, 202, 203, 204, 0, 0, 205, 175, 206, + 207, 208, 209, 4, 210, 0, 4, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 211, 133, 73, 212, 22, 0, 0, 0, 213, 175, 214, 215, 216, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 46, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 162, 0, 0, 0, + 4, 4, 4, 133, 4, 4, 4, 4, 4, 4, 111, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 29, 99, 0, 0, 0, 15, 217, 4, 22, 111, 218, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 219, 0, 166, 0, 0, 220, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 188, + 4, 4, 4, 4, 4, 4, 98, 0, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 99, 0, 221, 222, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 160, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 223, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 30, 4, 225, 226, 227, 4, 228, 229, 230, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 231, 232, 82, 30, 30, 126, 126, 211, 211, 150, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 233, 234, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 193, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 185, 0, 4, 4, 235, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 227, 236, 237, 238, 239, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 113, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 104, 4, 4, 4, 4, 4, 4, + 113, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 241, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 73, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 17, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_alphabetic_stage_4[] = { +static RE_UINT8 re_id_start_table_3[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, - 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 32, 0, 0, 0, - 0, 0, 223, 188, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, - 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 0, 0, - 0, 0, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, 0, 0, 255, 7, - 255, 255, 255, 254, 0, 192, 255, 255, 255, 255, 239, 31, 254, 225, 0, 156, - 0, 0, 255, 255, 0, 224, 255, 255, 255, 255, 3, 0, 0, 252, 255, 255, - 255, 7, 48, 4, 255, 255, 255, 252, 255, 31, 0, 0, 255, 255, 255, 1, - 255, 7, 0, 0, 255, 255, 223, 63, 0, 0, 240, 255, 248, 3, 255, 255, - 255, 255, 255, 239, 255, 223, 225, 255, 15, 0, 254, 255, 239, 159, 249, 255, - 255, 253, 197, 227, 159, 89, 128, 176, 15, 0, 3, 16, 238, 135, 249, 255, - 255, 253, 109, 195, 135, 25, 2, 94, 0, 0, 63, 0, 238, 191, 251, 255, - 255, 253, 237, 227, 191, 27, 1, 0, 15, 0, 0, 30, 238, 159, 249, 255, - 159, 25, 192, 176, 15, 0, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, - 199, 29, 129, 0, 239, 223, 253, 255, 255, 253, 255, 227, 223, 29, 96, 7, - 15, 0, 0, 0, 255, 253, 239, 227, 223, 29, 96, 64, 15, 0, 6, 0, - 255, 255, 255, 231, 223, 93, 240, 128, 15, 0, 0, 252, 236, 255, 127, 252, - 255, 255, 251, 47, 127, 128, 95, 255, 0, 0, 12, 0, 254, 255, 255, 255, - 255, 255, 255, 7, 127, 32, 0, 0, 214, 247, 255, 255, 175, 255, 255, 59, - 95, 32, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, 255, 31, 254, 255, - 3, 255, 255, 254, 255, 255, 255, 31, 255, 255, 127, 249, 255, 255, 0, 60, - 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, - 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 0, 0, - 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, 255, 223, 15, 0, - 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 207, 255, 255, 1, 128, 16, - 255, 7, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, 255, 15, 255, 1, - 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 0, 0, 255, 255, 255, 15, - 254, 255, 31, 0, 128, 0, 0, 0, 255, 255, 239, 255, 239, 15, 0, 0, - 255, 243, 0, 252, 191, 255, 3, 0, 255, 255, 127, 0, 0, 224, 0, 252, - 255, 255, 255, 63, 255, 1, 255, 255, 0, 222, 111, 4, 128, 255, 31, 0, - 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, - 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, 80, 189, 255, 243, - 224, 67, 0, 0, 0, 0, 192, 255, 255, 127, 255, 255, 31, 120, 12, 0, - 255, 128, 0, 0, 127, 127, 127, 127, 0, 128, 0, 0, 224, 0, 0, 0, - 254, 3, 62, 31, 255, 255, 127, 224, 224, 255, 255, 255, 255, 127, 0, 0, - 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 240, 143, 0, 0, 128, 255, - 252, 255, 255, 255, 255, 249, 255, 255, 124, 0, 0, 0, 191, 255, 255, 255, - 255, 0, 0, 0, 47, 0, 0, 0, 0, 0, 252, 232, 255, 255, 7, 0, - 255, 255, 247, 255, 255, 255, 0, 124, 255, 63, 0, 0, 255, 255, 127, 252, - 5, 0, 0, 56, 255, 255, 60, 0, 126, 126, 126, 0, 127, 127, 255, 255, - 255, 0, 255, 255, 15, 0, 255, 255, 127, 248, 255, 255, 255, 63, 255, 255, - 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, - 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 15, 0, 0, 223, 255, - 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, - 255, 63, 255, 63, 255, 255, 31, 0, 255, 255, 1, 0, 15, 255, 62, 0, - 255, 255, 15, 255, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, - 255, 255, 255, 192, 111, 240, 239, 254, 31, 0, 0, 0, 128, 0, 255, 255, - 63, 0, 0, 0, 112, 0, 255, 255, 255, 255, 71, 0, 30, 0, 0, 20, - 255, 255, 251, 255, 255, 255, 159, 64, 127, 189, 255, 191, 159, 25, 129, 224, - 187, 7, 0, 128, 179, 0, 0, 0, 255, 255, 63, 127, 0, 0, 0, 63, - 17, 0, 0, 0, 255, 255, 63, 1, 0, 0, 0, 128, 255, 252, 255, 255, - 26, 0, 0, 0, 255, 255, 231, 127, 255, 255, 255, 32, 255, 253, 255, 255, - 255, 255, 127, 127, 0, 0, 252, 255, 255, 254, 127, 0, 127, 251, 255, 255, - 255, 255, 127, 180, 203, 0, 0, 0, 191, 253, 255, 255, 255, 127, 123, 1, - 127, 0, 0, 0, 248, 255, 255, 224, 255, 135, 255, 255, 255, 128, 255, 255, - 11, 0, 0, 0, 255, 255, 255, 0, 0, 0, 7, 0, 240, 0, 255, 255, - 255, 7, 255, 31, 255, 1, 255, 67, 255, 255, 223, 255, 255, 255, 255, 223, - 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, - 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 247, 15, 0, 0, - 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 128, 63, 0, 64, 0, 0, - 255, 15, 0, 0, 143, 8, 0, 0, 150, 254, 247, 10, 132, 234, 150, 170, - 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 255, 3, 255, 255, - 3, 0, 255, 255, -}; - -/* Alphabetic: 2596 bytes. */ - -RE_UINT32 re_get_alphabetic(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_alphabetic_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_alphabetic_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_alphabetic_stage_3[pos + f] << 5; - pos += code; - value = (re_alphabetic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 0, 0, 223, 188, + 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, + 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 0, 0, 0, 0, 255, 255, + 255, 135, 7, 0, 255, 7, 0, 0, 0, 192, 254, 255, 255, 255, 47, 0, + 96, 192, 0, 156, 0, 0, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, + 63, 0, 2, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 63, 4, + 16, 1, 0, 0, 255, 255, 255, 1, 255, 255, 223, 255, 255, 0, 0, 0, + 240, 255, 255, 255, 255, 255, 255, 35, 0, 0, 1, 255, 3, 0, 254, 255, + 225, 159, 249, 255, 255, 253, 197, 35, 0, 64, 0, 176, 3, 0, 3, 16, + 224, 135, 249, 255, 255, 253, 109, 3, 0, 0, 0, 94, 0, 0, 28, 0, + 224, 191, 251, 255, 255, 253, 237, 35, 0, 0, 1, 0, 3, 0, 0, 2, + 224, 159, 249, 255, 0, 0, 0, 176, 3, 0, 2, 0, 232, 199, 61, 214, + 24, 199, 255, 3, 224, 223, 253, 255, 255, 253, 255, 35, 0, 0, 0, 7, + 3, 0, 0, 0, 225, 223, 253, 255, 255, 253, 239, 35, 0, 0, 0, 64, + 3, 0, 6, 0, 240, 223, 253, 255, 255, 255, 255, 39, 0, 64, 112, 128, + 3, 0, 0, 252, 224, 255, 127, 252, 255, 255, 251, 47, 127, 0, 0, 0, + 254, 255, 255, 255, 255, 255, 13, 0, 214, 247, 255, 255, 175, 255, 13, 32, + 95, 0, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, 255, 31, 0, 0, + 0, 31, 0, 0, 255, 7, 0, 128, 0, 0, 63, 60, 98, 192, 225, 255, + 3, 64, 0, 0, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, + 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, + 255, 255, 255, 7, 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, + 255, 223, 3, 0, 255, 255, 3, 0, 255, 223, 1, 0, 255, 255, 15, 0, + 0, 0, 128, 16, 255, 5, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, + 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 0, 0, 255, 255, 127, 0, + 255, 255, 31, 0, 128, 0, 0, 0, 224, 255, 255, 255, 224, 15, 0, 0, + 248, 255, 255, 255, 1, 192, 0, 252, 63, 0, 0, 0, 15, 0, 0, 0, + 0, 224, 0, 252, 255, 255, 255, 63, 255, 1, 255, 255, 255, 255, 255, 231, + 0, 222, 111, 4, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, + 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 63, + 80, 253, 255, 243, 224, 67, 0, 0, 255, 127, 255, 255, 31, 120, 12, 0, + 255, 128, 0, 0, 127, 127, 127, 127, 224, 0, 0, 0, 254, 3, 62, 31, + 255, 255, 127, 248, 255, 127, 0, 0, 255, 255, 255, 31, 255, 31, 255, 255, + 0, 12, 0, 0, 255, 127, 0, 128, 0, 0, 128, 255, 252, 255, 255, 255, + 255, 249, 255, 255, 252, 7, 0, 0, 0, 0, 224, 255, 187, 247, 255, 255, + 7, 0, 0, 0, 0, 0, 252, 104, 63, 0, 255, 255, 255, 255, 7, 0, + 0, 128, 0, 0, 223, 255, 0, 124, 247, 15, 0, 0, 255, 255, 127, 196, + 255, 255, 98, 62, 5, 0, 0, 56, 255, 7, 28, 0, 126, 126, 126, 0, + 127, 127, 255, 255, 255, 3, 255, 255, 15, 0, 255, 255, 127, 248, 255, 255, + 255, 255, 255, 15, 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 160, + 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, + 0, 0, 255, 15, 0, 0, 223, 255, 192, 255, 255, 255, 252, 252, 252, 28, + 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 1, 0, + 255, 7, 255, 255, 15, 255, 62, 0, 255, 255, 15, 255, 255, 0, 255, 255, + 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, 255, 255, 255, 192, + 1, 0, 239, 254, 31, 0, 0, 0, 255, 3, 3, 0, 128, 0, 255, 255, + 255, 255, 255, 0, 144, 0, 255, 255, 255, 255, 71, 0, 30, 0, 0, 20, + 255, 255, 251, 255, 255, 15, 0, 0, 127, 189, 255, 191, 0, 0, 1, 224, + 128, 7, 0, 128, 176, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, + 255, 7, 0, 1, 0, 0, 0, 128, 127, 242, 111, 255, 255, 255, 0, 128, + 2, 0, 0, 0, 255, 252, 255, 255, 10, 0, 0, 0, 1, 248, 255, 255, + 255, 255, 7, 4, 0, 0, 1, 240, 255, 3, 0, 32, 255, 253, 255, 255, + 0, 0, 252, 255, 127, 251, 255, 255, 64, 0, 0, 0, 191, 253, 255, 255, + 255, 3, 0, 1, 255, 63, 0, 0, 248, 255, 255, 224, 255, 7, 1, 0, + 11, 0, 0, 0, 0, 0, 7, 0, 240, 0, 255, 255, 255, 7, 255, 31, + 255, 1, 255, 3, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, + 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, + 253, 255, 255, 247, 255, 31, 128, 63, 0, 64, 0, 0, 15, 8, 0, 0, + 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, + 238, 251, 255, 15, 3, 0, 255, 255 +}; + +RE_UINT32 re_get_id_start(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_id_start_table_1[field_2]; + v = re_id_start_table_2[(v << 5) | field_1]; + v = re_id_start_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; } -/* Lowercase. */ - -static RE_UINT8 re_lowercase_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_lowercase_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 3, 14, - 3, 3, 15, 3, 3, 3, 16, 3, 3, 3, 3, 3, 17, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 18, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 19, 20, 3, 3, 3, 3, - 3, 3, 3, 3, 21, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -}; - -static RE_UINT8 re_lowercase_stage_3[] = { - 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 5, 13, 14, 15, 16, 17, 18, 19, 0, 0, 20, 21, 22, 23, 24, 25, - 0, 26, 15, 5, 27, 5, 28, 5, 5, 29, 0, 15, 30, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 31, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, - 0, 0, 0, 0, 30, 0, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, - 5, 5, 5, 5, 33, 5, 5, 5, 34, 35, 36, 37, 35, 38, 39, 40, - 0, 0, 0, 41, 42, 0, 0, 0, 43, 44, 45, 26, 46, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 47, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 26, 48, 49, 5, 5, 5, 50, 15, 51, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 52, 53, 0, 0, 0, 0, 54, 5, 55, 56, 57, 58, 59, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 60, 61, 15, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 63, 64, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 68, 69, 81, - 71, 72, 82, 64, 75, 83, 84, 85, 86, 82, 87, 26, 88, 75, 89, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 91, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_lowercase_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 0, 0, 0, 128, - 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 85, 85, 171, 170, 170, - 170, 170, 170, 212, 41, 49, 36, 78, 42, 45, 81, 230, 64, 82, 85, 181, - 170, 170, 41, 170, 170, 170, 250, 147, 133, 170, 255, 255, 255, 255, 255, 255, - 255, 255, 239, 255, 255, 255, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 138, 60, 0, 0, 1, 0, 0, 240, 255, 255, - 255, 127, 227, 170, 170, 170, 47, 25, 0, 0, 255, 255, 2, 168, 170, 170, - 84, 213, 170, 170, 170, 170, 0, 0, 255, 1, 0, 0, 255, 255, 255, 231, - 0, 0, 0, 63, 170, 170, 234, 191, 255, 0, 63, 0, 255, 0, 255, 0, - 63, 0, 255, 0, 255, 0, 255, 63, 255, 0, 223, 64, 220, 0, 207, 0, - 255, 0, 220, 0, 0, 0, 2, 128, 0, 0, 255, 31, 0, 196, 8, 0, - 0, 128, 16, 50, 192, 67, 0, 0, 16, 0, 0, 0, 255, 3, 0, 0, - 255, 255, 255, 127, 98, 21, 218, 63, 26, 80, 8, 0, 191, 32, 0, 0, - 170, 42, 0, 0, 170, 170, 170, 58, 168, 170, 171, 170, 170, 170, 255, 149, - 170, 80, 186, 170, 170, 130, 160, 170, 8, 0, 0, 0, 0, 0, 0, 7, - 255, 255, 255, 247, 255, 0, 255, 255, 127, 0, 248, 0, 0, 255, 255, 255, - 255, 255, 0, 0, 0, 0, 0, 255, 255, 255, 255, 15, 255, 255, 7, 0, - 0, 0, 0, 252, 255, 255, 15, 0, 0, 192, 223, 255, 255, 0, 0, 0, - 252, 255, 255, 15, 0, 0, 192, 235, 239, 255, 0, 0, 0, 252, 255, 255, - 15, 0, 0, 192, 255, 255, 255, 0, 0, 0, 252, 255, 255, 15, 0, 0, - 192, 255, 255, 255, 0, 192, 255, 255, 0, 0, 192, 255, 63, 0, 0, 0, - 252, 255, 255, 247, 3, 0, 0, 240, 255, 255, 223, 15, 255, 127, 63, 0, - 255, 253, 0, 0, 247, 11, 0, 0, 252, 255, 255, 255, 15, 0, 0, 0, -}; +/* IDS_Trinary_Operator. */ +RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 codepoint) { + if (0x2FF2 <= codepoint && codepoint <= 0x2FF3) + return 1; -/* Lowercase: 1000 bytes. */ - -RE_UINT32 re_get_lowercase(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_lowercase_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_lowercase_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_lowercase_stage_3[pos + f] << 5; - pos += code; - value = (re_lowercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return 0; } -/* Uppercase. */ - -static RE_UINT8 re_uppercase_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_uppercase_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 12, - 3, 3, 13, 3, 3, 3, 14, 3, 3, 3, 3, 3, 15, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 16, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 17, 18, 3, 3, 3, 3, - 3, 3, 3, 3, 19, 3, 3, 3, 20, 3, 3, 3, 3, 3, 3, 3, -}; - -static RE_UINT8 re_uppercase_stage_3[] = { - 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, - 3, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, - 18, 19, 0, 3, 20, 3, 21, 3, 3, 22, 23, 0, 0, 0, 0, 0, +/* Indic_Positional_Category. */ +static RE_UINT8 re_indic_positional_category_table_1[] = { + 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 25, - 0, 0, 0, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 28, 3, 3, 3, 29, 30, 31, 32, 0, 33, 34, 35, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 19, 39, 0, 0, 0, - 0, 0, 0, 0, 0, 40, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 41, 0, 42, 3, 3, 3, 43, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 44, 45, 0, 0, 0, 0, 46, 3, 47, 48, 49, 50, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 18, 51, 0, 0, 0, 26, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 18, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 54, 55, 56, 57, 58, 59, 26, 60, 61, 62, 63, 64, 65, 54, 55, 56, - 57, 66, 25, 26, 60, 57, 67, 68, 69, 70, 40, 41, 26, 71, 72, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 18, 73, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 74, 74, 60, 0, 0, 0, -}; - -static RE_UINT8 re_uppercase_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 255, 255, 127, 127, 85, 85, 85, 85, - 85, 85, 85, 170, 170, 84, 85, 85, 85, 85, 85, 43, 214, 206, 219, 177, - 213, 210, 174, 17, 144, 164, 170, 74, 85, 85, 210, 85, 85, 85, 5, 108, - 122, 85, 0, 0, 0, 0, 69, 128, 64, 215, 254, 255, 251, 15, 0, 0, - 0, 128, 28, 85, 85, 85, 144, 230, 255, 255, 255, 255, 255, 255, 0, 0, - 1, 84, 85, 85, 171, 42, 85, 85, 85, 85, 254, 255, 255, 255, 127, 0, - 191, 32, 0, 0, 255, 255, 63, 0, 0, 0, 255, 255, 255, 255, 255, 231, - 85, 85, 21, 64, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, - 0, 255, 0, 0, 0, 0, 0, 15, 0, 15, 0, 15, 0, 31, 0, 15, - 132, 56, 39, 62, 80, 61, 15, 192, 32, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, 5, 40, 4, 0, - 85, 21, 0, 0, 85, 85, 85, 5, 84, 85, 84, 85, 85, 85, 0, 106, - 85, 40, 69, 85, 85, 125, 95, 85, 116, 0, 0, 0, 255, 0, 0, 0, - 255, 255, 15, 0, 255, 255, 7, 0, 255, 255, 255, 3, 0, 0, 240, 255, - 255, 63, 0, 0, 0, 255, 255, 255, 3, 0, 0, 208, 100, 222, 63, 0, - 255, 3, 0, 0, 176, 231, 223, 31, 0, 0, 0, 123, 95, 252, 1, 0, - 0, 240, 255, 255, 63, 0, 0, 0, 3, 0, 0, 240, 1, 0, 0, 0, - 252, 255, 255, 7, 0, 0, 0, 240, 255, 255, 31, 0, 255, 1, 0, 0, - 0, 4, 0, 0, 3, 0, 0, 0, 255, 3, 255, 255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Uppercase: 916 bytes. */ - -RE_UINT32 re_get_uppercase(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_uppercase_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_uppercase_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_uppercase_stage_3[pos + f] << 5; - pos += code; - value = (re_uppercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Cased. */ - -static RE_UINT8 re_cased_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, +static RE_UINT8 re_indic_positional_category_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 6, 10, 11, 9, 6, 12, 13, 5, 14, 15, 4, 16, 17, 18, 0, + 19, 20, 21, 4, 5, 14, 22, 4, 23, 24, 25, 4, 5, 0, 26, 27, + 0, 28, 29, 0, 0, 30, 31, 0, 32, 33, 0, 34, 35, 36, 37, 0, + 0, 38, 39, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 43, 43, 0, 44, 45, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 48, 0, + 49, 0, 50, 51, 0, 0, 0, 0, 52, 53, 54, 55, 56, 57, 0, 58, + 0, 59, 0, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 62, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 64, 65, 0, 0, 66, 67, 68, 69, 0, 70, 71, 0, 1, 72, 73, 74, + 0, 75, 76, 77, 0, 78, 79, 80, 0, 0, 0, 0, 0, 0, 0, 81, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 84, 85, 86, 0, 56, 87, 0, 0, 88, 89, 90, 91, 56, 92, 93, 0, + 0, 94, 0, 0, 0, 0, 95, 96, 23, 97, 98, 99, 0, 0, 0, 0, + 0, 100, 101, 0, 0, 102, 103, 0, 0, 0, 0, 0, 0, 104, 105, 0, + 0, 106, 107, 0, 0, 108, 0, 0, 109, 110, 0, 0, 0, 0, 0, 0, + 0, 111, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 114, 115, + 116, 117, 118, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 120, 0, 0, 121, 122, 0, 0, 0, 123, 124, 0, 125, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_cased_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, +static RE_UINT8 re_indic_positional_category_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 2, 4, + 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2, 2, 3, 4, 2, + 0, 1, 3, 1, 1, 1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 4, + 2, 3, 3, 3, 3, 0, 0, 4, 4, 0, 0, 5, 5, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 3, 3, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 3, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 3, 3, 3, 3, 1, 0, 1, 1, 6, 0, 2, 2, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 1, + 2, 3, 3, 3, 3, 0, 0, 4, 7, 0, 0, 5, 8, 3, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, + 1, 2, 2, 0, 0, 0, 4, 4, 4, 0, 5, 5, 5, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 2, 2, 2, 2, 0, 1, 1, 9, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 2, 2, 2, 2, 0, 1, 6, 6, 0, 6, 6, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 2, 2, + 2, 2, 2, 3, 3, 0, 4, 4, 4, 0, 5, 5, 5, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, + 2, 2, 1, 1, 3, 0, 3, 0, 2, 4, 7, 4, 5, 8, 5, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 1, 2, 2, 1, 1, 1, 1, 3, 3, 3, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 1, 2, 2, 1, 1, 1, 1, 3, 3, 3, 1, 3, 0, 0, 0, + 10, 10, 10, 10, 10, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 3, 0, 1, 0, 0, 0, 0, 2, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 1, 9, 3, 3, 9, 9, 9, 9, 1, 1, 1, 1, 1, 2, + 1, 9, 1, 1, 3, 0, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 3, 14, - 3, 3, 15, 3, 3, 3, 16, 3, 3, 3, 3, 3, 17, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 18, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 19, 20, 3, 3, 3, 3, - 3, 3, 3, 3, 21, 3, 3, 3, 22, 3, 3, 3, 3, 3, 3, 3, -}; - -static RE_UINT8 re_cased_stage_3[] = { - 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 5, 6, 4, - 4, 4, 4, 4, 7, 8, 9, 10, 0, 0, 11, 12, 13, 14, 4, 15, - 4, 4, 4, 4, 16, 4, 4, 4, 4, 17, 18, 4, 19, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 20, 21, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 22, - 0, 0, 0, 0, 23, 21, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, - 4, 4, 4, 4, 4, 4, 4, 4, 22, 4, 24, 25, 4, 26, 27, 28, - 0, 0, 0, 29, 30, 0, 0, 0, 31, 32, 33, 4, 34, 0, 0, 0, - 0, 0, 0, 0, 0, 35, 4, 36, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 37, 38, 4, 4, 4, 4, 39, 4, 40, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 41, 25, 0, 0, 0, 0, 42, 4, 4, 43, 4, 44, 45, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 5, 47, 4, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, - 4, 4, 49, 0, 0, 46, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 52, 4, 52, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 4, 53, 4, 54, 55, 56, 4, 57, 58, 59, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 60, 61, 5, 53, 53, 37, 37, 62, 62, 63, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 64, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 65, 65, 36, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 1, 3, + 3, 4, 1, 1, 1, 1, 1, 3, 2, 0, 1, 2, 11, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 3, 3, 0, 0, 0, 0, 3, 3, + 3, 0, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 2, 4, 1, 1, 2, 2, 2, 2, 2, 2, 3, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 3, 3, 3, 7, 8, + 5, 4, 4, 4, 5, 5, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 1, 1, 3, 2, 2, 6, 6, 1, 1, 2, 2, 2, 0, 0, 0, 0, + 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 1, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 10, 10, 10, 2, 2, 10, 2, 2, 2, 2, 2, + 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 3, 4, 2, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 3, 2, 1, 1, 1, 3, 3, 3, 3, 0, + 0, 2, 1, 2, 2, 1, 1, 1, 1, 3, 3, 1, 3, 2, 4, 4, + 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 3, + 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 1, 1, 3, 3, 3, 12, 9, 13, 4, 4, + 5, 5, 1, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 3, 1, 3, 4, 2, 1, 1, 2, 0, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 1, 2, 2, 2, 1, 2, 1, + 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 4, 4, 7, 2, 2, 3, 1, 1, 1, + 1, 1, 1, 1, 4, 4, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 14, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, + 1, 2, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 3, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 1, 3, 3, 3, 3, 1, + 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 2, 2, 1, 1, 3, 3, 4, 4, 1, 3, 12, 15, + 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 3, 1, 4, + 4, 1, 3, 2, 4, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 1, 1, 3, 10, 10, 1, 1, 10, 2, 10, 10, 2, 1, 1, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 1, 4, 2, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 1, 2, 2, 3, 2, 2, 0, 2, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 3, 3, 0, 1, 14, 0, 0, 0, 0, 0, 3, 3, 3, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 0, 0, 0, 0, 0, + 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 3, 3, 3, 3, + 3, 3, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 4, 2, 3, 3, 1, 1, 2, 2, 3, 3, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, 4, 1, 9, 9, + 1, 3, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 4, 2, 3, 3, 3, 3, 3, 3, 1, 1, 1, 6, + 2, 0, 1, 1, 0, 0, 0, 0, 0, 3, 3, 1, 3, 0, 4, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, + 1, 1, 6, 6, 1, 2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 2, 4, 2, 3, 3, 1, 1, 1, 1, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, + 1, 2, 2, 2, 2, 0, 0, 4, 4, 0, 0, 5, 5, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 4, 2, 3, 3, 3, 3, 3, 3, 1, 1, + 2, 2, 3, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 4, 2, 3, 3, 3, 3, 3, 3, 4, 1, 7, 5, 2, 5, 1, + 1, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 4, 2, 3, 3, 3, 3, 0, 0, 4, 7, 5, 8, 1, 1, 2, 3, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 3, 3, 3, 3, 3, 3, 1, 1, 2, 2, 1, 2, 3, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 4, 2, + 3, 3, 1, 1, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 11, 1, + 2, 2, 1, 1, 3, 3, 4, 1, 3, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 2, 3, + 3, 3, 3, 1, 1, 1, 1, 1, 2, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 4, 0, 4, 5, 0, 0, 1, 1, 2, 0, 1, + 2, 1, 12, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 4, 2, 3, 3, 3, 3, 0, 0, 1, 1, 2, 2, 2, 2, + 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 3, 3, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 3, 1, 1, 1, 1, 2, 1, 3, 3, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 3, 3, 1, 1, 1, 2, 2, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 1, 1, 3, 3, 3, 3, 3, 0, 1, 1, 1, 1, 1, 1, 2, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 2, 3, 3, 3, 3, 3, 3, + 3, 4, 3, 1, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 3, 0, 0, 0, 1, 0, 1, 1, 0, 1, + 1, 1, 3, 1, 3, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, + 1, 1, 0, 2, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 3, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_cased_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, - 255, 255, 255, 255, 255, 255, 255, 247, 240, 255, 255, 255, 255, 255, 239, 255, - 255, 255, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, - 0, 0, 207, 188, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, - 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 0, 255, 1, 0, 0, - 191, 32, 255, 255, 255, 255, 255, 231, 255, 255, 63, 63, 255, 1, 255, 255, - 63, 63, 255, 170, 255, 255, 255, 63, 255, 255, 223, 95, 220, 31, 207, 15, - 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, - 80, 189, 31, 242, 224, 67, 0, 0, 24, 0, 0, 0, 0, 0, 192, 255, - 255, 3, 0, 0, 255, 127, 255, 255, 255, 255, 255, 127, 31, 120, 12, 0, - 191, 32, 0, 0, 255, 63, 0, 0, 252, 255, 255, 255, 255, 120, 255, 255, - 124, 0, 0, 0, 0, 0, 0, 7, 0, 0, 255, 255, 255, 0, 255, 255, - 127, 0, 248, 0, 255, 255, 0, 0, 255, 255, 15, 255, 255, 255, 255, 15, - 255, 255, 7, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, - 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, - 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 247, 15, 0, 0, - 15, 0, 0, 0, 255, 3, 255, 255, -}; +RE_UINT32 re_get_indic_positional_category(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -/* Cased: 912 bytes. */ - -RE_UINT32 re_get_cased(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_cased_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_cased_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_cased_stage_3[pos + f] << 5; - pos += code; - value = (re_cased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -/* Case_Ignorable. */ + v = re_indic_positional_category_table_1[field_2]; + v = re_indic_positional_category_table_2[(v << 5) | field_1]; + v = re_indic_positional_category_table_3[(v << 5) | field_0]; -static RE_UINT8 re_case_ignorable_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 6, 2, 7, 2, 8, 9, 10, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; + return v; +} -static RE_UINT8 re_case_ignorable_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 1, 17, 1, 1, 1, 18, 19, 20, 21, 22, 23, 24, 1, 25, - 26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 28, 29, 1, - 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* Indic_Syllabic_Category. */ +static RE_UINT8 re_indic_syllabic_category_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 31, 1, 1, 1, 32, 1, 33, 34, 35, 36, 37, 38, 1, 1, 1, 1, + 1, 1, 11, 1, 12, 13, 14, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39, 1, 1, 40, 41, - 1, 42, 43, 44, 1, 1, 1, 1, 1, 1, 45, 1, 1, 46, 1, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 1, 59, 60, 61, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 62, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 63, 64, 1, 1, 1, 65, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 66, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 67, 68, 1, 1, 1, 1, 1, 1, 1, 69, 1, 1, 1, 1, 1, - 70, 71, 72, 1, 1, 1, 1, 1, 73, 74, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 75, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 76, 77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_case_ignorable_stage_3[] = { - 0, 1, 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 6, 6, 6, 6, 6, 7, 8, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 11, 12, 13, 14, - 15, 0, 16, 17, 0, 0, 18, 19, 20, 5, 21, 0, 0, 22, 0, 23, - 24, 25, 26, 0, 0, 0, 27, 6, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 33, 37, 38, 36, 33, 39, 40, 32, 41, 42, 43, 44, 0, 45, 0, - 46, 47, 48, 43, 32, 41, 49, 43, 50, 51, 34, 43, 0, 0, 52, 0, - 0, 53, 54, 0, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 62, 0, - 0, 63, 64, 65, 66, 0, 0, 33, 0, 0, 67, 0, 0, 0, 0, 0, - 68, 68, 69, 69, 0, 70, 71, 0, 72, 0, 73, 0, 74, 75, 0, 0, - 0, 76, 0, 0, 0, 0, 0, 0, 77, 0, 78, 79, 0, 80, 0, 0, - 81, 82, 44, 83, 50, 84, 0, 85, 0, 86, 0, 87, 0, 0, 88, 89, - 0, 90, 6, 91, 92, 6, 6, 93, 0, 0, 0, 0, 0, 94, 95, 96, - 97, 98, 0, 99, 100, 0, 5, 101, 0, 0, 0, 102, 0, 0, 0, 103, - 0, 0, 0, 104, 0, 0, 0, 6, 0, 105, 0, 0, 0, 0, 0, 0, - 106, 107, 0, 0, 108, 0, 0, 109, 110, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 87, 111, 0, 0, 112, 113, 0, 0, 114, - 6, 50, 0, 17, 115, 0, 0, 57, 116, 74, 0, 0, 0, 0, 117, 118, - 0, 119, 120, 0, 28, 121, 105, 74, 0, 122, 123, 124, 0, 125, 126, 127, - 0, 0, 92, 0, 0, 0, 0, 128, 2, 0, 0, 0, 0, 129, 50, 0, - 130, 131, 132, 0, 0, 0, 0, 133, 1, 2, 3, 17, 47, 0, 0, 134, - 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 136, 0, 0, 0, 0, 137, 138, 0, 0, 0, 0, 0, 74, - 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, - 32, 140, 141, 133, 50, 142, 143, 0, 28, 144, 0, 145, 50, 146, 147, 0, - 0, 148, 0, 0, 0, 0, 133, 149, 50, 51, 3, 150, 0, 0, 0, 0, - 0, 140, 151, 0, 0, 152, 153, 0, 0, 0, 0, 0, 0, 154, 155, 0, - 0, 156, 3, 0, 0, 157, 0, 0, 67, 158, 0, 0, 0, 0, 0, 0, - 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 3, - 161, 162, 163, 0, 164, 0, 0, 0, 0, 165, 0, 0, 129, 166, 0, 0, - 0, 167, 168, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, - 0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, - 0, 173, 81, 0, 0, 0, 0, 0, 0, 0, 105, 0, 174, 0, 0, 175, - 0, 0, 0, 0, 176, 81, 0, 0, 0, 0, 0, 177, 178, 179, 0, 0, - 0, 0, 180, 0, 0, 0, 0, 0, 6, 181, 6, 182, 183, 184, 0, 0, - 185, 186, 0, 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 173, 0, - 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, - 32, 6, 6, 6, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 131, -}; - -static RE_UINT8 re_case_ignorable_stage_4[] = { - 0, 0, 0, 0, 128, 64, 0, 4, 0, 0, 0, 64, 1, 0, 0, 0, - 0, 161, 144, 1, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 48, 4, - 176, 0, 0, 0, 248, 3, 0, 0, 0, 0, 0, 2, 0, 0, 254, 255, - 255, 255, 255, 191, 182, 0, 0, 0, 0, 0, 16, 0, 63, 0, 255, 23, - 1, 248, 255, 255, 0, 0, 1, 0, 0, 0, 192, 191, 255, 61, 0, 0, - 0, 128, 2, 0, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 63, 36, - 0, 0, 192, 255, 255, 63, 0, 0, 0, 0, 0, 14, 0, 0, 248, 255, - 7, 0, 0, 0, 0, 0, 0, 20, 254, 33, 254, 0, 12, 0, 2, 0, - 2, 0, 0, 0, 0, 0, 0, 16, 30, 32, 0, 0, 12, 0, 0, 64, - 6, 0, 0, 0, 134, 57, 2, 0, 0, 0, 35, 0, 190, 33, 0, 0, - 12, 0, 0, 252, 0, 0, 0, 144, 30, 32, 64, 0, 12, 0, 0, 0, - 4, 0, 0, 0, 1, 32, 0, 0, 17, 0, 0, 0, 0, 0, 0, 192, - 193, 61, 96, 0, 64, 48, 0, 0, 3, 0, 0, 0, 0, 0, 0, 24, - 0, 4, 92, 0, 0, 0, 242, 7, 192, 127, 0, 0, 0, 0, 242, 31, - 64, 63, 0, 0, 0, 0, 0, 3, 0, 0, 160, 2, 0, 0, 254, 127, - 223, 224, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 0, 224, 253, 102, - 0, 0, 0, 195, 1, 0, 30, 0, 100, 32, 0, 32, 0, 0, 0, 224, - 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 176, 63, 64, 254, 143, 32, - 0, 120, 0, 0, 8, 0, 0, 0, 96, 0, 0, 0, 0, 2, 0, 0, - 135, 1, 4, 14, 0, 0, 128, 9, 0, 0, 64, 127, 229, 31, 248, 159, - 128, 0, 255, 127, 15, 0, 0, 0, 0, 0, 208, 23, 0, 248, 15, 0, - 60, 59, 0, 0, 64, 163, 3, 0, 0, 240, 207, 0, 0, 0, 0, 63, - 0, 0, 247, 255, 253, 33, 16, 3, 0, 240, 255, 255, 255, 7, 0, 1, - 0, 0, 0, 248, 255, 255, 255, 251, 0, 0, 0, 160, 3, 224, 0, 224, - 0, 224, 0, 96, 0, 248, 0, 3, 144, 124, 0, 0, 223, 255, 2, 128, - 0, 0, 255, 31, 255, 255, 1, 0, 0, 0, 0, 48, 0, 128, 3, 0, - 0, 128, 0, 128, 0, 128, 0, 0, 32, 0, 0, 0, 0, 60, 62, 8, - 0, 0, 0, 126, 0, 0, 0, 112, 0, 0, 32, 0, 0, 16, 0, 0, - 0, 128, 247, 191, 0, 0, 0, 240, 0, 0, 3, 0, 0, 7, 0, 0, - 68, 8, 0, 0, 48, 0, 0, 0, 255, 255, 3, 128, 192, 63, 0, 0, - 128, 255, 3, 0, 0, 0, 200, 51, 0, 126, 102, 0, 8, 16, 0, 0, - 0, 0, 1, 16, 0, 0, 157, 193, 2, 0, 0, 32, 0, 48, 88, 0, - 32, 33, 0, 0, 0, 0, 252, 255, 255, 255, 8, 0, 255, 255, 0, 0, - 0, 0, 36, 0, 0, 0, 0, 128, 8, 0, 0, 14, 0, 0, 0, 32, - 0, 0, 192, 7, 110, 240, 0, 0, 0, 0, 0, 135, 240, 0, 0, 0, - 0, 0, 0, 255, 127, 0, 0, 0, 0, 0, 120, 38, 0, 32, 0, 0, - 128, 239, 31, 0, 0, 0, 8, 0, 0, 0, 192, 127, 0, 30, 0, 0, - 0, 128, 211, 64, 248, 7, 0, 0, 192, 31, 31, 0, 92, 0, 0, 64, - 0, 0, 248, 133, 13, 0, 0, 0, 0, 0, 60, 176, 1, 0, 0, 48, - 0, 0, 248, 167, 0, 40, 191, 0, 188, 15, 0, 0, 0, 128, 255, 6, - 0, 0, 240, 12, 254, 7, 0, 0, 0, 0, 248, 121, 128, 0, 126, 14, - 0, 252, 127, 3, 0, 0, 127, 191, 255, 252, 109, 0, 0, 0, 126, 180, - 191, 0, 0, 0, 0, 0, 163, 0, 0, 0, 24, 0, 0, 0, 255, 1, - 0, 0, 31, 0, 0, 0, 127, 0, 0, 128, 255, 255, 11, 0, 0, 0, - 0, 0, 0, 96, 128, 3, 248, 255, 231, 15, 0, 0, 0, 60, 0, 0, - 28, 0, 0, 0, 255, 255, 127, 248, 255, 31, 32, 0, 16, 0, 0, 248, - 254, 255, 0, 0, 127, 255, 255, 249, 219, 7, 0, 0, 0, 0, 255, 63, - 0, 240, 0, 0, 240, 15, 0, 0, -}; - -/* Case_Ignorable: 1904 bytes. */ - -RE_UINT32 re_get_case_ignorable(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_case_ignorable_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_case_ignorable_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_case_ignorable_stage_3[pos + f] << 5; - pos += code; - value = (re_case_ignorable_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Changes_When_Lowercased. */ - -static RE_UINT8 re_changes_when_lowercased_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_changes_when_lowercased_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 12, - 3, 3, 13, 3, 3, 3, 14, 3, 3, 3, 3, 3, 15, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 16, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 17, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +static RE_UINT8 re_indic_syllabic_category_table_2[] = { + 0, 1, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 17, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 27, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 0, 45, 46, 47, 0, 0, 48, 49, 50, 51, 52, 53, 0, + 54, 55, 56, 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 59, 60, 61, 62, 54, 63, 64, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 67, 68, 69, 54, 70, 71, 0, + 72, 54, 73, 74, 75, 0, 0, 0, 76, 77, 78, 0, 79, 80, 54, 81, + 54, 82, 83, 0, 0, 0, 84, 85, 0, 0, 0, 0, 0, 0, 0, 86, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 0, 0, 88, 89, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 0, 103, 104, 105, 106, + 107, 108, 109, 110, 54, 111, 112, 113, 0, 0, 0, 0, 0, 0, 114, 115, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 117, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 119, 120, 121, 122, 123, 124, 0, 0, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 0, 0, 135, 136, 137, 138, 139, 140, 141, 142, 0, 0, 0, 0, + 143, 144, 145, 146, 147, 148, 149, 0, 0, 0, 0, 0, 143, 150, 151, 0, + 143, 152, 153, 0, 154, 155, 65, 0, 156, 157, 0, 0, 0, 0, 0, 0, + 154, 158, 0, 0, 0, 0, 0, 0, 159, 160, 161, 0, 0, 162, 163, 164, + 165, 166, 167, 54, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 169, 170, 171, 172, 173, 174, 0, 0, 175, 176, 177, 178, 179, 65, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_changes_when_lowercased_stage_3[] = { - 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, - 3, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, - 18, 19, 0, 3, 20, 3, 21, 3, 3, 22, 23, 0, 0, 0, 0, 0, +static RE_UINT8 re_indic_syllabic_category_table_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 25, - 0, 0, 0, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 28, 3, 3, 3, 29, 30, 31, 32, 30, 33, 34, 35, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 19, 37, 0, 0, 0, - 0, 0, 0, 0, 0, 38, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 39, 0, 40, 3, 3, 3, 41, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 42, 43, 0, 0, 0, 0, 44, 3, 45, 46, 47, 48, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 18, 49, 0, 0, 0, 26, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 18, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 18, 52, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_changes_when_lowercased_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 255, 255, 127, 127, 85, 85, 85, 85, - 85, 85, 85, 170, 170, 84, 85, 85, 85, 85, 85, 43, 214, 206, 219, 177, - 213, 210, 174, 17, 176, 173, 170, 74, 85, 85, 214, 85, 85, 85, 5, 108, - 122, 85, 0, 0, 0, 0, 69, 128, 64, 215, 254, 255, 251, 15, 0, 0, - 0, 128, 0, 85, 85, 85, 144, 230, 255, 255, 255, 255, 255, 255, 0, 0, - 1, 84, 85, 85, 171, 42, 85, 85, 85, 85, 254, 255, 255, 255, 127, 0, - 191, 32, 0, 0, 255, 255, 63, 0, 0, 0, 255, 255, 255, 255, 255, 231, - 85, 85, 21, 64, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, - 0, 255, 0, 0, 0, 255, 0, 31, 0, 31, 0, 15, 0, 31, 0, 31, - 64, 12, 4, 0, 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, - 157, 234, 37, 192, 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 5, - 84, 85, 84, 85, 85, 85, 0, 106, 85, 40, 69, 85, 85, 125, 95, 85, - 116, 0, 0, 0, 255, 0, 0, 0, 255, 255, 15, 0, 255, 255, 7, 0, - 3, 0, 0, 0, -}; - -/* Changes_When_Lowercased: 764 bytes. */ - -RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_changes_when_lowercased_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_changes_when_lowercased_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_changes_when_lowercased_stage_3[pos + f] << 5; - pos += code; - value = (re_changes_when_lowercased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Changes_When_Uppercased. */ - -static RE_UINT8 re_changes_when_uppercased_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, 8, 8, + 0, 12, 12, 0, 0, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, + 1, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 6, + 6, 0, 0, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, + 7, 0, 7, 0, 0, 0, 7, 7, 7, 7, 0, 0, 9, 10, 8, 8, + 8, 8, 8, 8, 8, 0, 0, 8, 8, 0, 0, 8, 8, 11, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 7, 7, 0, 7, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 0, + 0, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 6, + 6, 0, 0, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, + 7, 0, 7, 7, 0, 7, 7, 0, 7, 7, 0, 0, 9, 0, 8, 8, + 8, 8, 8, 0, 0, 0, 0, 8, 8, 0, 0, 8, 8, 11, 0, 0, + 0, 12, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 4, 14, 1, 1, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 6, + 6, 6, 0, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, + 7, 0, 7, 7, 0, 7, 7, 7, 7, 7, 0, 0, 9, 10, 8, 8, + 8, 8, 8, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 12, 12, 12, 9, 9, 9, + 0, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 6, + 6, 0, 0, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 0, 0, 8, 8, 0, 0, 8, 8, 11, 0, 0, + 0, 0, 0, 0, 0, 8, 8, 8, 0, 0, 0, 0, 7, 7, 0, 7, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 16, 0, 6, 6, 6, 6, 6, 6, 0, 0, 0, 6, 6, + 6, 0, 6, 6, 6, 7, 0, 0, 0, 7, 7, 0, 7, 0, 7, 7, + 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 7, 0, 0, 0, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 8, 8, + 8, 8, 8, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 5, 4, 6, 6, 6, 6, 6, 6, 6, 6, 0, 6, 6, + 6, 0, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 10, 8, 8, + 8, 8, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 11, 0, 0, + 0, 0, 0, 0, 0, 8, 8, 0, 7, 7, 7, 0, 0, 0, 0, 0, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 0, 6, 6, + 6, 0, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 0, 0, 9, 10, 8, 8, + 8, 8, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 11, 0, 0, + 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 7, 0, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 18, 18, 10, 8, 8, + 8, 8, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 11, 19, 0, + 0, 0, 0, 0, 13, 13, 13, 8, 0, 0, 0, 0, 0, 0, 0, 6, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, + 0, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 11, 0, 0, 0, 0, 8, + 8, 8, 8, 8, 8, 0, 8, 0, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 18, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 0, 8, 20, 20, 20, 20, 21, 4, 18, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 7, 7, 0, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 0, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 18, 8, 15, 15, 0, 0, + 8, 8, 8, 8, 8, 0, 0, 0, 20, 20, 20, 20, 0, 4, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 7, 7, 7, 7, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 3, 0, 3, 0, 9, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, + 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 5, + 8, 8, 4, 4, 18, 10, 0, 0, 22, 22, 22, 22, 22, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 4, 20, 5, 24, 18, 15, 15, 15, 15, 7, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 0, 0, 1, 0, + 7, 7, 6, 6, 6, 6, 8, 8, 8, 8, 7, 7, 7, 7, 15, 15, + 15, 7, 8, 20, 20, 7, 7, 8, 8, 20, 20, 20, 20, 20, 7, 7, + 7, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 15, 8, 8, 8, 8, 20, 20, 20, 20, 20, 20, 20, 7, 20, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20, 20, 8, 8, 0, 0, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, + 7, 7, 8, 8, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 8, 8, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, + 7, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 4, 5, 8, 25, 25, 3, 26, 21, 3, 3, + 3, 18, 24, 3, 0, 0, 0, 0, 0, 0, 0, 0, 10, 3, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 23, 23, 23, 0, 0, 0, 0, + 27, 27, 4, 27, 27, 27, 27, 27, 27, 27, 8, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, + 29, 29, 29, 29, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 27, 27, 27, 27, 27, 27, 27, 20, 20, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, + 6, 6, 6, 7, 7, 15, 15, 23, 27, 27, 30, 23, 23, 23, 23, 0, + 24, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 4, 20, 20, 20, 20, 20, 18, 3, 3, 0, 0, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 26, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 11, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 4, 26, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 23, 23, 23, 8, 8, 8, 8, 8, 8, 18, 24, 23, 23, 7, 7, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 7, 7, 7, 27, 27, + 7, 7, 7, 7, 6, 6, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 27, 27, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 23, 23, 8, 8, 8, 8, 8, 8, 8, 27, 27, 27, + 27, 27, 27, 27, 4, 4, 3, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 13, 12, 17, 17, 12, 12, 12, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 8, 6, 6, 6, 11, 7, 7, 7, 7, 4, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 8, 8, 8, 8, 8, 0, 0, 0, 0, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 28, 28, + 28, 28, 7, 7, 7, 7, 28, 23, 23, 7, 7, 7, 7, 7, 7, 7, + 7, 23, 7, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 15, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 11, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 28, 28, 28, 28, 28, 28, 28, 28, 28, 20, 20, 20, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 27, + 27, 27, 27, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 26, 5, 6, 6, 6, 6, 6, 7, 7, 7, 6, 6, 6, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 15, 15, 15, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 8, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 7, 7, 0, + 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 7, 7, 7, 1, 1, 1, 0, 0, 0, 7, 20, 20, 20, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 20, + 29, 20, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 5, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, + 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 27, 27, 27, 27, 27, + 27, 27, 27, 8, 8, 8, 8, 8, 8, 8, 8, 0, 20, 18, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 7, 8, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 8, 8, 4, 5, + 7, 7, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 0, 0, 9, 9, 9, 0, 0, 0, 0, 24, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 5, 17, 17, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 4, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, 9, 0, 0, 0, 0, 0, + 4, 4, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 24, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 7, 8, 8, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 28, 28, 28, 28, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 11, 10, 35, 35, 0, 0, 0, 0, 0, 3, 9, 8, 8, 0, 8, 4, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 4, 11, 9, 14, 0, 0, 0, 0, 0, 0, 12, 0, + 6, 6, 6, 6, 7, 7, 7, 0, 7, 0, 7, 7, 7, 7, 0, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 18, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 6, + 6, 0, 0, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, + 7, 0, 7, 7, 0, 7, 7, 7, 7, 7, 0, 9, 9, 10, 8, 8, + 8, 8, 8, 8, 8, 0, 0, 8, 8, 0, 0, 8, 8, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 4, 4, + 6, 6, 8, 8, 0, 0, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, + 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 11, 4, 4, 5, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 3, 4, + 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, + 4, 5, 11, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, + 8, 8, 8, 8, 8, 8, 0, 0, 8, 8, 8, 8, 4, 4, 5, 11, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 8, 8, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 5, 11, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 5, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 11, 9, 7, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 15, 15, 15, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 18, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 4, 5, 11, 9, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 0, 0, 6, 0, 0, 7, 7, 7, 7, + 7, 7, 7, 7, 0, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 0, 8, 8, 0, 0, 4, 4, 18, 24, 35, + 15, 19, 15, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 6, 6, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 8, 0, 0, 8, 8, 8, 8, 4, 5, + 11, 10, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 3, 18, 4, 4, 4, 4, 5, 35, 15, 15, 15, 15, 1, + 0, 0, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, + 7, 7, 7, 7, 35, 35, 35, 35, 35, 35, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 4, 5, 14, 24, 0, 0, 0, 10, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 6, 6, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, + 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, 8, 8, 4, 4, 5, 11, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, + 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 23, 23, + 8, 8, 8, 8, 8, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 0, 6, 6, 0, 6, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 0, 0, 0, 8, 0, 8, 8, 0, 8, + 4, 5, 9, 8, 18, 24, 19, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 0, 6, 6, 0, 6, 6, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 0, + 8, 8, 0, 8, 8, 4, 5, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 1, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_changes_when_uppercased_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 3, 14, - 3, 3, 15, 3, 3, 3, 16, 3, 3, 3, 3, 3, 17, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 18, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 19, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -}; +RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -static RE_UINT8 re_changes_when_uppercased_stage_3[] = { - 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 5, 13, 14, 15, 16, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, - 0, 23, 24, 5, 25, 5, 26, 5, 5, 27, 0, 28, 29, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 30, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, - 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 33, 34, 0, 0, 0, - 5, 5, 5, 5, 35, 5, 5, 5, 36, 37, 38, 39, 24, 40, 41, 42, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 23, 43, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 44, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 23, 45, 46, 5, 5, 5, 47, 24, 48, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 49, 50, 0, 0, 0, 0, 51, 5, 52, 53, 54, 55, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 23, 24, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 58, 59, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -static RE_UINT8 re_changes_when_uppercased_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 0, 0, 0, 128, - 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 84, 85, 171, 170, 170, - 170, 170, 170, 212, 41, 17, 36, 70, 42, 33, 81, 162, 96, 91, 85, 181, - 170, 170, 45, 170, 168, 170, 10, 144, 133, 170, 223, 26, 107, 159, 38, 32, - 141, 31, 4, 96, 32, 0, 0, 0, 0, 0, 138, 56, 0, 0, 1, 0, - 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 47, 9, 0, 0, 255, 255, - 255, 255, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 170, 0, 0, - 254, 255, 255, 255, 255, 0, 0, 0, 255, 255, 255, 231, 0, 0, 0, 63, - 255, 1, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 170, 170, 234, 15, - 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, - 255, 255, 223, 80, 220, 16, 207, 0, 255, 0, 220, 16, 16, 0, 0, 0, - 255, 3, 0, 0, 255, 255, 255, 127, 98, 21, 72, 0, 10, 80, 8, 0, - 191, 32, 0, 0, 170, 42, 0, 0, 170, 170, 170, 10, 168, 170, 168, 170, - 170, 170, 0, 148, 170, 16, 154, 170, 170, 2, 160, 170, 8, 0, 0, 0, - 0, 0, 8, 0, 127, 0, 248, 0, 0, 255, 255, 255, 255, 255, 0, 0, - 0, 0, 0, 255, 255, 255, 255, 15, 255, 255, 7, 0, 252, 255, 255, 255, - 15, 0, 0, 0, -}; + v = re_indic_syllabic_category_table_1[field_2]; + v = re_indic_syllabic_category_table_2[(v << 5) | field_1]; + v = re_indic_syllabic_category_table_3[(v << 5) | field_0]; -/* Changes_When_Uppercased: 844 bytes. */ - -RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_changes_when_uppercased_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_changes_when_uppercased_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_changes_when_uppercased_stage_3[pos + f] << 5; - pos += code; - value = (re_changes_when_uppercased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return v; } -/* Changes_When_Titlecased. */ - -static RE_UINT8 re_changes_when_titlecased_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; +/* Join_Control. */ +RE_UINT32 re_get_join_control(RE_UINT32 codepoint) { + if (0x200C <= codepoint && codepoint <= 0x200D) + return 1; -static RE_UINT8 re_changes_when_titlecased_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 5, 6, - 7, 3, 8, 3, 3, 3, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 10, 3, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 12, 3, 13, - 3, 3, 14, 3, 3, 3, 15, 3, 3, 3, 3, 3, 16, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 17, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 18, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -}; + return 0; +} -static RE_UINT8 re_changes_when_titlecased_stage_3[] = { - 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 5, 13, 14, 15, 16, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, - 0, 23, 24, 5, 25, 5, 26, 5, 5, 27, 0, 28, 29, 0, 0, 0, +/* Joining_Group. */ +static RE_UINT8 re_joining_group_table_1[] = { + 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_joining_group_table_2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, - 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, - 5, 5, 5, 5, 34, 5, 5, 5, 35, 36, 37, 38, 36, 39, 40, 41, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 23, 42, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 43, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 23, 44, 45, 5, 5, 5, 46, 24, 47, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 48, 49, 0, 0, 0, 0, 50, 5, 51, 52, 53, 54, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 23, 24, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 57, 58, 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0, + 0, 0, 0, 12, 0, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_changes_when_titlecased_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 0, 0, 0, 128, - 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 84, 85, 171, 170, 170, - 170, 170, 170, 212, 41, 17, 36, 70, 42, 33, 81, 162, 208, 86, 85, 181, - 170, 170, 43, 170, 168, 170, 10, 144, 133, 170, 223, 26, 107, 159, 38, 32, - 141, 31, 4, 96, 32, 0, 0, 0, 0, 0, 138, 56, 0, 0, 1, 0, - 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 47, 9, 0, 0, 255, 255, - 255, 255, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 170, 0, 0, - 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 63, 255, 1, 0, 0, - 0, 0, 0, 34, 0, 64, 0, 0, 170, 170, 234, 15, 255, 0, 63, 0, - 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, 255, 0, 223, 64, - 220, 0, 207, 0, 255, 0, 220, 0, 16, 0, 0, 0, 255, 3, 0, 0, - 255, 255, 255, 127, 98, 21, 72, 0, 10, 80, 8, 0, 191, 32, 0, 0, - 170, 42, 0, 0, 170, 170, 170, 10, 168, 170, 168, 170, 170, 170, 0, 148, - 170, 16, 154, 170, 170, 2, 160, 170, 8, 0, 0, 0, 0, 0, 8, 0, - 127, 0, 248, 0, 0, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 255, - 255, 255, 255, 15, 255, 255, 7, 0, 252, 255, 255, 255, 15, 0, 0, 0, +static RE_UINT8 re_joining_group_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 2, 2, 3, 2, 1, 2, 4, 5, 4, 4, 6, 6, 6, 7, + 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, + 0, 15, 16, 17, 18, 19, 20, 21, 3, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 16, + 0, 2, 2, 2, 0, 2, 3, 3, 1, 4, 4, 4, 4, 4, 4, 4, + 4, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 10, 10, 11, + 12, 15, 15, 15, 15, 15, 15, 16, 16, 13, 22, 13, 17, 17, 17, 13, + 13, 13, 13, 13, 13, 18, 18, 18, 18, 20, 20, 20, 20, 23, 24, 6, + 5, 25, 25, 26, 3, 3, 3, 3, 3, 3, 3, 3, 14, 27, 14, 3, + 1, 1, 28, 28, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 12, 0, 0, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 30, 31, 31, 32, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 32, 51, 52, 30, 31, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 55, + 4, 4, 4, 4, 4, 4, 4, 6, 6, 7, 7, 8, 9, 12, 12, 12, + 15, 15, 13, 13, 13, 19, 19, 20, 20, 20, 18, 8, 8, 9, 6, 6, + 9, 8, 6, 2, 2, 14, 14, 1, 3, 3, 56, 56, 6, 9, 9, 17, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 6, 11, 15, 16, 18, 19, 1, 1, 8, 3, 68, 0, 7, 10, + 13, 69, 8, 12, 17, 0, 4, 4, 4, 8, 1, 70, 71, 72, 4, 4, + 4, 6, 13, 12, 71, 6, 6, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 73, 74, 74, 75, 75, 76, 0, 77, 0, 78, 78, 0, 0, 79, 80, 81, + 82, 82, 82, 83, 84, 85, 86, 87, 88, 89, 89, 90, 90, 91, 92, 92, + 92, 93, 0, 0, 94, 0, 0, 0, 0, 0, 0, 95, 96, 97, 98, 99, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 100, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 100, 0, 101, 0, + 101, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Changes_When_Titlecased: 824 bytes. */ - -RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_changes_when_titlecased_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_changes_when_titlecased_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_changes_when_titlecased_stage_3[pos + f] << 5; - pos += code; - value = (re_changes_when_titlecased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} +RE_UINT32 re_get_joining_group(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -/* Changes_When_Casefolded. */ + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -static RE_UINT8 re_changes_when_casefolded_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; + v = re_joining_group_table_1[field_2]; + v = re_joining_group_table_2[(v << 5) | field_1]; + v = re_joining_group_table_3[(v << 5) | field_0]; -static RE_UINT8 re_changes_when_casefolded_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 3, 14, - 3, 3, 15, 3, 3, 3, 16, 3, 3, 3, 3, 3, 17, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 18, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 19, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -}; + return v; +} -static RE_UINT8 re_changes_when_casefolded_stage_3[] = { - 0, 0, 1, 0, 0, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, - 4, 12, 13, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, - 20, 21, 0, 4, 22, 4, 23, 4, 4, 24, 25, 0, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 20, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, - 0, 0, 0, 0, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 4, 4, 4, 31, 4, 4, 4, 32, 33, 34, 35, 20, 36, 37, 38, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 21, 40, 0, 0, 0, - 0, 0, 0, 0, 0, 41, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 42, 0, 43, 4, 4, 4, 44, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 45, 46, 0, 0, 0, 0, 47, 4, 48, 49, 50, 51, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 20, 20, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 20, 54, 0, 0, 0, 52, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 20, 57, 0, 0, 0, 0, 0, 0, +/* Joining_Type. */ +static RE_UINT8 re_joining_type_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 15, + 16, 9, 17, 18, 19, 20, 21, 22, 9, 9, 9, 9, 9, 23, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 24, 25, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 26, + 9, 9, 9, 9, 27, 9, 28, 9, 29, 9, 30, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 31, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; -static RE_UINT8 re_changes_when_casefolded_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 255, 255, 127, 255, - 85, 85, 85, 85, 85, 85, 85, 170, 170, 86, 85, 85, 85, 85, 85, 171, - 214, 206, 219, 177, 213, 210, 174, 17, 176, 173, 170, 74, 85, 85, 214, 85, - 85, 85, 5, 108, 122, 85, 0, 0, 32, 0, 0, 0, 0, 0, 69, 128, - 64, 215, 254, 255, 251, 15, 0, 0, 4, 128, 99, 85, 85, 85, 179, 230, - 255, 255, 255, 255, 255, 255, 0, 0, 1, 84, 85, 85, 171, 42, 85, 85, - 85, 85, 254, 255, 255, 255, 127, 0, 128, 0, 0, 0, 191, 32, 0, 0, - 0, 0, 0, 63, 255, 1, 255, 255, 255, 255, 255, 231, 85, 85, 21, 76, - 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, 0, 255, 0, 0, - 255, 255, 156, 31, 156, 31, 0, 15, 0, 31, 156, 31, 64, 12, 4, 0, - 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, - 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 5, 84, 85, 84, 85, - 85, 85, 0, 106, 85, 40, 69, 85, 85, 125, 95, 85, 116, 0, 0, 0, - 0, 0, 255, 255, 127, 0, 248, 0, 255, 0, 0, 0, 255, 255, 15, 0, - 255, 255, 7, 0, 3, 0, 0, 0, +static RE_UINT8 re_joining_type_table_2[] = { + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 20, 21, 22, + 23, 24, 25, 26, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 35, 39, 40, 38, 35, 41, 42, 34, 43, 44, 33, 45, 0, 46, 0, + 47, 48, 49, 33, 34, 43, 50, 33, 51, 52, 36, 33, 34, 0, 53, 0, + 0, 54, 55, 0, 0, 56, 57, 0, 58, 59, 0, 60, 61, 62, 63, 0, + 0, 64, 65, 66, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 69, 69, 70, 70, 0, 71, 72, 0, + 73, 13, 13, 74, 75, 76, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, + 78, 0, 79, 80, 0, 81, 82, 0, 83, 84, 45, 85, 51, 86, 0, 87, + 0, 88, 0, 0, 0, 0, 89, 90, 0, 0, 0, 0, 0, 0, 2, 91, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92, 93, 0, 94, 0, 0, 81, 95, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 97, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 98, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 100, 48, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, + 102, 103, 13, 104, 0, 0, 105, 106, 0, 107, 108, 0, 30, 109, 0, 110, + 0, 111, 112, 35, 0, 113, 34, 114, 0, 0, 0, 0, 0, 0, 0, 115, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 117, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, + 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 119, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 120, 121, 0, 0, 0, 0, 122, 123, 0, 0, 0, 0, 124, 125, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 126, 127, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 129, 130, 0, 0, 131, 132, 0, + 34, 133, 134, 97, 51, 135, 0, 0, 30, 136, 0, 137, 51, 138, 139, 0, + 0, 140, 0, 0, 0, 0, 97, 141, 51, 52, 82, 142, 0, 0, 0, 0, + 0, 133, 143, 0, 0, 144, 145, 0, 0, 0, 0, 0, 0, 146, 147, 0, + 0, 148, 82, 0, 0, 149, 0, 0, 68, 150, 0, 0, 0, 0, 0, 0, + 0, 151, 0, 0, 0, 0, 0, 0, 0, 152, 153, 0, 0, 0, 154, 82, + 155, 156, 157, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 159, 0, 0, 160, 161, 0, 0, 0, 162, 163, 0, 164, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 167, 0, 168, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 0, 170, 0, 0, 171, + 0, 0, 0, 0, 172, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 174, 98, 0, 0, + 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 176, 2, 177, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 181, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 168, 0, 13, 13, 183, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Changes_When_Casefolded: 816 bytes. */ - -RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_changes_when_casefolded_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_changes_when_casefolded_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_changes_when_casefolded_stage_3[pos + f] << 5; - pos += code; - value = (re_changes_when_casefolded_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Changes_When_Casemapped. */ - -static RE_UINT8 re_changes_when_casemapped_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, +static RE_UINT8 re_joining_type_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, + 2, 0, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 3, + 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 4, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, + 1, 3, 3, 3, 0, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3, + 2, 2, 3, 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 3, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 3, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, + 2, 3, 2, 3, 3, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 2, 2, 2, 2, 2, 3, 3, 2, 3, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 2, 3, 3, 3, 1, 1, 1, 0, 0, 0, 0, + 2, 0, 2, 2, 2, 2, 0, 3, 2, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 0, 3, 2, + 2, 3, 3, 2, 2, 0, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 4, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, + 2, 2, 2, 2, 2, 3, 0, 3, 0, 3, 3, 0, 0, 5, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 3, 2, 2, + 2, 3, 0, 0, 3, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 2, 2, 3, 2, 3, 3, + 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 2, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 2, 2, 3, 3, 3, 0, 2, 3, 3, 2, 2, 3, 2, 2, + 0, 2, 3, 3, 2, 0, 0, 0, 0, 3, 2, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_changes_when_casemapped_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 3, 14, - 3, 3, 15, 3, 3, 3, 16, 3, 3, 3, 3, 3, 17, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 18, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 19, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -}; +RE_UINT32 re_get_joining_type(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -static RE_UINT8 re_changes_when_casemapped_stage_3[] = { - 0, 0, 1, 1, 0, 2, 3, 3, 4, 5, 4, 4, 6, 7, 8, 4, - 4, 9, 10, 11, 12, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, 18, - 4, 4, 4, 4, 19, 4, 4, 4, 4, 20, 21, 22, 23, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 24, 25, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 26, - 0, 0, 0, 0, 27, 25, 0, 0, 0, 0, 0, 28, 29, 0, 0, 0, - 4, 4, 4, 4, 30, 4, 4, 4, 26, 4, 31, 32, 4, 33, 34, 35, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 29, 4, 37, 0, 0, 0, - 0, 0, 0, 0, 0, 38, 4, 39, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 40, 41, 42, 4, 4, 4, 43, 4, 44, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 45, 46, 0, 0, 0, 0, 47, 4, 48, 49, 40, 50, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 4, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, - 4, 4, 54, 0, 0, 52, 55, 46, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 56, 4, 56, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 57, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -static RE_UINT8 re_changes_when_casemapped_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 255, 255, 127, 255, - 255, 255, 255, 255, 255, 255, 255, 254, 255, 223, 255, 247, 255, 243, 255, 179, - 240, 255, 255, 255, 253, 255, 15, 252, 255, 255, 223, 26, 107, 159, 38, 32, - 141, 31, 4, 96, 32, 0, 0, 0, 0, 0, 207, 184, 64, 215, 255, 255, - 251, 255, 255, 255, 255, 255, 227, 255, 255, 255, 191, 239, 3, 252, 255, 255, - 255, 255, 254, 255, 255, 255, 127, 0, 254, 255, 255, 255, 255, 0, 0, 0, - 191, 32, 255, 255, 255, 255, 255, 231, 255, 255, 63, 63, 255, 1, 255, 255, - 0, 0, 0, 34, 0, 64, 0, 0, 255, 255, 255, 79, 63, 63, 255, 170, - 255, 255, 255, 63, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, - 64, 12, 4, 0, 24, 0, 0, 0, 0, 0, 192, 255, 255, 3, 0, 0, - 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 109, 192, 15, 120, 12, 0, - 191, 32, 0, 0, 255, 63, 0, 0, 255, 255, 255, 15, 252, 255, 252, 255, - 255, 255, 0, 254, 255, 56, 223, 255, 124, 0, 0, 0, 0, 0, 8, 0, - 0, 0, 255, 255, 127, 0, 248, 0, 255, 255, 0, 0, 255, 255, 15, 255, - 255, 255, 7, 0, 15, 0, 0, 0, -}; + v = re_joining_type_table_1[field_2]; + v = re_joining_type_table_2[(v << 5) | field_1]; + v = re_joining_type_table_3[(v << 5) | field_0]; -/* Changes_When_Casemapped: 816 bytes. */ - -RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_changes_when_casemapped_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_changes_when_casemapped_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_changes_when_casemapped_stage_3[pos + f] << 5; - pos += code; - value = (re_changes_when_casemapped_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return v; } -/* ID_Start. */ - -static RE_UINT8 re_id_start_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 9, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 22, 23, 5, 24, 25, +/* Line_Break. */ +static RE_UINT8 re_line_break_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 18, 19, 20, 25, 26, 26, 27, 27, 27, 27, 27, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 27, 27, 40, 41, 27, 27, + 27, 42, 27, 27, 27, 27, 27, 27, 27, 27, 43, 44, 13, 13, 13, 13, + 13, 45, 46, 47, 27, 27, 27, 27, 27, 27, 27, 27, 48, 27, 27, 49, + 27, 27, 27, 27, 50, 51, 52, 27, 53, 27, 54, 55, 56, 57, 58, 59, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 59, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 59, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 60, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27 +}; + +static RE_UINT16 re_line_break_table_2[] = { + 0, 1, 2, 3, 4, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 8, 7, 9, 9, 10, 11, 12, 13, 7, 7, + 7, 7, 7, 7, 14, 7, 7, 7, 7, 15, 16, 7, 17, 18, 19, 20, + 21, 7, 22, 23, 7, 7, 24, 25, 26, 27, 28, 7, 7, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 53, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 36, 82, 83, 84, 36, 85, 86, 87, 88, 89, 90, 91, 36, + 92, 92, 93, 92, 94, 7, 95, 7, 96, 96, 96, 97, 97, 98, 99, 99, + 7, 7, 100, 7, 101, 102, 103, 7, 104, 7, 105, 106, 107, 7, 7, 108, + 109, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 110, 7, 7, 111, 112, 113, 114, 115, 92, 92, 116, 117, + 118, 7, 7, 119, 120, 121, 7, 122, 123, 124, 125, 126, 92, 127, 128, 7, + 129, 92, 130, 131, 132, 133, 134, 36, 135, 136, 137, 138, 139, 140, 7, 141, + 7, 142, 143, 144, 145, 146, 147, 148, 7, 7, 7, 7, 7, 7, 9, 149, + 7, 7, 7, 7, 7, 7, 7, 7, 108, 7, 150, 151, 7, 37, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 7, 167, 7, + 168, 169, 170, 171, 172, 173, 7, 174, 175, 176, 7, 7, 7, 7, 7, 177, + 7, 178, 35, 179, 179, 179, 179, 180, 179, 179, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 7, 196, 197, 198, 7, 199, 200, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 201, 7, 202, 203, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 204, 205, 206, 7, 7, 7, + 7, 207, 123, 7, 7, 7, 7, 208, 7, 95, 7, 209, 210, 211, 211, 9, + 212, 213, 214, 36, 215, 216, 216, 217, 216, 216, 216, 216, 216, 216, 218, 219, + 220, 221, 222, 223, 224, 225, 223, 226, 227, 228, 216, 216, 229, 216, 216, 230, + 231, 216, 232, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 7, 7, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 233, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 234, 216, 235, 144, 7, 7, 7, 7, 7, 7, 7, 7, + 236, 237, 7, 238, 239, 7, 7, 240, 7, 7, 7, 7, 7, 7, 241, 242, + 243, 244, 7, 245, 246, 136, 247, 248, 30, 249, 250, 251, 40, 252, 253, 254, + 7, 255, 256, 92, 92, 92, 257, 258, 259, 260, 7, 261, 7, 7, 7, 262, + 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, + 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, + 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, + 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, + 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, + 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, + 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, + 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, + 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, + 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, + 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, + 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, + 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, + 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, + 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, + 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 270, 271, 272, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 274, 275, 276, 7, 7, 7, 277, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 278, 279, 7, 280, 7, 281, 282, + 283, 284, 285, 286, 7, 7, 7, 287, 288, 289, 290, 291, 292, 231, 293, 294, + 295, 296, 297, 36, 7, 7, 7, 298, 299, 300, 7, 7, 301, 302, 279, 303, + 36, 36, 36, 36, 304, 7, 305, 306, 7, 307, 308, 309, 310, 7, 311, 36, + 7, 7, 7, 7, 151, 312, 313, 314, 7, 315, 7, 316, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 210, 122, 281, 36, 36, 36, 36, + 317, 318, 319, 7, 123, 320, 36, 321, 322, 323, 36, 36, 7, 324, 280, 7, + 325, 326, 327, 7, 7, 36, 7, 328, 7, 329, 330, 331, 332, 333, 36, 36, + 7, 7, 334, 36, 7, 335, 7, 336, 7, 337, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 123, 7, 338, 36, 36, 7, 315, 339, 36, 36, 279, 340, 210, + 139, 341, 342, 343, 139, 344, 345, 346, 139, 347, 348, 349, 139, 252, 350, 351, + 352, 353, 36, 36, 354, 355, 356, 357, 358, 359, 360, 361, 36, 36, 36, 36, + 7, 362, 363, 364, 7, 27, 365, 36, 36, 36, 36, 36, 7, 366, 367, 36, + 7, 27, 368, 369, 7, 370, 371, 36, 372, 373, 36, 36, 36, 36, 36, 36, + 7, 374, 36, 36, 36, 7, 7, 375, 376, 377, 378, 36, 36, 379, 380, 381, + 382, 383, 384, 7, 385, 386, 7, 119, 36, 36, 36, 36, 36, 36, 36, 36, + 387, 388, 389, 390, 391, 392, 36, 36, 393, 394, 395, 396, 397, 371, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 398, 36, 36, 36, 36, 36, 399, 400, 401, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 107, 36, 36, 36, + 7, 7, 7, 402, 7, 7, 7, 7, 7, 7, 403, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 404, 7, 405, 7, 7, 7, 7, 7, 7, 406, 7, 7, 7, 7, + 7, 407, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 408, 7, + 7, 7, 178, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 119, 123, 409, 36, 36, 279, 410, 7, 411, 412, 413, 414, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 7, 7, 415, 36, 36, 36, 7, 7, 416, 9, 417, 36, 36, 418, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 419, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 122, 36, 420, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 216, 216, 216, 216, 216, 216, 216, 216, 231, 36, 421, 422, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 423, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 424, 425, 426, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 122, 7, 427, 7, 428, 429, 430, 7, 334, + 7, 7, 431, 36, 36, 36, 36, 432, 7, 7, 210, 119, 36, 36, 36, 36, + 7, 7, 37, 7, 433, 434, 435, 7, 436, 437, 438, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 439, 7, 7, 7, 7, 7, 7, 7, 7, 440, 441, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 9, 442, 9, 443, 444, 445, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 446, 447, 36, 36, 36, 36, 36, 36, 7, 448, 449, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 7, 450, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 451, 36, 7, 7, 452, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 453, 7, 454, 36, 36, 455, 151, 36, 36, 36, 36, 36, 36, + 435, 456, 457, 458, 459, 460, 36, 461, 36, 36, 36, 36, 36, 36, 36, 36, + 216, 216, 216, 216, 216, 216, 216, 216, 462, 463, 179, 464, 179, 465, 216, 466, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 467, 468, 469, 470, + 216, 216, 471, 472, 473, 474, 216, 216, 475, 476, 477, 478, 479, 216, 480, 481, + 216, 216, 482, 483, 216, 484, 485, 216, 7, 7, 7, 486, 7, 7, 487, 216, + 488, 7, 489, 7, 490, 491, 216, 216, 492, 493, 216, 494, 216, 495, 496, 216, + 7, 7, 486, 216, 216, 216, 216, 216, 7, 7, 7, 7, 497, 7, 35, 498, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 499, + 500, 9, 9, 9, 36, 36, 36, 36, 9, 9, 9, 9, 9, 9, 9, 501, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36 +}; + +static RE_UINT8 re_line_break_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 6, 7, 8, 9, 10, 11, 9, 8, 12, 13, 9, 10, 14, 15, 14, 16, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 14, 14, 9, 9, 9, 7, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 10, 13, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 2, 18, 9, 1, + 1, 1, 1, 1, 1, 19, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 20, 12, 11, 10, 10, 10, 9, 21, 21, 9, 21, 8, 9, 2, 9, 9, + 11, 10, 21, 21, 22, 9, 21, 21, 21, 21, 21, 8, 21, 21, 21, 12, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 21, 22, 21, 21, 21, 22, 21, 9, 9, + 21, 9, 9, 9, 9, 9, 9, 9, 21, 21, 21, 21, 9, 21, 9, 22, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 20, 20, 20, + 20, 20, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 14, 9, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 2, 0, 0, 9, 9, 10, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 9, 1, 1, 9, 1, 1, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, 0, 23, + 23, 23, 23, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 14, 14, 9, 9, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 0, 7, 7, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 11, 17, 17, 9, 9, 9, + 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 7, 9, 1, 1, 1, 1, 1, 1, 1, 9, 9, 1, + 1, 1, 1, 1, 1, 9, 9, 1, 1, 9, 1, 1, 1, 1, 9, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, + 9, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 9, 9, 9, 9, 14, 7, 9, 0, 0, 1, 10, 10, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 9, 1, 1, 1, 9, 1, 1, 1, 1, 1, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 0, 0, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 9, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 9, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 1, 2, 2, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, + 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 0, 0, 0, 9, 9, 9, 9, 0, 0, 1, 9, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 9, 9, 0, 9, + 9, 9, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 9, 9, 11, 11, 9, 9, 9, 9, 9, 11, 9, 10, 9, 9, 1, 0, + 0, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, + 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 0, 9, 9, 0, 9, 9, 0, 0, 1, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 1, 1, 9, 9, 9, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, 1, 9, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 9, 10, 0, 0, 0, 0, 0, 0, 0, 9, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, + 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 9, 9, 0, 9, + 9, 9, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 9, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, + 9, 0, 9, 9, 9, 9, 0, 0, 0, 9, 9, 0, 9, 0, 9, 9, + 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 9, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 9, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 9, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 0, 0, 0, 0, 0, 0, 22, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 1, 1, 1, 22, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, 1, 9, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 9, 0, + 9, 9, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 9, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 9, 9, + 0, 0, 0, 0, 9, 9, 9, 1, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 9, 9, 9, 9, 9, 9, + 0, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 0, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 10, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 2, 2, 0, 0, 0, 0, + 0, 24, 24, 0, 24, 0, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 0, 24, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, + 24, 24, 24, 24, 24, 0, 24, 0, 24, 24, 24, 24, 24, 24, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 24, 24, 24, 24, + 9, 22, 22, 22, 22, 9, 22, 22, 20, 22, 22, 2, 20, 7, 7, 7, + 7, 7, 20, 9, 7, 9, 9, 9, 1, 1, 9, 9, 9, 9, 9, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 2, 1, 9, 1, 9, 1, 12, 18, 12, 18, 1, 1, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 2, 1, 1, 9, 9, 9, 9, 9, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, + 9, 9, 9, 9, 9, 9, 1, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 22, 22, 2, 22, 9, 9, 9, 9, 9, 20, 20, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 2, 2, 9, 9, 9, 9, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 24, 24, 24, 24, 24, + 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 0, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 1, 1, 1, + 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, + 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 9, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 2, 2, 28, 24, 2, 9, 2, 10, 24, 24, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 7, 7, 2, 2, 22, 9, 7, 7, 9, 1, 1, 1, 20, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 9, 0, 0, 0, 7, 7, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, + 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 0, 0, 0, 24, 24, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 0, 0, 9, 9, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 1, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 2, 2, 9, 2, 2, 2, + 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 9, 9, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 1, 9, 9, + 9, 9, 9, 9, 1, 9, 9, 1, 1, 1, 9, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 0, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 22, 9, 0, + 2, 2, 2, 2, 2, 2, 2, 20, 2, 2, 2, 29, 1, 30, 1, 1, + 2, 20, 2, 2, 31, 21, 21, 9, 8, 8, 12, 8, 8, 8, 12, 8, + 21, 21, 9, 9, 32, 32, 32, 2, 4, 4, 1, 1, 1, 1, 1, 20, + 11, 11, 11, 11, 11, 11, 11, 11, 9, 8, 8, 21, 28, 28, 9, 9, + 9, 9, 9, 9, 14, 12, 18, 28, 28, 28, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 2, 9, 2, 2, 2, 2, 9, 2, 2, 2, + 33, 9, 9, 9, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 9, 9, 0, 0, 21, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 21, + 9, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 11, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 11, 10, 10, 10, 10, 11, 10, 10, 11, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 11, 9, 21, 9, 9, 9, 11, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 21, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 21, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 21, 21, 9, 9, 9, 9, 9, 21, 9, 9, 21, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, 9, 9, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, 9, 9, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 21, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 21, 9, 21, 21, 9, 9, 9, 21, 21, 9, 9, 21, 9, 9, 9, 21, + 9, 21, 10, 10, 9, 21, 9, 9, 9, 9, 21, 9, 9, 21, 21, 21, + 21, 9, 9, 21, 9, 21, 9, 21, 21, 21, 21, 21, 21, 9, 21, 9, + 9, 9, 9, 9, 21, 21, 21, 21, 9, 9, 9, 9, 21, 21, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 21, 9, 9, 9, 21, 9, 9, 9, + 9, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 21, 21, 9, 9, 21, 21, 21, 21, 9, 9, 21, 21, 9, 9, 21, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 21, 21, 9, 9, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 21, 9, 9, 9, 21, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 32, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 12, 18, 9, 9, 9, 9, + 9, 9, 21, 9, 9, 9, 9, 9, 9, 9, 34, 34, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, 9, 9, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 9, 9, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 21, 21, 9, 21, 21, 21, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, + 9, 9, 21, 21, 9, 9, 21, 21, 9, 9, 9, 9, 21, 21, 9, 9, + 21, 21, 9, 9, 9, 9, 21, 21, 21, 9, 9, 21, 9, 9, 21, 21, + 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 34, 34, 34, 34, 9, 21, 21, 9, 9, 21, 9, 9, 9, 9, 21, 21, + 9, 9, 9, 9, 34, 34, 21, 21, 34, 9, 34, 34, 34, 35, 34, 34, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 9, 9, 9, 9, + 21, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 21, 21, 9, 21, 21, 21, 9, 21, 34, 21, 21, 9, 21, 21, 9, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 21, 21, 21, 34, 9, 34, + 34, 34, 21, 34, 34, 21, 21, 21, 34, 34, 21, 21, 34, 21, 21, 34, + 34, 34, 9, 21, 9, 9, 9, 9, 21, 21, 34, 21, 21, 21, 21, 21, + 21, 34, 34, 34, 34, 34, 21, 34, 34, 35, 34, 21, 21, 34, 34, 34, + 34, 34, 34, 34, 34, 9, 9, 9, 34, 34, 35, 35, 35, 35, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 21, 9, 9, 9, 8, 8, 8, 8, 8, + 8, 9, 7, 7, 34, 9, 9, 9, 12, 18, 12, 18, 12, 18, 12, 18, + 12, 18, 12, 18, 12, 18, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 12, 18, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, 12, + 18, 12, 18, 12, 18, 12, 18, 12, 18, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 12, 18, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 21, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, + 1, 1, 9, 9, 0, 0, 0, 0, 0, 7, 2, 2, 2, 9, 7, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 2, + 2, 2, 2, 2, 2, 2, 9, 2, 12, 2, 9, 9, 8, 8, 9, 9, + 8, 8, 12, 18, 12, 18, 12, 18, 12, 18, 2, 2, 2, 2, 7, 9, + 2, 2, 9, 2, 2, 9, 9, 9, 9, 9, 31, 31, 2, 2, 2, 9, + 2, 2, 12, 2, 2, 2, 2, 2, 2, 2, 2, 9, 2, 9, 2, 2, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, + 2, 18, 18, 34, 34, 28, 34, 34, 12, 18, 12, 18, 12, 18, 12, 18, + 12, 18, 34, 34, 12, 18, 12, 18, 12, 18, 12, 18, 28, 12, 18, 18, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 1, 1, 1, 1, 1, 1, + 34, 34, 34, 34, 34, 1, 34, 34, 34, 34, 34, 28, 28, 34, 34, 34, + 0, 36, 34, 36, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 36, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34, 36, 34, + 34, 34, 34, 34, 34, 36, 36, 0, 0, 1, 1, 28, 28, 28, 28, 34, + 28, 36, 34, 36, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34, 36, 34, + 34, 34, 34, 34, 34, 36, 36, 34, 34, 34, 34, 28, 36, 28, 28, 34, + 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 21, 21, 21, 21, 21, 21, 21, 21, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 7, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, + 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 9, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 9, 9, 9, 1, 9, 9, 9, 9, 1, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 1, 1, 1, 1, 1, 9, 9, 9, 9, 1, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 11, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 22, 22, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 1, + 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 9, 9, 9, 9, 9, 9, 2, 2, 2, 9, 9, 9, 9, 0, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 9, 9, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 24, 24, 24, 24, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 1, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 9, 2, 2, 2, + 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, + 2, 2, 9, 9, 9, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, + 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 23, 1, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 9, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 0, 23, 0, + 23, 23, 0, 23, 23, 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 12, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 9, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 14, 18, 18, 14, 14, 7, 7, 12, 18, 32, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 34, 34, 34, 34, 34, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, 12, + 18, 12, 18, 12, 18, 34, 34, 12, 18, 34, 34, 34, 34, 34, 34, 34, + 18, 34, 18, 0, 28, 28, 7, 7, 34, 12, 18, 12, 18, 12, 18, 34, + 34, 34, 34, 34, 34, 34, 34, 0, 34, 10, 11, 34, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 33, + 0, 7, 34, 34, 10, 11, 34, 34, 12, 18, 34, 34, 18, 34, 18, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 28, 28, 34, 34, 34, 7, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 12, 34, 18, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 12, 34, 18, 34, 12, + 18, 18, 12, 18, 18, 28, 34, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 28, 28, + 0, 0, 34, 34, 34, 34, 34, 34, 0, 0, 34, 34, 34, 34, 34, 34, + 0, 0, 34, 34, 34, 34, 34, 34, 0, 0, 34, 34, 34, 0, 0, 0, + 11, 10, 34, 34, 34, 10, 10, 0, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 40, 21, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 2, 2, 2, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 2, + 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 2, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static RE_UINT8 re_id_start_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, - 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, - 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 1, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 1, 57, 58, 59, 60, 61, 62, 63, 31, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 31, 76, 77, 78, 31, - 1, 1, 1, 79, 80, 81, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 82, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 84, 85, 31, 31, 86, 87, - 1, 1, 1, 1, 1, 1, 1, 88, 1, 1, 89, 31, 31, 31, 31, 31, - 1, 90, 91, 31, 31, 31, 31, 31, 31, 31, 31, 31, 92, 31, 31, 31, - 31, 31, 31, 31, 93, 94, 95, 96, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 97, 98, 31, 31, 31, 31, 31, 99, 100, 31, 31, 31, 31, 101, 31, - 1, 1, 1, 1, 1, 1, 102, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 103, 104, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 105, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 106, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 107, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_id_start_stage_3[] = { - 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 0, 7, 8, 9, 4, 10, - 4, 4, 4, 4, 11, 4, 4, 4, 4, 12, 13, 4, 14, 0, 15, 16, - 0, 4, 17, 18, 4, 4, 19, 20, 21, 22, 23, 4, 4, 24, 25, 26, - 27, 28, 29, 17, 0, 30, 0, 0, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 44, 48, 49, 50, 51, 45, 0, - 52, 53, 54, 55, 56, 57, 58, 59, 52, 60, 61, 62, 63, 64, 65, 0, - 66, 67, 65, 0, 68, 69, 70, 0, 71, 0, 72, 73, 74, 0, 0, 0, - 4, 75, 76, 77, 78, 4, 79, 80, 4, 4, 81, 4, 82, 83, 84, 4, - 85, 4, 86, 0, 22, 4, 4, 87, 66, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 88, 1, 4, 4, 89, 90, 91, 91, 92, 4, 93, 94, 0, - 0, 4, 4, 29, 4, 95, 4, 96, 97, 0, 15, 98, 4, 99, 100, 0, - 101, 4, 102, 0, 0, 103, 0, 0, 104, 93, 105, 0, 106, 107, 4, 108, - 4, 109, 110, 111, 112, 113, 0, 114, 4, 4, 4, 4, 4, 4, 0, 0, - 87, 4, 115, 111, 4, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, - 121, 122, 123, 4, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 124, 97, 4, 4, 4, 4, 125, 4, 79, 4, 126, 101, 127, 127, 0, - 128, 129, 66, 4, 130, 66, 4, 80, 104, 12, 4, 4, 131, 86, 0, 15, - 4, 4, 4, 4, 4, 96, 0, 0, 4, 4, 4, 4, 4, 4, 4, 22, - 4, 4, 4, 4, 73, 0, 15, 111, 132, 133, 4, 134, 111, 4, 4, 22, - 135, 136, 4, 4, 137, 4, 138, 135, 139, 140, 4, 93, 136, 93, 0, 141, - 25, 142, 65, 143, 31, 144, 145, 146, 4, 14, 147, 148, 4, 149, 150, 151, - 152, 153, 80, 154, 4, 4, 4, 140, 4, 4, 4, 4, 4, 155, 156, 157, - 4, 4, 4, 158, 4, 4, 159, 0, 160, 161, 162, 4, 4, 91, 163, 4, - 4, 111, 15, 4, 164, 4, 165, 166, 0, 0, 0, 167, 4, 4, 4, 143, - 0, 1, 1, 168, 4, 97, 169, 0, 170, 171, 172, 0, 4, 4, 4, 86, - 0, 0, 4, 102, 0, 0, 0, 0, 0, 0, 0, 0, 143, 4, 173, 0, - 4, 23, 174, 96, 111, 4, 175, 0, 4, 4, 4, 4, 111, 15, 176, 157, - 4, 154, 4, 109, 0, 0, 0, 0, 4, 101, 96, 165, 0, 0, 0, 0, - 177, 178, 96, 101, 97, 0, 0, 179, 96, 159, 0, 0, 4, 180, 0, 0, - 181, 96, 0, 143, 143, 0, 72, 182, 4, 96, 96, 144, 91, 0, 0, 0, - 4, 4, 14, 0, 4, 144, 4, 144, 4, 109, 0, 0, 0, 0, 0, 0, - 143, 183, 108, 0, 0, 0, 0, 101, 106, 184, 0, 0, 106, 22, 15, 14, - 106, 65, 185, 186, 106, 144, 187, 0, 188, 189, 0, 0, 190, 112, 97, 0, - 47, 44, 191, 55, 0, 0, 0, 0, 4, 102, 192, 0, 4, 22, 193, 0, - 0, 0, 0, 0, 4, 131, 194, 0, 4, 22, 195, 0, 4, 196, 0, 0, - 86, 0, 0, 0, 0, 0, 0, 0, 4, 189, 0, 0, 0, 4, 4, 197, - 0, 0, 0, 0, 0, 198, 173, 199, 200, 201, 202, 4, 203, 0, 4, 29, - 204, 131, 71, 205, 22, 0, 0, 0, 206, 173, 207, 208, 209, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 144, 4, 4, 4, 4, 159, 0, 0, 0, - 4, 4, 4, 131, 4, 4, 4, 4, 4, 4, 109, 0, 0, 0, 0, 0, - 4, 131, 0, 0, 0, 0, 0, 0, 4, 4, 65, 0, 0, 0, 0, 0, - 4, 29, 97, 0, 0, 0, 15, 210, 4, 22, 109, 211, 22, 0, 0, 0, - 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 212, 0, 163, 0, 0, 213, - 4, 4, 4, 4, 4, 4, 4, 184, 4, 4, 4, 4, 4, 4, 4, 144, - 97, 0, 214, 215, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 157, - 4, 4, 4, 216, 217, 0, 0, 0, 4, 4, 218, 4, 219, 220, 221, 4, - 222, 223, 224, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 225, 226, 80, - 218, 218, 124, 124, 204, 204, 147, 0, 4, 227, 228, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 189, 4, 4, 4, 4, 4, 4, 182, 0, - 4, 4, 229, 0, 0, 0, 0, 0, 221, 230, 231, 232, 233, 234, 0, 0, - 4, 4, 4, 4, 4, 4, 101, 0, 4, 102, 4, 4, 4, 4, 4, 4, - 111, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 235, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 71, 111, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_id_start_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, - 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 0, 0, 223, 188, - 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, - 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 0, 0, 0, 0, 255, 255, - 255, 135, 7, 0, 255, 7, 0, 0, 0, 192, 254, 255, 255, 255, 47, 0, - 96, 192, 0, 156, 0, 0, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, - 63, 0, 2, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 63, 4, - 16, 1, 0, 0, 255, 255, 255, 1, 255, 255, 223, 63, 240, 255, 255, 255, - 255, 255, 255, 35, 0, 0, 1, 255, 3, 0, 254, 255, 225, 159, 249, 255, - 255, 253, 197, 35, 0, 64, 0, 176, 3, 0, 3, 16, 224, 135, 249, 255, - 255, 253, 109, 3, 0, 0, 0, 94, 0, 0, 28, 0, 224, 191, 251, 255, - 255, 253, 237, 35, 0, 0, 1, 0, 3, 0, 0, 2, 224, 159, 249, 255, - 0, 0, 0, 176, 3, 0, 2, 0, 232, 199, 61, 214, 24, 199, 255, 3, - 224, 223, 253, 255, 255, 253, 255, 35, 0, 0, 0, 7, 3, 0, 0, 0, - 225, 223, 253, 255, 255, 253, 239, 35, 0, 0, 0, 64, 3, 0, 6, 0, - 255, 255, 255, 39, 0, 64, 112, 128, 3, 0, 0, 252, 224, 255, 127, 252, - 255, 255, 251, 47, 127, 0, 0, 0, 254, 255, 255, 255, 255, 255, 13, 0, - 214, 247, 255, 255, 175, 255, 13, 32, 95, 0, 0, 240, 1, 0, 0, 0, - 255, 254, 255, 255, 255, 31, 0, 0, 0, 31, 0, 0, 255, 7, 0, 128, - 0, 0, 63, 60, 98, 192, 225, 255, 3, 64, 0, 0, 191, 32, 255, 255, - 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, - 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 7, 255, 255, 63, 63, - 255, 159, 255, 255, 255, 199, 255, 1, 255, 223, 3, 0, 255, 255, 3, 0, - 255, 223, 1, 0, 255, 255, 15, 0, 0, 0, 128, 16, 255, 5, 255, 255, - 255, 255, 63, 0, 255, 255, 255, 127, 255, 63, 31, 0, 255, 15, 255, 255, - 255, 3, 0, 0, 255, 255, 127, 0, 255, 255, 31, 0, 128, 0, 0, 0, - 224, 255, 255, 255, 224, 15, 0, 0, 248, 255, 255, 255, 1, 192, 0, 252, - 63, 0, 0, 0, 15, 0, 0, 0, 0, 224, 0, 252, 255, 255, 255, 63, - 255, 1, 255, 255, 255, 255, 255, 231, 0, 222, 111, 4, 63, 63, 255, 170, - 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, - 0, 0, 255, 31, 132, 252, 47, 63, 80, 253, 255, 243, 224, 67, 0, 0, - 255, 127, 255, 255, 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, - 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 248, 255, 127, 0, 0, - 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 0, 128, 0, 0, 128, 255, - 252, 255, 255, 255, 255, 249, 255, 255, 124, 0, 0, 0, 187, 247, 255, 255, - 7, 0, 0, 0, 0, 0, 252, 104, 63, 0, 255, 255, 255, 255, 255, 31, - 255, 255, 7, 0, 0, 128, 0, 0, 223, 255, 0, 124, 247, 15, 0, 0, - 255, 255, 127, 196, 255, 255, 98, 62, 5, 0, 0, 56, 255, 7, 28, 0, - 126, 126, 126, 0, 127, 127, 255, 255, 255, 0, 255, 255, 15, 0, 255, 255, - 127, 248, 255, 255, 255, 255, 255, 15, 255, 63, 255, 255, 255, 255, 255, 3, - 127, 0, 248, 160, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, - 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 15, 0, 0, 223, 255, - 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, - 255, 63, 255, 63, 255, 255, 1, 0, 255, 7, 255, 255, 15, 255, 62, 0, - 255, 255, 15, 255, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, - 255, 255, 255, 192, 1, 0, 239, 254, 31, 0, 0, 0, 128, 0, 255, 255, - 255, 255, 255, 0, 16, 0, 255, 255, 255, 255, 71, 0, 30, 0, 0, 20, - 255, 255, 251, 255, 255, 15, 0, 0, 127, 189, 255, 191, 0, 0, 1, 224, - 128, 7, 0, 128, 176, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, - 255, 7, 0, 1, 0, 0, 0, 128, 255, 252, 255, 255, 10, 0, 0, 0, - 1, 248, 255, 255, 255, 255, 7, 4, 0, 0, 1, 240, 255, 3, 0, 32, - 255, 253, 255, 255, 0, 0, 252, 255, 127, 251, 255, 255, 64, 0, 0, 0, - 191, 253, 255, 255, 255, 3, 0, 1, 255, 63, 0, 0, 248, 255, 255, 224, - 255, 7, 1, 0, 11, 0, 0, 0, 0, 0, 7, 0, 240, 0, 255, 255, - 255, 7, 255, 31, 255, 1, 255, 3, 255, 255, 223, 255, 255, 255, 255, 223, - 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, - 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 31, 128, 63, - 0, 64, 0, 0, 15, 8, 0, 0, 150, 254, 247, 10, 132, 234, 150, 170, - 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255, -}; - -/* ID_Start: 2496 bytes. */ - -RE_UINT32 re_get_id_start(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_id_start_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_id_start_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_id_start_stage_3[pos + f] << 5; - pos += code; - value = (re_id_start_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* ID_Continue. */ - -static RE_UINT8 re_id_continue_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 9, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 22, 23, 5, 24, 25, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 2, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 9, 9, 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 1, 1, 0, 0, 0, 0, 9, 9, 9, 9, 9, + 2, 2, 2, 2, 2, 2, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 26, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static RE_UINT8 re_id_continue_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, - 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, - 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 1, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 1, 57, 58, 59, 60, 61, 62, 63, 31, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 31, 76, 77, 78, 31, - 1, 1, 1, 79, 80, 81, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 82, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 84, 85, 31, 31, 86, 87, - 1, 1, 1, 1, 1, 1, 1, 88, 1, 1, 89, 31, 31, 31, 31, 31, - 1, 90, 91, 31, 31, 31, 31, 31, 31, 31, 31, 31, 92, 31, 31, 31, - 31, 93, 94, 31, 95, 96, 97, 98, 31, 31, 99, 31, 31, 31, 31, 31, - 100, 101, 102, 31, 31, 31, 31, 31, 103, 104, 31, 31, 31, 31, 105, 31, - 1, 1, 1, 1, 1, 1, 106, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 107, 108, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 109, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 110, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 111, 31, 31, 31, 31, 31, - 31, 37, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_id_continue_stage_3[] = { - 0, 0, 0, 1, 2, 3, 2, 4, 0, 0, 5, 6, 7, 8, 7, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 0, - 7, 7, 7, 7, 7, 7, 7, 12, 13, 7, 14, 7, 7, 7, 7, 15, - 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 2, 7, 17, 7, 7, 18, 2, 7, 19, 20, 7, 3, 21, - 0, 4, 7, 7, 7, 7, 22, 7, 7, 7, 7, 7, 7, 23, 24, 25, - 0, 7, 7, 7, 26, 7, 7, 7, 7, 7, 7, 10, 7, 7, 7, 27, - 7, 7, 28, 0, 7, 29, 4, 0, 0, 0, 7, 30, 0, 31, 14, 7, - 7, 7, 7, 7, 7, 7, 32, 2, 23, 33, 24, 34, 35, 36, 32, 37, - 38, 33, 24, 39, 40, 41, 42, 43, 44, 14, 24, 45, 46, 47, 32, 48, - 49, 33, 24, 45, 50, 51, 32, 52, 53, 54, 55, 22, 56, 57, 42, 0, - 58, 59, 24, 60, 61, 62, 32, 0, 63, 59, 24, 64, 61, 65, 32, 66, - 63, 59, 7, 7, 67, 68, 32, 69, 70, 71, 7, 72, 73, 74, 42, 75, - 2, 7, 7, 4, 76, 1, 0, 0, 77, 7, 78, 28, 79, 80, 0, 0, - 47, 81, 1, 82, 83, 7, 84, 2, 85, 83, 7, 84, 86, 0, 0, 0, - 7, 7, 7, 7, 1, 7, 7, 7, 7, 28, 7, 7, 87, 7, 7, 88, - 7, 7, 7, 7, 89, 90, 7, 7, 89, 7, 7, 91, 92, 8, 7, 7, - 7, 92, 7, 7, 7, 26, 48, 10, 7, 0, 7, 7, 7, 7, 7, 93, - 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 25, 7, 2, 4, 7, 7, 7, 7, 94, 18, - 58, 95, 7, 95, 7, 96, 58, 97, 7, 7, 7, 7, 7, 98, 1, 0, - 99, 1, 7, 7, 7, 7, 7, 18, 7, 7, 4, 7, 7, 7, 7, 43, - 7, 76, 29, 29, 42, 7, 28, 95, 7, 7, 29, 7, 1, 4, 0, 0, - 7, 29, 7, 7, 7, 76, 7, 25, 1, 1, 100, 28, 0, 0, 0, 0, - 7, 7, 7, 7, 29, 1, 101, 96, 7, 7, 7, 7, 7, 7, 7, 96, - 7, 7, 7, 102, 60, 7, 7, 28, 18, 7, 7, 26, 0, 103, 7, 4, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 104, - 7, 93, 7, 7, 93, 105, 7, 28, 7, 7, 7, 106, 107, 108, 84, 107, - 0, 0, 0, 109, 47, 110, 0, 111, 0, 84, 0, 0, 0, 84, 112, 47, - 113, 114, 115, 80, 116, 0, 7, 7, 18, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 76, 7, 7, 76, 7, 7, 7, 7, 7, 7, 7, 7, 117, 96, - 7, 7, 87, 7, 7, 7, 118, 109, 7, 119, 120, 120, 120, 120, 7, 7, - 121, 0, 2, 122, 2, 7, 7, 7, 7, 123, 2, 7, 7, 7, 7, 88, - 124, 7, 7, 2, 7, 7, 7, 7, 76, 0, 7, 4, 0, 0, 0, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 43, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 84, 0, 0, 0, 0, 7, 7, 28, - 84, 7, 29, 0, 7, 7, 7, 125, 7, 7, 7, 7, 7, 7, 7, 10, - 0, 126, 127, 7, 7, 7, 7, 7, 128, 7, 7, 7, 129, 0, 0, 126, - 7, 7, 102, 0, 7, 7, 7, 96, 7, 7, 7, 7, 43, 1, 7, 130, - 7, 7, 28, 7, 7, 96, 7, 84, 7, 7, 7, 7, 131, 1, 7, 76, - 7, 7, 7, 119, 28, 1, 7, 71, 7, 7, 7, 7, 21, 99, 7, 129, - 132, 133, 120, 7, 7, 88, 102, 7, 7, 7, 7, 7, 7, 7, 134, 1, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 96, 7, 135, 7, 7, 29, - 7, 7, 7, 7, 7, 7, 28, 7, 7, 7, 7, 7, 7, 1, 0, 0, - 119, 136, 24, 137, 138, 7, 7, 7, 7, 7, 7, 10, 0, 31, 7, 7, - 7, 7, 7, 28, 0, 7, 7, 7, 7, 127, 7, 7, 102, 0, 0, 29, - 7, 0, 7, 139, 140, 0, 0, 85, 7, 7, 7, 7, 7, 7, 7, 84, - 0, 1, 2, 3, 2, 4, 42, 7, 7, 7, 7, 76, 141, 142, 0, 0, - 143, 7, 8, 144, 28, 28, 0, 0, 7, 7, 7, 7, 7, 7, 7, 4, - 0, 0, 0, 0, 7, 7, 7, 95, 0, 0, 0, 0, 0, 0, 0, 145, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 84, 7, 7, 7, 47, 47, 0, - 7, 7, 140, 7, 4, 7, 7, 4, 7, 28, 7, 7, 146, 147, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 28, 1, 7, 7, 146, 7, 29, - 7, 7, 102, 7, 7, 7, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 119, 7, 43, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 148, 7, 7, 149, 7, 43, 7, 119, 7, 76, 0, 0, 0, 0, 7, 150, - 7, 43, 7, 1, 0, 0, 0, 0, 7, 7, 7, 151, 0, 0, 0, 0, - 152, 153, 7, 154, 0, 0, 7, 84, 7, 84, 0, 0, 83, 7, 119, 0, - 7, 7, 7, 43, 7, 43, 7, 21, 7, 10, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 18, 0, 0, 0, 7, 7, 7, 21, 7, 7, 7, 21, - 7, 7, 102, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 84, 100, 7, 7, 47, 0, 0, 0, 0, 0, 0, 0, 0, 7, 119, - 7, 7, 7, 7, 119, 0, 42, 109, 7, 7, 7, 4, 0, 7, 18, 1, - 7, 7, 7, 85, 155, 7, 7, 156, 7, 7, 7, 7, 157, 158, 0, 0, - 7, 14, 7, 159, 0, 0, 0, 0, 160, 19, 18, 7, 7, 7, 4, 1, - 23, 33, 24, 161, 50, 162, 163, 95, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 4, 22, 0, 0, 7, 7, 7, 7, 164, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 165, 47, 166, 0, 0, - 7, 7, 7, 7, 167, 1, 0, 0, 7, 7, 7, 18, 1, 0, 0, 0, - 7, 26, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 4, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 1, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 7, 7, 168, 169, 0, - 7, 7, 7, 76, 100, 7, 7, 7, 7, 170, 0, 0, 7, 7, 7, 18, - 24, 7, 7, 8, 47, 1, 0, 127, 7, 127, 83, 119, 0, 0, 0, 0, - 171, 7, 7, 172, 102, 1, 173, 7, 76, 174, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 119, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 76, 0, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 18, 7, 76, 1, 0, 0, 0, 0, 0, 0, 7, 28, 95, - 7, 7, 7, 119, 96, 1, 31, 175, 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 3, 7, 7, 7, 118, 7, 0, 0, 0, 0, 176, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 102, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, - 7, 76, 0, 0, 0, 21, 177, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 29, - 7, 7, 7, 7, 7, 7, 4, 84, 18, 178, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 179, 180, 181, 0, 182, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 85, 7, 7, 7, 58, 184, 185, 186, 7, 7, 7, - 187, 188, 7, 189, 190, 59, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 165, 7, 59, 88, 7, 88, - 7, 85, 7, 85, 76, 7, 76, 7, 24, 7, 24, 7, 191, 7, 7, 7, - 7, 7, 7, 135, 7, 7, 84, 192, 110, 101, 2, 0, 0, 0, 0, 0, - 8, 128, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 84, 28, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 1, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 95, 119, 0, 0, - 7, 7, 7, 7, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 186, 7, 195, 196, 197, 198, 199, 200, 104, 29, 201, 29, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 119, 0, 0, - 7, 7, 7, 95, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 28, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 47, 0, - 7, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_id_continue_stage_4[] = { - 0, 0, 255, 3, 254, 255, 255, 135, 255, 7, 0, 4, 160, 4, 255, 255, - 127, 255, 195, 255, 3, 0, 31, 80, 223, 188, 192, 215, 251, 255, 191, 255, - 251, 252, 127, 2, 255, 1, 255, 191, 182, 0, 7, 0, 255, 195, 239, 159, - 255, 253, 255, 159, 255, 231, 63, 36, 255, 63, 255, 15, 223, 63, 248, 255, - 207, 255, 249, 255, 197, 243, 159, 121, 128, 176, 3, 80, 238, 135, 109, 211, - 135, 57, 2, 94, 192, 255, 63, 0, 238, 191, 237, 243, 191, 59, 1, 0, - 0, 254, 238, 159, 159, 57, 192, 176, 2, 0, 236, 199, 61, 214, 24, 199, - 199, 61, 129, 0, 255, 223, 253, 255, 255, 227, 223, 61, 96, 7, 239, 223, - 239, 243, 96, 64, 6, 0, 223, 125, 240, 128, 0, 252, 236, 255, 127, 252, - 251, 47, 127, 132, 95, 255, 12, 0, 255, 127, 214, 247, 175, 255, 95, 63, - 255, 243, 0, 3, 160, 194, 255, 254, 255, 31, 223, 255, 64, 0, 191, 32, - 255, 247, 255, 61, 127, 61, 61, 127, 61, 255, 63, 63, 255, 199, 31, 0, - 15, 0, 13, 0, 143, 48, 0, 56, 128, 0, 0, 248, 255, 0, 247, 255, - 255, 251, 255, 170, 223, 95, 220, 31, 207, 15, 0, 128, 16, 0, 2, 128, - 226, 255, 132, 252, 47, 63, 80, 253, 224, 67, 31, 248, 255, 128, 127, 0, - 127, 127, 224, 0, 62, 31, 127, 254, 224, 255, 240, 191, 128, 255, 252, 255, - 255, 249, 124, 0, 255, 232, 1, 128, 126, 126, 126, 0, 255, 55, 127, 248, - 248, 224, 127, 95, 219, 255, 24, 0, 0, 224, 252, 252, 252, 28, 255, 239, - 255, 183, 0, 32, 15, 255, 62, 0, 63, 253, 191, 145, 55, 0, 255, 192, - 111, 240, 239, 254, 63, 135, 112, 0, 79, 0, 31, 30, 255, 23, 255, 64, - 127, 189, 237, 251, 129, 224, 207, 31, 191, 0, 63, 255, 0, 63, 17, 0, - 255, 252, 27, 0, 255, 35, 127, 251, 127, 180, 191, 253, 251, 1, 255, 224, - 11, 0, 240, 0, 255, 99, 224, 227, 7, 248, 231, 15, 0, 60, 28, 0, - 100, 222, 255, 235, 239, 255, 191, 231, 223, 223, 255, 123, 95, 252, 247, 207, - 32, 0, 219, 7, 255, 67, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, - 247, 94, 238, 251, -}; - -/* ID_Continue: 2900 bytes. */ - -RE_UINT32 re_get_id_continue(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_id_continue_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_id_continue_stage_2[pos + f] << 4; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_id_continue_stage_3[pos + f] << 4; - pos += code; - value = (re_id_continue_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* XID_Start. */ - -static RE_UINT8 re_xid_start_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 9, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 22, 23, 5, 24, 25, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1, 2, 0, 0, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 2, 2, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 2, 2, 2, 2, 9, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 1, 9, 22, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 9, 9, 9, 9, 2, 2, 9, 2, 1, 1, 1, 1, 9, 1, 1, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 22, 9, 2, 2, 2, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 9, 2, 2, 9, 1, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, + 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 0, 1, 1, 9, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 2, 2, 2, 2, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 2, 2, 0, 9, 1, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 22, 2, 2, 7, 7, 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, 1, 1, 0, 0, + 1, 2, 2, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 24, 2, 2, 2, 24, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 9, + 1, 9, 1, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 9, 22, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static RE_UINT8 re_xid_start_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, - 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, - 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 1, 58, 59, 60, 61, 62, 63, 64, 31, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 31, 77, 78, 79, 31, - 1, 1, 1, 80, 81, 82, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 84, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 85, 86, 31, 31, 87, 88, - 1, 1, 1, 1, 1, 1, 1, 89, 1, 1, 90, 31, 31, 31, 31, 31, - 1, 91, 92, 31, 31, 31, 31, 31, 31, 31, 31, 31, 93, 31, 31, 31, - 31, 31, 31, 31, 94, 95, 96, 97, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 98, 99, 31, 31, 31, 31, 31, 100, 101, 31, 31, 31, 31, 102, 31, - 1, 1, 1, 1, 1, 1, 103, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 104, 105, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 106, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 107, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 108, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_xid_start_stage_3[] = { - 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 0, 7, 8, 9, 4, 10, - 4, 4, 4, 4, 11, 4, 4, 4, 4, 12, 13, 4, 14, 0, 15, 16, - 0, 4, 17, 18, 4, 4, 19, 20, 21, 22, 23, 4, 4, 24, 25, 26, - 27, 28, 29, 17, 0, 30, 0, 0, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 44, 48, 49, 50, 51, 45, 0, - 52, 53, 54, 55, 56, 57, 58, 59, 52, 60, 61, 62, 63, 64, 65, 0, - 66, 67, 65, 0, 68, 69, 70, 0, 71, 0, 72, 73, 74, 0, 0, 0, - 4, 75, 76, 77, 78, 4, 79, 80, 4, 4, 81, 4, 82, 83, 84, 4, - 85, 4, 86, 0, 22, 4, 4, 87, 66, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 88, 1, 4, 4, 89, 90, 91, 91, 92, 4, 93, 94, 0, - 0, 4, 4, 29, 4, 95, 4, 96, 97, 0, 15, 98, 4, 99, 100, 0, - 101, 4, 102, 0, 0, 103, 0, 0, 104, 93, 105, 0, 106, 107, 4, 108, - 4, 109, 110, 111, 112, 113, 0, 114, 4, 4, 4, 4, 4, 4, 0, 0, - 87, 4, 115, 111, 4, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, - 121, 122, 123, 4, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 124, 97, 4, 4, 4, 4, 125, 4, 79, 4, 126, 101, 127, 127, 0, - 128, 129, 66, 4, 130, 66, 4, 80, 104, 12, 4, 4, 131, 86, 0, 15, - 4, 4, 4, 4, 4, 96, 0, 0, 4, 4, 4, 4, 4, 4, 4, 22, - 4, 4, 4, 4, 73, 0, 15, 111, 132, 133, 4, 134, 111, 4, 4, 22, - 135, 136, 4, 4, 137, 4, 138, 135, 139, 140, 4, 93, 136, 93, 0, 141, - 25, 142, 65, 143, 31, 144, 145, 146, 4, 14, 147, 148, 4, 149, 150, 151, - 152, 153, 80, 154, 4, 4, 4, 140, 4, 4, 4, 4, 4, 155, 156, 157, - 4, 4, 4, 158, 4, 4, 159, 0, 160, 161, 162, 4, 4, 91, 163, 4, - 4, 4, 111, 31, 4, 4, 4, 4, 4, 111, 15, 4, 164, 4, 165, 166, - 0, 0, 0, 167, 4, 4, 4, 143, 0, 1, 1, 168, 111, 97, 169, 0, - 170, 171, 172, 0, 4, 4, 4, 86, 0, 0, 4, 102, 0, 0, 0, 0, - 0, 0, 0, 0, 143, 4, 173, 0, 4, 23, 174, 96, 111, 4, 175, 0, - 4, 4, 4, 4, 111, 15, 176, 157, 4, 154, 4, 109, 0, 0, 0, 0, - 4, 101, 96, 165, 0, 0, 0, 0, 177, 178, 96, 101, 97, 0, 0, 179, - 96, 159, 0, 0, 4, 180, 0, 0, 181, 96, 0, 143, 143, 0, 72, 182, - 4, 96, 96, 144, 91, 0, 0, 0, 4, 4, 14, 0, 4, 144, 4, 144, - 4, 109, 0, 0, 0, 0, 0, 0, 143, 183, 108, 0, 0, 0, 0, 101, - 106, 184, 0, 0, 106, 22, 15, 14, 106, 65, 185, 186, 106, 144, 187, 0, - 188, 189, 0, 0, 190, 112, 97, 0, 47, 44, 191, 55, 0, 0, 0, 0, - 4, 102, 192, 0, 4, 22, 193, 0, 0, 0, 0, 0, 4, 131, 194, 0, - 4, 22, 195, 0, 4, 196, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, - 4, 189, 0, 0, 0, 4, 4, 197, 0, 0, 0, 0, 0, 198, 173, 199, - 200, 201, 202, 4, 203, 0, 4, 29, 204, 131, 71, 205, 22, 0, 0, 0, - 206, 173, 207, 208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, - 4, 4, 4, 4, 159, 0, 0, 0, 4, 4, 4, 131, 4, 4, 4, 4, - 4, 4, 109, 0, 0, 0, 0, 0, 4, 131, 0, 0, 0, 0, 0, 0, - 4, 4, 65, 0, 0, 0, 0, 0, 4, 29, 97, 0, 0, 0, 15, 210, - 4, 22, 109, 211, 22, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, - 4, 4, 212, 0, 163, 0, 0, 213, 4, 4, 4, 4, 4, 4, 4, 184, - 4, 4, 4, 4, 4, 4, 4, 144, 97, 0, 214, 215, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 157, 4, 4, 4, 216, 217, 0, 0, 0, - 4, 4, 218, 4, 219, 220, 221, 4, 222, 223, 224, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 225, 226, 80, 218, 218, 124, 124, 204, 204, 147, 0, - 4, 227, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 189, - 4, 4, 4, 4, 4, 4, 182, 0, 4, 4, 229, 0, 0, 0, 0, 0, - 221, 230, 231, 232, 233, 234, 0, 0, 4, 4, 4, 4, 4, 4, 101, 0, - 4, 102, 4, 4, 4, 4, 4, 4, 111, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 235, 4, 4, 4, 4, 4, 4, 4, 4, 4, 71, - 111, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_xid_start_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, - 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 0, 0, 223, 184, - 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, - 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 0, 0, 0, 0, 255, 255, - 255, 135, 7, 0, 255, 7, 0, 0, 0, 192, 254, 255, 255, 255, 47, 0, - 96, 192, 0, 156, 0, 0, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, - 63, 0, 2, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 63, 4, - 16, 1, 0, 0, 255, 255, 255, 1, 255, 255, 223, 63, 240, 255, 255, 255, - 255, 255, 255, 35, 0, 0, 1, 255, 3, 0, 254, 255, 225, 159, 249, 255, - 255, 253, 197, 35, 0, 64, 0, 176, 3, 0, 3, 16, 224, 135, 249, 255, - 255, 253, 109, 3, 0, 0, 0, 94, 0, 0, 28, 0, 224, 191, 251, 255, - 255, 253, 237, 35, 0, 0, 1, 0, 3, 0, 0, 2, 224, 159, 249, 255, - 0, 0, 0, 176, 3, 0, 2, 0, 232, 199, 61, 214, 24, 199, 255, 3, - 224, 223, 253, 255, 255, 253, 255, 35, 0, 0, 0, 7, 3, 0, 0, 0, - 225, 223, 253, 255, 255, 253, 239, 35, 0, 0, 0, 64, 3, 0, 6, 0, - 255, 255, 255, 39, 0, 64, 112, 128, 3, 0, 0, 252, 224, 255, 127, 252, - 255, 255, 251, 47, 127, 0, 0, 0, 254, 255, 255, 255, 255, 255, 5, 0, - 214, 247, 255, 255, 175, 255, 5, 32, 95, 0, 0, 240, 1, 0, 0, 0, - 255, 254, 255, 255, 255, 31, 0, 0, 0, 31, 0, 0, 255, 7, 0, 128, - 0, 0, 63, 60, 98, 192, 225, 255, 3, 64, 0, 0, 191, 32, 255, 255, - 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, - 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 7, 255, 255, 63, 63, - 255, 159, 255, 255, 255, 199, 255, 1, 255, 223, 3, 0, 255, 255, 3, 0, - 255, 223, 1, 0, 255, 255, 15, 0, 0, 0, 128, 16, 255, 5, 255, 255, - 255, 255, 63, 0, 255, 255, 255, 127, 255, 63, 31, 0, 255, 15, 255, 255, - 255, 3, 0, 0, 255, 255, 127, 0, 255, 255, 31, 0, 128, 0, 0, 0, - 224, 255, 255, 255, 224, 15, 0, 0, 248, 255, 255, 255, 1, 192, 0, 252, - 63, 0, 0, 0, 15, 0, 0, 0, 0, 224, 0, 252, 255, 255, 255, 63, - 255, 1, 255, 255, 255, 255, 255, 231, 0, 222, 111, 4, 63, 63, 255, 170, - 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, - 0, 0, 255, 31, 132, 252, 47, 63, 80, 253, 255, 243, 224, 67, 0, 0, - 255, 127, 255, 255, 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, - 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 224, 255, 127, 0, 0, - 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 0, 128, 0, 0, 128, 255, - 252, 255, 255, 255, 255, 249, 255, 255, 124, 0, 0, 0, 187, 247, 255, 255, - 7, 0, 0, 0, 0, 0, 252, 104, 63, 0, 255, 255, 255, 255, 255, 31, - 255, 255, 7, 0, 0, 128, 0, 0, 223, 255, 0, 124, 247, 15, 0, 0, - 255, 255, 127, 196, 255, 255, 98, 62, 5, 0, 0, 56, 255, 7, 28, 0, - 126, 126, 126, 0, 127, 127, 255, 255, 255, 0, 255, 255, 15, 0, 255, 255, - 127, 248, 255, 255, 255, 255, 255, 15, 255, 63, 255, 255, 255, 255, 255, 3, - 127, 0, 248, 160, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, - 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 3, 0, 0, 138, 170, - 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, - 255, 63, 255, 63, 255, 255, 1, 0, 255, 7, 255, 255, 15, 255, 62, 0, - 255, 255, 15, 255, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, - 255, 255, 255, 192, 1, 0, 239, 254, 31, 0, 0, 0, 128, 0, 255, 255, - 255, 255, 255, 0, 16, 0, 255, 255, 255, 255, 71, 0, 30, 0, 0, 20, - 255, 255, 251, 255, 255, 15, 0, 0, 127, 189, 255, 191, 0, 0, 1, 224, - 128, 7, 0, 128, 176, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, - 255, 7, 0, 1, 0, 0, 0, 128, 255, 252, 255, 255, 10, 0, 0, 0, - 1, 248, 255, 255, 255, 255, 7, 4, 0, 0, 1, 240, 255, 3, 0, 32, - 255, 253, 255, 255, 0, 0, 252, 255, 127, 251, 255, 255, 64, 0, 0, 0, - 191, 253, 255, 255, 255, 3, 0, 1, 255, 63, 0, 0, 248, 255, 255, 224, - 255, 7, 1, 0, 11, 0, 0, 0, 0, 0, 7, 0, 240, 0, 255, 255, - 255, 7, 255, 31, 255, 1, 255, 3, 255, 255, 223, 255, 255, 255, 255, 223, - 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, - 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 31, 128, 63, - 0, 64, 0, 0, 15, 8, 0, 0, 150, 254, 247, 10, 132, 234, 150, 170, - 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255, -}; - -/* XID_Start: 2504 bytes. */ - -RE_UINT32 re_get_xid_start(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_xid_start_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_xid_start_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_xid_start_stage_3[pos + f] << 5; - pos += code; - value = (re_xid_start_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* XID_Continue. */ - -static RE_UINT8 re_xid_continue_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 9, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 22, 23, 5, 24, 25, + 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 22, + 9, 2, 2, 2, 2, 22, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 9, 22, 22, + 22, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 9, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 22, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 0, + 1, 1, 0, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 1, 1, 1, 1, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, + 11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 12, 12, 12, 18, 18, 18, 9, 9, + 9, 9, 18, 9, 9, 9, 12, 18, 12, 18, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 18, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 20, 20, 20, 20, 20, 20, 20, 12, 18, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 2, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 1, + 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 28, 28, 28, 28, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 1, 1, 2, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 9, 9, 9, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 9, 9, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 0, 0, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, + 9, 9, 9, 9, 9, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 1, 9, 9, 2, 2, 2, 2, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 10, + 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 12, 12, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 9, 9, 9, + 11, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 9, 0, 9, 0, 9, 0, 9, 9, 9, + 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, + 0, 9, 9, 0, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 34, 34, 34, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, 9, 9, 34, 34, 34, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 9, 9, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 9, 9, 34, 34, 34, 34, 34, 9, 34, 34, 34, + 34, 34, 35, 35, 35, 34, 34, 35, 34, 34, 35, 35, 35, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42, + 34, 34, 35, 35, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 34, 35, 34, 34, 34, + 34, 35, 35, 35, 34, 35, 35, 35, 34, 34, 34, 34, 34, 34, 34, 35, + 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 9, 34, 9, 34, 9, 34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 9, + 34, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 35, 35, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 34, 34, 34, 34, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 35, 35, 35, 34, 34, 34, 35, 35, 35, 35, 35, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 8, 8, 8, 28, 28, 28, 9, 9, 9, 9, + 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 35, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 26, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, + 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 35, 34, 34, 35, + 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, + 34, 34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 35, 35, 35, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 35, 35, 34, 35, 35, 34, 35, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, + 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_xid_continue_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, - 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, - 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 1, 58, 59, 60, 61, 62, 63, 64, 31, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 31, 77, 78, 79, 31, - 1, 1, 1, 80, 81, 82, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 84, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 85, 86, 31, 31, 87, 88, - 1, 1, 1, 1, 1, 1, 1, 89, 1, 1, 90, 31, 31, 31, 31, 31, - 1, 91, 92, 31, 31, 31, 31, 31, 31, 31, 31, 31, 93, 31, 31, 31, - 31, 94, 95, 31, 96, 97, 98, 99, 31, 31, 100, 31, 31, 31, 31, 31, - 101, 102, 103, 31, 31, 31, 31, 31, 104, 105, 31, 31, 31, 31, 106, 31, - 1, 1, 1, 1, 1, 1, 107, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 108, 109, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 110, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 111, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 112, 31, 31, 31, 31, 31, - 31, 37, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, +RE_UINT32 re_get_line_break(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_line_break_table_1[field_2]; + v = re_line_break_table_2[(v << 5) | field_1]; + v = re_line_break_table_3[(v << 5) | field_0]; + + return v; +} + +/* Logical_Order_Exception. */ +RE_UINT32 re_get_logical_order_exception(RE_UINT32 codepoint) { + if (0x0E40 <= codepoint && codepoint <= 0x0E44) + return 1; + if (0x0EC0 <= codepoint && codepoint <= 0x0EC4) + return 1; + if (0x19B5 <= codepoint && codepoint <= 0x19B7) + return 1; + if (codepoint == 0x19BA) + return 1; + if (0xAAB5 <= codepoint && codepoint <= 0xAAB6) + return 1; + if (codepoint == 0xAAB9) + return 1; + if (0xAABB <= codepoint && codepoint <= 0xAABC) + return 1; + + return 0; +} + +/* Lowercase. */ +static RE_UINT8 re_lowercase_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 17, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_lowercase_table_2[] = { + 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 5, 13, 14, 15, 16, 17, 18, 19, 0, 0, 20, 21, 22, 23, 24, 25, + 0, 26, 15, 5, 27, 5, 28, 5, 5, 29, 0, 15, 30, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, + 0, 0, 0, 0, 30, 0, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, + 5, 5, 5, 5, 33, 5, 5, 5, 34, 35, 36, 37, 35, 38, 39, 40, + 0, 0, 0, 41, 42, 0, 0, 0, 43, 44, 45, 26, 46, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 47, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 26, 48, 49, 5, 5, 5, 50, 15, 51, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 52, 53, 0, 0, 0, 0, 54, 5, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 60, 61, 15, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 63, 64, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 68, 69, 81, + 71, 72, 82, 64, 75, 83, 84, 85, 86, 82, 87, 26, 88, 75, 89, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 91, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_lowercase_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 0, 0, 0, 128, + 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 85, 85, 171, 170, 170, + 170, 170, 170, 212, 41, 49, 36, 78, 42, 45, 81, 230, 64, 82, 85, 181, + 170, 170, 41, 170, 170, 170, 250, 147, 133, 170, 255, 255, 255, 255, 255, 255, + 255, 255, 239, 255, 255, 255, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 138, 60, 0, 0, 1, 0, 0, 240, 255, 255, + 255, 127, 227, 170, 170, 170, 47, 25, 0, 0, 255, 255, 2, 168, 170, 170, + 84, 213, 170, 170, 170, 170, 0, 0, 255, 1, 0, 0, 255, 255, 255, 231, + 0, 0, 0, 63, 170, 170, 234, 191, 255, 0, 63, 0, 255, 0, 255, 0, + 63, 0, 255, 0, 255, 0, 255, 63, 255, 0, 223, 64, 220, 0, 207, 0, + 255, 0, 220, 0, 0, 0, 2, 128, 0, 0, 255, 31, 0, 196, 8, 0, + 0, 128, 16, 50, 192, 67, 0, 0, 16, 0, 0, 0, 255, 3, 0, 0, + 255, 255, 255, 127, 98, 21, 218, 63, 26, 80, 8, 0, 191, 32, 0, 0, + 170, 42, 0, 0, 170, 170, 170, 58, 168, 170, 171, 170, 170, 170, 255, 149, + 170, 80, 186, 170, 170, 130, 160, 170, 8, 5, 0, 0, 0, 0, 64, 7, + 255, 255, 255, 247, 255, 1, 255, 255, 127, 0, 248, 0, 0, 255, 255, 255, + 255, 255, 0, 0, 0, 0, 0, 255, 255, 255, 255, 15, 255, 255, 7, 0, + 0, 0, 0, 252, 255, 255, 15, 0, 0, 192, 223, 255, 255, 0, 0, 0, + 252, 255, 255, 15, 0, 0, 192, 235, 239, 255, 0, 0, 0, 252, 255, 255, + 15, 0, 0, 192, 255, 255, 255, 0, 0, 0, 252, 255, 255, 15, 0, 0, + 192, 255, 255, 255, 0, 192, 255, 255, 0, 0, 192, 255, 63, 0, 0, 0, + 252, 255, 255, 247, 3, 0, 0, 240, 255, 255, 223, 15, 255, 127, 63, 0, + 255, 253, 0, 0, 247, 11, 0, 0, 252, 255, 255, 255, 15, 0, 0, 0 }; -static RE_UINT8 re_xid_continue_stage_3[] = { - 0, 0, 0, 1, 2, 3, 2, 4, 0, 0, 5, 6, 7, 8, 7, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 0, - 7, 7, 7, 7, 7, 7, 7, 12, 13, 7, 14, 7, 7, 7, 7, 15, - 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 2, 7, 17, 7, 7, 18, 2, 7, 19, 20, 7, 3, 21, - 0, 4, 7, 7, 7, 7, 22, 7, 7, 7, 7, 7, 7, 23, 24, 25, - 0, 7, 7, 7, 26, 7, 7, 7, 7, 7, 7, 10, 7, 7, 7, 27, - 7, 7, 28, 0, 7, 29, 4, 0, 0, 0, 7, 30, 0, 31, 14, 7, - 7, 7, 7, 7, 7, 7, 32, 2, 23, 33, 24, 34, 35, 36, 32, 37, - 38, 33, 24, 39, 40, 41, 42, 43, 44, 14, 24, 45, 46, 47, 32, 48, - 49, 33, 24, 45, 50, 51, 32, 52, 53, 54, 55, 22, 56, 57, 42, 0, - 58, 59, 24, 60, 61, 62, 32, 0, 63, 59, 24, 64, 61, 65, 32, 66, - 63, 59, 7, 7, 67, 68, 32, 69, 70, 71, 7, 72, 73, 74, 42, 75, - 2, 7, 7, 4, 76, 1, 0, 0, 77, 7, 78, 28, 79, 80, 0, 0, - 47, 81, 1, 82, 83, 7, 84, 2, 85, 83, 7, 84, 86, 0, 0, 0, - 7, 7, 7, 7, 1, 7, 7, 7, 7, 28, 7, 7, 87, 7, 7, 88, - 7, 7, 7, 7, 89, 90, 7, 7, 89, 7, 7, 91, 92, 8, 7, 7, - 7, 92, 7, 7, 7, 26, 48, 10, 7, 0, 7, 7, 7, 7, 7, 93, - 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 25, 7, 2, 4, 7, 7, 7, 7, 94, 18, - 58, 95, 7, 95, 7, 96, 58, 97, 7, 7, 7, 7, 7, 98, 1, 0, - 99, 1, 7, 7, 7, 7, 7, 18, 7, 7, 4, 7, 7, 7, 7, 43, - 7, 76, 29, 29, 42, 7, 28, 95, 7, 7, 29, 7, 1, 4, 0, 0, - 7, 29, 7, 7, 7, 76, 7, 25, 1, 1, 100, 28, 0, 0, 0, 0, - 7, 7, 7, 7, 29, 1, 101, 96, 7, 7, 7, 7, 7, 7, 7, 96, - 7, 7, 7, 102, 60, 7, 7, 28, 18, 7, 7, 26, 0, 103, 7, 4, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 104, - 7, 93, 7, 7, 93, 105, 7, 28, 7, 7, 7, 106, 107, 108, 84, 107, - 0, 0, 0, 109, 47, 110, 0, 111, 0, 84, 0, 0, 0, 84, 112, 47, - 113, 114, 115, 80, 116, 0, 7, 7, 18, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 76, 7, 7, 76, 7, 7, 7, 7, 7, 7, 7, 7, 117, 96, - 7, 7, 87, 7, 7, 7, 118, 109, 7, 119, 120, 120, 120, 120, 7, 7, - 121, 0, 2, 122, 2, 7, 7, 7, 7, 123, 2, 7, 7, 7, 7, 88, - 124, 7, 7, 2, 7, 7, 7, 7, 76, 0, 7, 4, 0, 0, 0, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 43, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 84, 0, 0, 0, 0, 7, 7, 28, - 84, 7, 29, 0, 7, 7, 7, 125, 7, 7, 7, 7, 7, 7, 7, 10, - 0, 126, 127, 7, 7, 7, 7, 7, 128, 7, 7, 7, 129, 0, 0, 126, - 7, 7, 102, 0, 7, 7, 7, 96, 7, 7, 7, 7, 43, 1, 7, 130, - 7, 7, 28, 7, 7, 96, 7, 84, 7, 7, 7, 7, 131, 1, 7, 76, - 7, 7, 7, 119, 28, 1, 7, 71, 7, 7, 7, 7, 21, 99, 7, 129, - 132, 133, 120, 7, 7, 88, 102, 7, 7, 7, 7, 7, 7, 7, 134, 1, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 96, 7, 135, 7, 7, 29, - 7, 7, 7, 7, 7, 7, 28, 7, 7, 7, 7, 7, 7, 1, 0, 0, - 119, 136, 24, 137, 138, 7, 7, 7, 7, 7, 7, 10, 0, 31, 7, 7, - 7, 7, 7, 7, 7, 28, 139, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 28, 0, 7, 7, 7, 7, 127, 7, 7, 102, 0, 0, 1, - 7, 0, 7, 140, 141, 0, 0, 142, 7, 7, 7, 7, 7, 7, 7, 84, - 0, 1, 2, 3, 2, 4, 42, 7, 7, 7, 7, 76, 143, 144, 0, 0, - 145, 7, 8, 146, 28, 28, 0, 0, 7, 7, 7, 7, 7, 7, 7, 4, - 0, 0, 0, 0, 7, 7, 7, 95, 0, 0, 0, 0, 0, 0, 0, 147, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 84, 7, 7, 7, 47, 47, 0, - 7, 7, 141, 7, 4, 7, 7, 4, 7, 28, 7, 7, 148, 149, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 28, 1, 7, 7, 148, 7, 29, - 7, 7, 102, 7, 7, 7, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 119, 7, 43, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 150, 7, 7, 151, 7, 43, 7, 119, 7, 76, 0, 0, 0, 0, 7, 152, - 7, 43, 7, 1, 0, 0, 0, 0, 7, 7, 7, 153, 0, 0, 0, 0, - 154, 155, 7, 156, 0, 0, 7, 84, 7, 84, 0, 0, 83, 7, 119, 0, - 7, 7, 7, 43, 7, 43, 7, 21, 7, 10, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 18, 0, 0, 0, 7, 7, 7, 21, 7, 7, 7, 21, - 7, 7, 102, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 84, 100, 7, 7, 47, 0, 0, 0, 0, 0, 0, 0, 0, 7, 119, - 7, 7, 7, 7, 119, 0, 42, 109, 7, 7, 7, 4, 0, 7, 18, 1, - 7, 7, 7, 85, 157, 7, 7, 158, 7, 7, 7, 7, 159, 160, 0, 0, - 7, 14, 7, 161, 0, 0, 0, 0, 162, 19, 18, 7, 7, 7, 4, 1, - 23, 33, 24, 163, 50, 164, 165, 95, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 4, 22, 0, 0, 7, 7, 7, 7, 166, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 167, 47, 168, 0, 0, - 7, 7, 7, 7, 169, 1, 0, 0, 7, 7, 7, 18, 1, 0, 0, 0, - 7, 26, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 4, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 1, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 7, 7, 170, 171, 0, - 7, 7, 7, 76, 100, 7, 7, 7, 7, 172, 0, 0, 7, 7, 7, 18, - 24, 7, 7, 8, 47, 1, 0, 127, 7, 127, 83, 119, 0, 0, 0, 0, - 173, 7, 7, 174, 102, 1, 175, 7, 76, 176, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 119, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 76, 0, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 18, 7, 76, 1, 0, 0, 0, 0, 0, 0, 7, 28, 95, - 7, 7, 7, 119, 96, 1, 31, 177, 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 3, 7, 7, 7, 118, 7, 0, 0, 0, 0, 178, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 102, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, - 7, 76, 0, 0, 0, 21, 179, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 29, - 7, 7, 7, 7, 7, 7, 4, 84, 18, 180, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 181, 182, 183, 0, 184, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 85, 7, 7, 7, 58, 186, 187, 188, 7, 7, 7, - 189, 190, 7, 191, 192, 59, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 167, 7, 59, 88, 7, 88, - 7, 85, 7, 85, 76, 7, 76, 7, 24, 7, 24, 7, 193, 7, 7, 7, - 7, 7, 7, 135, 7, 7, 84, 194, 110, 101, 2, 0, 0, 0, 0, 0, - 8, 128, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 84, 28, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 1, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 95, 119, 0, 0, - 7, 7, 7, 7, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 188, 7, 197, 198, 199, 200, 201, 202, 104, 29, 203, 29, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 119, 0, 0, - 7, 7, 7, 95, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 28, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 47, 0, - 7, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_lowercase(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_xid_continue_stage_4[] = { - 0, 0, 255, 3, 254, 255, 255, 135, 255, 7, 0, 4, 160, 4, 255, 255, - 127, 255, 195, 255, 3, 0, 31, 80, 223, 184, 192, 215, 251, 255, 191, 255, - 251, 252, 127, 2, 255, 1, 255, 191, 182, 0, 7, 0, 255, 195, 239, 159, - 255, 253, 255, 159, 255, 231, 63, 36, 255, 63, 255, 15, 223, 63, 248, 255, - 207, 255, 249, 255, 197, 243, 159, 121, 128, 176, 3, 80, 238, 135, 109, 211, - 135, 57, 2, 94, 192, 255, 63, 0, 238, 191, 237, 243, 191, 59, 1, 0, - 0, 254, 238, 159, 159, 57, 192, 176, 2, 0, 236, 199, 61, 214, 24, 199, - 199, 61, 129, 0, 255, 223, 253, 255, 255, 227, 223, 61, 96, 7, 239, 223, - 239, 243, 96, 64, 6, 0, 223, 125, 240, 128, 0, 252, 236, 255, 127, 252, - 251, 47, 127, 132, 95, 255, 12, 0, 255, 127, 214, 247, 175, 255, 95, 63, - 255, 243, 0, 3, 160, 194, 255, 254, 255, 31, 223, 255, 64, 0, 191, 32, - 255, 247, 255, 61, 127, 61, 61, 127, 61, 255, 63, 63, 255, 199, 31, 0, - 15, 0, 13, 0, 143, 48, 0, 56, 128, 0, 0, 248, 255, 0, 247, 255, - 255, 251, 255, 170, 223, 95, 220, 31, 207, 15, 0, 128, 16, 0, 2, 128, - 226, 255, 132, 252, 47, 63, 80, 253, 224, 67, 31, 248, 255, 128, 127, 0, - 127, 127, 224, 0, 62, 31, 127, 230, 224, 255, 240, 191, 128, 255, 252, 255, - 255, 249, 124, 0, 255, 232, 1, 128, 126, 126, 126, 0, 255, 55, 127, 248, - 248, 224, 127, 95, 219, 255, 240, 255, 24, 0, 0, 224, 138, 170, 252, 252, - 252, 28, 255, 239, 255, 183, 0, 32, 15, 255, 62, 0, 63, 253, 191, 145, - 55, 0, 255, 192, 111, 240, 239, 254, 63, 135, 112, 0, 79, 0, 31, 30, - 255, 23, 255, 64, 127, 189, 237, 251, 129, 224, 207, 31, 191, 0, 63, 255, - 0, 63, 17, 0, 255, 252, 27, 0, 255, 35, 127, 251, 127, 180, 191, 253, - 251, 1, 255, 224, 11, 0, 240, 0, 255, 99, 224, 227, 7, 248, 231, 15, - 0, 60, 28, 0, 100, 222, 255, 235, 239, 255, 191, 231, 223, 223, 255, 123, - 95, 252, 247, 207, 32, 0, 219, 7, 255, 67, 150, 254, 247, 10, 132, 234, - 150, 170, 150, 247, 247, 94, 238, 251, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* XID_Continue: 2920 bytes. */ - -RE_UINT32 re_get_xid_continue(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_xid_continue_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_xid_continue_stage_2[pos + f] << 4; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_xid_continue_stage_3[pos + f] << 4; - pos += code; - value = (re_xid_continue_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} + v = re_lowercase_table_1[field_2]; + v = re_lowercase_table_2[(v << 5) | field_1]; + v = re_lowercase_table_3[(v << 2) | field_0]; -/* Default_Ignorable_Code_Point. */ + return (v >> offset) & 0x1; +} -static RE_UINT8 re_default_ignorable_code_point_stage_1[] = { - 0, 1, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 4, 5, 2, +/* Math. */ +static RE_UINT8 re_math_table_1[] = { + 0, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 7, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; -static RE_UINT8 re_default_ignorable_code_point_stage_2[] = { - 0, 1, 2, 3, 2, 2, 2, 2, 4, 2, 2, 5, 6, 2, 2, 2, - 7, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, - 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, +static RE_UINT8 re_math_table_2[] = { + 0, 1, 2, 3, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 10, 11, 12, 13, 0, 14, 15, 16, 17, 18, 0, 19, 20, 21, 22, + 23, 23, 23, 23, 23, 23, 23, 23, 24, 25, 0, 26, 27, 28, 29, 30, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, + 34, 0, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, + 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 0, 19, 37, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 39, 0, 0, 0, 0, 1, 3, 3, 0, 0, 0, 0, 40, + 23, 23, 41, 23, 42, 43, 44, 23, 45, 46, 47, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 48, 23, 23, 23, 23, 23, 23, 23, 23, 49, 23, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 44, 50, 51, 52, 53, 54, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_default_ignorable_code_point_stage_3[] = { - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 10, 0, 0, 11, 0, 0, 12, 13, - 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 16, 16, 16, 16, 16, 16, 16, 16, +static RE_UINT8 re_math_table_3[] = { + 0, 0, 0, 0, 0, 8, 0, 112, 0, 0, 0, 64, 0, 0, 0, 80, + 0, 16, 2, 0, 0, 0, 128, 0, 0, 0, 39, 0, 0, 0, 115, 0, + 192, 1, 0, 0, 0, 0, 64, 0, 0, 0, 28, 0, 17, 0, 4, 0, + 30, 0, 0, 124, 0, 124, 0, 0, 0, 0, 255, 31, 98, 248, 0, 0, + 132, 252, 47, 63, 16, 179, 251, 241, 255, 11, 0, 0, 0, 0, 255, 255, + 255, 126, 195, 240, 255, 255, 255, 47, 48, 0, 240, 255, 255, 255, 255, 255, + 0, 15, 0, 0, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 248, + 255, 255, 191, 0, 0, 0, 1, 240, 7, 0, 0, 0, 3, 192, 255, 240, + 195, 140, 15, 0, 148, 31, 0, 255, 96, 0, 0, 0, 5, 0, 0, 0, + 15, 224, 0, 0, 159, 31, 0, 0, 0, 2, 0, 0, 126, 1, 0, 0, + 4, 30, 0, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, + 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, + 63, 255, 255, 255, 255, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, + 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 0, 0, 3, 0 }; -static RE_UINT8 re_default_ignorable_code_point_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, - 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, - 0, 120, 0, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 124, 0, 0, - 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 1, - 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 7, - 255, 255, 255, 255, 255, 255, 255, 255, -}; +RE_UINT32 re_get_math(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_math_table_1[field_2]; + v = re_math_table_2[(v << 5) | field_1]; + v = re_math_table_3[(v << 2) | field_0]; -/* Default_Ignorable_Code_Point: 488 bytes. */ - -RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_default_ignorable_code_point_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_default_ignorable_code_point_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_default_ignorable_code_point_stage_3[pos + f] << 6; - pos += code; - value = (re_default_ignorable_code_point_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return (v >> offset) & 0x1; } -/* Grapheme_Extend. */ +/* NFC_Quick_Check. */ +static RE_UINT8 re_nfc_quick_check_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 9, 5, 10, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 5, + 5, 5, 5, 5, 12, 13, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 15, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 16, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 +}; -static RE_UINT8 re_grapheme_extend_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 7, 8, 9, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, +static RE_UINT8 re_nfc_quick_check_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 9, 10, 0, + 0, 11, 12, 0, 0, 0, 0, 0, 0, 9, 13, 0, 0, 9, 14, 0, + 0, 0, 15, 0, 0, 0, 16, 0, 0, 9, 14, 0, 0, 0, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, 21, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 24, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 28, 29, 30, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, + 37, 38, 36, 39, 36, 36, 40, 0, 41, 42, 43, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 44, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 51, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_nfc_quick_check_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, + 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, + 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 2, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 }; -static RE_UINT8 re_grapheme_extend_stage_2[] = { - 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 0, 0, 15, 0, 0, 0, 16, 17, 18, 19, 20, 21, 22, 0, 0, - 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 0, 0, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +RE_UINT32 re_get_nfc_quick_check(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_nfc_quick_check_table_1[field_2]; + v = re_nfc_quick_check_table_2[(v << 5) | field_1]; + v = re_nfc_quick_check_table_3[(v << 5) | field_0]; + + return v; +} + +/* NFD_Quick_Check. */ +static RE_UINT8 re_nfd_quick_check_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 9, 5, 10, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 12, 5, 5, 5, 5, 5, 5, 5, 5, 13, 5, + 5, 5, 5, 5, 14, 15, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 17, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 +}; + +static RE_UINT8 re_nfd_quick_check_table_2[] = { + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 7, 8, 9, + 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, 15, 16, 0, + 17, 18, 19, 20, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 23, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 0, 0, 0, 27, 0, + 0, 28, 29, 0, 0, 0, 0, 0, 0, 0, 30, 0, 31, 0, 32, 0, + 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 35, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, + 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 27, 0, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 33, 34, - 0, 35, 36, 37, 0, 0, 0, 0, 0, 0, 38, 0, 0, 39, 0, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 52, 53, 54, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 0, 0, 57, + 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 44, 44, 44, 44, 45, 44, 44, 46, 47, 44, 48, 49, 44, 50, 51, 52, + 53, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 55, 56, 57, 0, + 58, 59, 60, 61, 62, 63, 0, 64, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 67, 68, 13, 67, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 60, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, - 62, 56, 63, 0, 0, 0, 0, 0, 64, 65, 0, 0, 0, 0, 0, 0, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 70, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, + 71, 72, 44, 73, 44, 44, 46, 0, 74, 75, 76, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 77, 78, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_grapheme_extend_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0, - 7, 0, 8, 9, 0, 0, 10, 11, 12, 13, 14, 0, 0, 15, 0, 16, - 17, 18, 19, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 30, 31, 34, 35, 26, 36, 37, 25, 38, 39, 40, 0, - 41, 42, 43, 25, 26, 44, 45, 25, 46, 47, 28, 25, 0, 0, 48, 0, - 0, 49, 50, 0, 0, 51, 52, 0, 53, 54, 0, 55, 56, 57, 58, 0, - 0, 59, 60, 61, 62, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, - 64, 64, 65, 65, 0, 66, 67, 0, 68, 0, 0, 0, 69, 70, 0, 0, - 0, 71, 0, 0, 0, 0, 0, 0, 72, 0, 73, 74, 0, 75, 0, 0, - 76, 77, 38, 78, 46, 79, 0, 80, 0, 81, 0, 0, 0, 0, 82, 83, - 0, 0, 0, 0, 0, 0, 1, 84, 85, 0, 0, 0, 0, 0, 13, 86, - 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 1, - 0, 89, 0, 0, 90, 0, 0, 0, 0, 0, 0, 91, 42, 0, 0, 92, - 93, 69, 0, 0, 0, 0, 94, 95, 0, 96, 97, 0, 22, 98, 0, 99, - 0, 100, 101, 31, 0, 102, 26, 103, 0, 0, 0, 0, 0, 0, 0, 104, - 39, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, - 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 107, 0, 0, 0, 0, - 108, 109, 0, 0, 0, 0, 0, 69, 0, 110, 0, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, 0, 0, 26, 111, 112, 88, 46, 113, 0, 0, - 22, 114, 0, 115, 46, 116, 117, 0, 0, 118, 0, 0, 0, 0, 88, 119, - 46, 47, 120, 121, 0, 0, 0, 0, 0, 111, 122, 0, 0, 123, 124, 0, - 0, 0, 0, 0, 0, 125, 126, 0, 0, 127, 106, 0, 0, 128, 0, 0, - 63, 129, 0, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 131, 106, 132, 133, 134, 0, 135, 0, 0, 0, - 0, 136, 0, 0, 137, 138, 0, 0, 0, 139, 140, 0, 141, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 143, - 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 146, 0, 0, 0, - 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 148, 149, 150, 0, 0, - 0, 0, 151, 0, 0, 0, 0, 0, 1, 152, 1, 153, 154, 155, 0, 0, - 156, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, - 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 159, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, -}; - -static RE_UINT8 re_grapheme_extend_stage_4[] = { - 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 0, 248, 3, 0, 0, - 0, 0, 254, 255, 255, 255, 255, 191, 182, 0, 0, 0, 0, 0, 255, 7, - 0, 248, 255, 255, 0, 0, 1, 0, 0, 0, 192, 159, 159, 61, 0, 0, - 0, 0, 2, 0, 0, 0, 255, 255, 255, 7, 0, 0, 192, 255, 1, 0, - 0, 248, 15, 32, 0, 0, 192, 251, 239, 62, 0, 0, 0, 0, 0, 14, - 0, 0, 248, 255, 251, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 20, - 254, 33, 254, 0, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 80, - 30, 32, 128, 0, 12, 0, 0, 64, 6, 0, 0, 0, 0, 0, 0, 16, - 134, 57, 2, 0, 0, 0, 35, 0, 190, 33, 0, 0, 12, 0, 0, 252, - 0, 0, 0, 208, 30, 32, 192, 0, 4, 0, 0, 0, 0, 0, 0, 64, - 1, 32, 128, 0, 17, 0, 0, 0, 0, 0, 0, 192, 193, 61, 96, 0, - 0, 0, 0, 144, 68, 48, 96, 0, 3, 0, 0, 0, 0, 0, 0, 88, - 0, 132, 92, 128, 0, 0, 242, 7, 128, 127, 0, 0, 0, 0, 242, 31, - 0, 63, 0, 0, 0, 0, 0, 3, 0, 0, 160, 2, 0, 0, 254, 127, - 223, 224, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 0, 224, 253, 102, - 0, 0, 0, 195, 1, 0, 30, 0, 100, 32, 0, 32, 0, 0, 0, 224, - 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 176, 63, 64, 254, 15, 32, - 0, 56, 0, 0, 96, 0, 0, 0, 0, 2, 0, 0, 135, 1, 4, 14, - 0, 0, 128, 9, 0, 0, 64, 127, 229, 31, 248, 159, 0, 0, 255, 127, - 15, 0, 0, 0, 0, 0, 240, 23, 0, 248, 15, 0, 60, 59, 0, 0, - 64, 163, 3, 0, 0, 240, 207, 0, 0, 0, 247, 255, 253, 33, 16, 3, - 255, 255, 255, 251, 0, 16, 0, 0, 255, 255, 1, 0, 0, 128, 3, 0, - 0, 0, 0, 128, 0, 252, 0, 0, 0, 0, 0, 6, 0, 128, 247, 63, - 0, 0, 3, 0, 68, 8, 0, 0, 48, 0, 0, 0, 255, 255, 3, 128, - 192, 63, 0, 0, 128, 255, 3, 0, 0, 0, 200, 51, 32, 0, 0, 0, - 0, 126, 102, 0, 8, 16, 0, 0, 0, 0, 157, 193, 0, 48, 64, 0, - 32, 33, 0, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 192, 7, - 110, 240, 0, 0, 0, 0, 0, 135, 240, 0, 0, 0, 0, 0, 0, 255, - 127, 0, 0, 0, 0, 0, 120, 6, 128, 239, 31, 0, 0, 0, 8, 0, - 0, 0, 192, 127, 0, 30, 0, 0, 0, 128, 211, 64, 248, 7, 0, 0, - 1, 0, 128, 0, 192, 31, 31, 0, 92, 0, 0, 64, 0, 0, 249, 165, - 13, 0, 0, 0, 0, 128, 60, 176, 1, 0, 0, 48, 0, 0, 248, 167, - 0, 40, 191, 0, 188, 15, 0, 0, 0, 128, 255, 6, 0, 0, 240, 12, - 254, 7, 0, 0, 0, 0, 248, 121, 128, 0, 126, 14, 0, 252, 127, 3, - 0, 0, 127, 191, 0, 0, 252, 255, 255, 252, 109, 0, 0, 0, 126, 180, - 191, 0, 0, 0, 0, 0, 163, 0, 0, 0, 24, 0, 0, 0, 31, 0, - 0, 0, 127, 0, 0, 128, 0, 0, 0, 128, 7, 0, 0, 0, 0, 96, - 160, 195, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, - 255, 255, 127, 248, 255, 31, 32, 0, 16, 0, 0, 248, 254, 255, 0, 0, - 127, 255, 255, 249, 219, 7, 0, 0, 0, 240, 0, 0, 240, 7, 0, 0, -}; - -/* Grapheme_Extend: 1672 bytes. */ - -RE_UINT32 re_get_grapheme_extend(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_grapheme_extend_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_grapheme_extend_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_grapheme_extend_stage_3[pos + f] << 5; - pos += code; - value = (re_grapheme_extend_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 85, 86, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_nfd_quick_check_table_3[] = { + 255, 255, 255, 255, 64, 0, 129, 193, 64, 0, 129, 65, 0, 0, 3, 0, + 192, 0, 14, 129, 7, 14, 12, 0, 192, 0, 0, 128, 252, 127, 254, 255, + 255, 31, 0, 32, 48, 0, 206, 0, 0, 0, 0, 48, 63, 0, 240, 255, + 228, 255, 255, 255, 255, 255, 239, 191, 31, 40, 254, 255, 255, 3, 254, 255, + 255, 131, 231, 255, 116, 143, 255, 253, 255, 255, 255, 253, 255, 255, 116, 143, + 255, 255, 63, 255, 249, 255, 48, 3, 3, 3, 192, 252, 131, 255, 255, 255, + 250, 255, 247, 255, 255, 253, 237, 255, 255, 255, 255, 0, 255, 231, 255, 79, + 255, 255, 183, 255, 255, 255, 255, 177, 255, 230, 255, 207, 255, 255, 239, 255, + 255, 227, 255, 255, 255, 254, 255, 255, 126, 242, 255, 255, 255, 255, 255, 139, + 247, 223, 123, 239, 255, 253, 151, 254, 253, 255, 247, 223, 123, 239, 255, 253, + 191, 255, 255, 255, 191, 170, 251, 255, 255, 255, 255, 215, 244, 255, 255, 255, + 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 252, 0, 0, 192, 192, + 192, 192, 0, 85, 0, 0, 0, 192, 0, 0, 32, 160, 33, 0, 48, 16, + 0, 0, 35, 192, 252, 255, 255, 255, 191, 243, 255, 255, 255, 255, 255, 243, + 255, 191, 255, 255, 255, 31, 255, 255, 239, 237, 255, 255, 175, 255, 255, 255, + 109, 253, 255, 255, 250, 31, 204, 252, 204, 252, 255, 255, 255, 15, 255, 255, + 240, 195, 255, 255, 255, 249, 255, 255, 255, 255, 255, 239, 255, 175, 170, 170, + 90, 253, 36, 201, 255, 255, 111, 184, 240, 255, 255, 255, 0, 192, 26, 128, + 154, 3, 0, 0, 0, 192, 0, 0, 255, 255, 255, 95, 255, 3, 128, 160, + 36, 128, 255, 255, 255, 255, 255, 235, 255, 247, 255, 255, 255, 63, 255, 255, + 255, 231, 255, 255, 255, 255, 255, 167, 255, 255, 255, 254, 255, 255, 255, 63, + 224, 255, 255, 255, 255, 255, 255, 7, 254, 255, 255, 255 +}; + +RE_UINT32 re_get_nfd_quick_check(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_nfd_quick_check_table_1[field_2]; + v = re_nfd_quick_check_table_2[(v << 5) | field_1]; + v = re_nfd_quick_check_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; } -/* Grapheme_Base. */ - -static RE_UINT8 re_grapheme_base_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, -}; - -static RE_UINT8 re_grapheme_base_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, - 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 19, 19, 13, 32, 19, 19, - 19, 33, 19, 19, 19, 19, 19, 19, 19, 19, 34, 35, 13, 13, 13, 13, - 13, 36, 37, 19, 19, 19, 19, 19, 19, 19, 19, 19, 38, 19, 19, 39, - 19, 19, 19, 19, 40, 41, 42, 19, 43, 19, 44, 45, 46, 47, 48, 19, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 49, 13, 13, 13, 50, 51, 13, - 13, 13, 13, 52, 13, 13, 13, 13, 13, 13, 53, 19, 19, 19, 54, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, -}; - -static RE_UINT8 re_grapheme_base_stage_3[] = { - 0, 1, 2, 2, 2, 2, 3, 4, 2, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 2, 2, 30, 31, 32, 33, 2, 2, 2, 2, 2, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 2, 47, 2, 2, 48, 49, - 50, 51, 2, 52, 2, 2, 2, 2, 53, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 54, 55, 56, 57, 58, 59, 60, 61, 2, 62, - 63, 64, 65, 66, 67, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 68, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 69, - 2, 70, 2, 2, 71, 72, 2, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 2, 2, 2, 2, 2, 2, 2, 82, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 2, 2, 84, 85, 86, 87, 2, 2, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 83, 98, 99, 100, 2, 101, 102, 83, 2, 2, 103, 83, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 83, 115, 83, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 83, 125, 126, 83, 127, 128, 129, 130, 83, - 131, 132, 83, 133, 134, 135, 83, 83, 136, 137, 138, 139, 83, 140, 83, 141, - 2, 2, 2, 2, 2, 2, 2, 142, 143, 2, 144, 83, 83, 83, 83, 83, - 145, 83, 83, 83, 83, 83, 83, 83, 2, 2, 2, 2, 146, 83, 83, 83, - 2, 2, 2, 2, 147, 148, 149, 150, 83, 83, 83, 83, 151, 152, 153, 154, - 2, 2, 2, 2, 2, 2, 2, 155, 2, 2, 2, 2, 2, 156, 83, 83, - 2, 2, 157, 2, 2, 158, 83, 83, 159, 160, 83, 83, 83, 83, 83, 83, - 2, 161, 162, 163, 164, 165, 166, 83, 167, 168, 169, 2, 2, 170, 2, 171, - 2, 2, 2, 2, 172, 173, 83, 83, 83, 83, 174, 83, 83, 175, 83, 83, - 2, 176, 177, 83, 83, 83, 83, 83, 178, 179, 180, 83, 181, 182, 83, 83, - 183, 184, 185, 186, 187, 83, 2, 2, 2, 2, 2, 2, 2, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 83, 83, 2, 2, 2, 2, 2, 197, 2, 2, - 2, 2, 2, 2, 2, 2, 198, 2, 199, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 200, 2, 2, 2, 2, 2, 2, 2, 2, 2, 201, - 2, 2, 2, 2, 202, 83, 83, 83, +/* NFKC_Quick_Check. */ +static RE_UINT8 re_nfkc_quick_check_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 14, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 16, + 5, 5, 5, 5, 17, 18, 19, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 20, 21, 5, 5, 5, 5, 5, 22, 23, 5, 24, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; -static RE_UINT8 re_grapheme_base_stage_4[] = { - 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, - 0, 0, 0, 0, 255, 223, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 252, - 240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 7, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 127, 254, 255, 255, 255, 255, - 255, 231, 0, 0, 0, 0, 0, 64, 73, 0, 255, 255, 255, 135, 31, 0, - 192, 255, 0, 200, 255, 255, 255, 255, 255, 7, 0, 0, 255, 255, 254, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 64, 96, 194, 255, 255, - 255, 63, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 63, 0, 2, 0, 255, 255, 255, 255, 255, 7, 240, 199, - 255, 255, 63, 4, 16, 1, 255, 127, 255, 255, 255, 65, 255, 7, 0, 0, - 0, 0, 0, 0, 255, 255, 223, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 248, 255, 255, 255, 255, 255, 255, 235, 1, 222, 1, 255, 243, 255, 255, 255, - 237, 159, 249, 255, 255, 253, 197, 163, 129, 89, 0, 176, 195, 255, 255, 63, - 232, 135, 249, 255, 255, 253, 109, 195, 1, 0, 0, 94, 192, 255, 92, 0, - 232, 191, 251, 255, 255, 253, 237, 227, 1, 26, 1, 0, 195, 255, 3, 2, - 236, 159, 249, 255, 255, 253, 237, 35, 129, 25, 0, 176, 195, 255, 255, 0, - 232, 199, 61, 214, 24, 199, 255, 131, 198, 29, 1, 0, 192, 255, 255, 7, - 238, 223, 253, 255, 255, 253, 255, 35, 30, 0, 0, 7, 195, 255, 128, 255, - 253, 223, 253, 255, 255, 253, 239, 99, 155, 13, 0, 64, 195, 255, 6, 0, - 236, 223, 253, 255, 255, 255, 255, 167, 193, 221, 112, 255, 195, 255, 255, 255, - 236, 255, 127, 252, 255, 255, 251, 47, 127, 0, 3, 127, 192, 255, 28, 0, - 254, 255, 255, 255, 255, 255, 13, 128, 127, 128, 255, 15, 0, 0, 0, 0, - 214, 247, 255, 255, 175, 255, 13, 32, 95, 0, 255, 243, 0, 0, 0, 0, - 255, 255, 255, 252, 255, 255, 95, 253, 255, 254, 255, 255, 255, 31, 0, 128, - 32, 31, 0, 0, 0, 0, 0, 192, 191, 223, 255, 7, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 31, 2, 153, 255, 255, 255, 60, 254, 255, 225, 255, - 155, 223, 255, 223, 255, 255, 255, 255, 191, 32, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 61, 127, 61, 255, 255, 255, 255, - 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 255, 255, - 255, 255, 61, 255, 255, 255, 255, 255, 255, 255, 255, 7, 255, 255, 255, 31, - 255, 255, 255, 3, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 63, - 255, 255, 255, 31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, - 255, 223, 3, 0, 255, 255, 99, 0, 255, 255, 3, 0, 255, 223, 1, 0, - 255, 255, 255, 255, 255, 255, 79, 192, 191, 1, 240, 31, 255, 3, 255, 3, - 255, 7, 255, 3, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, - 159, 255, 255, 255, 255, 5, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, - 255, 255, 255, 127, 120, 14, 251, 1, 241, 255, 255, 255, 255, 63, 31, 0, - 255, 255, 255, 255, 255, 15, 255, 255, 255, 3, 255, 199, 255, 255, 255, 255, - 255, 255, 127, 198, 255, 255, 255, 255, 255, 255, 191, 0, 26, 224, 7, 0, - 255, 3, 255, 3, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 255, 255, 255, 255, 255, 15, 232, 251, 15, 255, 255, 255, 7, 240, 31, - 252, 255, 255, 255, 195, 196, 255, 255, 255, 255, 255, 255, 191, 92, 12, 240, - 255, 255, 255, 255, 255, 15, 48, 248, 255, 227, 255, 255, 255, 255, 255, 255, - 255, 1, 255, 255, 255, 255, 255, 231, 255, 0, 8, 0, 2, 222, 239, 4, - 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 63, 63, 255, 255, 255, 255, 63, 63, 255, 170, 255, 255, 255, 63, - 255, 255, 255, 255, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127, - 255, 7, 255, 255, 255, 128, 255, 255, 255, 255, 255, 255, 0, 0, 243, 255, - 255, 127, 255, 31, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 127, 0, 0, 0, 255, 7, 0, 0, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 255, - 255, 255, 63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 12, 254, - 255, 255, 255, 255, 191, 32, 255, 255, 255, 255, 255, 255, 255, 128, 1, 0, - 255, 255, 127, 0, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 255, 15, - 255, 255, 255, 255, 255, 3, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 127, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 224, 255, 255, 255, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 127, 255, 255, 255, 255, 255, 7, 255, 255, 255, 255, 15, 0, 255, 255, - 255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 63, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, - 255, 31, 255, 255, 255, 255, 255, 255, 127, 0, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 15, 0, 0, 255, 255, 255, 255, 255, 127, 8, 192, - 255, 255, 255, 63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 124, 0, 0, 0, 0, 0, 128, 255, - 187, 247, 255, 255, 159, 15, 255, 3, 255, 255, 255, 255, 255, 255, 255, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 15, 192, 255, 3, 0, 0, 252, 127, - 255, 255, 255, 255, 63, 192, 255, 255, 127, 0, 12, 128, 255, 255, 255, 31, - 248, 255, 255, 255, 255, 255, 55, 204, 255, 191, 255, 195, 223, 255, 255, 127, - 255, 255, 255, 255, 255, 129, 25, 0, 247, 47, 255, 243, 255, 255, 255, 239, - 255, 255, 255, 255, 255, 255, 98, 62, 5, 0, 0, 248, 255, 207, 63, 0, - 126, 126, 126, 0, 127, 127, 255, 255, 255, 255, 255, 255, 255, 0, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 30, 255, 3, - 255, 255, 255, 255, 15, 0, 255, 255, 127, 248, 255, 255, 255, 255, 255, 15, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 3, 0, 0, 0, 0, - 127, 0, 248, 160, 255, 255, 127, 95, 219, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 3, 0, 248, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 255, 255, 255, 255, 255, 255, - 255, 255, 252, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 255, 63, - 0, 0, 255, 3, 0, 0, 255, 255, 255, 255, 247, 255, 127, 15, 223, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 31, - 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 63, 255, 255, 255, 127, 252, 252, 252, 28, 127, 127, 0, 48, - 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 7, - 135, 255, 255, 255, 255, 255, 143, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 127, 255, 15, 1, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 31, - 255, 255, 255, 31, 255, 255, 255, 255, 255, 255, 1, 0, 254, 255, 255, 15, - 255, 255, 255, 255, 15, 224, 255, 255, 255, 7, 255, 255, 255, 255, 63, 0, - 255, 255, 255, 191, 255, 255, 255, 255, 15, 255, 63, 0, 0, 0, 0, 0, - 255, 255, 255, 63, 255, 3, 255, 255, 255, 255, 15, 255, 255, 255, 255, 15, - 255, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 255, 15, 128, 0, 0, - 255, 255, 255, 255, 255, 255, 127, 0, 255, 255, 63, 0, 255, 0, 0, 0, - 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 191, 255, 255, 255, 255, 255, - 255, 255, 255, 127, 128, 255, 0, 0, 0, 0, 0, 0, 255, 255, 55, 248, - 255, 255, 255, 143, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 240, 255, 255, 252, 255, 255, 255, 255, 255, - 1, 0, 239, 254, 255, 255, 63, 0, 255, 1, 255, 1, 255, 255, 255, 255, - 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 31, 248, 127, 0, - 255, 255, 255, 255, 255, 255, 63, 254, 255, 255, 63, 255, 255, 255, 7, 255, - 255, 255, 3, 30, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 7, 0, 255, 255, 255, 255, 255, 255, 7, 252, - 255, 255, 255, 255, 15, 0, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 127, - 255, 255, 255, 255, 255, 0, 255, 255, 63, 0, 254, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 127, 0, - 253, 255, 255, 255, 255, 255, 255, 0, 128, 63, 252, 255, 255, 255, 0, 0, - 252, 255, 255, 255, 255, 255, 135, 217, 3, 0, 255, 255, 255, 1, 255, 3, - 248, 255, 255, 255, 127, 16, 192, 255, 127, 0, 255, 255, 255, 255, 119, 0, - 252, 255, 255, 255, 255, 255, 63, 128, 255, 33, 255, 255, 254, 255, 31, 0, - 255, 255, 251, 255, 255, 127, 44, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 127, 189, 255, 191, 255, 3, 255, 255, 255, 255, 255, 127, 7, 0, 255, 3, - 236, 159, 249, 255, 255, 253, 237, 163, 158, 57, 1, 224, 15, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 0, 163, 255, 255, 171, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 6, 90, 242, 0, 255, 3, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 127, 3, 79, 254, 255, 255, 15, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 7, 88, 30, 0, 255, 3, 255, 31, 0, 0, - 255, 255, 255, 255, 255, 215, 64, 1, 255, 3, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 7, 67, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 127, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 7, 128, - 0, 0, 0, 0, 255, 252, 255, 255, 255, 255, 15, 240, 30, 0, 0, 0, - 1, 248, 255, 255, 255, 255, 7, 134, 127, 0, 129, 241, 255, 255, 255, 255, - 255, 3, 128, 252, 7, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 1, - 255, 253, 255, 255, 255, 255, 0, 64, 63, 0, 255, 255, 255, 31, 255, 255, - 255, 255, 0, 0, 0, 2, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 127, 251, 255, 255, 255, 255, 1, 0, 64, 0, 255, 3, 191, 253, 255, 255, - 255, 127, 88, 1, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 231, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 3, 128, - 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 31, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 1, 255, 255, 255, 127, 255, 195, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 32, 0, - 255, 255, 255, 255, 255, 255, 128, 255, 63, 0, 255, 251, 251, 255, 255, 224, - 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 7, 255, 255, 255, 255, 255, 255, - 255, 0, 248, 255, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 7, 0, - 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 7, 0, 240, 0, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 7, 255, 31, - 255, 1, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, - 255, 255, 255, 255, 127, 254, 255, 255, 255, 255, 255, 255, 95, 60, 0, 0, - 24, 240, 255, 255, 255, 195, 255, 255, 255, 255, 255, 255, 255, 1, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 35, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 15, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 255, 255, 255, 1, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 255, 255, 255, 255, 255, - 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 255, 255, 255, 255, - 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255, - 0, 0, 0, 0, 0, 0, 128, 7, 0, 0, 0, 0, 0, 224, 223, 255, - 239, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 31, 128, 63, 255, 195, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 15, 255, 131, - 255, 255, 255, 255, 255, 255, 255, 255, 159, 255, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 15, 8, 255, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, - 255, 255, 255, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 254, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 239, 255, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, - 255, 251, 255, 15, 238, 251, 255, 15, 0, 0, 0, 0, 0, 0, 3, 0, - 255, 255, 255, 255, 255, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 15, 0, 255, 127, 254, 255, 254, 255, 254, 255, 255, 255, 63, 0, - 255, 31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 31, 255, 255, - 255, 255, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, - 7, 0, 255, 255, 255, 255, 255, 15, 255, 1, 3, 0, 63, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, 255, 31, 255, 7, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, 255, 15, 0, 0, - 255, 15, 255, 255, 255, 255, 255, 255, 255, 0, 255, 3, 255, 255, 255, 255, - 255, 0, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 123, 252, - 255, 255, 255, 255, 231, 199, 255, 255, 255, 231, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 255, 63, 15, 7, - 7, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 31, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 3, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, 0, 0, 0, - 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_nfkc_quick_check_table_2[] = { + 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 3, 4, 0, 0, 5, 6, + 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 0, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 0, 0, 22, 23, 0, + 0, 24, 25, 0, 0, 0, 0, 0, 0, 22, 26, 0, 0, 22, 27, 0, + 0, 0, 28, 0, 0, 0, 29, 0, 0, 22, 27, 0, 0, 0, 30, 0, + 0, 31, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36, 37, 0, 0, + 0, 38, 0, 0, 0, 0, 0, 39, 0, 0, 0, 40, 0, 41, 42, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 45, 46, 47, 48, 0, 0, + 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 50, 0, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 0, 0, 60, 61, 62, 48, 63, 0, 0, 0, + 0, 64, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 48, 48, 48, 48, 66, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 33, 0, 0, 67, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 31, 48, 48, 48, 48, 48, 48, 69, 0, + 70, 71, 0, 0, 72, 0, 0, 4, 0, 73, 48, 48, 74, 0, 0, 0, + 75, 48, 76, 75, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 80, 81, 48, 82, 48, 48, 83, 0, 84, 85, 86, 48, 48, 87, 88, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 89, 90, 48, 91, 48, 92, 93, + 94, 90, 95, 96, 48, 48, 48, 97, 98, 48, 48, 48, 48, 75, 99, 100, + 0, 0, 0, 0, 0, 101, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 27, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 9, 0, 47, 70, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 107, 48, 108, 109, 110, 48, 111, 112, 113, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 114, 48, 48, 48, 48, 48, 48, 48, 48, 115, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 110, 116, 117, 118, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, 77, 0, 0, 0, + 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Grapheme_Base: 3946 bytes. */ - -RE_UINT32 re_get_grapheme_base(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_grapheme_base_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_grapheme_base_stage_2[pos + f] << 3; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_grapheme_base_stage_3[pos + f] << 7; - pos += code; - value = (re_grapheme_base_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Grapheme_Link. */ - -static RE_UINT8 re_grapheme_link_stage_1[] = { - 0, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +static RE_UINT8 re_nfkc_quick_check_table_3[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, + 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_grapheme_link_stage_2[] = { - 0, 0, 1, 2, 3, 4, 5, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 9, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_grapheme_link_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, 2, 1, 0, 3, 4, 0, 4, 0, 0, 0, 5, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 5, 10, 11, - 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13, 0, 0, 5, 0, 14, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, - 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 0, 18, 19, 0, 20, 0, 0, 15, 21, 0, 0, 22, 0, 1, 0, 0, - 0, 23, 0, 23, 0, 0, 12, 0, 12, 0, 16, 0, 24, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 0, 9, 25, 26, 27, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 0, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_grapheme_link_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 24, 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 16, 0, 0, 0, 16, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, 0, 128, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 32, 0, 0, - 64, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, -}; - -/* Grapheme_Link: 580 bytes. */ - -RE_UINT32 re_get_grapheme_link(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_grapheme_link_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_grapheme_link_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_grapheme_link_stage_3[pos + f] << 6; - pos += code; - value = (re_grapheme_link_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* White_Space. */ - -static RE_UINT8 re_white_space_stage_1[] = { + 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, + 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, + 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 2, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_white_space_stage_2[] = { - 0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_white_space_stage_3[] = { - 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, - 3, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_white_space_stage_4[] = { - 0, 62, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 7, 0, 0, 0, 131, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, -}; - -/* White_Space: 218 bytes. */ - -RE_UINT32 re_get_white_space(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_white_space_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_white_space_stage_2[pos + f] << 3; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_white_space_stage_3[pos + f] << 7; - pos += code; - value = (re_white_space_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Bidi_Control. */ - -static RE_UINT8 re_bidi_control_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_bidi_control_stage_2[] = { - 0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_bidi_control_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_bidi_control_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 192, 0, 0, 0, 124, 0, 0, 0, 0, 0, 0, 192, 3, 0, 0, -}; - -/* Bidi_Control: 162 bytes. */ - -RE_UINT32 re_get_bidi_control(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_bidi_control_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_bidi_control_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_bidi_control_stage_3[pos + f] << 7; - pos += code; - value = (re_bidi_control_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Join_Control. */ - -static RE_UINT8 re_join_control_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_join_control_stage_2[] = { - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_join_control_stage_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_join_control_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -/* Join_Control: 130 bytes. */ - -RE_UINT32 re_get_join_control(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_join_control_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_join_control_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_join_control_stage_3[pos + f] << 7; - pos += code; - value = (re_join_control_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Dash. */ - -static RE_UINT8 re_dash_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_dash_stage_2[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 4, 1, 1, 1, - 5, 6, 1, 1, 1, 1, 1, 7, 8, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, -}; - -static RE_UINT8 re_dash_stage_3[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 4, 1, 1, 1, 1, 1, 1, 1, 5, 6, 7, 1, 1, 1, 1, 1, - 8, 1, 1, 1, 1, 1, 1, 1, 9, 3, 1, 1, 1, 1, 1, 1, - 10, 1, 11, 1, 1, 1, 1, 1, 12, 13, 1, 1, 14, 1, 1, 1, -}; - -static RE_UINT8 re_dash_stage_4[] = { - 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128, 4, 0, 0, 0, 12, - 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 1, 8, 0, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, -}; - -/* Dash: 364 bytes. */ - -RE_UINT32 re_get_dash(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_dash_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_dash_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_dash_stage_3[pos + f] << 6; - pos += code; - value = (re_dash_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Hyphen. */ - -static RE_UINT8 re_hyphen_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_hyphen_stage_2[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, - 4, 1, 1, 1, 1, 1, 1, 5, 6, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, + 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_hyphen_stage_3[] = { - 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 4, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 8, 9, 1, 1, -}; +RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -static RE_UINT8 re_hyphen_stage_4[] = { - 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 8, 0, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -/* Hyphen: 308 bytes. */ - -RE_UINT32 re_get_hyphen(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_hyphen_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_hyphen_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_hyphen_stage_3[pos + f] << 6; - pos += code; - value = (re_hyphen_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} + v = re_nfkc_quick_check_table_1[field_2]; + v = re_nfkc_quick_check_table_2[(v << 5) | field_1]; + v = re_nfkc_quick_check_table_3[(v << 5) | field_0]; -/* Quotation_Mark. */ + return v; +} -static RE_UINT8 re_quotation_mark_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, +/* NFKD_Quick_Check. */ +static RE_UINT8 re_nfkd_quick_check_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 14, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 16, 5, 5, 5, 5, 5, 5, 5, 5, 17, 18, + 5, 5, 5, 5, 19, 20, 21, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 22, 23, 5, 5, 5, 5, 5, 24, 25, 5, 26, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; -static RE_UINT8 re_quotation_mark_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 3, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, +static RE_UINT8 re_nfkd_quick_check_table_2[] = { + 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, + 11, 12, 0, 0, 0, 13, 14, 15, 0, 0, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 29, 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 34, 0, + 0, 35, 36, 0, 0, 0, 0, 0, 0, 0, 37, 0, 38, 0, 39, 0, + 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 39, 0, 0, 0, 42, 0, + 0, 43, 0, 0, 0, 43, 44, 0, 45, 0, 46, 47, 48, 49, 0, 0, + 0, 50, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 57, 58, 59, 0, 0, + 59, 59, 59, 59, 60, 59, 59, 61, 62, 59, 63, 64, 59, 65, 66, 67, + 68, 69, 70, 71, 72, 40, 0, 0, 73, 74, 75, 59, 76, 77, 78, 0, + 79, 80, 81, 82, 83, 84, 0, 85, 0, 86, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 59, 59, 59, 59, 87, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45, 0, 0, 88, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, + 0, 0, 0, 0, 90, 0, 0, 43, 59, 59, 59, 59, 59, 59, 91, 0, + 92, 93, 94, 95, 96, 94, 95, 97, 0, 98, 59, 59, 99, 0, 0, 0, + 100, 59, 101, 100, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 103, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 105, 0, 0, 0, 0, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 106, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 59, 59, 59, 59, 59, 59, 59, 59, + 107, 108, 59, 109, 59, 59, 61, 0, 110, 111, 112, 59, 59, 113, 114, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 64, 115, 59, 4, 59, 116, 117, + 118, 115, 119, 120, 59, 59, 59, 121, 122, 59, 59, 59, 59, 100, 123, 124, + 0, 0, 0, 0, 125, 126, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 130, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 15, 0, 58, 92, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 59, 59, 65, 59, 133, 134, 135, 59, 136, 137, 138, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 7, 59, 59, 59, 59, 59, 59, 59, 59, 139, 59, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 135, 140, 141, 142, 143, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 145, 146, 147, 39, 102, 0, 0, 0, + 148, 60, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_nfkd_quick_check_table_3[] = { + 255, 255, 255, 255, 254, 122, 195, 136, 64, 0, 129, 193, 64, 0, 129, 65, + 0, 0, 3, 0, 192, 0, 2, 1, 6, 12, 12, 0, 192, 0, 0, 0, + 252, 127, 254, 255, 15, 0, 0, 32, 48, 0, 192, 0, 0, 0, 0, 48, + 63, 0, 240, 255, 255, 255, 0, 254, 255, 255, 255, 192, 224, 255, 255, 255, + 228, 255, 255, 255, 255, 255, 239, 187, 15, 40, 254, 255, 255, 3, 254, 255, + 255, 131, 128, 255, 255, 255, 200, 253, 116, 143, 255, 253, 255, 255, 255, 253, + 255, 255, 116, 143, 255, 255, 63, 255, 249, 255, 48, 3, 3, 3, 192, 252, + 127, 255, 255, 255, 131, 255, 255, 255, 255, 255, 31, 254, 250, 255, 247, 255, + 255, 253, 237, 255, 255, 255, 255, 0, 255, 231, 255, 79, 255, 255, 183, 255, + 255, 255, 255, 177, 255, 230, 255, 207, 255, 255, 239, 255, 255, 227, 255, 255, + 255, 254, 255, 255, 126, 242, 255, 255, 255, 255, 255, 139, 255, 255, 247, 255, + 255, 255, 255, 207, 255, 239, 255, 255, 247, 223, 123, 239, 255, 253, 23, 252, + 253, 255, 247, 223, 123, 239, 255, 253, 191, 255, 255, 255, 255, 255, 255, 239, + 191, 170, 251, 255, 255, 255, 255, 215, 244, 255, 255, 255, 255, 143, 0, 8, + 0, 64, 0, 0, 0, 248, 255, 254, 255, 255, 255, 7, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 0, 252, 0, 0, 192, 192, 192, 192, 0, 85, + 0, 0, 0, 192, 0, 0, 32, 0, 32, 0, 48, 16, 0, 0, 35, 128, + 0, 248, 125, 255, 143, 127, 39, 175, 127, 252, 127, 127, 255, 255, 12, 0, + 0, 128, 0, 224, 16, 1, 144, 193, 168, 66, 4, 4, 30, 252, 0, 0, + 255, 253, 255, 243, 255, 191, 255, 255, 255, 31, 255, 255, 239, 237, 255, 255, + 175, 79, 254, 255, 109, 253, 255, 255, 250, 31, 204, 252, 204, 252, 255, 255, + 255, 15, 255, 255, 240, 195, 255, 255, 255, 249, 255, 255, 0, 248, 255, 255, + 255, 255, 143, 255, 255, 127, 255, 255, 255, 255, 255, 127, 0, 0, 192, 255, + 254, 255, 255, 255, 255, 255, 191, 248, 255, 175, 170, 170, 90, 253, 36, 201, + 255, 255, 239, 39, 255, 255, 111, 56, 255, 255, 1, 0, 0, 128, 3, 0, + 0, 0, 0, 128, 0, 255, 0, 0, 255, 255, 254, 255, 255, 255, 255, 252, + 255, 255, 255, 15, 255, 253, 255, 255, 240, 255, 255, 255, 0, 192, 26, 128, + 154, 3, 0, 0, 0, 192, 0, 0, 128, 255, 7, 95, 0, 0, 128, 160, + 36, 0, 0, 0, 0, 0, 252, 255, 255, 255, 7, 0, 255, 255, 0, 0, + 0, 255, 255, 255, 255, 255, 0, 224, 255, 255, 0, 252, 96, 0, 8, 0, + 128, 240, 40, 0, 0, 0, 0, 224, 1, 0, 0, 0, 3, 3, 3, 227, + 128, 128, 255, 255, 255, 255, 255, 235, 255, 247, 255, 255, 255, 63, 255, 255, + 255, 231, 255, 255, 255, 255, 255, 167, 255, 255, 255, 243, 255, 255, 255, 254, + 255, 255, 255, 63, 0, 0, 0, 32, 155, 33, 0, 20, 16, 0, 0, 0, + 64, 24, 32, 32, 0, 0, 0, 132, 160, 3, 2, 0, 0, 48, 0, 0, + 105, 1, 8, 245, 123, 21, 105, 85, 105, 8, 8, 161, 0, 4, 0, 240, + 17, 4, 0, 240, 0, 248, 0, 0, 0, 128, 0, 0, 0, 0, 255, 255, + 248, 255, 0, 0, 0, 254, 252, 255 +}; + +RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_nfkd_quick_check_table_1[field_2]; + v = re_nfkd_quick_check_table_2[(v << 5) | field_1]; + v = re_nfkd_quick_check_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Noncharacter_Code_Point. */ +static RE_UINT8 re_noncharacter_code_point_table_1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 }; -static RE_UINT8 re_quotation_mark_stage_3[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, - 5, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 7, 8, 1, 1, +static RE_UINT8 re_noncharacter_code_point_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 }; -static RE_UINT8 re_quotation_mark_stage_4[] = { - 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 255, 0, 0, 0, 6, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 224, 0, 0, 0, 0, - 30, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 0, 0, 0, +static RE_UINT8 re_noncharacter_code_point_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 192 }; -/* Quotation_Mark: 284 bytes. */ - -RE_UINT32 re_get_quotation_mark(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_quotation_mark_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_quotation_mark_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_quotation_mark_stage_3[pos + f] << 6; - pos += code; - value = (re_quotation_mark_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} +RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* Terminal_Punctuation. */ + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_terminal_punctuation_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 6, 2, 7, 2, 8, 9, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; + v = re_noncharacter_code_point_table_1[field_2]; + v = re_noncharacter_code_point_table_2[(v << 5) | field_1]; + v = re_noncharacter_code_point_table_3[(v << 2) | field_0]; -static RE_UINT8 re_terminal_punctuation_stage_2[] = { - 0, 1, 1, 2, 1, 3, 4, 5, 6, 7, 1, 1, 1, 1, 8, 9, - 10, 1, 1, 11, 1, 1, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, - 19, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, - 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 22, 1, 23, 1, 24, 25, 26, 27, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 29, - 1, 1, 1, 30, 1, 1, 1, 1, 31, 32, 33, 34, 1, 1, 1, 35, - 36, 37, 38, 1, 39, 40, 41, 42, 1, 1, 43, 1, 44, 1, 45, 1, - 1, 1, 1, 1, 46, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 48, 1, 1, 49, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 51, 1, 1, 1, 1, 1, -}; + return (v >> offset) & 0x1; +} -static RE_UINT8 re_terminal_punctuation_stage_3[] = { - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, - 6, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 9, - 0, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, - 0, 0, 12, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 0, 17, 0, 18, 0, 0, 0, 0, 19, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, - 0, 23, 0, 24, 0, 0, 0, 0, 0, 25, 26, 0, 0, 0, 0, 0, - 0, 27, 28, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 24, 30, 0, 0, 0, 0, 0, 0, 31, - 0, 0, 0, 32, 0, 0, 33, 0, 0, 34, 0, 0, 0, 0, 26, 0, - 0, 0, 35, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 38, - 0, 0, 39, 0, 0, 0, 0, 0, 1, 0, 0, 40, 0, 0, 0, 0, - 0, 0, 0, 0, 36, 0, 41, 0, 0, 0, 42, 0, 0, 0, 0, 0, - 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 43, - 0, 44, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, - 0, 0, 47, 0, 0, 24, 48, 0, 0, 0, 49, 0, 0, 0, 50, 0, - 0, 51, 0, 0, 0, 4, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 29, 0, 0, 0, 0, 0, - 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 56, 29, 0, 0, - 0, 0, 49, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, - 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 60, - 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, - 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, +/* Numeric_Type. */ +static RE_UINT8 re_numeric_type_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 10, + 10, 10, 10, 15, 16, 17, 18, 19, 20, 21, 10, 22, 23, 24, 10, 10, + 25, 26, 10, 27, 10, 28, 10, 10, 10, 29, 30, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 10, 41, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 42, 43, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 44, 45, 10, 10, 46, 10, 47, 48, 49, 10, 50, 10, + 51, 10, 52, 10, 10, 10, 10, 10, 53, 10, 54, 10, 10, 10, 55, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 56, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 57, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; -static RE_UINT8 re_terminal_punctuation_stage_4[] = { - 0, 0, 0, 0, 2, 80, 0, 140, 0, 0, 0, 64, 128, 0, 0, 0, - 0, 2, 0, 0, 8, 0, 0, 0, 0, 16, 0, 200, 0, 0, 16, 0, - 255, 23, 0, 0, 0, 0, 0, 3, 0, 0, 255, 127, 48, 0, 0, 0, - 0, 0, 0, 12, 0, 225, 7, 0, 0, 12, 0, 0, 254, 1, 0, 0, - 0, 64, 0, 0, 0, 56, 0, 0, 0, 0, 96, 0, 0, 0, 112, 4, - 60, 3, 0, 0, 0, 15, 0, 0, 0, 0, 0, 236, 0, 0, 0, 248, - 0, 0, 0, 192, 0, 0, 0, 48, 128, 3, 0, 0, 0, 64, 0, 16, - 2, 208, 0, 0, 6, 0, 0, 0, 0, 224, 0, 0, 0, 0, 248, 0, - 0, 0, 192, 0, 0, 192, 0, 0, 0, 128, 0, 0, 0, 0, 0, 224, - 0, 0, 0, 128, 0, 0, 3, 0, 0, 8, 0, 0, 0, 0, 247, 0, - 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 128, 0, 0, 0, 63, 0, - 0, 0, 0, 252, 0, 0, 0, 30, 0, 0, 224, 3, 128, 63, 0, 0, - 3, 0, 0, 0, 14, 0, 0, 0, 96, 32, 0, 192, 0, 0, 0, 31, - 0, 56, 0, 8, 60, 254, 255, 0, 0, 0, 0, 112, 12, 0, 0, 0, - 0, 0, 0, 24, 0, 0, 2, 0, 0, 0, 128, 1, 0, 0, 31, 0, - 0, 0, 32, 0, 0, 0, 128, 3, 16, 0, 0, 0, 128, 7, 0, 0, +static RE_UINT8 re_numeric_type_table_2[] = { + 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, + 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 7, + 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 9, 10, 0, 0, 0, 4, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 14, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 18, 0, 0, 0, 0, 0, 19, 20, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, + 0, 31, 32, 0, 31, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 38, 0, 27, 0, 39, 40, 41, 42, 37, 0, 0, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, 46, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 51, 0, 0, 0, 52, 53, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 58, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 59, 60, 61, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 63, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 56, 65, 27, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 67, 20, 68, 69, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 70, 0, 71, 72, 0, 0, 0, 73, 0, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 74, 75, 0, 76, 0, 77, 78, 0, 0, 0, 0, 79, 80, 20, + 0, 0, 81, 82, 83, 0, 0, 84, 0, 0, 74, 74, 0, 85, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 86, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 87, 0, 0, 0, 0, 83, 88, 89, 0, 0, 0, 90, 0, + 0, 0, 91, 92, 0, 0, 0, 1, 0, 93, 0, 0, 0, 0, 1, 94, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 3, 0, 0, 95, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 97, 98, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, + 20, 20, 20, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 101, 102, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 105, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 33, 20, 106, 0, 0, 107, 108, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 59, 0, 0, 44, 0, 0, 0, 110, 0, 59, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 111, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Terminal_Punctuation: 1128 bytes. */ - -RE_UINT32 re_get_terminal_punctuation(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_terminal_punctuation_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_terminal_punctuation_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_terminal_punctuation_stage_3[pos + f] << 5; - pos += code; - value = (re_terminal_punctuation_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Other_Math. */ - -static RE_UINT8 re_other_math_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, +static RE_UINT8 re_numeric_type_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 3, 3, 3, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 3, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, 3, 3, 3, 3, + 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, + 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_other_math_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, - 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, -}; +RE_UINT32 re_get_numeric_type(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -static RE_UINT8 re_other_math_stage_3[] = { - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 11, 0, 12, 13, - 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 0, 0, 0, 0, 0, 18, - 0, 0, 0, 0, 0, 0, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 22, 0, 0, 0, - 23, 24, 25, 26, 27, 28, 23, 23, 23, 23, 29, 30, 31, 32, 33, 34, - 0, 0, 0, 0, 0, 0, 0, 0, 35, 36, 37, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -static RE_UINT8 re_other_math_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, - 0, 0, 39, 0, 0, 0, 51, 0, 0, 0, 64, 0, 0, 0, 28, 0, - 1, 0, 0, 0, 30, 0, 0, 96, 0, 96, 0, 0, 0, 0, 0, 0, - 0, 0, 255, 31, 98, 248, 0, 0, 132, 252, 47, 62, 16, 179, 251, 241, - 224, 3, 0, 0, 0, 0, 0, 0, 0, 0, 224, 243, 182, 62, 195, 240, - 255, 63, 235, 47, 48, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 3, 192, 127, 240, 193, 140, 15, 0, 148, 31, 0, 0, - 96, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 15, 96, 0, 0, - 96, 0, 0, 0, 192, 255, 0, 0, 248, 255, 255, 1, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, 0, 48, 0, 0, 0, 0, 10, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 223, 255, 255, 255, 255, 255, 255, 255, 255, 223, 100, 222, 255, 235, - 239, 255, 255, 255, 255, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, - 95, 252, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 255, 255, 255, - 253, 255, 255, 247, 255, 255, 255, 247, 255, 255, 223, 255, 255, 255, 223, 255, - 255, 127, 255, 255, 255, 127, 255, 255, 255, 253, 255, 255, 255, 253, 255, 255, - 247, 207, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 150, 254, 247, 10, - 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, -}; + v = re_numeric_type_table_1[field_2]; + v = re_numeric_type_table_2[(v << 5) | field_1]; + v = re_numeric_type_table_3[(v << 5) | field_0]; -/* Other_Math: 564 bytes. */ - -RE_UINT32 re_get_other_math(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_other_math_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_other_math_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_other_math_stage_3[pos + f] << 6; - pos += code; - value = (re_other_math_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return v; } -/* Hex_Digit. */ - -static RE_UINT8 re_hex_digit_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -}; - -static RE_UINT8 re_hex_digit_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_hex_digit_stage_3[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, +/* Numeric_Value. */ +static RE_UINT8 re_numeric_value_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 10, + 10, 10, 10, 15, 16, 17, 18, 19, 20, 21, 10, 22, 23, 24, 10, 10, + 25, 26, 10, 27, 10, 28, 10, 10, 10, 29, 30, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 10, 41, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 42, 43, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 44, 45, 10, 10, 46, 10, 47, 48, 49, 10, 50, 10, + 51, 10, 52, 10, 10, 10, 10, 10, 53, 10, 54, 10, 10, 10, 55, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 56, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 57, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; -static RE_UINT8 re_hex_digit_stage_4[] = { - 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, +static RE_UINT8 re_numeric_value_table_2[] = { + 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, -}; - -/* Hex_Digit: 177 bytes. */ - -RE_UINT32 re_get_hex_digit(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 16; - code = ch ^ (f << 16); - pos = (RE_UINT32)re_hex_digit_stage_1[f] << 5; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_hex_digit_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_hex_digit_stage_3[pos + f] << 7; - pos += code; - value = (re_hex_digit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* ASCII_Hex_Digit. */ - -static RE_UINT8 re_ascii_hex_digit_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_ascii_hex_digit_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_ascii_hex_digit_stage_3[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_ascii_hex_digit_stage_4[] = { - 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, + 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 7, + 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 9, 10, 0, 0, 0, 4, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 14, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 3, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 20, 21, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 29, 30, 0, 29, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 0, 37, 0, 38, 39, 40, 41, 42, 0, 0, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, 46, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 51, 0, 0, 0, 52, 53, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64, 65, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 69, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 71, 72, 73, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 78, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 79, 0, 80, 81, 0, 0, 0, 82, 0, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 83, 84, 0, 85, 0, 86, 87, 0, 0, 0, 0, 88, 89, 90, + 0, 0, 91, 92, 93, 0, 0, 94, 0, 0, 95, 95, 0, 96, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 97, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 98, 0, 0, 0, 0, 99, 100, 101, 0, 0, 0, 102, 0, + 0, 0, 103, 104, 0, 0, 0, 1, 0, 105, 0, 0, 0, 0, 1, 106, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 3, 0, 0, 107, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 109, 110, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 0, + 112, 113, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 116, 117, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 120, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 124, 125, 126, 0, 0, 127, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 130, 0, 0, 131, 0, 0, 0, 132, 0, 133, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 0, 0, 135, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 136, 137, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* ASCII_Hex_Digit: 130 bytes. */ - -RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_ascii_hex_digit_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_ascii_hex_digit_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_ascii_hex_digit_stage_3[pos + f] << 7; - pos += code; - value = (re_ascii_hex_digit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Other_Alphabetic. */ - -static RE_UINT8 re_other_alphabetic_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 7, 2, 8, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, +static RE_UINT8 re_numeric_value_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 0, 0, 0, 0, 0, 2, 0, 0, 11, 12, 13, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 0, 0, 14, 15, 16, 11, 13, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 18, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 2, 3, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 21, 22, 23, 24, 25, 26, 27, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 18, 19, 20, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 18, 37, 38, 39, 40, 41, 42, 43, 44, 19, 45, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 47, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 50, 25, 51, 52, 27, 53, 54, 55, 56, 57, 15, 58, 59, 60, 2, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 61, 62, 40, 19, 63, 20, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 61, 62, 40, 19, 63, 20, + 20, 64, 45, 0, 0, 7, 40, 65, 66, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 61, 62, 67, 68, 69, 17, + 46, 47, 48, 37, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 61, 62, + 67, 68, 69, 17, 46, 47, 48, 37, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 18, 61, 62, 67, 68, 69, 17, 46, 47, 48, 37, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 61, 62, 67, 68, 69, + 17, 46, 47, 48, 37, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 37, 38, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 37, 38, 39, 40, 41, 42, 43, + 0, 70, 71, 72, 73, 74, 75, 76, 77, 78, 38, 79, 80, 81, 82, 83, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 84, 85, 86, 87, 39, 88, 89, 90, 91, 92, 93, 94, 95, 96, 40, + 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 8, 0, 0, 0, 45, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, + 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 9, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 0, 20, 37, 38, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 37, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 18, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 18, 37, 38, 39, 40, 41, 42, 43, 44, 19, 99, 100, 101, 63, 102, 103, + 104, 105, 20, 106, 107, 108, 64, 109, 110, 111, 112, 45, 113, 114, 115, 65, + 116, 117, 118, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 12, 2, 6, 40, 63, 64, 65, 6, 18, 40, 19, 63, 20, 64, 6, + 18, 40, 19, 63, 20, 45, 65, 18, 2, 2, 2, 3, 3, 3, 3, 6, + 18, 18, 18, 18, 18, 38, 40, 40, 40, 40, 19, 100, 63, 63, 63, 63, + 63, 20, 64, 6, 40, 12, 12, 52, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, + 42, 43, 44, 19, 99, 100, 101, 63, 102, 103, 104, 105, 0, 0, 0, 0, + 2, 6, 18, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 105, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 18, 37, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 18, 37, 19, 20, 45, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 18, 37, + 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 5, 6, 18, 37, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 18, 37, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 18, 37, 19, 3, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 12, 0, 0, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, 42, + 0, 0, 19, 99, 100, 101, 63, 102, 103, 104, 105, 20, 106, 107, 108, 64, + 109, 110, 111, 112, 45, 113, 114, 115, 65, 116, 117, 118, 119, 66, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 56, 11, 51, 130, 12, 131, 52, 13, 57, + 2, 3, 4, 5, 18, 37, 19, 20, 12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 40, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 18, 37, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 18, 37, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 18, 37, 19, 20, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 18, 37, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 18, 40, 19, 20, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, 42, + 43, 44, 19, 99, 100, 101, 63, 102, 103, 104, 105, 12, 11, 51, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, + 5, 6, 18, 37, 38, 19, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 18, 37, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 3, 4, 5, 18, 37, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, + 41, 42, 43, 44, 19, 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, + 42, 43, 44, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, + 42, 43, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 18, 37, 38, 39, 40, 41, 42, 43, 44, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132, 21, 133, 134, 22, 135, 23, 136, 24, 14, 14, 25, 15, 26, 16, 27, + 11, 12, 12, 13, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 5, + 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, + 4, 5, 6, 3, 4, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 4, + 5, 6, 137, 138, 2, 3, 4, 4, 5, 6, 4, 4, 5, 5, 5, 5, + 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 3, 4, 5, 6, 7, 2, + 3, 4, 5, 5, 6, 6, 3, 4, 2, 3, 51, 52, 57, 51, 52, 15, + 11, 56, 11, 11, 12, 51, 52, 39, 40, 5, 6, 7, 8, 9, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 18, 19, 45, 139, 97, + 140, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 61, 62, 67, 68, 69, + 17, 46, 47, 48, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 61, 62, 67, 68, 69, + 17, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, 42, + 43, 44, 2, 3, 4, 5, 6, 2, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, + 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, + 42, 43, 44, 19, 99, 100, 101, 63, 102, 103, 104, 105, 20, 106, 107, 108, + 64, 109, 110, 111, 112, 45, 113, 114, 115, 65, 116, 117, 118, 119, 66, 121, + 66, 141, 142, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 11, 12, 13, + 0, 2, 3, 45, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, + 42, 43, 44, 19, 99, 100, 101, 63, 102, 103, 104, 105, 20, 106, 107, 108, + 64, 109, 110, 111, 112, 45, 113, 114, 115, 65, 116, 117, 118, 119, 0, 3, + 4, 5, 6, 7, 8, 9, 10, 18, 101, 102, 106, 45, 12, 56, 0, 0, + 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_other_alphabetic_stage_2[] = { - 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 0, 0, - 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 0, 24, 25, 26, 27, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, - 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 30, 0, 0, 31, 0, 0, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 0, 43, 44, 45, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, - 48, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, - 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +RE_UINT32 re_get_numeric_value(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_numeric_value_table_1[field_2]; + v = re_numeric_value_table_2[(v << 5) | field_1]; + v = re_numeric_value_table_3[(v << 5) | field_0]; + + return v; +} + +/* Other_Alphabetic. */ +static RE_UINT8 re_other_alphabetic_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 10, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, 12, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 8, + 14, 8, 15, 16, 17, 18, 19, 20, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 21, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 22, + 8, 8, 8, 8, 8, 8, 8, 8, 23, 8, 24, 8, 25, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; -static RE_UINT8 re_other_alphabetic_stage_3[] = { +static RE_UINT8 re_other_alphabetic_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 3, 0, 4, 0, 5, 6, 0, 0, 7, 8, - 9, 10, 0, 0, 0, 11, 0, 0, 12, 13, 0, 0, 0, 0, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 19, 20, 21, 23, 24, 20, 21, 25, 26, - 20, 21, 27, 19, 28, 21, 29, 0, 16, 21, 30, 19, 20, 21, 30, 19, - 16, 21, 31, 19, 19, 0, 32, 33, 0, 34, 35, 0, 0, 36, 35, 0, - 0, 0, 0, 37, 38, 39, 0, 0, 0, 40, 41, 42, 43, 0, 0, 0, - 33, 33, 33, 33, 0, 44, 45, 0, 0, 0, 0, 0, 46, 47, 0, 0, - 0, 48, 0, 0, 0, 0, 0, 0, 49, 0, 50, 51, 0, 0, 0, 0, - 52, 53, 16, 0, 54, 55, 0, 56, 0, 57, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 44, 59, 60, - 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 61, 21, 0, 0, 0, - 62, 63, 0, 0, 64, 14, 65, 66, 0, 67, 68, 0, 16, 14, 0, 1, - 0, 69, 70, 71, 0, 72, 0, 73, 0, 0, 0, 0, 0, 0, 0, 74, - 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, - 77, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, - 54, 79, 80, 0, 28, 81, 0, 0, 54, 68, 46, 0, 54, 82, 0, 0, - 0, 83, 0, 0, 0, 0, 66, 45, 16, 21, 22, 19, 0, 0, 0, 0, - 0, 53, 84, 0, 0, 10, 64, 0, 0, 0, 0, 0, 0, 85, 86, 0, - 0, 87, 88, 0, 0, 89, 0, 0, 90, 91, 0, 0, 0, 0, 0, 0, - 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 94, - 95, 96, 97, 0, 98, 0, 0, 0, 0, 99, 0, 0, 100, 101, 0, 0, - 0, 102, 103, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, - 0, 0, 106, 59, 107, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, - 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, - 0, 10, 111, 111, 60, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, + 4, 0, 5, 6, 0, 0, 7, 8, 9, 10, 0, 0, 0, 11, 0, 0, + 12, 13, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 19, + 20, 21, 23, 24, 20, 21, 25, 26, 20, 21, 27, 19, 28, 21, 29, 0, + 16, 21, 30, 19, 20, 21, 30, 19, 16, 21, 31, 19, 20, 0, 32, 33, + 0, 34, 35, 0, 0, 36, 35, 0, 0, 0, 0, 37, 38, 39, 0, 0, + 0, 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 33, 33, 33, 33, 0, 44, 45, 0, + 0, 0, 0, 0, 46, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, + 49, 0, 50, 51, 0, 52, 53, 0, 54, 55, 16, 0, 56, 57, 0, 58, + 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 44, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 64, 65, 0, 0, 66, 14, 67, 52, 0, 68, 69, 0, 16, 14, 0, 1, + 0, 70, 71, 72, 0, 73, 0, 74, 0, 0, 0, 0, 0, 0, 0, 75, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 81, 82, 0, 28, 83, 0, 0, 56, 69, 46, 0, 56, 84, 85, 0, + 0, 86, 0, 0, 0, 0, 52, 45, 16, 21, 22, 19, 0, 0, 0, 0, + 0, 55, 87, 0, 0, 10, 66, 0, 0, 0, 0, 0, 0, 88, 89, 0, + 0, 90, 53, 0, 0, 91, 0, 0, 92, 93, 0, 0, 0, 0, 0, 0, + 0, 94, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 97, 98, + 99, 100, 101, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 103, 0, 0, 104, 105, 0, 0, 0, 106, 107, 0, 108, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 61, 111, 0, 0, 112, + 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 113, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 116, 116, 62, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_other_alphabetic_stage_4[] = { +static RE_UINT8 re_other_alphabetic_table_3[] = { 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 255, 191, 182, 0, 0, 0, 0, 0, 255, 7, 0, 248, 255, 254, 0, 0, 1, 0, 0, 0, 192, 31, 158, 33, 0, 0, 0, 0, 2, 0, 0, 0, 255, 255, 192, 255, 1, 0, @@ -10596,5620 +18401,7541 @@ static RE_UINT8 re_other_alphabetic_stage_4[] = { 0, 248, 127, 121, 0, 0, 192, 195, 157, 63, 30, 0, 252, 191, 0, 60, 0, 0, 192, 255, 255, 1, 0, 0, 96, 0, 0, 0, 0, 2, 0, 0, 255, 15, 255, 1, 0, 0, 128, 15, 0, 0, 224, 127, 254, 255, 31, 0, - 31, 0, 0, 0, 0, 0, 224, 255, 7, 0, 0, 0, 254, 51, 0, 0, - 128, 255, 3, 0, 240, 255, 127, 0, 128, 255, 31, 0, 255, 255, 255, 255, - 255, 3, 0, 0, 0, 0, 240, 15, 4, 8, 0, 0, 248, 0, 0, 0, - 3, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 128, 192, 7, 0, 0, - 128, 255, 7, 0, 0, 254, 127, 0, 8, 48, 0, 0, 0, 0, 0, 56, - 0, 0, 157, 65, 0, 248, 32, 0, 248, 7, 0, 0, 0, 0, 0, 64, - 0, 0, 192, 7, 110, 240, 0, 0, 240, 0, 0, 0, 0, 0, 0, 255, - 63, 0, 0, 0, 0, 0, 255, 1, 0, 0, 248, 255, 0, 240, 159, 64, - 59, 0, 0, 0, 0, 128, 63, 127, 0, 0, 0, 48, 0, 0, 255, 127, - 1, 0, 0, 0, 0, 248, 63, 0, 0, 0, 0, 224, 255, 7, 0, 0, - 0, 240, 255, 1, 0, 0, 254, 252, 16, 0, 0, 0, 254, 7, 0, 0, + 0, 0, 0, 128, 1, 0, 0, 0, 31, 0, 0, 0, 0, 0, 224, 255, + 7, 0, 0, 0, 254, 51, 0, 0, 128, 255, 3, 0, 240, 255, 127, 0, + 128, 255, 31, 0, 255, 255, 255, 255, 255, 3, 0, 0, 0, 0, 240, 15, + 4, 8, 0, 0, 248, 0, 0, 0, 3, 0, 0, 0, 47, 0, 0, 0, + 192, 7, 0, 0, 128, 255, 7, 0, 0, 254, 127, 0, 8, 48, 0, 0, + 0, 0, 0, 56, 0, 0, 157, 65, 0, 248, 32, 0, 248, 7, 0, 0, + 0, 0, 0, 64, 0, 0, 192, 7, 110, 240, 0, 0, 240, 0, 0, 0, + 0, 24, 0, 0, 0, 0, 0, 255, 63, 0, 0, 0, 0, 0, 255, 1, + 0, 0, 248, 255, 0, 192, 0, 0, 0, 240, 159, 64, 59, 0, 0, 0, + 0, 128, 63, 127, 0, 0, 0, 48, 0, 0, 255, 127, 0, 248, 63, 0, + 0, 0, 0, 224, 255, 7, 0, 0, 0, 240, 255, 1, 0, 0, 191, 25, + 5, 0, 0, 0, 0, 0, 254, 252, 16, 0, 0, 0, 254, 7, 0, 0, 0, 0, 224, 123, 0, 0, 254, 15, 0, 252, 255, 0, 0, 128, 127, 127, 0, 0, 252, 255, 255, 254, 127, 0, 0, 0, 126, 180, 139, 0, 0, 0, 0, 124, 123, 0, 0, 0, 120, 0, 0, 128, 254, 255, 255, 128, 7, 0, - 127, 255, 255, 249, 219, 7, 0, 0, 128, 0, 0, 0, 255, 3, 255, 255, -}; - -/* Other_Alphabetic: 1280 bytes. */ - -RE_UINT32 re_get_other_alphabetic(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_other_alphabetic_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_other_alphabetic_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_other_alphabetic_stage_3[pos + f] << 5; - pos += code; - value = (re_other_alphabetic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Ideographic. */ - -static RE_UINT8 re_ideographic_stage_1[] = { - 0, 1, 2, 3, 4, 0, 0, 5, 0, 0, 0, 6, 7, 8, 0, 0, - 3, 3, 3, 3, 3, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_ideographic_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 7, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 12, 13, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 15, 0, 0, 0, 0, 0, 0, 2, 16, 0, 0, -}; - -static RE_UINT8 re_ideographic_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, - 2, 2, 2, 2, 2, 2, 2, 4, 0, 0, 0, 0, 2, 2, 2, 2, - 2, 5, 2, 6, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 7, - 2, 2, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 2, 2, - 2, 2, 2, 10, 0, 0, 0, 0, 2, 2, 2, 11, 2, 2, 2, 2, - 2, 2, 2, 2, 12, 2, 2, 2, 13, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, - 16, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_ideographic_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 254, 3, 0, 7, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, - 255, 255, 255, 255, 255, 255, 0, 0, 255, 255, 255, 255, 255, 63, 255, 255, - 255, 255, 255, 3, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 0, - 255, 255, 255, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 15, 255, 255, 127, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 31, 0, 255, 255, 255, 63, 255, 255, 255, 255, - 255, 255, 255, 255, 3, 0, 255, 255, 255, 255, 255, 255, 1, 0, 0, 0, - 255, 255, 255, 63, 0, 0, 0, 0, -}; - -/* Ideographic: 600 bytes. */ - -RE_UINT32 re_get_ideographic(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_ideographic_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_ideographic_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_ideographic_stage_3[pos + f] << 6; - pos += code; - value = (re_ideographic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Diacritic. */ - -static RE_UINT8 re_diacritic_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_diacritic_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 1, 17, 1, 1, 1, 18, 1, 19, 20, 21, 22, 23, 1, 24, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 1, 26, 1, - 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 28, 29, 30, 31, 32, 33, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 34, 1, 1, 35, 36, - 1, 1, 37, 1, 1, 1, 1, 1, 1, 1, 38, 1, 1, 39, 1, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 37, 50, 1, 51, 52, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 53, 54, 1, 1, 1, 55, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 56, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 54, 57, 1, 1, 1, 1, 1, 58, 59, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_diacritic_stage_3[] = { - 0, 0, 1, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 5, 5, 5, 5, 6, 7, 8, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 11, 12, 13, 0, - 0, 0, 14, 0, 0, 0, 15, 16, 0, 4, 17, 0, 0, 18, 0, 19, - 20, 0, 0, 0, 0, 0, 0, 21, 0, 22, 23, 24, 0, 22, 25, 0, - 0, 22, 25, 0, 0, 22, 25, 26, 0, 22, 25, 0, 0, 0, 25, 0, - 0, 0, 25, 0, 0, 22, 25, 0, 0, 27, 25, 0, 0, 0, 28, 0, - 0, 0, 29, 0, 0, 30, 31, 0, 20, 32, 0, 0, 33, 0, 34, 0, - 0, 35, 0, 36, 37, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 38, 0, 0, 39, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 40, 0, 41, 0, 0, 0, 42, 43, 44, 0, 45, 0, 0, - 0, 46, 0, 47, 0, 0, 4, 48, 0, 49, 5, 17, 0, 0, 50, 51, - 0, 0, 0, 0, 0, 52, 53, 54, 0, 0, 0, 0, 0, 0, 0, 55, - 0, 56, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 58, 0, 0, 22, - 0, 0, 0, 59, 60, 0, 0, 61, 5, 62, 0, 0, 63, 0, 0, 20, - 0, 0, 0, 0, 0, 0, 43, 64, 0, 65, 66, 0, 0, 66, 2, 67, - 0, 0, 0, 68, 0, 15, 69, 70, 0, 0, 71, 0, 0, 0, 0, 72, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 74, 75, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 77, 0, 78, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, - 0, 80, 0, 66, 0, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0, 83, - 0, 22, 25, 84, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 86, 0, - 0, 0, 0, 0, 0, 15, 2, 0, 0, 15, 0, 0, 0, 46, 0, 0, - 0, 87, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, - 0, 42, 88, 0, 10, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 89, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, - 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, - 0, 0, 0, 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, - 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 98, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_diacritic_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 129, 144, 1, - 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 224, 7, 0, 48, 4, - 48, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 2, 0, 0, 254, 255, - 251, 255, 255, 191, 22, 0, 0, 0, 0, 248, 135, 1, 0, 0, 0, 128, - 97, 28, 0, 0, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 63, 0, - 0, 0, 0, 3, 248, 255, 255, 127, 0, 0, 0, 16, 0, 32, 30, 0, - 0, 0, 2, 0, 0, 32, 0, 0, 0, 0, 0, 224, 0, 0, 0, 24, - 0, 4, 0, 0, 128, 95, 0, 0, 0, 0, 0, 4, 0, 31, 0, 0, - 0, 0, 160, 194, 220, 0, 0, 0, 64, 0, 0, 0, 0, 0, 128, 6, - 24, 62, 0, 0, 128, 191, 0, 12, 0, 254, 15, 32, 0, 0, 0, 14, - 0, 0, 224, 159, 0, 0, 255, 63, 0, 0, 16, 0, 16, 0, 0, 0, - 0, 248, 15, 0, 0, 12, 0, 0, 0, 0, 192, 0, 0, 0, 0, 63, - 255, 33, 144, 3, 0, 240, 255, 255, 240, 255, 0, 0, 0, 0, 224, 227, - 0, 0, 0, 160, 3, 224, 0, 224, 0, 224, 0, 96, 0, 128, 3, 0, - 0, 128, 0, 0, 0, 252, 0, 0, 0, 0, 0, 30, 0, 128, 0, 176, - 0, 0, 0, 48, 0, 0, 3, 0, 3, 0, 0, 0, 0, 7, 0, 0, - 255, 255, 3, 0, 0, 120, 0, 0, 0, 0, 8, 0, 32, 0, 0, 0, - 0, 0, 0, 56, 7, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 248, - 0, 48, 0, 0, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 0, 192, - 8, 0, 0, 0, 96, 0, 0, 0, 252, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 24, 0, 1, 28, 0, 0, 0, 0, 96, 0, 0, 6, 0, 0, - 192, 31, 31, 0, 68, 0, 0, 0, 12, 0, 0, 0, 0, 8, 0, 0, - 128, 0, 0, 0, 52, 0, 0, 0, 0, 0, 128, 0, 0, 0, 31, 0, - 0, 0, 127, 0, 0, 128, 255, 255, 128, 227, 7, 248, 231, 15, 0, 0, - 0, 60, 0, 0, 0, 240, 0, 0, 112, 7, 0, 0, -}; - -/* Diacritic: 1300 bytes. */ - -RE_UINT32 re_get_diacritic(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_diacritic_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_diacritic_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_diacritic_stage_3[pos + f] << 5; - pos += code; - value = (re_diacritic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Extender. */ - -static RE_UINT8 re_extender_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 3, 0, 127, 255, 255, 249, 219, 7, 0, 0, 128, 0, 0, 0, + 255, 3, 255, 255 }; -static RE_UINT8 re_extender_stage_2[] = { - 0, 1, 2, 3, 2, 2, 2, 4, 2, 2, 2, 2, 5, 6, 7, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 9, 2, 2, 10, 11, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 14, 15, 2, 2, 16, 2, 2, - 2, 2, 2, 2, 2, 17, 2, 18, 2, 2, 2, 2, 2, 2, 2, 2, - 19, 2, 2, 2, 20, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -}; +RE_UINT32 re_get_other_alphabetic(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_extender_stage_3[] = { - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, - 0, 5, 0, 5, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, - 11, 0, 12, 13, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, - 0, 17, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, - 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 24, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_extender_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 32, 0, 0, 0, 0, 0, 62, 0, - 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, - 0, 0, 32, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 32, 0, 0, 24, 0, 0, 0, 0, 32, 0, 0, 0, 0, - 192, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 112, 0, 0, 0, 0, 0, 0, 0, -}; + v = re_other_alphabetic_table_1[field_2]; + v = re_other_alphabetic_table_2[(v << 5) | field_1]; + v = re_other_alphabetic_table_3[(v << 2) | field_0]; -/* Extender: 640 bytes. */ - -RE_UINT32 re_get_extender(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_extender_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_extender_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_extender_stage_3[pos + f] << 6; - pos += code; - value = (re_extender_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return (v >> offset) & 0x1; } -/* Other_Lowercase. */ - -static RE_UINT8 re_other_lowercase_stage_1[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* Other_Default_Ignorable_Code_Point. */ +static RE_UINT8 re_other_default_ignorable_code_point_table_1[] = { + 0, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_other_lowercase_stage_2[] = { - 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, - 4, 2, 5, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 7, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_other_lowercase_stage_3[] = { - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, - 0, 8, 9, 0, 0, 10, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, - 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 0, 15, - 0, 0, 0, 0, 0, 16, 0, 0, -}; - -static RE_UINT8 re_other_lowercase_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, - 0, 0, 0, 0, 0, 0, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 240, 255, 255, - 255, 255, 255, 255, 255, 7, 0, 1, 0, 0, 0, 248, 255, 255, 255, 255, - 0, 0, 0, 0, 0, 0, 2, 128, 0, 0, 255, 31, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 255, 255, 255, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 240, 0, 0, 0, 0, -}; - -/* Other_Lowercase: 372 bytes. */ - -RE_UINT32 re_get_other_lowercase(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_other_lowercase_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_other_lowercase_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_other_lowercase_stage_3[pos + f] << 6; - pos += code; - value = (re_other_lowercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Other_Uppercase. */ - -static RE_UINT8 re_other_uppercase_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_other_uppercase_stage_2[] = { - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -}; - -static RE_UINT8 re_other_uppercase_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 7, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_other_uppercase_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 3, 255, 255, - 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_other_default_ignorable_code_point_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 7, + 8, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 10, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; -/* Other_Uppercase: 210 bytes. */ - -RE_UINT32 re_get_other_uppercase(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_other_uppercase_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_other_uppercase_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_other_uppercase_stage_3[pos + f] << 7; - pos += code; - value = (re_other_uppercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Noncharacter_Code_Point. */ - -static RE_UINT8 re_noncharacter_code_point_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, +static RE_UINT8 re_other_default_ignorable_code_point_table_3[] = { + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 128, 1, 0, 0, 0, + 0, 0, 48, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 0, 255, 1, + 253, 255, 255, 255, 255, 255, 255, 255, 0, 0, 255, 255 }; -static RE_UINT8 re_noncharacter_code_point_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -}; +RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_noncharacter_code_point_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_noncharacter_code_point_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, -}; + v = re_other_default_ignorable_code_point_table_1[field_2]; + v = re_other_default_ignorable_code_point_table_2[(v << 5) | field_1]; + v = re_other_default_ignorable_code_point_table_3[(v << 2) | field_0]; -/* Noncharacter_Code_Point: 177 bytes. */ - -RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 16; - code = ch ^ (f << 16); - pos = (RE_UINT32)re_noncharacter_code_point_stage_1[f] << 5; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_noncharacter_code_point_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_noncharacter_code_point_stage_3[pos + f] << 7; - pos += code; - value = (re_noncharacter_code_point_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return (v >> offset) & 0x1; } /* Other_Grapheme_Extend. */ - -static RE_UINT8 re_other_grapheme_extend_stage_1[] = { - 0, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_other_grapheme_extend_stage_2[] = { +static RE_UINT8 re_other_grapheme_extend_table_1[] = { 0, 0, 1, 2, 0, 0, 3, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_other_grapheme_extend_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, - 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 8, 0, 9, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_other_grapheme_extend_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 2, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 2, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_other_grapheme_extend_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 96, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 192, 7, 0, - 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +static RE_UINT8 re_other_grapheme_extend_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 128, 0, 4, 0, 96, 0, + 0, 128, 0, 128, 0, 0, 32, 0, 0, 16, 0, 0, 0, 192, 0, 0, + 0, 0, 0, 192, 0, 0, 1, 32, 0, 128, 0, 0, 0, 0, 1, 0, + 32, 192, 7, 0, 255, 255, 255, 255 }; -/* Other_Grapheme_Extend: 444 bytes. */ - -RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_other_grapheme_extend_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_other_grapheme_extend_stage_2[pos + f] << 3; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_other_grapheme_extend_stage_3[pos + f] << 7; - pos += code; - value = (re_other_grapheme_extend_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; +RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_other_grapheme_extend_table_1[field_2]; + v = re_other_grapheme_extend_table_2[(v << 5) | field_1]; + v = re_other_grapheme_extend_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; } -/* IDS_Binary_Operator. */ +/* Other_ID_Continue. */ +RE_UINT32 re_get_other_id_continue(RE_UINT32 codepoint) { + if (codepoint == 0xB7) + return 1; + if (codepoint == 0x0387) + return 1; + if (0x1369 <= codepoint && codepoint <= 0x1371) + return 1; + if (codepoint == 0x19DA) + return 1; + + return 0; +} -static RE_UINT8 re_ids_binary_operator_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* Other_ID_Start. */ +RE_UINT32 re_get_other_id_start(RE_UINT32 codepoint) { + if (0x1885 <= codepoint && codepoint <= 0x1886) + return 1; + if (codepoint == 0x2118) + return 1; + if (codepoint == 0x212E) + return 1; + if (0x309B <= codepoint && codepoint <= 0x309C) + return 1; + + return 0; +} + +/* Other_Lowercase. */ +static RE_UINT8 re_other_lowercase_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_ids_binary_operator_stage_2[] = { - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_other_lowercase_table_2[] = { + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 5, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 12, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_ids_binary_operator_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, +static RE_UINT8 re_other_lowercase_table_3[] = { + 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 255, 1, 3, 0, 0, 0, + 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 4, 0, 240, 255, 255, + 255, 255, 255, 255, 255, 7, 0, 1, 0, 0, 0, 248, 0, 0, 2, 128, + 0, 0, 255, 31, 0, 0, 255, 255, 255, 3, 0, 0, 0, 0, 0, 48, + 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 0, 240 }; -static RE_UINT8 re_ids_binary_operator_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 15, -}; +RE_UINT32 re_get_other_lowercase(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* IDS_Binary_Operator: 130 bytes. */ - -RE_UINT32 re_get_ids_binary_operator(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_ids_binary_operator_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_ids_binary_operator_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_ids_binary_operator_stage_3[pos + f] << 7; - pos += code; - value = (re_ids_binary_operator_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* IDS_Trinary_Operator. */ + v = re_other_lowercase_table_1[field_2]; + v = re_other_lowercase_table_2[(v << 5) | field_1]; + v = re_other_lowercase_table_3[(v << 2) | field_0]; -static RE_UINT8 re_ids_trinary_operator_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + return (v >> offset) & 0x1; +} + +/* Other_Math. */ +static RE_UINT8 re_other_math_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_ids_trinary_operator_stage_2[] = { - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_ids_trinary_operator_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_ids_trinary_operator_stage_4[] = { +static RE_UINT8 re_other_math_table_2[] = { + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, -}; - -/* IDS_Trinary_Operator: 130 bytes. */ - -RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_ids_trinary_operator_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_ids_trinary_operator_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_ids_trinary_operator_stage_3[pos + f] << 7; - pos += code; - value = (re_ids_trinary_operator_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Radical. */ - -static RE_UINT8 re_radical_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 5, 6, 7, 8, 0, 9, 10, 11, 12, 13, 0, 14, 15, 16, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 19, 20, 21, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, 24, + 25, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 28, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 30, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 32, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, + 34, 34, 35, 34, 36, 37, 38, 34, 39, 40, 41, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 42, 43, 44, 35, 35, 45, 45, 46, 46, 47, 34, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 38, 48, 49, 50, 51, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_other_math_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 39, 0, 0, 0, 51, 0, + 0, 0, 64, 0, 0, 0, 28, 0, 1, 0, 0, 0, 30, 0, 0, 96, + 0, 96, 0, 0, 0, 0, 255, 31, 98, 248, 0, 0, 132, 252, 47, 62, + 16, 179, 251, 241, 224, 3, 0, 0, 0, 0, 224, 243, 182, 62, 195, 240, + 255, 63, 235, 47, 48, 0, 0, 0, 0, 15, 0, 0, 0, 0, 176, 0, + 0, 0, 1, 0, 4, 0, 0, 0, 3, 192, 127, 240, 193, 140, 15, 0, + 148, 31, 0, 0, 96, 0, 0, 0, 5, 0, 0, 0, 15, 96, 0, 0, + 192, 255, 0, 0, 248, 255, 255, 1, 0, 0, 0, 15, 0, 0, 0, 48, + 10, 1, 0, 0, 0, 0, 0, 80, 255, 255, 255, 255, 255, 255, 223, 255, + 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, + 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, + 255, 255, 255, 247, 255, 127, 255, 255, 255, 253, 255, 255, 247, 207, 255, 255, + 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, + 238, 251, 255, 15 }; -static RE_UINT8 re_radical_stage_2[] = { - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_other_math(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_radical_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_radical_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 0, 0, -}; + v = re_other_math_table_1[field_2]; + v = re_other_math_table_2[(v << 5) | field_1]; + v = re_other_math_table_3[(v << 2) | field_0]; -/* Radical: 162 bytes. */ - -RE_UINT32 re_get_radical(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_radical_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_radical_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_radical_stage_3[pos + f] << 7; - pos += code; - value = (re_radical_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return (v >> offset) & 0x1; } -/* Unified_Ideograph. */ - -static RE_UINT8 re_unified_ideograph_stage_1[] = { - 0, 1, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, -}; +/* Other_Uppercase. */ +RE_UINT32 re_get_other_uppercase(RE_UINT32 codepoint) { + if (0x2160 <= codepoint && codepoint <= 0x216F) + return 1; + if (0x24B6 <= codepoint && codepoint <= 0x24CF) + return 1; + if (0x01F130 <= codepoint && codepoint <= 0x01F149) + return 1; + if (0x01F150 <= codepoint && codepoint <= 0x01F169) + return 1; + if (0x01F170 <= codepoint && codepoint <= 0x01F189) + return 1; + + return 0; +} -static RE_UINT8 re_unified_ideograph_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, - 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* Pattern_Syntax. */ +static RE_UINT8 re_pattern_syntax_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 6, 7, 1, - 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_unified_ideograph_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, - 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, -}; - -static RE_UINT8 re_unified_ideograph_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 63, 0, 255, 255, 255, 255, 255, 255, 0, 0, - 0, 192, 26, 128, 154, 3, 0, 0, 255, 255, 127, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 31, 0, 255, 255, 255, 63, 255, 255, 255, 255, - 255, 255, 255, 255, 3, 0, 255, 255, 255, 255, 255, 255, 1, 0, 0, 0, -}; - -/* Unified_Ideograph: 434 bytes. */ - -RE_UINT32 re_get_unified_ideograph(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_unified_ideograph_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_unified_ideograph_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_unified_ideograph_stage_3[pos + f] << 6; - pos += code; - value = (re_unified_ideograph_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Other_Default_Ignorable_Code_Point. */ - -static RE_UINT8 re_other_default_ignorable_code_point_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_other_default_ignorable_code_point_stage_2[] = { - 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 7, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_other_default_ignorable_code_point_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, 9, 9, 0, 0, 0, 10, - 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static RE_UINT8 re_other_default_ignorable_code_point_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, - 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 1, - 253, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 0, 0, 0, 0, 0, 0, 255, 255, -}; - -/* Other_Default_Ignorable_Code_Point: 356 bytes. */ - -RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_3[pos + f] << 6; - pos += code; - value = (re_other_default_ignorable_code_point_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Deprecated. */ - -static RE_UINT8 re_deprecated_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_deprecated_stage_2[] = { - 0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, 1, - 5, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_deprecated_stage_3[] = { - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_deprecated_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 128, 2, - 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 252, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, -}; - -/* Deprecated: 292 bytes. */ - -RE_UINT32 re_get_deprecated(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_deprecated_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_deprecated_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_deprecated_stage_3[pos + f] << 6; - pos += code; - value = (re_deprecated_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Soft_Dotted. */ - -static RE_UINT8 re_soft_dotted_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_soft_dotted_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, - 6, 3, 3, 3, 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 9, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_soft_dotted_stage_3[] = { - 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_pattern_syntax_table_2[] = { + 0, 1, 2, 2, 0, 3, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, - 0, 12, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 18, 0, 19, 20, 0, 21, 0, 22, 23, 0, 24, 0, 17, 18, - 0, 19, 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_soft_dotted_stage_4[] = { - 0, 0, 0, 0, 0, 6, 0, 0, 0, 128, 0, 0, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 32, 0, 0, 4, 0, 0, 0, 8, 0, - 0, 0, 64, 1, 4, 0, 0, 0, 0, 0, 64, 0, 16, 1, 0, 0, - 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, - 0, 0, 0, 16, 12, 0, 0, 0, 0, 0, 192, 0, 0, 12, 0, 0, - 0, 0, 0, 192, 0, 0, 12, 0, 192, 0, 0, 0, 0, 0, 0, 12, - 0, 192, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 10, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Soft_Dotted: 424 bytes. */ - -RE_UINT32 re_get_soft_dotted(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_soft_dotted_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_soft_dotted_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_soft_dotted_stage_3[pos + f] << 5; - pos += code; - value = (re_soft_dotted_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Logical_Order_Exception. */ - -static RE_UINT8 re_logical_order_exception_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, +static RE_UINT8 re_pattern_syntax_table_3[] = { + 0, 0, 0, 0, 254, 255, 0, 252, 1, 0, 0, 120, 254, 90, 67, 136, + 0, 0, 128, 0, 0, 0, 255, 255, 255, 0, 255, 127, 254, 255, 239, 127, + 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 240, 255, 14, 255, 255, 255, + 1, 0, 1, 0, 0, 0, 0, 192, 96, 0, 0, 0 }; -static RE_UINT8 re_logical_order_exception_stage_2[] = { - 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_pattern_syntax(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_logical_order_exception_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_logical_order_exception_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 224, 4, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 96, 26, 0, 0, 0, 0, 0, 0, 0, 0, -}; + v = re_pattern_syntax_table_1[field_2]; + v = re_pattern_syntax_table_2[(v << 5) | field_1]; + v = re_pattern_syntax_table_3[(v << 2) | field_0]; -/* Logical_Order_Exception: 209 bytes. */ - -RE_UINT32 re_get_logical_order_exception(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 16; - code = ch ^ (f << 16); - pos = (RE_UINT32)re_logical_order_exception_stage_1[f] << 5; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_logical_order_exception_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_logical_order_exception_stage_3[pos + f] << 7; - pos += code; - value = (re_logical_order_exception_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return (v >> offset) & 0x1; } -/* Other_ID_Start. */ - -static RE_UINT8 re_other_id_start_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_other_id_start_stage_2[] = { - 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_other_id_start_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; +/* Pattern_White_Space. */ +RE_UINT32 re_get_pattern_white_space(RE_UINT32 codepoint) { + if (0x09 <= codepoint && codepoint <= 0x0D) + return 1; + if (codepoint == 0x20) + return 1; + if (codepoint == 0x85) + return 1; + if (0x200E <= codepoint && codepoint <= 0x200F) + return 1; + if (0x2028 <= codepoint && codepoint <= 0x2029) + return 1; + + return 0; +} -static RE_UINT8 re_other_id_start_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 64, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, +/* Posix_AlNum. */ +static RE_UINT8 re_posix_alnum_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10, + 10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38, + 10, 10, 10, 10, 10, 39, 10, 10, 40, 10, 41, 42, 43, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 44, 13, 13, 13, 45, 46, 13, + 13, 13, 13, 47, 13, 13, 13, 13, 13, 13, 48, 10, 10, 10, 49, 10, + 13, 13, 13, 13, 50, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; -/* Other_ID_Start: 194 bytes. */ - -RE_UINT32 re_get_other_id_start(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_other_id_start_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_other_id_start_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_other_id_start_stage_3[pos + f] << 6; - pos += code; - value = (re_other_id_start_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Other_ID_Continue. */ - -static RE_UINT8 re_other_id_continue_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, +static RE_UINT8 re_posix_alnum_table_2[] = { + 0, 1, 2, 2, 0, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 6, 7, 0, 0, 8, 9, 10, 11, 5, 12, + 5, 5, 5, 5, 13, 5, 5, 5, 5, 14, 15, 5, 16, 17, 18, 19, + 20, 5, 21, 22, 5, 5, 23, 24, 25, 5, 26, 5, 5, 27, 28, 29, + 30, 31, 32, 33, 0, 34, 35, 36, 5, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 49, 53, 54, 55, 56, 57, 0, + 58, 59, 60, 61, 58, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 0, 76, 77, 78, 0, 79, 0, 80, 81, 82, 83, 0, 0, + 5, 84, 25, 5, 85, 5, 86, 87, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 88, 5, 89, 90, 91, 5, 92, 5, 74, 0, 93, 5, 5, 94, + 73, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 95, 2, 5, 5, 96, 97, 98, 98, 99, 5, 100, 101, 0, + 0, 5, 5, 32, 5, 102, 5, 103, 104, 105, 25, 106, 5, 107, 108, 0, + 109, 5, 104, 110, 0, 111, 79, 0, 5, 112, 113, 0, 5, 114, 5, 115, + 5, 116, 117, 118, 119, 66, 0, 120, 5, 5, 5, 5, 5, 5, 0, 121, + 5, 5, 5, 5, 5, 5, 5, 5, 94, 5, 122, 118, 5, 123, 124, 125, + 0, 0, 0, 126, 127, 0, 0, 0, 128, 129, 130, 5, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 131, 5, 108, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 132, 104, 5, 5, 5, 5, 133, 5, 86, 5, 134, 116, 135, 135, 5, + 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 137, 138, 73, 5, 139, 73, 5, 87, 140, 14, 5, 5, 141, 5, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 83, + 5, 5, 5, 5, 31, 0, 25, 118, 5, 5, 5, 5, 5, 5, 5, 5, + 142, 143, 5, 144, 5, 5, 5, 93, 145, 146, 5, 5, 147, 5, 148, 149, + 150, 151, 5, 98, 5, 5, 152, 153, 28, 102, 154, 83, 5, 155, 136, 156, + 5, 116, 157, 158, 5, 104, 159, 160, 161, 162, 87, 163, 5, 5, 5, 33, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 164, 165, 109, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 166, 5, 5, 167, 0, 168, 169, 170, 5, 5, 27, 171, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 118, 25, 5, 172, 5, 151, 173, + 0, 0, 0, 174, 5, 5, 5, 83, 0, 2, 2, 175, 5, 104, 176, 0, + 177, 178, 179, 0, 5, 5, 5, 74, 0, 0, 5, 180, 0, 0, 0, 0, + 0, 0, 0, 0, 83, 5, 181, 0, 5, 26, 102, 74, 118, 5, 182, 0, + 5, 5, 5, 5, 118, 25, 183, 109, 5, 184, 5, 61, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 116, 103, 151, 0, 0, 0, 0, + 185, 186, 103, 116, 104, 0, 0, 187, 103, 167, 0, 0, 5, 188, 0, 0, + 189, 103, 0, 83, 83, 0, 80, 190, 5, 103, 103, 154, 27, 0, 0, 0, + 5, 5, 16, 0, 5, 154, 5, 154, 5, 151, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 191, 0, 0, 83, 192, 193, 0, 0, 25, 190, 116, + 5, 5, 193, 0, 146, 32, 25, 16, 5, 154, 194, 195, 5, 5, 196, 0, + 197, 198, 0, 0, 199, 119, 5, 16, 40, 49, 200, 61, 0, 0, 0, 0, + 5, 5, 201, 202, 5, 5, 203, 0, 0, 0, 0, 0, 5, 204, 205, 0, + 5, 104, 206, 0, 5, 207, 0, 0, 66, 33, 0, 0, 0, 0, 0, 0, + 5, 32, 0, 0, 0, 5, 5, 208, 209, 210, 211, 0, 0, 212, 30, 213, + 5, 214, 25, 5, 215, 0, 5, 32, 0, 0, 0, 0, 0, 0, 0, 0, + 216, 217, 79, 218, 172, 219, 0, 0, 220, 221, 222, 223, 224, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 225, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 167, 0, 0, 0, + 5, 5, 5, 141, 5, 5, 5, 5, 5, 5, 61, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 32, 104, 0, 0, 0, 25, 157, 5, 93, 61, 227, 93, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 0, 0, 0, 0, 5, 5, 228, 5, 229, 0, 0, 230, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 231, + 5, 5, 5, 5, 5, 5, 103, 0, 16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 104, 0, 232, 194, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 109, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 233, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 34, 5, 235, 236, 237, 5, 238, 239, 240, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 241, 242, 87, 34, 34, 132, 132, 216, 216, 243, 0, + 244, 245, 0, 0, 0, 0, 0, 0, 5, 246, 247, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 248, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 190, 0, 5, 5, 249, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 237, 250, 251, 252, 253, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 163, 163, 108, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 118, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 180, 5, 5, 5, 5, 5, 5, + 118, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 255, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 79, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 33, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_posix_alnum_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 7, 0, 4, 32, 4, + 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, + 32, 0, 0, 0, 0, 0, 223, 188, 64, 215, 255, 255, 251, 255, 255, 255, + 255, 255, 191, 255, 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, + 255, 1, 0, 0, 0, 0, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, + 0, 0, 255, 7, 255, 255, 255, 254, 0, 192, 255, 255, 255, 255, 239, 31, + 254, 225, 0, 156, 0, 0, 255, 255, 0, 224, 255, 255, 255, 255, 3, 0, + 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 255, 252, 255, 31, 0, 0, + 255, 255, 255, 1, 255, 7, 0, 0, 255, 255, 223, 255, 255, 0, 240, 255, + 248, 3, 255, 255, 255, 255, 255, 239, 255, 223, 225, 255, 15, 0, 254, 255, + 239, 159, 249, 255, 255, 253, 197, 227, 159, 89, 128, 176, 15, 0, 3, 16, + 238, 135, 249, 255, 255, 253, 109, 195, 135, 25, 2, 94, 0, 0, 63, 0, + 238, 191, 251, 255, 255, 253, 237, 227, 191, 27, 1, 0, 15, 0, 0, 30, + 238, 159, 249, 255, 159, 25, 192, 176, 15, 0, 2, 0, 236, 199, 61, 214, + 24, 199, 255, 195, 199, 29, 129, 0, 239, 223, 253, 255, 255, 253, 255, 227, + 223, 29, 96, 7, 15, 0, 0, 0, 255, 253, 239, 227, 223, 29, 96, 64, + 15, 0, 6, 0, 255, 223, 253, 255, 255, 255, 255, 231, 223, 93, 240, 128, + 15, 0, 0, 252, 238, 255, 127, 252, 255, 255, 251, 47, 127, 128, 95, 255, + 0, 0, 12, 0, 254, 255, 255, 255, 255, 255, 255, 7, 127, 32, 0, 0, + 214, 247, 255, 255, 175, 255, 255, 59, 95, 32, 0, 240, 1, 0, 0, 0, + 255, 254, 255, 255, 255, 31, 254, 255, 3, 255, 255, 254, 255, 255, 255, 31, + 255, 255, 127, 249, 255, 255, 0, 60, 191, 32, 255, 255, 255, 255, 255, 247, + 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, + 255, 255, 61, 255, 255, 255, 0, 0, 255, 255, 63, 63, 255, 159, 255, 255, + 255, 199, 255, 1, 255, 223, 15, 0, 255, 255, 15, 0, 255, 223, 13, 0, + 255, 255, 207, 255, 255, 1, 128, 16, 255, 7, 255, 255, 255, 255, 63, 0, + 255, 255, 255, 127, 255, 15, 255, 1, 255, 63, 31, 0, 255, 15, 255, 255, + 255, 3, 0, 0, 255, 255, 255, 15, 254, 255, 31, 0, 128, 0, 0, 128, + 255, 255, 239, 255, 239, 15, 0, 0, 255, 243, 0, 252, 191, 255, 3, 0, + 255, 255, 127, 0, 0, 224, 0, 252, 255, 255, 255, 63, 255, 1, 255, 255, + 0, 222, 111, 4, 128, 255, 31, 0, 63, 63, 255, 170, 255, 255, 223, 95, + 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, + 132, 252, 47, 62, 80, 189, 255, 243, 224, 67, 0, 0, 0, 0, 192, 255, + 255, 127, 255, 255, 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, + 0, 128, 0, 0, 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 224, + 224, 255, 255, 255, 255, 127, 0, 0, 255, 31, 255, 255, 0, 12, 0, 0, + 255, 127, 240, 143, 0, 0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, + 252, 7, 0, 0, 0, 0, 224, 255, 191, 255, 255, 255, 255, 0, 0, 0, + 47, 0, 0, 0, 0, 0, 252, 232, 255, 255, 7, 0, 255, 255, 247, 255, + 255, 255, 0, 124, 255, 63, 0, 0, 255, 255, 127, 252, 5, 0, 0, 56, + 255, 255, 60, 0, 126, 126, 126, 0, 127, 127, 255, 255, 255, 3, 255, 255, + 15, 0, 255, 255, 127, 248, 255, 255, 255, 63, 255, 255, 255, 255, 255, 3, + 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, + 255, 255, 252, 255, 0, 0, 255, 15, 0, 0, 223, 255, 192, 255, 255, 255, + 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, + 255, 255, 31, 0, 255, 255, 1, 0, 15, 255, 62, 0, 255, 255, 15, 255, + 255, 0, 255, 255, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, + 255, 255, 255, 192, 111, 240, 239, 254, 31, 0, 0, 0, 255, 27, 3, 0, + 128, 0, 255, 255, 63, 0, 0, 0, 240, 0, 255, 255, 255, 255, 71, 0, + 30, 192, 0, 20, 255, 255, 251, 255, 255, 255, 159, 64, 127, 189, 255, 191, + 159, 25, 129, 224, 187, 7, 0, 128, 3, 0, 0, 0, 179, 0, 0, 0, + 255, 255, 63, 127, 0, 0, 0, 63, 17, 0, 0, 0, 255, 255, 63, 1, + 0, 0, 0, 128, 127, 242, 111, 255, 255, 255, 191, 153, 7, 0, 0, 0, + 255, 252, 255, 255, 26, 0, 0, 0, 255, 255, 231, 127, 255, 255, 255, 32, + 255, 253, 255, 255, 255, 255, 127, 127, 0, 0, 252, 255, 255, 254, 127, 0, + 127, 251, 255, 255, 255, 255, 127, 180, 203, 0, 0, 0, 191, 253, 255, 255, + 255, 127, 123, 1, 0, 0, 1, 0, 127, 0, 0, 0, 248, 255, 255, 224, + 255, 135, 255, 255, 255, 128, 255, 255, 11, 0, 3, 0, 255, 255, 255, 0, + 0, 0, 7, 0, 255, 7, 255, 31, 255, 1, 255, 67, 255, 255, 255, 223, + 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, + 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 247, 15, 0, 0, + 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 128, 63, 0, 64, 0, 0, + 255, 15, 0, 0, 143, 8, 0, 0, 150, 254, 247, 10, 132, 234, 150, 170, + 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255 }; -static RE_UINT8 re_other_id_continue_stage_2[] = { - 0, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; +RE_UINT32 re_get_posix_alnum(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_other_id_continue_stage_3[] = { - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_other_id_continue_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, - 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 3, 0, - 0, 0, 0, 4, 0, 0, 0, 0, -}; + v = re_posix_alnum_table_1[field_2]; + v = re_posix_alnum_table_2[(v << 5) | field_1]; + v = re_posix_alnum_table_3[(v << 2) | field_0]; -/* Other_ID_Continue: 202 bytes. */ - -RE_UINT32 re_get_other_id_continue(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_other_id_continue_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_other_id_continue_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_other_id_continue_stage_3[pos + f] << 6; - pos += code; - value = (re_other_id_continue_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return (v >> offset) & 0x1; } -/* Sentence_Terminal. */ +/* Posix_Digit. */ +RE_UINT32 re_get_posix_digit(RE_UINT32 codepoint) { + if (0x30 <= codepoint && codepoint <= 0x39) + return 1; -static RE_UINT8 re_sentence_terminal_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 7, 8, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; + return 0; +} -static RE_UINT8 re_sentence_terminal_stage_2[] = { - 0, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, - 7, 1, 1, 8, 1, 1, 9, 10, 11, 12, 13, 14, 15, 1, 1, 1, - 16, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 1, - 18, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 19, 1, 20, 1, 21, 22, 23, 24, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 26, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 1, 1, 1, 1, 28, - 29, 30, 31, 1, 32, 33, 34, 35, 1, 1, 36, 1, 34, 1, 37, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, 39, 1, 1, 40, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 42, 1, 1, 1, 1, 1, +/* Posix_Punct. */ +static RE_UINT8 re_posix_punct_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 13, 27, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 28, 29, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 30, + 13, 13, 13, 13, 31, 32, 33, 13, 34, 13, 35, 36, 37, 38, 39, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13 }; -static RE_UINT8 re_sentence_terminal_stage_3[] = { - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 0, - 5, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, - 0, 12, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, - 0, 0, 15, 0, 0, 0, 0, 0, 0, 16, 0, 3, 0, 0, 0, 0, - 0, 17, 18, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, - 22, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 24, 0, 0, 22, 0, - 0, 25, 0, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 0, 28, - 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 30, 0, 0, 0, 0, 0, - 1, 0, 0, 31, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, - 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 3, 34, 0, - 0, 0, 35, 0, 0, 0, 36, 0, 0, 37, 0, 0, 0, 2, 0, 0, - 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, - 0, 0, 40, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, - 0, 0, 0, 22, 0, 0, 0, 44, 0, 43, 45, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, - 0, 0, 0, 0, 47, 0, 0, 0, -}; +static RE_UINT8 re_posix_punct_table_2[] = { + 0, 1, 2, 3, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 8, 9, 0, 0, 10, + 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 12, 0, 13, 14, 15, 16, + 17, 0, 0, 18, 0, 0, 19, 20, 21, 0, 0, 0, 0, 0, 0, 22, + 0, 23, 14, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 25, + 0, 0, 0, 10, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 28, + 0, 0, 0, 29, 30, 0, 0, 0, 0, 0, 31, 32, 0, 0, 0, 33, + 0, 34, 35, 0, 0, 0, 0, 0, 36, 37, 0, 0, 38, 39, 40, 0, + 0, 0, 41, 0, 39, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 0, 0, + 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 46, 47, 0, 0, 48, 0, 49, 0, 0, 0, 0, 50, 0, + 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 39, 53, + 39, 0, 0, 0, 0, 54, 0, 0, 0, 0, 12, 55, 0, 0, 0, 56, + 0, 57, 0, 39, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 60, 61, + 62, 63, 64, 65, 66, 53, 0, 0, 67, 68, 69, 0, 70, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 71, 51, 0, 56, 72, 0, 0, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 72, 73, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 74, 75, 53, 53, 53, + 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 27, 0, 0, 0, 0, + 53, 77, 78, 0, 79, 53, 53, 80, 53, 53, 53, 53, 53, 53, 72, 81, + 82, 83, 0, 0, 47, 45, 0, 42, 0, 0, 0, 0, 84, 0, 53, 85, + 64, 86, 87, 53, 86, 88, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 62, 53, 71, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 89, 0, 0, 90, 0, 0, 0, 91, 92, 93, 0, 0, 94, 0, 0, 0, + 0, 95, 0, 96, 0, 0, 97, 98, 0, 97, 34, 0, 0, 0, 99, 0, + 0, 0, 56, 100, 0, 0, 39, 26, 0, 0, 42, 101, 0, 0, 0, 102, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 0, 0, 0, 104, 93, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 105, + 44, 62, 106, 107, 0, 0, 0, 0, 1, 2, 2, 108, 0, 0, 0, 109, + 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, 112, 113, 45, 62, 114, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 115, 0, 0, 0, 0, 34, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 116, 34, 0, 0, 117, 118, 0, 112, 0, 0, 119, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, + 0, 0, 122, 0, 0, 123, 93, 0, 0, 0, 85, 124, 0, 0, 125, 0, + 0, 126, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 127, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 129, 0, + 0, 0, 130, 131, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, + 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 11, + 0, 34, 71, 0, 133, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 134, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, 0, 135, 136, + 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 97, 0, 0, 0, 138, 0, 111, 139, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 53, 53, 53, 53, 53, 53, 72, 53, 142, 53, 143, 144, 145, 53, 43, + 53, 53, 146, 0, 0, 0, 0, 0, 53, 53, 92, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 147, 42, 138, 138, 31, 31, 103, 103, 148, 0, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 0, 140, 0, 149, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 151, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 153, 53, 53, 80, 154, 155, 72, 156, 157, 41, 41, 86, 21, 0, 158, + 159, 160, 161, 108, 0, 0, 0, 0, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 162, 163, 53, 53, 53, 80, 53, 53, 164, 165, + 153, 53, 166, 53, 63, 167, 0, 0, 53, 53, 53, 168, 53, 53, 169, 53, + 53, 53, 80, 170, 171, 172, 173, 0, 53, 53, 53, 53, 106, 53, 51, 0 +}; + +static RE_UINT8 re_posix_punct_table_3[] = { + 0, 0, 0, 0, 254, 255, 0, 252, 1, 0, 0, 248, 1, 0, 0, 120, + 254, 219, 211, 137, 0, 0, 128, 0, 60, 0, 252, 255, 224, 175, 255, 255, + 0, 0, 32, 64, 176, 0, 0, 0, 0, 0, 64, 0, 4, 0, 0, 0, + 0, 0, 0, 252, 0, 230, 0, 0, 0, 0, 0, 64, 73, 0, 0, 0, + 0, 0, 24, 0, 192, 255, 0, 200, 0, 60, 0, 0, 0, 0, 16, 64, + 0, 2, 0, 96, 255, 63, 0, 0, 0, 0, 192, 195, 0, 0, 255, 127, + 48, 0, 1, 0, 0, 0, 12, 44, 0, 0, 3, 0, 0, 0, 1, 0, + 0, 0, 248, 7, 0, 0, 128, 128, 16, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 2, 0, 0, 16, 0, 0, 0, 0, 128, 0, 128, 0, 12, + 254, 255, 255, 252, 0, 0, 80, 61, 32, 0, 0, 0, 0, 0, 0, 192, + 191, 223, 255, 7, 0, 252, 0, 0, 0, 0, 0, 8, 255, 1, 0, 0, + 0, 0, 255, 3, 1, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 24, + 0, 56, 0, 0, 0, 0, 96, 0, 0, 0, 112, 15, 255, 7, 0, 0, + 49, 0, 0, 0, 255, 255, 255, 255, 127, 63, 0, 0, 255, 7, 240, 31, + 0, 0, 0, 240, 0, 0, 0, 248, 255, 0, 8, 0, 0, 0, 0, 160, + 3, 224, 0, 224, 0, 224, 0, 96, 0, 0, 255, 255, 255, 0, 255, 255, + 255, 255, 255, 127, 0, 0, 0, 124, 0, 124, 0, 0, 123, 3, 208, 193, + 175, 66, 0, 12, 31, 188, 0, 0, 0, 12, 255, 255, 127, 0, 0, 0, + 255, 255, 63, 0, 0, 0, 240, 255, 255, 255, 207, 255, 255, 255, 191, 255, + 224, 7, 0, 222, 255, 127, 255, 255, 255, 255, 7, 0, 255, 255, 255, 251, + 255, 255, 15, 0, 0, 0, 255, 15, 30, 255, 255, 255, 1, 0, 193, 224, + 0, 0, 195, 255, 15, 0, 0, 0, 0, 252, 255, 255, 255, 0, 1, 0, + 255, 255, 1, 0, 0, 224, 0, 0, 0, 0, 8, 64, 0, 0, 252, 0, + 255, 255, 127, 0, 3, 0, 0, 0, 0, 6, 0, 0, 0, 15, 192, 3, + 0, 0, 240, 0, 0, 192, 0, 0, 0, 0, 0, 23, 254, 63, 0, 192, + 0, 0, 128, 3, 0, 12, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, + 0, 0, 252, 255, 0, 0, 0, 48, 255, 255, 247, 255, 127, 15, 0, 0, + 63, 0, 0, 0, 127, 127, 0, 48, 7, 0, 0, 0, 0, 0, 128, 255, + 0, 0, 0, 254, 255, 115, 255, 31, 255, 255, 255, 31, 0, 0, 128, 1, + 0, 0, 255, 1, 0, 1, 0, 0, 0, 0, 127, 0, 0, 0, 0, 30, + 0, 32, 0, 0, 0, 0, 224, 3, 128, 63, 0, 0, 0, 0, 0, 216, + 0, 0, 48, 0, 224, 33, 0, 232, 0, 0, 0, 63, 0, 248, 0, 44, + 64, 0, 0, 0, 254, 255, 255, 0, 14, 0, 0, 0, 255, 31, 0, 0, + 112, 0, 0, 0, 0, 0, 0, 220, 62, 0, 0, 0, 0, 0, 224, 255, + 255, 255, 3, 128, 0, 0, 31, 0, 0, 0, 32, 0, 48, 0, 0, 0, + 0, 0, 128, 7, 0, 0, 0, 144, 127, 254, 255, 255, 31, 28, 0, 0, + 24, 240, 255, 255, 255, 195, 255, 255, 35, 0, 0, 0, 2, 0, 0, 8, + 8, 0, 0, 0, 0, 224, 223, 255, 239, 15, 0, 0, 0, 16, 1, 0, + 0, 64, 0, 0, 255, 15, 255, 255, 255, 127, 254, 255, 254, 255, 254, 255, + 0, 224, 255, 255, 255, 255, 0, 0, 192, 255, 255, 255, 7, 0, 255, 255, + 255, 255, 255, 15, 255, 1, 3, 0, 255, 255, 255, 0, 255, 31, 255, 31, + 255, 255, 255, 1, 255, 15, 0, 0, 255, 0, 255, 3, 255, 63, 3, 0, + 255, 255, 255, 253, 255, 239, 255, 255, 255, 63, 31, 7, 127, 0, 255, 255, + 255, 1, 127, 0, 7, 0, 127, 0 +}; + +RE_UINT32 re_get_posix_punct(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_posix_punct_table_1[field_2]; + v = re_posix_punct_table_2[(v << 5) | field_1]; + v = re_posix_punct_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} -static RE_UINT8 re_sentence_terminal_stage_4[] = { - 0, 0, 0, 0, 2, 64, 0, 128, 0, 2, 0, 0, 0, 0, 0, 192, - 0, 0, 16, 0, 7, 0, 0, 0, 0, 0, 0, 2, 0, 0, 128, 98, - 48, 0, 0, 0, 0, 12, 0, 0, 132, 1, 0, 0, 0, 64, 0, 0, - 0, 0, 96, 0, 8, 2, 0, 0, 0, 15, 0, 0, 0, 0, 0, 204, - 0, 0, 0, 24, 0, 0, 0, 48, 128, 3, 0, 0, 0, 64, 0, 16, - 4, 0, 0, 0, 0, 0, 0, 128, 0, 192, 0, 0, 0, 0, 136, 0, - 0, 0, 192, 0, 0, 128, 0, 0, 0, 3, 0, 0, 0, 0, 0, 224, - 0, 0, 3, 0, 0, 8, 0, 0, 0, 0, 196, 0, 2, 0, 0, 0, - 0, 0, 224, 3, 128, 1, 0, 0, 3, 0, 0, 0, 14, 0, 0, 0, - 96, 32, 0, 192, 0, 0, 0, 27, 0, 24, 0, 0, 12, 254, 255, 0, - 6, 0, 0, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 0, 128, 1, - 0, 0, 32, 0, 16, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, -}; +/* Posix_XDigit. */ +RE_UINT32 re_get_posix_xdigit(RE_UINT32 codepoint) { + if (0x30 <= codepoint && codepoint <= 0x39) + return 1; + if (0x41 <= codepoint && codepoint <= 0x46) + return 1; + if (0x61 <= codepoint && codepoint <= 0x66) + return 1; + + return 0; +} -/* Sentence_Terminal: 960 bytes. */ - -RE_UINT32 re_get_sentence_terminal(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_sentence_terminal_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_sentence_terminal_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_sentence_terminal_stage_3[pos + f] << 5; - pos += code; - value = (re_sentence_terminal_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; +/* Prepended_Concatenation_Mark. */ +RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 codepoint) { + if (0x0600 <= codepoint && codepoint <= 0x0605) + return 1; + if (codepoint == 0x06DD) + return 1; + if (codepoint == 0x070F) + return 1; + if (codepoint == 0x08E2) + return 1; + if (codepoint == 0x0110BD) + return 1; + if (codepoint == 0x0110CD) + return 1; + + return 0; } -/* Variation_Selector. */ +/* Print. */ +static RE_UINT8 re_print_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 14, 13, 15, 16, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 17, 18, 18, 13, 13, 13, 13, 13, 13, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 18, 18, 13, 31, 18, 18, + 18, 32, 18, 18, 18, 18, 18, 18, 18, 18, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 18, 18, 18, 18, 18, 18, 18, 18, 37, 18, 18, 38, + 18, 18, 18, 18, 39, 40, 41, 18, 42, 18, 43, 44, 45, 46, 47, 18, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 48, 13, 13, 13, 49, 50, 13, + 13, 13, 13, 51, 13, 13, 13, 13, 13, 13, 52, 18, 18, 18, 53, 18, + 13, 13, 13, 13, 54, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56 +}; -static RE_UINT8 re_variation_selector_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, +static RE_UINT16 re_print_table_2[] = { + 0, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, 5, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 1, 8, 1, 9, 10, + 11, 1, 1, 1, 1, 1, 1, 1, 12, 1, 13, 1, 1, 14, 1, 15, + 1, 16, 17, 18, 0, 19, 20, 1, 1, 1, 1, 1, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 30, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 40, 44, 45, 46, 40, 1, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 0, 56, 57, 58, 0, 1, 1, 59, 60, 61, 11, 62, 0, + 1, 1, 1, 1, 1, 1, 63, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 64, 1, 65, 66, 67, 1, 68, 1, 15, 69, 70, 1, 1, 71, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 69, 1, 1, 72, 73, 74, 75, 76, 1, 1, 77, 78, + 79, 1, 1, 72, 1, 80, 1, 81, 2, 82, 83, 84, 1, 85, 86, 1, + 87, 1, 2, 88, 78, 89, 90, 0, 1, 1, 85, 69, 1, 1, 1, 91, + 1, 92, 93, 1, 94, 15, 9, 95, 1, 1, 1, 1, 1, 1, 1, 96, + 1, 1, 1, 1, 1, 1, 1, 1, 71, 1, 97, 77, 1, 19, 98, 99, + 1, 100, 1, 101, 102, 1, 103, 104, 1, 1, 1, 1, 85, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 105, 18, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 106, 107, 1, 1, 1, + 1, 108, 2, 1, 1, 1, 1, 109, 1, 63, 1, 110, 74, 111, 111, 1, + 1, 1, 112, 0, 96, 1, 1, 75, 1, 1, 1, 1, 1, 1, 81, 113, + 1, 1, 53, 1, 7, 1, 1, 1, 114, 6, 1, 1, 108, 1, 1, 115, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 69, + 1, 1, 1, 1, 116, 1, 117, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 118, 1, 1, 1, 1, 1, 119, 1, 1, 1, 1, 1, 1, 120, 121, + 1, 122, 1, 119, 1, 1, 123, 1, 1, 1, 124, 69, 1, 1, 125, 2, + 1, 74, 126, 1, 1, 1, 127, 74, 128, 129, 1, 85, 1, 1, 1, 130, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 115, 131, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 89, 1, 1, 70, 0, 132, 133, 134, 1, 1, 1, 135, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 103, 1, 136, 1, 137, 138, + 70, 1, 139, 140, 1, 1, 1, 88, 53, 1, 1, 1, 1, 2, 141, 142, + 143, 144, 145, 0, 1, 1, 1, 95, 146, 147, 1, 1, 102, 90, 103, 77, + 0, 0, 0, 0, 69, 1, 104, 55, 1, 148, 80, 95, 149, 1, 150, 0, + 1, 1, 1, 1, 77, 151, 152, 55, 1, 9, 1, 153, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 74, 81, 137, 0, 0, 0, 0, + 154, 155, 107, 1, 2, 156, 0, 157, 158, 159, 0, 0, 1, 160, 136, 1, + 161, 162, 163, 1, 1, 0, 1, 164, 1, 165, 166, 167, 168, 169, 0, 0, + 1, 1, 170, 0, 1, 112, 1, 171, 1, 172, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 1, 173, 0, 0, 1, 9, 70, 0, 0, 103, 118, 74, + 1, 1, 174, 175, 1, 1, 176, 177, 1, 19, 9, 74, 1, 1, 1, 178, + 179, 2, 0, 0, 180, 151, 1, 181, 21, 182, 183, 184, 0, 0, 0, 0, + 1, 1, 185, 186, 1, 1, 172, 0, 0, 0, 0, 0, 1, 166, 77, 0, + 1, 1, 187, 188, 1, 72, 189, 0, 15, 85, 0, 0, 0, 0, 0, 0, + 1, 55, 0, 0, 0, 1, 1, 190, 191, 192, 193, 0, 0, 100, 3, 194, + 1, 1, 9, 1, 1, 195, 1, 72, 0, 0, 0, 0, 0, 0, 0, 0, + 196, 197, 198, 116, 136, 199, 0, 0, 200, 201, 172, 202, 203, 189, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 204, 1, 205, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 70, 0, 0, 0, + 1, 1, 1, 206, 1, 1, 1, 1, 1, 1, 207, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 72, 2, 209, 0, 0, 103, 210, 1, 1, 211, 212, 213, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 95, 0, 0, 0, 1, 1, 214, 1, 215, 0, 0, 216, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 119, + 1, 1, 1, 1, 1, 1, 81, 0, 170, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 217, 218, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 219, 220, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 81, 1, 221, 1, 1, 1, 1, 1, 170, + 1, 1, 222, 0, 0, 0, 0, 75, 1, 1, 74, 72, 0, 0, 0, 0, + 1, 1, 19, 1, 11, 223, 224, 1, 225, 226, 227, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 228, 1, 1, 1, 1, 1, 1, 1, 1, 229, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 230, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 232, 233, 0, 0, 0, 0, 0, 0, 1, 234, 209, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 159, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 235, 0, 1, 1, 236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 237, 1, 238, 0, 0, 53, 77, 0, 0, 0, 0, 0, 0, + 224, 239, 240, 241, 242, 243, 0, 244, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 85, 1, 1, 75, 245, 246, 81, 1, 1, 1, 1, 1, 247, 0, 248, + 249, 55, 250, 222, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 119, 251, 1, 1, 1, 75, 1, 1, 72, 118, + 85, 1, 172, 1, 9, 252, 0, 0, 1, 1, 1, 253, 1, 1, 143, 1, + 1, 1, 75, 254, 117, 255, 256, 0, 1, 1, 1, 1, 139, 1, 18, 257, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 77, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 238, 1, 1, 1, 1, 1, 1, + 77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 258, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 90, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 0, 0, 0, 0, 0, + 259, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 213, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 77 }; -static RE_UINT8 re_variation_selector_stage_2[] = { - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_print_table_3[] = { + 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 252, + 240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 254, 255, 255, 255, 127, 254, + 255, 231, 254, 255, 255, 0, 255, 255, 255, 135, 31, 0, 255, 255, 255, 223, + 255, 191, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 255, 231, + 255, 63, 255, 127, 255, 255, 255, 79, 255, 7, 0, 0, 255, 255, 223, 255, + 255, 0, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176, + 207, 255, 255, 127, 238, 135, 249, 255, 255, 253, 109, 211, 135, 57, 2, 94, + 192, 255, 127, 0, 238, 191, 251, 255, 255, 253, 237, 243, 191, 59, 1, 0, + 207, 255, 3, 254, 238, 159, 249, 255, 159, 57, 224, 176, 207, 255, 255, 0, + 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, 192, 255, 255, 7, + 255, 223, 253, 255, 255, 253, 255, 227, 223, 61, 96, 7, 207, 255, 128, 255, + 255, 253, 239, 243, 223, 61, 96, 64, 207, 255, 6, 0, 223, 253, 240, 255, + 207, 255, 255, 255, 238, 255, 127, 252, 255, 255, 251, 47, 127, 132, 95, 255, + 192, 255, 28, 0, 254, 255, 255, 255, 255, 255, 255, 135, 255, 255, 255, 15, + 214, 247, 255, 255, 175, 255, 255, 63, 95, 63, 255, 243, 255, 254, 255, 255, + 255, 31, 254, 255, 255, 255, 255, 254, 255, 223, 255, 7, 191, 32, 255, 255, + 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, + 255, 255, 61, 255, 255, 255, 255, 31, 255, 255, 255, 3, 255, 255, 63, 63, + 255, 255, 255, 1, 255, 223, 31, 0, 255, 255, 127, 0, 255, 255, 15, 0, + 255, 223, 13, 0, 255, 255, 255, 63, 255, 3, 255, 3, 255, 127, 255, 3, + 255, 7, 255, 255, 255, 255, 63, 0, 255, 15, 255, 15, 241, 255, 255, 255, + 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 199, 255, 255, 255, 207, + 255, 255, 255, 159, 255, 63, 255, 255, 1, 0, 0, 0, 255, 255, 15, 240, + 255, 255, 255, 248, 255, 227, 255, 255, 255, 1, 255, 255, 255, 255, 255, 7, + 255, 255, 255, 251, 63, 63, 255, 170, 223, 255, 207, 239, 255, 255, 220, 127, + 255, 252, 255, 255, 223, 255, 243, 255, 255, 127, 255, 31, 0, 0, 255, 255, + 255, 255, 1, 0, 127, 0, 0, 0, 255, 255, 207, 255, 255, 255, 191, 255, + 255, 127, 255, 255, 255, 255, 15, 254, 255, 128, 1, 128, 127, 127, 127, 127, + 255, 255, 7, 0, 0, 0, 255, 15, 224, 255, 255, 255, 15, 0, 255, 255, + 255, 31, 255, 255, 127, 0, 255, 255, 255, 15, 0, 0, 255, 255, 255, 0, + 252, 7, 0, 0, 0, 0, 224, 255, 255, 31, 255, 3, 63, 192, 255, 3, + 255, 255, 15, 128, 255, 191, 255, 195, 255, 63, 255, 243, 7, 0, 0, 248, + 126, 126, 126, 0, 127, 127, 255, 255, 255, 63, 255, 3, 127, 248, 255, 255, + 127, 0, 248, 224, 255, 255, 127, 95, 219, 255, 255, 255, 3, 0, 248, 255, + 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 63, 255, 255, 247, 255, + 127, 15, 223, 255, 252, 252, 252, 28, 127, 127, 0, 62, 255, 239, 255, 255, + 127, 255, 255, 183, 255, 63, 255, 63, 135, 255, 255, 255, 255, 255, 143, 255, + 15, 224, 255, 255, 255, 255, 255, 191, 15, 255, 63, 0, 255, 3, 255, 255, + 255, 255, 15, 255, 15, 128, 0, 0, 63, 253, 255, 255, 255, 255, 191, 145, + 128, 255, 0, 0, 255, 255, 55, 248, 255, 255, 255, 143, 255, 255, 255, 131, + 255, 255, 255, 240, 111, 240, 239, 254, 255, 255, 63, 135, 255, 1, 255, 1, + 127, 248, 127, 0, 255, 255, 63, 254, 255, 255, 63, 255, 255, 255, 7, 255, + 255, 255, 3, 30, 0, 254, 0, 0, 255, 1, 0, 0, 255, 255, 7, 252, + 255, 0, 255, 3, 255, 59, 3, 0, 255, 63, 252, 255, 255, 255, 0, 128, + 3, 32, 255, 255, 255, 1, 255, 3, 254, 255, 31, 0, 255, 255, 251, 255, + 127, 189, 255, 191, 255, 7, 255, 3, 255, 253, 237, 251, 159, 57, 129, 224, + 207, 31, 31, 0, 255, 255, 255, 239, 3, 0, 0, 0, 31, 0, 255, 3, + 255, 31, 0, 0, 255, 3, 0, 0, 255, 255, 7, 128, 127, 242, 111, 255, + 255, 255, 191, 249, 127, 0, 255, 3, 31, 0, 0, 0, 7, 0, 0, 0, + 255, 253, 255, 255, 255, 255, 127, 255, 63, 0, 255, 255, 255, 254, 127, 0, + 127, 251, 255, 255, 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251, 1, + 0, 0, 1, 0, 255, 255, 3, 128, 255, 127, 31, 0, 15, 0, 0, 0, + 255, 127, 255, 1, 255, 195, 0, 0, 255, 63, 63, 0, 63, 0, 255, 251, + 251, 255, 255, 224, 255, 255, 0, 0, 255, 135, 255, 255, 255, 128, 255, 255, + 31, 0, 3, 0, 0, 0, 7, 0, 240, 0, 255, 255, 255, 7, 255, 31, + 255, 1, 255, 243, 127, 254, 255, 255, 63, 0, 0, 0, 100, 222, 255, 235, + 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, + 63, 255, 255, 255, 255, 207, 255, 255, 255, 15, 0, 248, 254, 255, 0, 0, + 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 255, 63, 159, 255, 127, 0, + 255, 15, 255, 195, 0, 0, 254, 255, 255, 255, 31, 0, 150, 254, 247, 10, + 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, + 0, 0, 3, 0, 255, 127, 254, 255, 254, 255, 254, 255, 255, 63, 0, 0, + 192, 255, 255, 255, 7, 0, 255, 255, 255, 1, 3, 0, 255, 31, 255, 31, + 255, 63, 3, 0, 255, 255, 255, 253, 255, 63, 31, 7, 255, 1, 127, 0, + 7, 0, 127, 0, 0, 0, 255, 3, 3, 0, 255, 255, 2, 0, 0, 0 }; -static RE_UINT8 re_variation_selector_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 3, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_print(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_variation_selector_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, - 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* Variation_Selector: 236 bytes. */ - -RE_UINT32 re_get_variation_selector(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_variation_selector_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_variation_selector_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_variation_selector_stage_3[pos + f] << 6; - pos += code; - value = (re_variation_selector_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} + v = re_print_table_1[field_2]; + v = re_print_table_2[(v << 5) | field_1]; + v = re_print_table_3[(v << 2) | field_0]; -/* Pattern_White_Space. */ + return (v >> offset) & 0x1; +} -static RE_UINT8 re_pattern_white_space_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* Quotation_Mark. */ +static RE_UINT8 re_quotation_mark_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 4, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_pattern_white_space_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_pattern_white_space_stage_3[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_pattern_white_space_stage_4[] = { - 0, 62, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 3, 0, 0, -}; - -/* Pattern_White_Space: 178 bytes. */ - -RE_UINT32 re_get_pattern_white_space(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_pattern_white_space_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_pattern_white_space_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_pattern_white_space_stage_3[pos + f] << 6; - pos += code; - value = (re_pattern_white_space_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Pattern_Syntax. */ - -static RE_UINT8 re_pattern_syntax_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_pattern_syntax_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 3, 4, 5, 3, 3, 1, 6, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 9, -}; - -static RE_UINT8 re_pattern_syntax_stage_3[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 6, 4, 4, 4, 4, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 9, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 10, 11, 8, - 8, 8, 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 13, 4, 4, 4, 4, 14, 4, 4, 4, 4, 4, 4, -}; - -static RE_UINT8 re_pattern_syntax_stage_4[] = { - 0, 0, 0, 0, 254, 255, 0, 252, 1, 0, 0, 120, 1, 0, 0, 120, - 0, 0, 0, 0, 254, 90, 67, 136, 0, 0, 128, 0, 0, 0, 128, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 0, 255, 127, - 254, 255, 239, 127, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 240, 255, 255, 255, 255, 255, - 14, 255, 255, 255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 192, - 96, 0, 0, 0, 0, 0, 0, 0, -}; - -/* Pattern_Syntax: 364 bytes. */ - -RE_UINT32 re_get_pattern_syntax(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_pattern_syntax_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_pattern_syntax_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_pattern_syntax_stage_3[pos + f] << 6; - pos += code; - value = (re_pattern_syntax_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Prepended_Concatenation_Mark. */ - -static RE_UINT8 re_prepended_concatenation_mark_stage_1[] = { - 0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_prepended_concatenation_mark_stage_2[] = { - 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_quotation_mark_table_2[] = { + 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_prepended_concatenation_mark_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 3, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_prepended_concatenation_mark_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 32, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, - 0, 32, 0, 0, 0, 0, 0, 0, -}; - -/* Prepended_Concatenation_Mark: 236 bytes. */ - -RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_prepended_concatenation_mark_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_prepended_concatenation_mark_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_prepended_concatenation_mark_stage_3[pos + f] << 6; - pos += code; - value = (re_prepended_concatenation_mark_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Regional_Indicator. */ - -static RE_UINT8 re_regional_indicator_stage_1[] = { - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -}; - -static RE_UINT8 re_regional_indicator_stage_2[] = { + 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -}; - -static RE_UINT8 re_regional_indicator_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0 }; -static RE_UINT8 re_regional_indicator_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, +static RE_UINT8 re_quotation_mark_table_3[] = { + 0, 0, 0, 0, 132, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 255, + 0, 0, 0, 6, 4, 0, 0, 0, 0, 240, 0, 224, 30, 0, 0, 0, + 12, 0, 0, 0 }; -/* Regional_Indicator: 130 bytes. */ - -RE_UINT32 re_get_regional_indicator(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_regional_indicator_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_regional_indicator_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_regional_indicator_stage_3[pos + f] << 7; - pos += code; - value = (re_regional_indicator_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Hangul_Syllable_Type. */ - -static RE_UINT8 re_hangul_syllable_type_stage_1[] = { - 0, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, -}; +RE_UINT32 re_get_quotation_mark(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_hangul_syllable_type_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 4, 5, 6, - 7, 8, 9, 3, 4, 5, 6, 7, 8, 9, 3, 4, 5, 6, 7, 8, - 9, 3, 4, 5, 6, 7, 8, 9, 3, 4, 5, 6, 7, 8, 9, 3, - 4, 5, 6, 7, 8, 9, 3, 10, 0, 0, 0, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_hangul_syllable_type_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4, - 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, - 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, - 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, - 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, - 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, - 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, - 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, - 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 11, 2, 12, 4, 4, 13, -}; + v = re_quotation_mark_table_1[field_2]; + v = re_quotation_mark_table_2[(v << 5) | field_1]; + v = re_quotation_mark_table_3[(v << 2) | field_0]; -static RE_UINT8 re_hangul_syllable_type_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, -}; + return (v >> offset) & 0x1; +} -/* Hangul_Syllable_Type: 664 bytes. */ - -RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_hangul_syllable_type_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_hangul_syllable_type_stage_2[pos + f] << 4; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_hangul_syllable_type_stage_3[pos + f] << 4; - value = re_hangul_syllable_type_stage_4[pos + code]; - - return value; +/* Radical. */ +RE_UINT32 re_get_radical(RE_UINT32 codepoint) { + if (0x2E80 <= codepoint && codepoint <= 0x2E99) + return 1; + if (0x2E9B <= codepoint && codepoint <= 0x2EF3) + return 1; + if (0x2F00 <= codepoint && codepoint <= 0x2FD5) + return 1; + + return 0; } -/* Bidi_Class. */ +/* Regional_Indicator. */ +RE_UINT32 re_get_regional_indicator(RE_UINT32 codepoint) { + if (0x01F1E6 <= codepoint && codepoint <= 0x01F1FF) + return 1; -static RE_UINT8 re_bidi_class_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 7, - 8, 9, 5, 5, 5, 5, 10, 5, 5, 5, 5, 11, 5, 12, 13, 14, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, -}; + return 0; +} -static RE_UINT8 re_bidi_class_stage_2[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 7, 8, 9, 10, - 4, 4, 11, 4, 4, 4, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 30, 32, 33, 34, 35, 36, - 37, 38, 28, 39, 40, 41, 4, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 54, 55, 4, - 56, 4, 4, 4, 4, 4, 4, 4, 4, 4, 57, 4, 58, 59, 60, 61, - 62, 4, 63, 4, 64, 65, 4, 66, 67, 68, 69, 4, 70, 71, 72, 73, - 74, 4, 4, 75, 4, 4, 4, 76, 4, 4, 4, 4, 4, 4, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 86, 86, 86, 88, 89, 90, 86, - 91, 92, 93, 94, 86, 86, 86, 86, 86, 86, 95, 86, 86, 86, 86, 86, - 4, 4, 4, 4, 86, 86, 86, 86, 86, 86, 86, 86, 86, 96, 97, 86, - 4, 4, 4, 98, 4, 99, 4, 100, 86, 101, 102, 103, 86, 86, 86, 104, - 105, 4, 106, 107, 4, 4, 4, 108, 109, 110, 111, 112, 4, 113, 4, 114, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 86, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 115, 116, 4, 4, 4, 4, 117, 118, 119, 120, 121, 4, 122, 4, - 123, 124, 4, 125, 126, 127, 128, 129, 130, 131, 132, 133, 4, 4, 4, 134, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 135, 136, 16, 16, - 16, 16, 16, 16, 137, 16, 16, 138, 139, 140, 16, 141, 142, 143, 4, 144, - 4, 4, 4, 4, 145, 86, 146, 147, 4, 4, 4, 148, 4, 149, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 150, 150, 150, 150, 151, 150, 150, 150, 152, 150, 150, 153, 154, 150, 150, 150, - 150, 150, 150, 150, 155, 150, 150, 150, 150, 156, 150, 150, 157, 158, 150, 150, - 159, 160, 161, 4, 162, 163, 164, 165, 166, 4, 4, 167, 40, 168, 4, 4, - 169, 170, 171, 172, 4, 4, 173, 174, 175, 176, 177, 4, 178, 4, 4, 4, - 179, 4, 4, 4, 4, 4, 4, 180, 181, 182, 183, 4, 4, 4, 4, 4, - 184, 4, 185, 4, 186, 187, 188, 4, 4, 4, 4, 189, 4, 4, 4, 190, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 191, 192, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 193, 194, 195, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 196, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 197, 198, 4, 86, 199, 4, 4, 86, 200, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 201, 202, 203, 204, 205, - 4, 4, 4, 4, 4, 4, 4, 4, 206, 207, 208, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 209, 4, 4, 4, 192, 4, 4, 4, 4, 4, 4, 210, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 150, 150, 150, 211, 150, 212, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 157, 16, 150, 16, 213, 150, 150, 16, 16, 16, 214, 150, 150, 150, 150, - 215, 86, 216, 217, 218, 219, 4, 4, 4, 220, 4, 4, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 221, 86, 103, 86, 222, - 223, 224, 225, 4, 226, 227, 228, 229, 86, 230, 231, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 232, +/* Script. */ +static RE_UINT8 re_script_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 21, 21, 34, 35, 21, 21, + 21, 36, 21, 21, 21, 21, 21, 21, 21, 21, 37, 38, 39, 39, 39, 39, + 39, 40, 41, 42, 21, 21, 21, 21, 21, 21, 21, 21, 43, 21, 21, 44, + 21, 21, 21, 21, 45, 46, 47, 21, 48, 21, 49, 50, 51, 52, 53, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 54, 13, 13, 13, 55, 56, 13, + 13, 13, 13, 57, 13, 13, 13, 13, 13, 13, 58, 21, 21, 21, 59, 21, + 13, 13, 13, 13, 60, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 61, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21 +}; + +static RE_UINT16 re_script_table_2[] = { + 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 5, 0, 6, 7, 7, 7, 8, 9, 10, 11, 12, + 13, 13, 13, 13, 14, 13, 13, 13, 13, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 23, 23, 26, 23, 27, 28, 29, 23, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 38, 84, 85, 86, 38, 87, 87, 88, 89, 90, 91, 92, 38, + 93, 93, 93, 93, 93, 94, 95, 96, 97, 97, 97, 97, 97, 97, 97, 97, + 98, 98, 99, 98, 100, 101, 102, 98, 103, 98, 104, 105, 106, 107, 107, 108, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 110, 111, 111, 112, 113, 114, 115, 116, 117, 117, 118, 119, + 120, 121, 121, 122, 121, 123, 109, 124, 125, 126, 127, 128, 129, 130, 131, 117, + 132, 133, 134, 135, 136, 137, 138, 38, 139, 139, 140, 141, 142, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 4, 153, 154, 155, 4, 156, 7, 157, + 4, 4, 4, 4, 4, 4, 4, 4, 158, 11, 159, 160, 11, 161, 162, 163, + 164, 0, 0, 165, 166, 0, 167, 168, 0, 169, 170, 4, 171, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 172, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 174, 174, 174, 174, 174, 174, 174, 174, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 176, 0, 0, 0, + 177, 178, 179, 4, 180, 180, 180, 181, 94, 182, 183, 184, 185, 186, 186, 13, + 0, 0, 187, 38, 188, 189, 189, 190, 189, 189, 189, 189, 189, 189, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 97, 97, 203, 204, 0, 205, + 206, 0, 0, 207, 0, 0, 208, 209, 199, 199, 210, 0, 0, 0, 0, 0, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 0, 0, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 211, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 213, 212, 214, 215, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 217, 13, 13, 13, 218, 218, 219, 0, 220, 4, 4, 221, 4, 222, 223, + 224, 225, 226, 227, 228, 228, 229, 42, 230, 231, 232, 233, 234, 234, 235, 236, + 237, 238, 239, 93, 240, 240, 241, 242, 243, 244, 245, 246, 107, 107, 247, 248, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 249, 250, 251, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 252, 189, 189, 253, 38, 254, 255, 256, 23, 23, 23, 257, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 258, 259, 23, 260, 23, 261, 262, + 263, 264, 265, 266, 23, 23, 23, 267, 268, 1, 1, 269, 270, 206, 271, 272, + 273, 274, 275, 38, 276, 276, 276, 277, 278, 279, 11, 11, 280, 281, 282, 283, + 38, 38, 38, 38, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 38, + 295, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 38, 38, 38, 38, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 307, 308, 309, 38, 38, 38, 38, + 310, 311, 312, 313, 314, 315, 38, 316, 317, 318, 38, 38, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 38, 328, 329, 330, 331, 332, 333, 334, 335, 38, 38, + 336, 336, 337, 38, 338, 339, 338, 340, 341, 342, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 343, 344, 345, 38, 38, 346, 347, 348, 38, 38, 349, 350, 351, + 352, 352, 353, 354, 355, 355, 356, 357, 358, 359, 360, 361, 362, 362, 362, 363, + 364, 365, 38, 38, 366, 367, 368, 369, 370, 371, 372, 373, 38, 38, 38, 38, + 374, 374, 375, 376, 377, 377, 378, 38, 38, 38, 38, 38, 379, 380, 381, 38, + 382, 382, 383, 384, 385, 386, 387, 38, 388, 389, 38, 38, 38, 38, 38, 38, + 390, 391, 38, 38, 38, 392, 392, 393, 394, 395, 396, 38, 38, 397, 398, 399, + 400, 400, 401, 402, 402, 403, 404, 405, 38, 38, 38, 38, 38, 38, 38, 38, + 406, 407, 408, 409, 410, 411, 38, 38, 412, 413, 414, 415, 416, 417, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 418, 38, 38, 38, 38, 38, 419, 420, 421, + 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, + 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 423, 38, 38, 38, + 422, 422, 422, 424, 422, 422, 422, 422, 422, 422, 425, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + 426, 427, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 429, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, + 218, 430, 431, 432, 38, 38, 433, 434, 435, 435, 436, 437, 438, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 439, 439, 440, 38, 38, 38, 441, 441, 442, 441, 443, 38, 38, 444, + 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, + 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, + 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, + 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 446, + 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, + 445, 445, 445, 445, 445, 445, 445, 445, 447, 447, 447, 447, 447, 447, 447, 447, + 447, 447, 447, 447, 447, 447, 448, 38, 449, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 450, 196, 196, 196, 196, 196, 196, 196, 451, 38, 452, 453, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 455, 38, 38, 38, 38, 38, 38, 38, 38, + 456, 456, 456, 457, 458, 459, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 0, 0, 0, 0, 0, 0, 0, 460, 0, 461, 0, 462, 463, 464, 0, 465, + 11, 11, 466, 38, 38, 38, 38, 467, 0, 0, 468, 469, 38, 38, 38, 38, + 0, 0, 470, 0, 471, 472, 473, 0, 474, 475, 476, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 477, 0, 0, 0, 0, 0, 0, 0, 0, 478, 0, + 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, + 479, 479, 479, 479, 480, 481, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 482, 483, 38, 38, 38, 38, 38, 38, 484, 485, 486, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 487, 488, 38, 38, 38, 38, 38, 38, 38, 38, + 489, 489, 489, 489, 489, 489, 490, 38, 491, 491, 492, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 493, 0, 494, 38, 38, 268, 495, 38, 38, 38, 38, 38, 38, + 496, 497, 498, 499, 500, 501, 38, 502, 38, 38, 38, 38, 38, 38, 38, 38, + 0, 503, 0, 0, 467, 504, 505, 460, 0, 0, 0, 0, 0, 506, 38, 507, + 508, 509, 510, 511, 38, 38, 38, 38, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 512, 513, 0, 0, 0, 467, 0, 0, 469, 514, + 503, 0, 515, 0, 516, 517, 38, 38, 0, 0, 0, 518, 0, 0, 519, 0, + 0, 0, 467, 520, 521, 522, 523, 38, 0, 0, 0, 0, 265, 0, 173, 524, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 525, 38, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 526, 189, 189, 189, 189, 189, 189, + 525, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 527, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 528, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 525, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 529, 38, 38, 38, 38, 38, + 530, 0, 0, 0, 38, 38, 38, 38, 7, 7, 7, 7, 7, 7, 7, 531, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38 +}; + +static RE_UINT8 re_script_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 232, - 233, 233, 233, 233, 7, 7, 7, 234, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, -}; - -static RE_UINT8 re_bidi_class_stage_3[] = { - 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 8, 9, 7, 8, 8, 10, - 11, 0, 0, 0, 12, 13, 14, 15, 8, 8, 16, 8, 8, 8, 16, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 17, - 18, 19, 18, 19, 20, 21, 19, 19, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 23, 24, 25, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 24, 8, 26, 27, 8, 8, 8, 8, 8, 8, - 8, 28, 29, 22, 22, 22, 22, 30, 31, 32, 32, 32, 32, 32, 32, 32, - 33, 34, 22, 35, 36, 36, 36, 36, 36, 37, 22, 22, 38, 39, 40, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 42, 43, 44, 5, 45, - 36, 36, 46, 36, 36, 36, 22, 22, 22, 35, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 41, 22, 40, 36, 32, 32, 32, 32, 32, 47, 48, 49, - 32, 32, 50, 51, 52, 53, 32, 32, 32, 32, 32, 54, 36, 36, 32, 32, - 32, 32, 32, 32, 36, 36, 36, 36, 36, 36, 37, 22, 55, 22, 22, 22, - 56, 8, 8, 8, 8, 8, 8, 57, 58, 59, 58, 8, 60, 8, 8, 8, - 61, 8, 8, 8, 8, 8, 8, 62, 63, 64, 8, 8, 60, 8, 65, 66, - 67, 8, 8, 8, 8, 8, 8, 62, 68, 69, 61, 8, 8, 8, 70, 8, - 71, 59, 8, 8, 60, 8, 72, 73, 61, 8, 8, 8, 8, 8, 8, 74, - 63, 64, 75, 8, 60, 8, 8, 8, 76, 8, 8, 8, 8, 8, 8, 8, - 77, 64, 8, 8, 8, 8, 9, 78, 79, 8, 8, 8, 8, 8, 8, 80, - 81, 82, 83, 8, 60, 8, 8, 84, 8, 85, 8, 8, 60, 8, 8, 8, - 27, 8, 8, 8, 8, 8, 8, 86, 63, 64, 8, 8, 60, 8, 8, 8, - 8, 76, 87, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 88, 89, - 90, 91, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 88, 92, - 8, 93, 8, 8, 8, 8, 8, 8, 8, 8, 8, 27, 8, 8, 94, 95, - 8, 8, 8, 8, 8, 8, 58, 91, 96, 97, 22, 58, 22, 22, 22, 92, - 75, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 97, 98, 99, - 8, 8, 8, 100, 77, 8, 63, 8, 101, 64, 8, 64, 8, 8, 8, 8, - 8, 8, 8, 97, 8, 8, 8, 8, 8, 8, 19, 102, 8, 8, 8, 8, - 7, 8, 8, 8, 8, 8, 8, 8, 103, 8, 8, 104, 8, 8, 8, 8, - 8, 8, 105, 8, 8, 8, 105, 8, 8, 8, 60, 8, 8, 8, 60, 8, - 8, 8, 8, 8, 8, 8, 106, 93, 75, 58, 107, 108, 8, 8, 19, 102, - 19, 109, 8, 8, 8, 8, 8, 8, 83, 8, 8, 8, 8, 61, 8, 8, - 8, 8, 8, 8, 110, 77, 76, 111, 112, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 113, 19, 19, 19, 19, 8, 8, 90, 114, 8, 8, 8, 8, - 8, 8, 75, 91, 115, 92, 26, 116, 8, 8, 8, 8, 8, 8, 22, 91, - 107, 8, 8, 8, 8, 8, 117, 118, 76, 8, 8, 8, 8, 26, 107, 8, - 27, 8, 8, 8, 119, 120, 8, 8, 8, 8, 8, 8, 75, 121, 27, 8, - 8, 8, 8, 8, 8, 122, 123, 8, 8, 8, 124, 22, 98, 59, 62, 27, - 22, 22, 22, 22, 22, 22, 22, 125, 8, 8, 8, 8, 8, 8, 8, 126, - 102, 20, 8, 20, 8, 20, 8, 127, 128, 129, 19, 19, 19, 130, 131, 19, - 132, 19, 19, 133, 134, 135, 136, 137, 5, 137, 8, 8, 138, 138, 138, 138, - 138, 138, 22, 22, 22, 22, 77, 8, 139, 102, 140, 141, 142, 143, 8, 144, - 145, 146, 19, 19, 8, 8, 8, 8, 8, 147, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 148, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 149, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 19, 19, 150, 19, 19, 19, 19, 19, 19, 19, 19, 19, 84, 8, 8, 8, - 19, 151, 8, 8, 19, 19, 19, 19, 19, 5, 5, 152, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 18, 19, 19, 19, 19, 19, 19, 19, 153, 19, 19, - 19, 19, 19, 19, 19, 19, 154, 19, 19, 19, 149, 19, 19, 19, 19, 19, - 8, 8, 8, 8, 20, 155, 27, 156, 8, 8, 8, 8, 8, 8, 8, 90, - 8, 8, 8, 8, 22, 22, 22, 22, 19, 19, 8, 8, 8, 8, 8, 8, - 19, 19, 19, 157, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 158, 8, - 19, 19, 149, 8, 8, 8, 19, 158, 159, 19, 19, 19, 7, 119, 141, 20, - 8, 8, 8, 160, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 161, - 19, 19, 19, 19, 158, 8, 8, 8, 8, 8, 8, 127, 8, 8, 8, 8, - 8, 8, 19, 19, 8, 8, 8, 162, 8, 8, 8, 8, 8, 8, 156, 19, - 8, 163, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16, 151, - 8, 8, 8, 113, 8, 8, 8, 16, 8, 8, 19, 19, 19, 19, 19, 19, - 84, 8, 8, 8, 8, 8, 8, 8, 8, 20, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 90, 164, 165, 8, 8, 8, 80, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 27, 8, 19, 19, 19, 19, 102, 8, 8, 8, - 8, 7, 8, 8, 8, 8, 8, 8, 166, 167, 8, 8, 83, 158, 8, 168, - 8, 8, 8, 8, 8, 8, 163, 8, 85, 8, 8, 8, 22, 22, 27, 90, - 8, 8, 8, 8, 80, 93, 8, 8, 90, 22, 27, 8, 8, 8, 8, 8, - 56, 8, 8, 8, 8, 8, 169, 170, 8, 8, 8, 8, 64, 8, 8, 8, - 8, 8, 8, 8, 8, 171, 99, 8, 167, 62, 8, 8, 8, 8, 8, 62, - 8, 8, 8, 8, 8, 8, 172, 81, 61, 8, 8, 8, 8, 85, 75, 8, - 8, 8, 8, 8, 64, 59, 8, 8, 8, 8, 8, 173, 32, 174, 32, 32, - 32, 32, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 175, - 36, 36, 0, 0, 0, 0, 36, 176, 22, 22, 19, 102, 22, 22, 19, 19, - 19, 19, 177, 178, 179, 180, 36, 36, 36, 36, 36, 36, 36, 36, 36, 181, - 182, 4, 5, 6, 7, 8, 8, 9, 7, 8, 8, 9, 149, 8, 8, 8, - 8, 8, 8, 8, 183, 84, 0, 184, 185, 8, 8, 8, 8, 8, 8, 8, - 19, 145, 19, 158, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 64, - 8, 8, 8, 8, 186, 5, 5, 152, 8, 8, 8, 8, 8, 8, 80, 56, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 187, 32, 32, 32, 32, - 188, 189, 32, 32, 32, 32, 32, 190, 32, 32, 32, 32, 191, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 192, 36, 36, 36, 36, 193, 36, 38, 194, - 32, 32, 32, 32, 38, 38, 38, 195, 32, 32, 32, 32, 32, 32, 36, 36, - 41, 22, 40, 36, 36, 36, 32, 32, 61, 8, 8, 8, 8, 8, 8, 22, - 91, 8, 18, 19, 149, 8, 8, 90, 27, 8, 8, 8, 8, 8, 196, 67, - 56, 8, 8, 8, 90, 197, 92, 8, 8, 8, 8, 8, 8, 8, 167, 8, - 27, 8, 8, 8, 8, 8, 80, 91, 8, 63, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 90, 198, 75, 8, 8, 8, 90, 26, 56, 8, 8, - 77, 8, 8, 8, 80, 92, 92, 8, 8, 8, 8, 8, 8, 8, 8, 22, - 87, 8, 8, 75, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 26, 199, - 200, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 119, 106, - 77, 8, 8, 85, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 26, 201, - 77, 8, 8, 8, 19, 145, 8, 8, 8, 8, 8, 8, 8, 202, 203, 8, - 8, 8, 8, 97, 204, 107, 8, 8, 8, 8, 8, 8, 8, 90, 22, 67, - 8, 8, 122, 60, 77, 8, 8, 8, 171, 67, 8, 8, 8, 8, 26, 205, - 90, 8, 171, 111, 8, 8, 8, 8, 8, 73, 91, 27, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 91, 93, 8, 8, 73, 22, 22, 73, 206, 8, - 8, 8, 8, 8, 8, 8, 171, 207, 203, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 121, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 86, 8, - 8, 8, 20, 208, 209, 19, 102, 8, 8, 8, 8, 8, 8, 8, 92, 8, - 8, 8, 8, 8, 8, 8, 91, 8, 8, 90, 8, 8, 8, 8, 8, 8, - 8, 90, 56, 8, 8, 8, 8, 8, 8, 8, 8, 8, 210, 8, 8, 8, - 8, 8, 8, 83, 211, 8, 8, 8, 8, 8, 8, 8, 90, 27, 212, 213, - 214, 107, 8, 8, 8, 119, 8, 8, 215, 8, 8, 8, 8, 8, 8, 8, - 19, 19, 84, 8, 8, 8, 8, 8, 8, 8, 8, 161, 8, 8, 8, 8, - 8, 8, 216, 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, - 8, 185, 8, 8, 8, 8, 8, 8, 161, 217, 5, 5, 5, 5, 5, 5, - 22, 22, 22, 22, 22, 22, 91, 26, 22, 22, 22, 22, 22, 92, 64, 8, - 62, 8, 8, 26, 58, 22, 8, 8, 91, 22, 22, 218, 219, 56, 8, 8, - 8, 8, 8, 8, 8, 122, 8, 220, 32, 32, 221, 32, 32, 32, 32, 32, - 189, 222, 32, 32, 32, 32, 32, 32, 36, 36, 32, 32, 32, 32, 32, 32, - 36, 36, 36, 36, 36, 36, 223, 36, 19, 19, 19, 19, 19, 158, 19, 19, - 19, 19, 158, 8, 19, 84, 156, 19, 156, 19, 156, 19, 19, 19, 149, 8, - 5, 224, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 225, 8, 8, - 8, 8, 8, 8, 149, 8, 8, 8, 19, 19, 149, 8, 19, 145, 19, 151, - 19, 19, 19, 7, 19, 158, 8, 8, 19, 158, 19, 19, 19, 19, 19, 19, - 19, 8, 19, 102, 19, 19, 19, 19, 19, 8, 19, 19, 19, 149, 8, 8, - 19, 153, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 139, 18, - 19, 19, 19, 19, 226, 227, 19, 19, 19, 226, 19, 19, 19, 19, 19, 19, - 19, 19, 158, 8, 19, 149, 158, 151, 151, 8, 149, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 228, 0, 0, 0, 0, 0, 0, 0, 0, - 22, 22, 22, 22, 22, 22, 0, 0, -}; - -static RE_UINT8 re_bidi_class_stage_4[] = { - 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 7, 8, 9, 7, 11, 11, - 11, 11, 11, 11, 7, 7, 7, 8, 9, 10, 10, 4, 4, 4, 10, 10, - 10, 10, 10, 3, 6, 3, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 6, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, - 0, 0, 0, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 7, 11, 11, - 6, 10, 4, 4, 4, 4, 10, 10, 10, 10, 0, 10, 10, 11, 10, 10, - 4, 4, 2, 2, 10, 0, 10, 10, 10, 2, 0, 10, 10, 10, 10, 10, - 0, 0, 0, 0, 0, 0, 0, 10, 0, 10, 10, 0, 0, 0, 0, 0, - 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, - 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 10, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 10, 10, 0, 10, - 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 10, 10, 4, 1, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 1, 12, 1, 12, 12, 1, 12, 12, 1, 12, - 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 10, 10, - 13, 4, 4, 13, 6, 13, 10, 10, 12, 12, 12, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 13, 13, 13, - 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, - 12, 12, 12, 12, 12, 5, 10, 12, 12, 12, 12, 12, 12, 13, 13, 12, - 12, 10, 12, 12, 12, 12, 13, 13, 2, 2, 13, 13, 13, 13, 13, 13, - 13, 12, 13, 13, 13, 13, 13, 13, 1, 1, 1, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 1, 1, 10, 10, 10, 10, 1, 1, 1, 12, 1, 1, - 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 1, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 1, 12, 12, 12, 1, 12, 12, 12, 12, 12, 1, 1, - 1, 12, 12, 12, 1, 1, 1, 1, 12, 12, 5, 12, 12, 12, 12, 12, - 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, - 0, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 12, 0, 0, - 0, 0, 12, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 12, 12, 12, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 12, 0, 0, 12, 12, 0, 0, 0, 0, 0, - 0, 12, 12, 0, 0, 0, 0, 12, 12, 0, 0, 12, 12, 12, 0, 0, - 12, 12, 0, 0, 0, 12, 0, 0, 0, 12, 12, 12, 12, 12, 0, 12, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, - 0, 0, 0, 0, 12, 0, 0, 12, 0, 0, 0, 0, 0, 0, 12, 0, - 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 10, 4, 10, 0, 0, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, 0, 0, 12, 12, - 12, 0, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 12, 12, 0, - 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 12, 12, 0, 0, - 0, 0, 0, 12, 12, 0, 0, 0, 0, 0, 12, 12, 12, 0, 12, 0, - 0, 12, 0, 0, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 0, - 12, 12, 12, 12, 12, 0, 0, 0, 12, 12, 12, 12, 12, 12, 0, 0, - 0, 0, 0, 0, 0, 12, 0, 12, 0, 12, 10, 10, 10, 10, 0, 0, - 12, 12, 12, 12, 12, 0, 12, 12, 0, 0, 0, 0, 0, 12, 12, 12, - 12, 0, 12, 12, 12, 12, 12, 12, 0, 12, 12, 0, 0, 12, 12, 0, - 12, 12, 0, 0, 0, 0, 12, 12, 0, 0, 12, 0, 0, 12, 12, 0, - 10, 10, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, - 0, 0, 0, 0, 12, 12, 0, 12, 12, 12, 12, 12, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 12, 0, 0, 10, 10, 10, 12, 12, 12, 11, 0, - 12, 12, 12, 0, 0, 0, 0, 12, 0, 12, 12, 12, 0, 0, 0, 0, - 10, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, - 12, 0, 0, 12, 0, 0, 0, 0, 12, 0, 12, 0, 0, 12, 12, 12, - 12, 12, 12, 12, 12, 0, 0, 12, 0, 0, 0, 0, 12, 0, 12, 12, - 12, 12, 12, 0, 12, 0, 0, 0, 0, 0, 12, 12, 12, 12, 0, 0, - 12, 12, 0, 12, 12, 12, 0, 0, 12, 12, 0, 0, 0, 12, 0, 12, - 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 12, 12, - 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, 0, 12, 12, 12, 12, 12, - 0, 0, 0, 0, 0, 10, 0, 10, 0, 0, 0, 0, 0, 10, 10, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 0, 1, - 9, 7, 16, 17, 18, 14, 15, 6, 4, 4, 4, 4, 4, 10, 10, 10, - 10, 10, 10, 10, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, - 11, 11, 11, 11, 11, 11, 19, 20, 21, 22, 11, 11, 11, 11, 11, 11, - 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 3, 3, 10, 10, 10, 0, - 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 0, 10, 10, 10, 10, 0, - 0, 0, 0, 0, 10, 0, 10, 10, 10, 0, 0, 0, 0, 0, 10, 10, - 10, 10, 10, 10, 0, 10, 0, 10, 0, 10, 0, 0, 0, 0, 4, 0, - 0, 0, 10, 10, 0, 0, 0, 0, 10, 10, 10, 10, 10, 0, 0, 0, - 0, 0, 10, 10, 10, 10, 0, 0, 0, 10, 10, 10, 0, 0, 0, 0, - 10, 10, 3, 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, - 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 0, 0, 0, 0, 10, 10, 10, 10, 0, 10, 10, 10, - 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 12, - 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 0, 0, 0, 0, 9, 10, 10, 10, 10, 0, 0, 0, - 0, 12, 12, 10, 10, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, 0, 0, 10, 10, 10, 10, - 12, 12, 12, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, - 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 0, 12, 0, 0, 0, 0, - 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 12, 12, - 12, 12, 0, 0, 12, 12, 0, 0, 0, 12, 12, 12, 12, 12, 12, 0, - 12, 0, 12, 12, 12, 0, 0, 12, 0, 0, 0, 0, 0, 1, 12, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 10, 10, - 13, 13, 13, 13, 13, 10, 13, 13, 6, 10, 6, 0, 10, 6, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 4, 10, 10, 3, 3, 10, 10, 10, 0, - 10, 4, 4, 10, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 11, - 0, 10, 10, 4, 4, 4, 10, 10, 4, 4, 10, 10, 10, 4, 4, 0, - 11, 10, 10, 10, 10, 10, 11, 11, 0, 10, 0, 0, 0, 0, 0, 0, - 12, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 10, - 1, 12, 12, 12, 1, 12, 12, 1, 1, 1, 1, 1, 12, 12, 12, 12, - 12, 12, 12, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 12, 12, 1, - 1, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 12, 12, 12, 12, - 5, 5, 13, 13, 13, 13, 13, 13, 5, 5, 5, 5, 5, 5, 5, 1, - 0, 0, 0, 12, 12, 12, 12, 0, 12, 12, 12, 12, 0, 12, 12, 12, - 12, 12, 0, 0, 12, 0, 12, 12, 12, 0, 12, 0, 0, 0, 0, 12, - 12, 0, 12, 12, 0, 0, 0, 0, 12, 12, 12, 0, 0, 12, 0, 12, - 0, 0, 0, 12, 0, 12, 0, 0, 12, 12, 12, 12, 12, 12, 0, 12, - 0, 0, 12, 12, 12, 12, 0, 12, 12, 0, 0, 12, 12, 12, 12, 0, - 12, 0, 12, 12, 0, 12, 12, 0, 0, 0, 12, 0, 12, 12, 0, 12, - 10, 10, 10, 10, 10, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, - 0, 0, 10, 0, 0, 0, 0, 0, 11, 11, 11, 11, 0, 0, 0, 0, - 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, - 12, 12, 12, 0, 0, 12, 12, 12, 10, 10, 12, 12, 12, 10, 0, 0, - 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, - 12, 0, 0, 12, 12, 12, 12, 12, 12, 12, 0, 12, 12, 0, 12, 12, - 0, 0, 0, 0, 0, 0, 0, 4, 12, 12, 12, 12, 12, 12, 12, 1, - 12, 12, 12, 1, 1, 1, 1, 1, 10, 10, 13, 13, 13, 13, 13, 13, - 2, 2, 2, 10, 10, 0, 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, - 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, 0, 0, 0, 10, 10, - 0, 0, 0, 0, 0, 0, 11, 11, -}; - -/* Bidi_Class: 5072 bytes. */ - -RE_UINT32 re_get_bidi_class(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_bidi_class_stage_1[f] << 6; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_bidi_class_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_bidi_class_stage_3[pos + f] << 3; - value = re_bidi_class_stage_4[pos + code]; - - return value; -} - -/* Canonical_Combining_Class. */ - -static RE_UINT8 re_canonical_combining_class_stage_1[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 6, - 7, 8, 4, 4, 4, 4, 9, 4, 4, 4, 4, 10, 4, 11, 12, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static RE_UINT8 re_canonical_combining_class_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, - 0, 0, 3, 0, 0, 0, 4, 5, 6, 7, 0, 8, 9, 10, 0, 11, - 12, 13, 0, 14, 15, 16, 15, 17, 15, 18, 15, 18, 15, 18, 0, 18, - 0, 19, 15, 18, 20, 18, 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 34, - 0, 0, 35, 0, 36, 0, 0, 0, 37, 38, 39, 0, 40, 41, 42, 43, - 44, 0, 0, 45, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 48, 0, 49, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, - 51, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 1, 5, 5, 5, 0, 0, 5, 5, 5, 5, 1, 5, + 0, 0, 0, 0, 5, 1, 5, 1, 5, 5, 5, 0, 5, 0, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 0, 0, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 8, 8, 8, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 1, 10, 10, 10, 10, 10, 10, 1, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 10, 0, 10, 1, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 4, 4, 4, 4, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 1, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, + 17, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, + 17, 0, 17, 0, 0, 0, 17, 17, 17, 17, 0, 0, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 0, 0, 17, 17, 0, 0, 17, 17, 17, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 17, 17, 0, 17, + 17, 17, 17, 17, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, + 0, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 18, + 18, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, + 18, 0, 18, 18, 0, 18, 18, 0, 18, 18, 0, 0, 18, 0, 18, 18, + 18, 18, 18, 0, 0, 0, 0, 18, 18, 0, 0, 18, 18, 18, 0, 0, + 0, 18, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, + 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, + 19, 0, 19, 19, 0, 19, 19, 19, 19, 19, 0, 0, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 0, 19, 19, 19, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 19, 19, 19, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, + 0, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 20, + 20, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, + 20, 0, 20, 20, 0, 20, 20, 20, 20, 20, 0, 0, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 0, 0, 20, 20, 0, 0, 20, 20, 20, 0, 0, + 0, 0, 0, 0, 0, 20, 20, 20, 0, 0, 0, 0, 20, 20, 0, 20, + 20, 20, 20, 20, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 21, 0, 21, 21, 21, 21, 21, 21, 0, 0, 0, 21, 21, + 21, 0, 21, 21, 21, 21, 0, 0, 0, 21, 21, 0, 21, 0, 21, 21, + 0, 0, 0, 21, 21, 0, 0, 0, 21, 21, 21, 0, 0, 0, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 21, 21, + 21, 21, 21, 0, 0, 0, 21, 21, 21, 0, 21, 21, 21, 21, 0, 0, + 21, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, + 22, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, 22, 22, 22, + 22, 22, 22, 22, 22, 0, 22, 22, 22, 0, 22, 22, 22, 22, 0, 0, + 0, 0, 0, 0, 0, 22, 22, 0, 22, 22, 22, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, + 23, 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 0, 0, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 0, 23, 23, 23, 0, 23, 23, 23, 23, 0, 0, + 0, 0, 0, 0, 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 23, 0, + 23, 23, 23, 23, 0, 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, + 24, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 0, 24, 24, 24, 0, 24, 24, 24, 24, 24, 24, + 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 0, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 0, 0, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 0, 0, 0, 0, 25, + 25, 25, 25, 25, 25, 0, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, + 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 0, 0, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 1, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, + 0, 27, 27, 0, 27, 0, 27, 27, 27, 27, 27, 0, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 0, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 27, 27, 27, 27, 27, 0, 27, 0, 27, 27, 27, 27, 27, 27, 0, 0, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, + 0, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, + 28, 28, 28, 28, 28, 1, 1, 1, 1, 28, 28, 0, 0, 0, 0, 0, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 0, 30, 0, 0, 0, 0, 0, 30, 0, 0, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 1, 30, 30, 30, 30, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 0, 32, 32, 32, 32, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 0, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 32, 0, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 0, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 0, 0, 33, 33, 33, 33, 33, 33, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 1, 1, 1, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, 37, 37, + 37, 37, 37, 37, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 40, 40, + 40, 0, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, + 42, 42, 1, 1, 42, 1, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, 0, + 43, 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, + 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 45, 45, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 46, 46, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 51, 51, 51, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 30, 30, 30, + 49, 49, 49, 49, 49, 49, 49, 49, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 1, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 4, 1, 1, + 1, 1, 1, 1, 4, 1, 1, 1, 4, 4, 1, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, + 5, 5, 2, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 0, 5, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, + 30, 30, 30, 30, 30, 30, 0, 30, 0, 0, 0, 0, 0, 30, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 56, 1, 56, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 56, 56, 56, 56, 56, 56, 56, 56, 56, 4, 4, 4, 4, 31, 31, + 1, 1, 1, 1, 1, 1, 1, 1, 56, 56, 56, 56, 1, 1, 1, 1, + 0, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 0, 0, 4, 4, 1, 1, 57, 57, 57, + 1, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 1, 1, 58, 58, 58, + 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 1, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 1, 1, 1, 1, 1, 1, 1, 1, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 0, 0, 0, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 0, 0, 0, 0, 0, 0, 0, 0, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 0, 0, 0, 0, 0, 0, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 1, 66, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 1, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 68, 68, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 0, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 0, 69, 69, 69, 69, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 32, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 0, + 0, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, + 31, 31, 31, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, 0, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 0, + 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 55, 0, 0, 0, 0, - 56, 0, 0, 57, 58, 59, 60, 61, 0, 0, 62, 63, 0, 0, 0, 64, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 1, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 1, 1, + 0, 0, 31, 31, 31, 31, 31, 31, 0, 0, 31, 31, 31, 31, 31, 31, + 0, 0, 31, 31, 31, 31, 31, 31, 0, 0, 31, 31, 31, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 0, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 72, 72, 0, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, - 0, 74, 75, 0, 76, 60, 0, 77, 78, 0, 0, 79, 80, 81, 0, 0, - 0, 82, 0, 83, 0, 0, 49, 84, 49, 0, 85, 0, 86, 0, 0, 0, - 75, 0, 0, 0, 0, 0, 0, 87, 88, 89, 90, 0, 0, 0, 0, 0, - 49, 0, 0, 0, 0, 91, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0, 0, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 0, 0, 0, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 75, 75, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 0, 0, 0, 0, 0, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 78, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 0, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 0, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 87, 87, 87, 87, 87, 0, 0, 87, 0, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 0, 87, 87, 0, 0, 0, 87, 0, 0, 87, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 0, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, + 0, 0, 0, 0, 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 0, 91, 91, 0, 0, 0, 0, 0, 91, 91, 91, 91, 91, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 92, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 0, 0, 0, 0, 0, 93, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 96, 96, 96, 96, 0, 96, 96, 0, 0, 0, 0, 0, 96, 96, 96, 96, + 96, 96, 96, 96, 0, 96, 96, 96, 0, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 0, 0, 96, 96, 96, 0, 0, 0, 0, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 0, 0, 0, 0, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 0, 0, 0, 100, 100, 100, 100, 100, 100, 100, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 0, 0, 101, 101, 101, 101, 101, 101, 101, 101, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 0, 0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 0, 0, 0, 0, 0, 0, 0, 103, 103, 103, 103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 103, 103, 103, 103, 103, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 107, 0, 0, + 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 0, 0, + 0, 0, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 0, 0, 0, 0, 0, 0, 0, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 0, 0, 0, 0, 0, 0, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 0, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 0, + 119, 119, 119, 119, 119, 119, 119, 0, 119, 0, 119, 119, 119, 119, 0, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 0, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 0, 0, 0, 0, 0, 0, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 0, 0, 0, 0, 0, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 0, 0, 0, 0, 0, 0, + 121, 121, 121, 121, 0, 121, 121, 121, 121, 121, 121, 121, 121, 0, 0, 121, + 121, 0, 0, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 0, 121, 121, 121, 121, 121, 121, + 121, 0, 121, 121, 0, 121, 121, 121, 121, 121, 0, 4, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 0, 0, 121, 121, 0, 0, 121, 121, 121, 0, 0, + 121, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 121, 121, 121, + 121, 121, 121, 121, 0, 0, 121, 121, 121, 121, 121, 121, 121, 0, 0, 0, + 121, 121, 121, 121, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 0, 122, 122, 122, + 122, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, 0, 0, 0, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, 0, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 0, 0, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 0, 0, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 0, 0, 0, 0, 0, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 0, 0, 0, 0, 0, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 0, 0, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 130, 130, 130, 130, 130, 130, 0, 0, 130, 0, 0, 130, 130, 130, 130, + 130, 130, 130, 130, 0, 130, 130, 0, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 0, 130, 130, 0, 0, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0, + 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 0, 0, 0, 0, 0, 0, 0, 0, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 0, 0, 0, 0, 0, 0, 0, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 0, 0, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 0, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 137, 137, 137, 137, 137, 137, 137, 0, 137, 137, 0, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 137, 0, 137, 137, 0, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 0, 0, 0, 0, 0, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 0, 0, 0, + 138, 138, 138, 138, 138, 138, 0, 138, 138, 0, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, + 138, 138, 0, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, 0, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, + 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 0, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 0, 0, 0, 0, 0, 0, 0, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, 0, 0, 0, 143, 143, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, + 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 145, 145, 145, 145, 145, + 145, 145, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 0, 0, 0, 0, 0, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, 0, 0, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, 0, 0, 0, 0, 0, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 148, 149, 1, 1, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, 0, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 58, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 94, 0, 0, 0, + 57, 57, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 58, 58, 58, 58, 0, 0, 0, 0, 0, 0, 0, 0, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, 0, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 151, 151, 151, 151, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, + 4, 4, 4, 1, 1, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 152, 152, 152, 152, + 0, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, + 54, 54, 0, 54, 54, 0, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, 0, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, 0, 0, 153, 153, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 0, 0, 0, 0, 0, 154, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 0, 0, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 0, 0, 0, 0, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 0, 0, 0, 0, 156, 156, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 10, 10, 0, 10, 0, 0, 10, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 10, 10, 10, 10, 0, 10, 0, 10, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 10, 0, 10, 0, 10, 0, 10, 10, 10, + 0, 10, 10, 0, 10, 0, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, + 0, 10, 10, 0, 10, 0, 0, 10, 10, 10, 10, 0, 10, 10, 10, 10, + 10, 10, 10, 0, 10, 10, 10, 10, 0, 10, 10, 10, 10, 0, 10, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 10, 10, 10, 0, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 96, 97, 0, 0, 98, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 57, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 101, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_canonical_combining_class_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 1, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 14, 15, 16, 17, 18, 19, 20, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 21, 0, 0, 0, 0, 0, 22, 23, 24, 0, 0, 25, 0, - 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 30, 0, 0, 0, 31, 32, - 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 35, 36, - 0, 0, 26, 37, 38, 39, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, - 0, 0, 41, 1, 42, 43, 44, 45, 0, 0, 0, 0, 0, 0, 0, 46, - 0, 47, 48, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 49, - 0, 47, 0, 0, 0, 0, 0, 0, 0, 47, 50, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 51, 0, 52, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 53, 0, 54, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 0, 56, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 57, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 60, 61, - 62, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 64, 65, 0, 36, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, - 0, 0, 52, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 71, 72, 0, 0, 0, 0, - 0, 0, 0, 0, 73, 0, 66, 74, 0, 0, 0, 0, 0, 0, 75, 76, - 0, 0, 0, 0, 0, 0, 46, 0, 67, 0, 0, 0, 0, 77, 78, 0, - 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 80, 0, 79, 0, - 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 1, 1, 1, 90, 91, 0, 0, 92, 93, 94, 95, 96, 0, - 0, 0, 0, 0, 0, 71, 86, 0, 0, 0, 0, 0, 0, 0, 0, 97, - 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 98, 0, 0, - 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 100, 101, - 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, - 102, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 1, 1, 86, 0, - 0, 0, 0, 0, 0, 103, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 105, 0, 73, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 106, 107, 108, 0, 0, 0, 0, 0, 102, 0, - 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, - 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, - 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 112, - 0, 113, 0, 0, 0, 0, 0, 114, 0, 0, 0, 0, 115, 0, 0, 0, - 0, 0, 0, 0, 100, 0, 0, 0, 116, 117, 72, 0, 0, 0, 0, 0, - 102, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 118, - 112, 0, 0, 0, 0, 0, 51, 0, 73, 119, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 121, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 122, 0, 47, 0, 0, 26, 123, 123, 0, - 124, 0, 0, 49, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, - 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, - 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 67, 0, 97, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, - 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 132, 0, 0, 0, 0, - 0, 0, 0, 0, 133, 134, 135, 136, 137, 138, 0, 0, 0, 139, 0, 0, - 140, 0, 0, 0, 0, 0, 0, 0, 131, 1, 1, 141, 142, 112, 0, 0, - 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, - 100, 144, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_canonical_combining_class_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 51, 45, 45, 45, 45, 51, 43, 45, 45, 45, 45, - 45, 41, 41, 45, 45, 45, 45, 41, 41, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1, 1, 1, 1, 1, 45, 45, 45, 45, 50, 50, 50, - 50, 50, 50, 50, 50, 54, 50, 45, 45, 45, 50, 50, 50, 45, 45, 0, - 50, 50, 50, 45, 45, 45, 45, 50, 51, 45, 45, 50, 52, 53, 53, 52, - 53, 53, 52, 50, 50, 50, 50, 50, 0, 0, 0, 50, 50, 50, 50, 50, - 0, 45, 50, 50, 50, 50, 45, 50, 50, 50, 46, 45, 50, 50, 50, 50, - 50, 50, 45, 45, 45, 45, 45, 45, 50, 50, 45, 50, 50, 46, 49, 50, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 15, 16, 17, 0, 18, - 0, 19, 20, 0, 50, 45, 0, 13, 25, 26, 27, 0, 0, 0, 0, 0, - 0, 0, 0, 22, 23, 24, 25, 26, 27, 28, 29, 50, 50, 45, 45, 50, - 50, 50, 50, 50, 45, 50, 50, 45, 30, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 0, 0, 50, - 50, 50, 50, 45, 50, 0, 0, 50, 50, 0, 45, 50, 50, 45, 0, 0, - 0, 31, 0, 0, 0, 0, 0, 0, 50, 45, 50, 50, 45, 50, 50, 45, - 45, 45, 50, 45, 45, 50, 45, 50, 50, 50, 45, 50, 45, 50, 45, 50, - 45, 50, 50, 0, 0, 0, 0, 0, 50, 50, 45, 50, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 45, 0, 0, 50, 50, 0, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 0, 50, 50, 50, 0, 50, 50, 50, 50, 50, 0, 0, - 0, 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 45, 50, 50, 50, 50, - 50, 50, 0, 45, 50, 50, 45, 50, 50, 45, 50, 50, 50, 45, 45, 45, - 22, 23, 24, 50, 50, 50, 45, 50, 50, 45, 45, 50, 50, 50, 50, 50, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, - 0, 50, 45, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, - 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 4, 4, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 34, 34, 4, 0, 0, 0, 0, 0, - 35, 35, 35, 35, 0, 0, 0, 0, 36, 36, 4, 0, 0, 0, 0, 0, - 37, 37, 37, 37, 0, 0, 0, 0, 45, 45, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 45, 0, 45, 0, 43, 0, 0, 0, 0, 0, 0, - 0, 38, 39, 0, 40, 0, 0, 0, 0, 0, 39, 39, 39, 39, 0, 0, - 39, 0, 50, 50, 4, 0, 50, 50, 0, 0, 0, 0, 0, 0, 45, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50, 50, 50, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 50, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, - 0, 46, 50, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, - 45, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 50, 50, 50, 50, 50, 0, 0, 45, 50, 50, 50, 50, 50, 45, 45, 45, - 45, 45, 45, 50, 50, 45, 0, 0, 0, 0, 0, 50, 45, 50, 50, 50, - 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 50, 50, 50, 0, 1, 45, 45, 45, - 45, 45, 50, 50, 45, 45, 45, 45, 50, 0, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, - 50, 50, 0, 0, 0, 0, 0, 0, 50, 50, 45, 50, 50, 50, 50, 50, - 50, 50, 45, 50, 50, 53, 42, 45, 41, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 51, 49, 49, 45, 0, 50, 52, 45, 50, 45, - 50, 50, 1, 1, 50, 50, 50, 50, 1, 1, 1, 50, 50, 0, 0, 0, - 0, 50, 0, 0, 0, 1, 1, 50, 45, 50, 1, 1, 45, 45, 45, 45, - 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 44, 49, 51, 46, 47, 47, 0, 3, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 45, 45, 45, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 50, 0, 50, 50, 45, 0, 0, 50, 50, 0, 0, 0, 0, 0, 50, 50, - 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, - 50, 50, 50, 50, 50, 50, 50, 45, 45, 45, 45, 45, 45, 45, 50, 50, - 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 50, - 50, 1, 45, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 50, 45, 0, - 0, 0, 0, 0, 0, 0, 45, 45, 50, 50, 50, 45, 50, 45, 45, 45, - 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 2, 0, 0, 2, 4, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 2, 0, 0, 0, 50, 50, 50, 50, 50, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 4, 2, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 0, 0, - 1, 1, 1, 1, 1, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 43, 43, 1, - 1, 1, 0, 0, 0, 48, 43, 43, 43, 43, 43, 0, 0, 0, 0, 0, - 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 50, 50, 50, - 50, 50, 45, 45, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 0, 0, - 0, 0, 50, 50, 50, 0, 0, 0, 50, 0, 0, 50, 50, 50, 50, 50, - 50, 50, 0, 50, 50, 0, 50, 50, 45, 45, 45, 45, 45, 45, 45, 0, - 50, 50, 2, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_script(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -/* Canonical_Combining_Class: 3088 bytes. */ - -RE_UINT32 re_get_canonical_combining_class(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_canonical_combining_class_stage_1[f] << 6; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_canonical_combining_class_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_canonical_combining_class_stage_3[pos + f] << 3; - value = re_canonical_combining_class_stage_4[pos + code]; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -/* Decomposition_Type. */ + v = re_script_table_1[field_2]; + v = re_script_table_2[(v << 5) | field_1]; + v = re_script_table_3[(v << 5) | field_0]; -static RE_UINT8 re_decomposition_type_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 8, 9, 10, 10, 10, 10, 11, 7, 7, 7, 7, 12, - 7, 7, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 7, 7, 15, 16, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 17, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, -}; + return v; +} -static RE_UINT8 re_decomposition_type_stage_2[] = { - 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, - 11, 12, 0, 0, 0, 13, 14, 15, 0, 0, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 0, 28, 0, 0, 0, - 0, 29, 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 34, 0, - 0, 35, 36, 0, 0, 0, 0, 0, 0, 0, 37, 0, 38, 0, 39, 0, - 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 39, 0, 0, 0, 42, 0, - 0, 43, 0, 0, 0, 43, 44, 0, 45, 0, 46, 47, 48, 49, 0, 0, - 0, 50, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* Script_Extensions. */ +static RE_UINT8 script_extensions_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 21, 21, 34, 35, 21, 21, + 21, 36, 21, 21, 21, 21, 21, 21, 21, 21, 37, 38, 39, 39, 39, 39, + 39, 40, 41, 42, 21, 21, 21, 21, 21, 21, 21, 21, 43, 21, 21, 44, + 21, 21, 21, 21, 45, 46, 47, 21, 48, 21, 49, 50, 51, 52, 53, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 54, 13, 13, 13, 55, 56, 13, + 13, 13, 13, 57, 13, 13, 13, 13, 13, 13, 58, 21, 21, 21, 59, 21, + 13, 13, 13, 13, 60, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 61, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21 +}; +static RE_UINT16 script_extensions_table_2[] = { + 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 5, 0, 6, 7, 7, 8, 9, 10, 11, 12, 13, + 14, 14, 14, 14, 15, 14, 14, 14, 14, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 24, 24, 27, 24, 28, 29, 30, 24, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 39, 85, 86, 87, 39, 88, 88, 89, 90, 91, 92, 93, 39, + 94, 94, 95, 94, 94, 96, 97, 98, 99, 99, 99, 99, 99, 99, 99, 99, + 100, 100, 101, 100, 102, 103, 104, 100, 105, 100, 106, 107, 108, 109, 109, 110, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 112, 113, 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, + 122, 123, 123, 124, 123, 125, 111, 126, 127, 128, 129, 130, 131, 132, 133, 119, + 134, 135, 136, 137, 138, 139, 140, 39, 141, 141, 142, 143, 144, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 4, 155, 156, 157, 4, 158, 159, 160, + 4, 4, 4, 4, 4, 4, 4, 4, 161, 12, 162, 163, 12, 164, 165, 166, + 167, 168, 0, 169, 170, 0, 171, 172, 0, 173, 174, 4, 175, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 178, 178, 178, 178, 178, 178, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 180, 0, 0, 0, + 181, 182, 183, 4, 184, 184, 184, 185, 96, 186, 187, 188, 189, 190, 190, 14, + 0, 0, 191, 39, 192, 193, 193, 194, 193, 193, 193, 193, 193, 193, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 99, 99, 207, 208, 209, 210, + 211, 209, 212, 213, 209, 214, 215, 216, 203, 203, 217, 218, 0, 0, 0, 219, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 0, 0, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 220, + 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, 222, 221, 223, 224, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 226, 14, 227, 14, 228, 228, 229, 230, 231, 4, 4, 232, 4, 233, 234, + 235, 236, 237, 238, 239, 239, 240, 241, 242, 243, 244, 245, 246, 246, 247, 248, + 249, 250, 251, 94, 252, 252, 253, 254, 255, 256, 257, 258, 109, 109, 259, 260, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 261, 262, 263, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 264, 193, 193, 265, 39, 266, 267, 268, 24, 24, 24, 269, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 270, 271, 24, 272, 24, 273, 274, + 275, 276, 277, 278, 24, 24, 24, 279, 280, 1, 1, 281, 282, 211, 283, 284, + 285, 286, 287, 39, 288, 288, 288, 289, 290, 291, 12, 12, 292, 293, 294, 295, + 39, 39, 39, 39, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 39, + 307, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 39, 39, 39, 39, + 318, 318, 318, 318, 318, 318, 318, 318, 318, 319, 320, 321, 39, 39, 39, 39, + 322, 323, 324, 325, 326, 327, 39, 328, 329, 330, 39, 39, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 39, 340, 341, 342, 343, 344, 345, 346, 347, 39, 39, + 348, 348, 349, 39, 350, 351, 350, 352, 353, 354, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 355, 356, 357, 39, 39, 358, 359, 360, 39, 39, 361, 362, 363, + 364, 364, 365, 366, 367, 367, 368, 369, 370, 371, 372, 373, 374, 374, 374, 375, + 376, 377, 39, 39, 378, 379, 380, 381, 382, 383, 384, 385, 39, 39, 39, 39, + 386, 386, 387, 388, 389, 389, 390, 39, 39, 39, 39, 39, 391, 392, 393, 39, + 394, 394, 395, 396, 397, 398, 399, 39, 400, 401, 39, 39, 39, 39, 39, 39, + 402, 403, 39, 39, 39, 404, 404, 405, 406, 407, 408, 39, 39, 409, 410, 411, + 412, 412, 413, 414, 414, 415, 416, 417, 39, 39, 39, 39, 39, 39, 39, 39, + 418, 419, 420, 421, 422, 423, 39, 39, 424, 425, 426, 427, 428, 429, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 430, 39, 39, 39, 39, 39, 431, 432, 433, + 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 435, 39, 39, 39, + 434, 434, 434, 436, 434, 434, 434, 434, 434, 434, 437, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, + 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, + 438, 439, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, + 440, 440, 441, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 442, 443, 444, 39, 39, 445, 446, 447, 447, 448, 449, 450, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 451, 451, 452, 39, 39, 39, 453, 453, 454, 453, 455, 39, 39, 456, + 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, + 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, + 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, + 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 458, + 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, + 457, 457, 457, 457, 457, 457, 457, 457, 459, 459, 459, 459, 459, 459, 459, 459, + 459, 459, 459, 459, 459, 459, 460, 39, 461, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 462, 200, 200, 200, 200, 200, 200, 200, 463, 39, 464, 465, 466, 466, 466, 466, + 466, 466, 466, 466, 466, 466, 466, 467, 39, 39, 39, 39, 39, 39, 39, 39, + 468, 468, 468, 469, 470, 471, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 0, 0, 0, 0, 0, 0, 0, 472, 0, 473, 0, 474, 475, 476, 0, 477, + 12, 12, 478, 39, 39, 39, 39, 479, 0, 0, 480, 481, 39, 39, 39, 39, + 0, 0, 482, 0, 483, 484, 485, 0, 486, 487, 488, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 489, 0, 0, 0, 0, 0, 0, 0, 0, 490, 0, + 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, + 491, 491, 491, 491, 492, 493, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 494, 495, 39, 39, 39, 39, 39, 39, 496, 497, 498, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 499, 500, 39, 39, 39, 39, 39, 39, 39, 39, + 501, 501, 501, 501, 501, 501, 502, 39, 503, 503, 504, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 505, 0, 506, 39, 39, 280, 507, 39, 39, 39, 39, 39, 39, + 508, 509, 510, 511, 512, 513, 39, 514, 39, 39, 39, 39, 39, 39, 39, 39, + 0, 515, 0, 0, 479, 516, 517, 472, 0, 0, 0, 0, 0, 518, 39, 519, + 520, 521, 522, 523, 39, 39, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 0, 0, 479, 0, 0, 526, 527, + 515, 0, 528, 0, 529, 530, 39, 39, 0, 0, 0, 531, 0, 0, 532, 0, + 0, 0, 479, 533, 534, 535, 536, 39, 0, 0, 0, 0, 537, 0, 177, 538, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 539, 39, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 540, 193, 193, 193, 193, 193, 193, + 539, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 541, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 542, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 539, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 543, 39, 39, 39, 39, 39, + 544, 0, 0, 0, 39, 39, 39, 39, 7, 7, 7, 7, 7, 7, 7, 545, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39 +}; +static RE_UINT8 script_extensions_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 158, 4, 4, 158, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 5, 5, 5, 5, 1, 5, 5, 5, 0, 0, 5, 5, 5, 5, 1, 5, + 0, 0, 0, 0, 5, 1, 5, 1, 5, 5, 5, 0, 5, 0, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 160, 161, 162, 162, 161, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 0, 0, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 8, 8, 8, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 1, 10, 10, 10, 10, 10, 10, 163, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 163, 164, 0, 10, 163, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 165, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 10, 10, 10, 10, 10, 10, + 166, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 168, 10, 10, 10, 10, 10, 10, 10, 10, 1, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 169, 170, 4, 4, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 171, 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, + 17, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, + 17, 0, 17, 0, 0, 0, 17, 17, 17, 17, 0, 0, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 0, 0, 17, 17, 0, 0, 17, 17, 17, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 17, 17, 0, 17, + 17, 17, 17, 17, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, + 0, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 18, + 18, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, + 18, 0, 18, 18, 0, 18, 18, 0, 18, 18, 0, 0, 18, 0, 18, 18, + 18, 18, 18, 0, 0, 0, 0, 18, 18, 0, 0, 18, 18, 18, 0, 0, + 0, 18, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, + 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, + 19, 0, 19, 19, 0, 19, 19, 19, 19, 19, 0, 0, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 0, 19, 19, 19, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 19, 19, 19, 0, 0, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 19, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, + 0, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 20, + 20, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, + 20, 0, 20, 20, 0, 20, 20, 20, 20, 20, 0, 0, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 0, 0, 20, 20, 0, 0, 20, 20, 20, 0, 0, + 0, 0, 0, 0, 0, 20, 20, 20, 0, 0, 0, 0, 20, 20, 0, 20, + 20, 20, 20, 20, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 21, 0, 21, 21, 21, 21, 21, 21, 0, 0, 0, 21, 21, + 21, 0, 21, 21, 21, 21, 0, 0, 0, 21, 21, 0, 21, 0, 21, 21, + 0, 0, 0, 21, 21, 0, 0, 0, 21, 21, 21, 0, 0, 0, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 21, 21, + 21, 21, 21, 0, 0, 0, 21, 21, 21, 0, 21, 21, 21, 21, 0, 0, + 21, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, + 22, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, 22, 22, 22, + 22, 22, 22, 22, 22, 0, 22, 22, 22, 0, 22, 22, 22, 22, 0, 0, + 0, 0, 0, 0, 0, 22, 22, 0, 22, 22, 22, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, + 23, 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 0, 0, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 0, 23, 23, 23, 0, 23, 23, 23, 23, 0, 0, + 0, 0, 0, 0, 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 23, 0, + 23, 23, 23, 23, 0, 0, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, + 24, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 0, 24, 24, 24, 0, 24, 24, 24, 24, 24, 24, + 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 0, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 0, 0, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 0, 0, 0, 0, 25, + 25, 25, 25, 25, 25, 0, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, + 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 0, 0, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 1, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, + 0, 27, 27, 0, 27, 0, 27, 27, 27, 27, 27, 0, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 0, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 27, 27, 27, 27, 27, 0, 27, 0, 27, 27, 27, 27, 27, 27, 0, 0, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, + 0, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, + 28, 28, 28, 28, 28, 1, 1, 1, 1, 28, 28, 0, 0, 0, 0, 0, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 0, 30, 0, 0, 0, 0, 0, 30, 0, 0, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 180, 30, 30, 30, 30, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 0, 32, 32, 32, 32, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 0, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 32, 0, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 0, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 0, 0, 33, 33, 33, 33, 33, 33, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 1, 1, 1, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, 37, 37, + 37, 37, 37, 37, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 181, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 40, 40, + 40, 0, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, + 42, 42, 182, 182, 42, 182, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, 0, + 43, 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, + 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 45, 45, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 46, 46, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 51, 51, 51, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 30, 30, 30, + 49, 49, 49, 49, 49, 49, 49, 49, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 184, 183, 185, 184, 186, 186, 187, 186, 187, 188, 184, 187, 187, 184, 184, + 187, 186, 184, 184, 184, 184, 184, 184, 184, 189, 186, 184, 184, 186, 184, 184, + 184, 184, 190, 185, 191, 186, 186, 192, 185, 185, 193, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, + 5, 5, 2, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, + 158, 158, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 194, 4, 0, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 0, 5, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 195, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 57, 58, 59, 0, 0, - 60, 60, 60, 60, 61, 60, 60, 62, 63, 60, 64, 65, 60, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 0, 0, 75, 76, 77, 78, 79, 80, 81, 0, - 82, 83, 84, 85, 86, 87, 0, 88, 0, 89, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 90, 78, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, + 30, 30, 30, 30, 30, 30, 0, 30, 0, 0, 0, 0, 0, 30, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 1, 1, 1, 161, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 197, 197, 198, 1, 56, 199, 56, 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 1, 198, 197, 197, 197, 197, 197, 197, 197, 197, 198, 198, 198, 198, + 1, 56, 56, 56, 56, 56, 56, 56, 56, 56, 200, 200, 200, 200, 31, 31, + 198, 201, 201, 201, 201, 201, 1, 198, 56, 56, 56, 56, 202, 202, 199, 199, + 0, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 0, 0, 201, 201, 201, 201, 57, 57, 57, + 201, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 197, 201, 58, 58, 58, + 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, + 199, 199, 199, 199, 199, 199, 199, 199, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 1, 1, 1, 1, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 199, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 1, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 0, 0, 0, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 94, 0, 0, 95, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, - 0, 0, 0, 0, 99, 0, 0, 43, 78, 78, 78, 78, 78, 78, 100, 0, - 101, 102, 103, 104, 105, 103, 104, 106, 0, 107, 78, 78, 108, 0, 0, 0, - 109, 78, 110, 111, 92, 92, 112, 113, 114, 114, 115, 116, 114, 114, 114, 117, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 161, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 203, 203, 203, 203, 203, 203, 203, 203, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, + 204, 204, 204, 205, 205, 205, 206, 206, 206, 206, 0, 0, 0, 0, 0, 0, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 0, 0, 0, 0, 0, 0, 0, 0, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 186, 16, 207, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 208, 66, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 209, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 68, 68, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 0, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 0, 69, 69, 69, 69, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 32, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 0, + 0, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, + 31, 31, 31, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, 0, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 0, + 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 210, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 210, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 198, 198, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 197, 197, 197, 197, 197, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 201, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 201, 201, + 0, 0, 31, 31, 31, 31, 31, 31, 0, 0, 31, 31, 31, 31, 31, 31, + 0, 0, 31, 31, 31, 31, 31, 31, 0, 0, 31, 31, 31, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 0, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 72, 72, 0, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, 0, 0, 0, + 211, 211, 211, 0, 0, 0, 0, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 0, 0, 0, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0, 0, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 0, 0, 0, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 0, 0, 0, 0, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 75, 75, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 0, 0, 0, 0, 0, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 78, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 0, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 0, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 87, 87, 87, 87, 87, 0, 0, 87, 0, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 0, 87, 87, 0, 0, 0, 87, 0, 0, 87, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 0, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, + 0, 0, 0, 0, 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 0, 91, 91, 0, 0, 0, 0, 0, 91, 91, 91, 91, 91, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 92, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 0, 0, 0, 0, 0, 93, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 96, 96, 96, 96, 0, 96, 96, 0, 0, 0, 0, 0, 96, 96, 96, 96, + 96, 96, 96, 96, 0, 96, 96, 96, 0, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 0, 0, 96, 96, 96, 0, 0, 0, 0, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 0, 0, 0, 0, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 0, 0, 0, 100, 100, 100, 100, 100, 100, 100, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 0, 0, 101, 101, 101, 101, 101, 101, 101, 101, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 0, 0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 0, 0, 0, 0, 0, 0, 0, 103, 103, 103, 103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 103, 103, 103, 103, 103, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 107, 0, 0, + 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 0, 0, + 0, 0, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 0, 0, 0, 0, 0, 0, 0, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 0, 0, 0, 0, 0, 0, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 0, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 0, + 119, 119, 119, 119, 119, 119, 119, 0, 119, 0, 119, 119, 119, 119, 0, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 0, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 0, 0, 0, 0, 0, 0, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 0, 0, 0, 0, 0, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 0, 0, 0, 0, 0, 0, + 121, 177, 121, 177, 0, 121, 121, 121, 121, 121, 121, 121, 121, 0, 0, 121, + 121, 0, 0, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 0, 121, 121, 121, 121, 121, 121, + 121, 0, 121, 121, 0, 121, 121, 121, 121, 121, 0, 177, 177, 121, 121, 121, + 121, 121, 121, 121, 121, 0, 0, 121, 121, 0, 0, 121, 121, 121, 0, 0, + 121, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 121, 121, 121, + 121, 121, 121, 121, 0, 0, 121, 121, 121, 121, 121, 121, 121, 0, 0, 0, + 121, 121, 121, 121, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 0, 122, 122, 122, + 122, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, 0, 0, 0, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, 0, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 0, 0, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 0, 0, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 0, 0, 0, 0, 0, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 0, 0, 0, 0, 0, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 0, 0, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 130, 130, 130, 130, 130, 130, 0, 0, 130, 0, 0, 130, 130, 130, 130, + 130, 130, 130, 130, 0, 130, 130, 0, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 0, 130, 130, 0, 0, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0, + 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 0, 0, 0, 0, 0, 0, 0, 0, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 0, 0, 0, 0, 0, 0, 0, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 0, 0, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 0, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 137, 137, 137, 137, 137, 137, 137, 0, 137, 137, 0, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 137, 0, 137, 137, 0, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 0, 0, 0, 0, 0, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 0, 0, 0, + 138, 138, 138, 138, 138, 138, 0, 138, 138, 0, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, + 138, 138, 0, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, 0, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 177, 177, 21, 177, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, + 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 0, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 0, 0, 0, 0, 0, 0, 0, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, 0, 0, 0, 143, 143, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, + 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 145, 145, 145, 145, 145, + 145, 145, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 0, 0, 0, 0, 0, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, 0, 0, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, 0, 0, 0, 0, 0, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 148, 149, 1, 1, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, 0, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 58, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 120, + 57, 57, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 58, 58, 58, 58, 0, 0, 0, 0, 0, 0, 0, 0, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, 0, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 151, 151, 151, 151, + 214, 214, 214, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 122, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 60, 60, 60, 60, 60, 60, 60, 60, - 123, 124, 60, 125, 60, 60, 62, 0, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 134, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 157, 158, 159, 160, 161, 162, - 0, 0, 0, 0, 163, 164, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, + 4, 4, 4, 1, 1, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 170, 0, 171, 172, 0, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 173, 173, 174, 173, 175, 176, 177, 173, 178, 179, 180, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 181, 173, 173, 173, 173, 173, 173, 173, 173, 182, 173, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 152, 152, 152, 152, + 0, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, + 54, 54, 0, 54, 54, 0, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, 0, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, 0, 0, 153, 153, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 0, 0, 0, 0, 0, 154, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 0, 0, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 0, 0, 0, 0, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 0, 0, 0, 0, 156, 156, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 10, 10, 0, 10, 0, 0, 10, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 10, 10, 10, 10, 0, 10, 0, 10, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 10, 0, 10, 0, 10, 0, 10, 10, 10, + 0, 10, 10, 0, 10, 0, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, + 0, 10, 10, 0, 10, 0, 0, 10, 10, 10, 10, 0, 10, 10, 10, 10, + 10, 10, 10, 0, 10, 10, 10, 10, 0, 10, 10, 10, 10, 0, 10, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 10, 10, 10, 0, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 57, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 199, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 177, 183, 184, 185, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 188, 189, 190, 191, 192, 0, 0, 0, - 193, 194, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; +static RE_UINT16 script_extensions_table_4[] = { + 0, 2, 4, 7, 10, 13, 19, 23, 32, 35, 39, 42, 56, 69, 90, 112, + 117, 121, 124, 127, 130, 133, 137, 140, 145, 148, 153, 155, 158, 161, 164, 171, + 174, 183, 187, 189, 191, 194, 197, 201, 208, 214, 216, 219, 222, 226, 229, 244, + 258, 270, 273, 277, 280, 283, 286, 290, 293 +}; +static RE_UINT8 script_extensions_table_5[] = { + 5, 0, 2, 0, 7, 77, 0, 7, 54, 0, 7, 2, 0, 10, 106, 11, + 12, 107, 0, 10, 11, 12, 0, 156, 10, 15, 99, 103, 106, 109, 11, 0, + 10, 11, 0, 10, 12, 107, 0, 10, 106, 0, 17, 16, 121, 19, 18, 23, + 2, 24, 20, 117, 21, 22, 123, 0, 17, 16, 121, 19, 18, 23, 2, 24, + 20, 21, 22, 123, 0, 17, 16, 128, 138, 137, 121, 19, 18, 23, 116, 24, + 131, 20, 120, 25, 63, 126, 21, 22, 123, 0, 17, 16, 128, 138, 137, 121, + 19, 18, 23, 43, 116, 24, 131, 20, 120, 25, 63, 126, 21, 22, 123, 0, + 16, 128, 113, 116, 0, 17, 115, 63, 0, 18, 119, 0, 19, 118, 0, 121, + 21, 0, 23, 131, 0, 115, 29, 44, 0, 30, 2, 0, 39, 38, 40, 37, + 0, 42, 64, 0, 17, 16, 121, 23, 0, 16, 0, 16, 121, 0, 17, 16, + 0, 16, 117, 0, 16, 23, 24, 20, 21, 22, 0, 16, 131, 0, 17, 16, + 121, 23, 131, 20, 22, 123, 0, 16, 121, 23, 0, 17, 0, 131, 0, 7, + 11, 0, 2, 42, 0, 16, 121, 2, 0, 3, 31, 56, 57, 58, 59, 0, + 3, 31, 56, 57, 58, 0, 56, 0, 3, 56, 0, 57, 58, 0, 56, 57, + 58, 0, 56, 2, 0, 16, 128, 19, 18, 118, 23, 113, 116, 24, 125, 131, + 120, 126, 123, 0, 16, 128, 19, 18, 118, 23, 113, 116, 125, 131, 120, 126, + 123, 0, 16, 128, 19, 18, 118, 113, 116, 125, 120, 126, 123, 0, 16, 21, + 0, 66, 2, 29, 0, 46, 68, 0, 10, 12, 0, 87, 72, 0, 87, 86, + 72, 0, 10, 6, 0, 151, 0 +}; + +int re_get_script_extensions(RE_UINT32 codepoint, RE_UINT8* scripts) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + int offset; + int count; -static RE_UINT8 re_decomposition_type_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, - 8, 9, 8, 8, 10, 11, 10, 12, 8, 9, 8, 8, 10, 11, 10, 9, - 8, 8, 8, 8, 13, 8, 8, 8, 8, 12, 8, 8, 14, 8, 10, 15, - 16, 8, 17, 8, 12, 8, 8, 8, 8, 12, 8, 8, 8, 8, 8, 15, - 12, 0, 0, 18, 19, 0, 0, 0, 0, 20, 20, 21, 8, 8, 8, 22, - 8, 13, 8, 8, 23, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, - 0, 13, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 24, 24, 25, 0, - 0, 0, 0, 0, 0, 0, 20, 5, 24, 25, 0, 0, 0, 0, 0, 0, - 9, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 26, 27, - 0, 21, 11, 22, 19, 0, 0, 0, 0, 0, 13, 8, 19, 0, 0, 0, - 0, 0, 13, 11, 28, 29, 0, 0, 0, 0, 0, 0, 30, 5, 31, 0, - 9, 18, 0, 11, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 9, 18, 0, 11, 0, 0, 0, 0, 0, 13, 0, 0, - 33, 0, 0, 0, 8, 13, 13, 8, 13, 8, 13, 8, 8, 12, 12, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 13, 11, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 34, 35, 0, 36, 0, 0, 0, 18, 0, 0, 0, - 0, 0, 32, 0, 32, 19, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, - 0, 0, 18, 19, 0, 0, 0, 9, 0, 0, 0, 0, 18, 27, 0, 0, - 0, 0, 0, 0, 0, 0, 10, 27, 0, 0, 37, 19, 0, 0, 0, 12, - 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 13, 19, 0, 0, 0, 0, - 0, 0, 19, 0, 0, 0, 0, 0, 19, 18, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 27, 11, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, - 18, 0, 0, 32, 27, 18, 0, 19, 0, 0, 32, 0, 18, 38, 17, 0, - 32, 0, 0, 0, 18, 0, 0, 32, 27, 18, 0, 19, 0, 0, 32, 0, - 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, - 0, 27, 36, 36, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 32, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 24, 24, 39, 24, - 24, 24, 24, 40, 24, 24, 24, 24, 41, 42, 43, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 0, 44, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 45, 0, - 8, 8, 8, 8, 8, 8, 12, 0, 8, 8, 8, 8, 8, 12, 8, 12, - 8, 12, 8, 12, 8, 8, 46, 46, 8, 8, 8, 8, 8, 8, 8, 12, - 8, 8, 8, 8, 8, 22, 8, 47, 21, 22, 8, 8, 8, 13, 8, 10, - 8, 8, 8, 8, 13, 22, 8, 48, 49, 50, 30, 0, 51, 3, 0, 0, - 0, 30, 0, 52, 3, 53, 0, 54, 0, 3, 5, 0, 0, 3, 0, 3, - 0, 0, 0, 0, 55, 24, 24, 24, 42, 42, 42, 43, 42, 42, 42, 56, - 0, 0, 35, 0, 0, 0, 0, 0, 57, 34, 58, 59, 59, 60, 61, 62, - 63, 64, 65, 66, 66, 67, 68, 59, 69, 61, 62, 0, 70, 70, 70, 70, - 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 71, 0, 0, 0, 13, 0, - 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, - 0, 19, 32, 19, 0, 0, 0, 0, 0, 36, 0, 72, 35, 0, 0, 0, - 32, 37, 32, 0, 0, 0, 0, 0, 36, 0, 0, 10, 12, 12, 12, 0, - 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, - 8, 0, 13, 12, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, - 73, 73, 73, 73, 73, 20, 20, 20, 20, 20, 20, 20, 20, 74, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 75, 0, 0, 0, 0, 0, - 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 76, - 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 20, 20, 20, 20, 20, 5, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 30, 0, 0, 0, 0, 36, 36, 36, 36, 36, - 36, 46, 32, 0, 9, 22, 33, 12, 0, 0, 0, 0, 0, 19, 3, 78, - 0, 0, 0, 0, 0, 37, 11, 79, 0, 0, 0, 0, 34, 20, 20, 20, - 20, 20, 20, 30, 4, 24, 24, 24, 20, 20, 20, 20, 20, 20, 20, 30, - 20, 73, 0, 0, 80, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 75, - 20, 20, 20, 81, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 82, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 20, 20, - 20, 20, 20, 20, 83, 81, 81, 81, 20, 20, 20, 20, 20, 20, 20, 84, - 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 24, - 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 12, 36, 10, 8, 11, - 36, 33, 13, 8, 8, 8, 8, 8, 8, 8, 8, 12, 8, 8, 8, 8, - 20, 30, 0, 0, 3, 20, 0, 46, 59, 59, 85, 8, 8, 11, 8, 36, - 9, 22, 8, 15, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 86, 86, 86, 87, 87, 87, 87, 88, 86, 87, 87, 89, 0, 0, 0, - 0, 0, 0, 0, 90, 91, 92, 93, 86, 88, 87, 86, 86, 86, 94, 88, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 97, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 99, 100, 100, 100, 100, 100, 101, 95, 95, - 95, 95, 95, 95, 102, 96, 96, 96, 96, 96, 96, 103, 98, 100, 100, 104, - 0, 0, 0, 0, 105, 98, 106, 107, 108, 106, 109, 106, 105, 97, 96, 106, - 97, 110, 111, 98, 112, 107, 113, 106, 96, 96, 96, 96, 96, 107, 114, 96, - 97, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 95, 115, - 0, 0, 0, 0, 116, 116, 117, 0, 0, 0, 0, 0, 116, 116, 116, 116, - 116, 118, 119, 20, 120, 121, 121, 121, 121, 120, 121, 0, 122, 123, 124, 124, - 125, 92, 126, 127, 91, 126, 128, 128, 128, 128, 127, 92, 126, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 127, 126, 127, 92, 129, - 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 132, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, - 133, 133, 133, 133, 133, 133, 133, 134, 135, 133, 135, 133, 135, 133, 135, 136, - 131, 137, 133, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 19, - 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, - 0, 0, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 36, - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 13, - 8, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 8, - 19, 0, 0, 0, 0, 0, 0, 0, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 138, 59, 59, 59, 59, 59, 59, 59, 59, 59, 138, - 139, 140, 61, 138, 59, 59, 66, 61, 59, 61, 59, 59, 59, 59, 59, 59, - 59, 66, 141, 61, 59, 138, 59, 138, 59, 59, 59, 59, 59, 59, 66, 141, - 59, 142, 143, 59, 138, 59, 59, 59, 59, 62, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 143, 59, 59, 59, 59, 140, 144, 61, 59, 141, 59, 145, 0, - 139, 146, 145, 61, 140, 144, 145, 145, 140, 144, 141, 59, 141, 59, 61, 142, - 59, 59, 66, 59, 59, 59, 59, 0, 61, 61, 66, 59, 59, 59, 59, 0, - 20, 20, 30, 0, 20, 20, 20, 20, 20, 20, 147, 75, 81, 81, 81, 81, - 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 4, 25, 0, 0, 0, 0, - 0, 0, 0, 0, 148, 0, 0, 0, 149, 0, 0, 0, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 0, 20, 20, 35, 0, 150, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -static RE_UINT8 re_decomposition_type_stage_4[] = { - 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 10, 0, 0, 0, 0, 2, - 0, 0, 10, 10, 2, 2, 0, 0, 2, 10, 10, 0, 17, 17, 17, 0, - 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 2, 2, 1, 1, 1, 2, - 2, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2, - 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, - 2, 2, 2, 1, 1, 2, 2, 0, 2, 2, 2, 0, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 1, 1, 0, 0, 2, 2, 2, 2, 0, 0, 0, - 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 2, 10, 10, 10, 0, - 10, 10, 0, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, - 0, 0, 0, 10, 1, 1, 2, 1, 0, 1, 0, 1, 1, 2, 1, 2, - 1, 1, 2, 0, 1, 1, 2, 2, 2, 2, 2, 4, 0, 4, 0, 0, - 0, 0, 0, 4, 2, 0, 2, 2, 2, 0, 2, 0, 10, 10, 0, 0, - 11, 0, 0, 0, 2, 2, 3, 2, 0, 2, 3, 3, 3, 3, 3, 3, - 0, 3, 2, 0, 0, 3, 3, 3, 3, 3, 0, 0, 10, 2, 10, 0, - 3, 0, 1, 0, 3, 0, 1, 1, 3, 3, 0, 3, 3, 2, 2, 2, - 2, 3, 0, 2, 3, 0, 0, 0, 17, 17, 17, 17, 0, 17, 0, 0, - 2, 2, 0, 2, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, 9, 0, - 11, 10, 0, 0, 13, 0, 0, 0, 2, 0, 1, 12, 0, 0, 1, 12, - 16, 9, 9, 9, 16, 16, 16, 16, 9, 9, 9, 16, 2, 16, 16, 16, - 2, 2, 2, 16, 3, 3, 1, 1, 8, 7, 8, 7, 5, 6, 8, 7, - 8, 7, 5, 6, 8, 7, 0, 0, 0, 0, 0, 8, 7, 5, 6, 8, - 7, 8, 7, 8, 7, 8, 8, 7, 5, 8, 7, 5, 8, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 6, - 6, 6, 6, 6, 6, 8, 8, 8, 8, 7, 7, 7, 7, 5, 5, 5, - 7, 8, 0, 0, 5, 7, 5, 5, 7, 5, 7, 7, 5, 5, 7, 7, - 5, 5, 7, 5, 5, 7, 7, 5, 7, 7, 5, 7, 5, 5, 5, 7, - 0, 0, 5, 5, 5, 7, 7, 7, 5, 7, 5, 7, 8, 0, 0, 0, - 12, 12, 12, 12, 12, 12, 0, 0, 12, 0, 0, 12, 12, 2, 2, 2, - 15, 15, 15, 0, 15, 15, 15, 15, 8, 6, 8, 0, 8, 0, 8, 6, - 8, 6, 8, 6, 8, 8, 7, 8, 7, 8, 7, 5, 6, 8, 7, 8, - 6, 8, 7, 5, 7, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, - 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, - 14, 0, 0, 0, 13, 13, 13, 0, 3, 0, 3, 3, 0, 0, 3, 0, - 0, 3, 3, 0, 3, 3, 3, 0, 3, 0, 3, 0, 0, 0, 3, 3, - 3, 0, 0, 3, 0, 3, 0, 3, 0, 0, 0, 3, 2, 2, 2, 9, - 16, 0, 0, 0, 16, 16, 16, 0, 9, 9, 0, 0, -}; + v = script_extensions_table_1[field_2]; + v = script_extensions_table_2[(v << 5) | field_1]; + v = script_extensions_table_3[(v << 5) | field_0]; + + if (v < 158) { + scripts[0] = v; -/* Decomposition_Type: 3868 bytes. */ - -RE_UINT32 re_get_decomposition_type(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_decomposition_type_stage_1[f] << 6; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_decomposition_type_stage_2[pos + f] << 3; - f = code >> 2; - code ^= f << 2; - pos = (RE_UINT32)re_decomposition_type_stage_3[pos + f] << 2; - value = re_decomposition_type_stage_4[pos + code]; - - return value; + return 1; + } + + offset = script_extensions_table_4[v - 158]; + count = 0; + + do { + scripts[count] = script_extensions_table_5[offset + count]; + ++count; + } while (script_extensions_table_5[offset + count] != 0); + + return count; } -/* East_Asian_Width. */ +/* Sentence_Break. */ +static RE_UINT8 re_sentence_break_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 19, 19, 13, 32, 19, 19, + 19, 33, 19, 19, 19, 19, 19, 19, 19, 19, 34, 35, 13, 13, 13, 13, + 13, 36, 13, 37, 19, 19, 19, 19, 19, 19, 19, 19, 38, 19, 19, 39, + 19, 19, 19, 19, 40, 41, 42, 19, 43, 19, 44, 45, 46, 47, 48, 19, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 49, 13, 13, 13, 50, 51, 13, + 13, 13, 13, 52, 13, 13, 13, 13, 13, 13, 53, 19, 19, 19, 54, 19, + 13, 13, 13, 13, 55, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 56, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19 +}; -static RE_UINT8 re_east_asian_width_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 7, 8, 9, - 10, 10, 10, 10, 10, 10, 11, 5, 12, 10, 10, 13, 10, 10, 10, 14, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, +static RE_UINT16 re_sentence_break_table_2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 8, 16, 17, 18, 19, 20, 21, 22, 23, 23, 23, 24, 25, 26, 27, 28, + 29, 30, 18, 8, 31, 8, 32, 8, 8, 33, 34, 18, 35, 36, 37, 38, + 39, 40, 41, 42, 40, 40, 43, 44, 45, 46, 47, 40, 40, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 72, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 55, 101, 102, 103, 55, 104, 105, 106, 107, 108, 109, 110, 55, + 40, 111, 112, 113, 114, 29, 115, 116, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 117, 40, 118, 119, 120, 40, 121, 40, 122, 123, 124, 29, 29, 125, + 98, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 126, 127, 40, 40, 128, 129, 130, 131, 132, 40, 133, 134, 135, + 136, 40, 40, 137, 138, 139, 40, 140, 141, 142, 143, 144, 40, 145, 146, 55, + 147, 40, 148, 149, 150, 151, 152, 55, 153, 133, 154, 155, 156, 157, 40, 158, + 40, 159, 160, 161, 162, 163, 164, 165, 18, 18, 18, 18, 18, 18, 23, 166, + 8, 8, 8, 8, 167, 8, 8, 8, 168, 169, 170, 171, 169, 172, 173, 174, + 175, 176, 177, 178, 179, 55, 180, 181, 182, 183, 184, 30, 185, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 186, 187, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 188, 30, 189, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 190, 191, 55, 55, 192, 193, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 194, 55, 195, 196, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 29, 197, 198, 199, 8, 8, 8, 200, 18, 201, 40, 202, 203, 204, 204, 23, + 205, 206, 207, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 208, 209, 98, 40, 210, 98, 40, 116, 211, 212, 40, 40, 213, 40, 55, 214, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 215, + 40, 40, 40, 40, 216, 55, 214, 217, 40, 40, 40, 40, 40, 40, 40, 40, + 218, 219, 8, 220, 221, 40, 40, 222, 223, 224, 8, 225, 226, 227, 228, 229, + 230, 231, 40, 232, 233, 133, 234, 235, 49, 236, 237, 215, 59, 238, 239, 240, + 40, 241, 242, 243, 40, 244, 245, 246, 247, 248, 249, 250, 18, 18, 40, 251, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 252, 253, 254, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 255, 40, 40, 256, 55, 257, 258, 259, 40, 40, 260, 261, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 262, 214, 40, 263, 40, 264, 265, + 266, 267, 268, 269, 40, 40, 40, 270, 271, 2, 272, 273, 274, 141, 275, 276, + 277, 278, 279, 55, 40, 40, 40, 280, 55, 55, 40, 281, 55, 55, 55, 282, + 55, 55, 55, 55, 215, 40, 283, 152, 40, 284, 285, 286, 287, 40, 288, 55, + 29, 289, 290, 40, 287, 291, 292, 293, 40, 294, 40, 295, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 203, 140, 264, 55, 55, 55, 55, + 296, 297, 140, 203, 141, 55, 55, 298, 140, 256, 55, 55, 40, 299, 55, 55, + 300, 301, 302, 215, 215, 55, 106, 303, 40, 140, 140, 304, 260, 55, 55, 55, + 40, 40, 305, 55, 29, 306, 18, 307, 40, 308, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 40, 309, 55, 55, 215, 310, 311, 55, 55, 214, 312, 203, + 156, 313, 314, 315, 156, 316, 317, 318, 156, 319, 320, 321, 156, 238, 322, 55, + 323, 324, 55, 55, 325, 326, 327, 328, 329, 330, 331, 332, 55, 55, 55, 55, + 40, 333, 334, 335, 40, 46, 336, 55, 55, 55, 55, 55, 40, 337, 338, 55, + 40, 46, 339, 55, 40, 340, 135, 55, 122, 341, 55, 55, 55, 55, 55, 55, + 40, 342, 55, 55, 55, 29, 18, 343, 344, 345, 346, 55, 55, 347, 348, 349, + 350, 351, 352, 40, 353, 55, 40, 137, 55, 55, 55, 55, 55, 55, 55, 55, + 354, 355, 356, 357, 358, 359, 55, 55, 360, 361, 362, 363, 364, 135, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 365, 55, 55, 55, 55, 55, 366, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 256, 55, 55, 55, + 40, 40, 40, 213, 40, 40, 40, 40, 40, 40, 295, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 367, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 368, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 137, 141, 369, 55, 55, 214, 370, 40, 371, 372, 373, 124, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 29, 18, 374, 55, 55, 55, 40, 40, 375, 23, 376, 55, 55, 377, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 378, + 40, 40, 40, 40, 40, 40, 140, 55, 305, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 141, 55, 379, 380, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 254, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 381, 382, 383, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 384, 385, 386, 55, 55, + 55, 55, 387, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 388, 389, 401, + 391, 402, 403, 404, 395, 405, 406, 407, 408, 409, 410, 197, 411, 412, 413, 414, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 23, 415, 23, 416, 417, 418, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 419, 420, 55, 55, 55, 55, 55, 55, 40, 421, 422, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 40, 423, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 424, 55, 29, 425, 426, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 427, 428, 429, 430, 431, 432, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 433, 434, 434, 435, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 436, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 437, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 287, 55, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 281, 40, 40, 40, 40, 40, 40, + 287, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 438, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 439, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 287, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 54, 55, 55, 55, 55, 55, + 440, 23, 23, 23, 55, 55, 55, 55, 23, 23, 23, 23, 23, 23, 23, 441, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55 +}; + +static RE_UINT8 re_sentence_break_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 1, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 4, 5, 0, 0, 0, 0, 5, 5, 5, 0, 0, 6, 6, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 0, 0, 0, 0, 4, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 0, 5, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 5, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 10, 5, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 10, 9, 10, 9, 10, 9, 10, 9, + 10, 9, 10, 9, 10, 9, 10, 9, 10, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 9, 10, 9, 10, 9, 10, 10, + 10, 9, 9, 10, 9, 10, 9, 9, 10, 9, 9, 9, 10, 10, 9, 9, + 9, 9, 10, 9, 9, 10, 9, 9, 9, 10, 10, 10, 9, 9, 10, 9, + 9, 10, 9, 10, 9, 10, 9, 9, 10, 9, 10, 10, 9, 10, 9, 9, + 10, 9, 9, 9, 10, 9, 10, 9, 9, 10, 10, 13, 9, 10, 10, 10, + 13, 13, 13, 13, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 10, 9, + 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 10, 9, 9, 10, 9, 10, 9, 9, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 10, 10, 10, 10, 10, 10, 9, 9, 10, 9, 9, 10, + 10, 9, 10, 9, 9, 9, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, + 10, 10, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 13, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 9, 10, 9, 10, 13, 0, 9, 10, 0, 0, 10, 10, 10, 10, 0, 9, + 0, 0, 0, 0, 0, 0, 9, 0, 9, 9, 9, 0, 9, 0, 9, 9, + 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, + 10, 10, 9, 9, 9, 10, 10, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 10, 10, 10, 10, 9, 10, 0, 9, 10, 9, 9, 10, 10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 9, 10, 0, 14, 14, 14, 14, 14, 14, 14, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 13, 0, 0, 0, 6, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 0, 0, 0, 0, 0, 0, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, + 0, 14, 14, 0, 14, 14, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 13, + 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 12, 0, 4, 4, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, 0, 13, 13, + 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 4, 13, 14, 14, 14, 14, 14, 14, 14, 12, 0, 14, + 14, 14, 14, 14, 14, 13, 13, 14, 14, 0, 14, 14, 14, 14, 13, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 13, 13, 0, 0, 13, + 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, + 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 13, 13, 0, 0, 6, 4, 13, 0, 0, 14, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 13, 14, 14, 14, 13, 14, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 13, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 14, 14, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, + 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 0, 13, 0, 0, 0, 13, 13, 13, 13, 0, 0, 14, 13, 14, 14, + 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 13, 13, 0, 13, + 13, 13, 14, 14, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, + 0, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 13, + 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 0, 13, 13, 0, 13, 13, 0, 13, 13, 0, 0, 14, 0, 14, 14, + 14, 14, 14, 0, 0, 0, 0, 14, 14, 0, 0, 14, 14, 14, 0, 0, + 0, 14, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 14, 14, 13, 13, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, + 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 0, 0, 14, 13, 14, 14, + 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 14, 14, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 14, 14, 14, 14, 14, + 0, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, + 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 13, 13, 0, 13, + 13, 13, 14, 14, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 13, 0, 13, 13, 13, 13, 13, 13, 0, 0, 0, 13, 13, + 13, 0, 13, 13, 13, 13, 0, 0, 0, 13, 13, 0, 13, 0, 13, 13, + 0, 0, 0, 13, 13, 0, 0, 0, 13, 13, 13, 0, 0, 0, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 14, 14, + 14, 14, 14, 0, 0, 0, 14, 14, 14, 0, 14, 14, 14, 14, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, + 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 13, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 0, 13, 13, 13, 0, 0, 0, 0, 0, + 13, 13, 14, 14, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, + 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 0, 0, 14, 13, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 13, 13, 14, 14, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, + 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 14, 13, 0, + 0, 0, 0, 0, 13, 13, 13, 14, 0, 0, 0, 0, 0, 0, 0, 13, + 13, 13, 14, 14, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, + 0, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 14, 0, 0, 0, 0, 14, + 14, 14, 14, 14, 14, 0, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 13, 13, 0, 13, 0, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 0, 0, + 13, 13, 13, 13, 13, 0, 13, 0, 14, 14, 14, 14, 14, 14, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 13, 13, 13, 13, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 14, 0, 14, 5, 5, 5, 5, 14, 14, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, + 14, 13, 14, 14, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 13, + 13, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 14, 14, 14, 14, 0, 0, + 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 0, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 0, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 0, + 13, 0, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 0, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 14, 14, 14, + 0, 0, 4, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 10, 10, 10, 10, 10, 10, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 4, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 5, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, + 13, 13, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 14, 14, 14, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, + 13, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 13, 0, 0, 0, 0, 13, 14, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 4, 0, 0, 0, 0, 6, 4, 0, 14, 14, 14, 12, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 4, 4, 4, 4, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 0, 0, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 4, 4, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 13, 13, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 4, 4, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 13, 13, + 13, 13, 13, 13, 14, 13, 13, 14, 14, 14, 13, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 9, 0, 9, 0, 9, 0, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 0, 10, 10, 9, 9, 9, 9, 9, 0, 10, 0, + 0, 0, 10, 10, 10, 0, 10, 10, 9, 9, 9, 9, 9, 0, 0, 0, + 10, 10, 10, 10, 0, 0, 10, 10, 9, 9, 9, 9, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 10, 10, 10, 0, 10, 10, 9, 9, 9, 9, 9, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 14, 14, 12, 12, + 0, 0, 0, 6, 6, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 7, 0, 0, 0, 11, 11, 12, 12, 12, 12, 12, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 4, 4, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 12, 12, 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 9, 0, 0, 10, 9, 9, 9, 10, 10, + 9, 9, 9, 10, 0, 9, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 9, 0, 9, 0, 9, 0, 9, 9, 9, 9, 0, 10, + 9, 9, 9, 9, 10, 13, 13, 13, 13, 10, 0, 0, 10, 10, 9, 9, + 0, 0, 0, 0, 0, 9, 10, 10, 10, 10, 0, 0, 0, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 9, 10, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 9, 10, 9, 9, 9, 10, 10, 9, 10, 9, 10, 9, 10, 9, 9, 9, + 9, 10, 9, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, + 9, 10, 9, 10, 10, 0, 0, 0, 0, 0, 0, 9, 10, 9, 10, 14, + 14, 14, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, 0, 0, 10, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 4, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 6, 4, 0, 0, 13, 13, 13, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, + 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, + 0, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 14, 14, 0, 0, 13, 13, 13, + 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 4, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 4, 4, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 13, 14, + 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 13, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 10, 10, 14, 14, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 0, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 10, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 9, 10, 9, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 13, 0, 0, 9, 10, 9, 10, 13, + 9, 10, 9, 10, 10, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 9, 9, 9, 9, 10, + 9, 9, 9, 9, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 0, 0, 9, 10, 9, 9, 9, 9, 10, 9, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 10, 13, 10, 10, 10, 13, 13, 13, 13, 13, + 13, 13, 14, 13, 13, 13, 14, 13, 13, 13, 13, 14, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 13, 13, 13, 13, 13, 13, 0, 0, 0, 13, 0, 13, 13, 14, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 0, 4, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 13, 13, 13, 13, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 4, 4, 4, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 13, 14, 14, 14, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 13, 14, 14, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14, + 13, 14, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, + 4, 4, 13, 13, 13, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, 0, + 0, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 4, 14, 14, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 13, 14, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 0, 13, 0, + 13, 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 5, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 6, 6, 0, 6, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 6, 6, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 7, 0, 0, 6, 4, 4, 6, 5, 5, 5, 5, 5, 5, 0, + 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 12, + 0, 4, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 6, 6, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 0, 0, 0, 0, 4, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 0, 5, 0, 5, + 5, 4, 5, 5, 6, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, + 0, 0, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, + 0, 0, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 0, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 0, 0, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 0, 13, 13, 0, 0, 0, 13, 0, 0, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 0, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 13, 13, + 13, 14, 14, 14, 0, 14, 14, 0, 0, 0, 0, 0, 14, 14, 14, 14, + 13, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 0, 0, 14, 14, 14, 0, 0, 0, 0, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 14, 14, 0, 0, 0, + 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 4, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 12, 4, 4, + 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 4, 4, 4, 13, 14, 14, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 14, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 13, 13, 13, 13, 4, 4, 0, 0, 14, 14, 14, 14, 4, 14, 14, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 0, 13, 0, 4, 4, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 4, 4, 0, 4, 4, 0, 14, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 0, 13, 13, 13, 13, 0, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 4, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, + 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 0, 14, 14, 13, 14, 14, + 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 13, 13, 13, + 13, 13, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 4, 4, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 14, 13, + 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 13, 13, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, + 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 4, 4, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 13, 13, 13, 13, 14, 14, 0, 0, + 14, 4, 4, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 13, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 4, 4, 4, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, 0, 0, 13, 13, 13, 13, + 13, 13, 13, 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 0, 14, 14, 0, 0, 14, 14, 14, 14, 13, + 14, 13, 14, 14, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, + 14, 13, 0, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 14, 14, 14, 14, 0, + 0, 0, 4, 4, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 4, 4, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 13, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 0, 14, 14, 0, 14, + 14, 14, 14, 14, 14, 14, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 0, + 14, 14, 0, 14, 14, 14, 14, 14, 13, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 14, 14, 14, 14, 4, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 14, 14, 14, 14, 14, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 4, 4, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 13, 13, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 14, + 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 14, + 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 0, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 14, 14, 4, + 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, + 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 14, 14, 14, 14, 14, + 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 0, 9, 9, + 0, 0, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 0, 10, 0, 10, 10, 10, + 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 9, 9, 0, 9, 9, 9, 9, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 16, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 17, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 17, -}; - -static RE_UINT8 re_east_asian_width_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 0, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 9, 9, 9, 27, 9, 9, 28, 9, 9, 9, 9, 9, 9, 29, 30, 31, - 32, 33, 34, 35, 36, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 37, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 38, 9, 9, 9, 9, 9, 9, - 9, 9, 39, 9, 9, 9, 9, 9, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 40, + 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 30, 30, 30, 30, 9, 9, 9, 9, 9, 9, 42, 9, 43, 44, + 10, 10, 10, 10, 10, 10, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, + 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 45, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 46, - 30, 30, 30, 30, 30, 47, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 30, 30, 48, 30, 30, 49, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 9, 10, 0, 0, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 0, 14, 14, 0, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 14, 14, 14, 14, 14, 14, 14, 13, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 13, 13, 0, 13, 0, 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 0, 13, 13, 13, 13, 0, 13, 0, 13, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 13, 0, 13, 0, 13, 0, 13, 13, 13, + 0, 13, 13, 0, 13, 0, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, + 0, 13, 13, 0, 13, 0, 0, 13, 13, 13, 13, 0, 13, 13, 13, 13, + 13, 13, 13, 0, 13, 13, 13, 13, 0, 13, 13, 13, 13, 0, 13, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 0, 13, 13, 13, 0, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 50, 51, 52, 53, 54, 9, 55, 56, 57, 58, 59, 60, 61, 62, 9, 63, - 9, 9, 64, 65, 66, 67, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 68, - 9, 9, 41, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 69, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +RE_UINT32 re_get_sentence_break(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_sentence_break_table_1[field_2]; + v = re_sentence_break_table_2[(v << 5) | field_1]; + v = re_sentence_break_table_3[(v << 5) | field_0]; + + return v; +} + +/* Sentence_Terminal. */ +static RE_UINT8 re_sentence_terminal_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 3, 9, 10, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 11, 12, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, + 3, 3, 14, 15, 16, 17, 18, 19, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 20, 21, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 22, + 3, 3, 3, 3, 3, 3, 23, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; -static RE_UINT8 re_east_asian_width_stage_3[] = { - 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 0, 0, 0, 0, 3, 4, 5, 6, 7, 0, 8, 9, 10, 11, 12, 13, - 14, 0, 15, 16, 17, 16, 18, 8, 19, 20, 21, 0, 17, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 22, 23, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 0, 0, 0, 0, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, - 0, 0, 29, 28, 30, 31, 29, 28, 30, 31, 0, 0, 0, 0, 0, 0, - 14, 0, 28, 28, 28, 28, 28, 28, 28, 28, 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, - 0, 0, 33, 34, 6, 0, 35, 36, 0, 0, 0, 0, 0, 0, 37, 38, - 39, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 41, 14, 36, 0, 42, 16, 0, 0, 0, 0, 43, 44, 28, 45, 28, 31, - 0, 14, 28, 31, 0, 0, 0, 31, 0, 0, 46, 0, 38, 0, 0, 0, - 12, 47, 48, 49, 50, 51, 52, 53, 0, 54, 55, 0, 56, 57, 0, 0, - 57, 0, 58, 14, 58, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 59, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 30, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 45, 28, 28, 28, 28, 45, 0, - 28, 28, 63, 0, 30, 31, 57, 53, 64, 65, 31, 0, 63, 38, 0, 66, - 67, 68, 69, 70, 0, 0, 0, 0, 71, 32, 72, 0, 73, 74, 0, 75, - 0, 0, 76, 17, 77, 59, 0, 78, 79, 80, 81, 28, 82, 83, 84, 85, - 86, 59, 0, 0, 0, 87, 0, 58, 0, 88, 89, 0, 0, 0, 17, 28, - 0, 0, 90, 0, 0, 0, 87, 75, 0, 0, 0, 0, 91, 92, 0, 0, - 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 95, 31, 0, 0, 0, 0, - 32, 32, 32, 96, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, 0, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 97, 0, 0, 0, 32, 72, - 98, 32, 32, 32, 32, 32, 32, 99, 100, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 99, 100, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 90, 32, 32, 32, 32, 32, 100, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 99, 32, 32, 32, 32, 32, 101, 32, 32, 32, 32, 72, 0, 32, 32, - 32, 32, 32, 99, 32, 32, 32, 32, 32, 28, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 102, 32, 32, 32, 32, 32, 32, 99, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 102, - 32, 32, 32, 32, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 32, 103, 0, 0, 32, 32, 32, 32, 104, 32, 99, 72, 0, 0, - 105, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 109, 110, 110, 110, 111, 112, 109, 0, 58, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 101, 0, - 32, 32, 32, 99, 0, 0, 0, 0, 0, 0, 101, 0, 113, 0, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, - 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, - 28, 115, 28, 28, 28, 116, 28, 28, 28, 28, 28, 28, 28, 31, 28, 28, - 28, 80, 117, 118, 28, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 101, 0, 32, 32, 32, 32, 32, 72, 32, 87, 103, 0, 97, 0, 0, 0, - 32, 32, 32, 32, 87, 90, 120, 32, 32, 32, 32, 32, 32, 32, 32, 121, - 32, 32, 72, 0, 32, 32, 32, 32, 32, 122, 72, 0, 32, 32, 123, 32, - 32, 32, 32, 32, 32, 32, 32, 99, 124, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, - 32, 32, 32, 32, 32, 32, 32, 97, 0, 126, 32, 32, 32, 0, 0, 127, - 0, 0, 66, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 32, 32, 32, 32, 32, 97, 114, 129, 0, 0, 94, 113, 101, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 72, 0, 0, - 0, 90, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 130, 131, - 32, 32, 32, 32, 132, 133, 32, 32, 32, 132, 32, 32, 32, 32, 32, 32, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 101, - 101, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 97, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 116, +static RE_UINT8 re_sentence_terminal_table_2[] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, 6, + 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, + 0, 16, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 24, 0, 0, 22, 0, 0, 25, 0, 0, 0, 0, 26, 0, + 0, 0, 27, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 30, 0, 0, 0, 0, 0, 1, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 33, 0, 0, 3, 34, 0, 0, 0, 35, 0, 0, 0, 36, 0, + 0, 37, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, + 0, 0, 40, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, + 0, 0, 43, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 45, 0, 44, 46, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_east_asian_width_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 0, 1, 5, 5, 1, 5, 5, 1, - 1, 0, 1, 0, 5, 1, 1, 5, 1, 1, 1, 1, 1, 0, 1, 1, - 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, - 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, - 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, - 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, - 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 1, 1, 1, 1, 0, - 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, - 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, - 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, - 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, - 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, - 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, - 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, - 0, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, - 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, - 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1, 0, - 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 3, 3, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, - 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 3, 1, 0, 0, 0, 0, 3, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, - 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 3, 1, 1, 1, 1, 1, - 1, 1, 3, 3, 1, 3, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, - 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 3, 3, 0, 3, - 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 5, 5, - 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, - 0, 0, 0, 3, 3, 0, 0, 0, 3, 0, 0, 0, 0, 3, 1, 1, - 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, - 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, - 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, - 3, 3, 3, 0, 3, 3, 3, 3, 0, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, - 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, - 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 3, 3, 3, 3, - 0, 0, 0, 0, 3, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, - 3, 3, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 3, 0, 0, 0, - 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, - 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 0, 0, - 3, 3, 0, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, +static RE_UINT8 re_sentence_terminal_table_3[] = { + 0, 0, 0, 0, 2, 64, 0, 128, 0, 2, 0, 0, 0, 0, 0, 192, + 0, 0, 16, 0, 7, 0, 0, 0, 0, 0, 0, 2, 0, 0, 128, 98, + 48, 0, 0, 0, 0, 12, 0, 0, 132, 1, 0, 0, 0, 64, 0, 0, + 0, 0, 96, 0, 8, 2, 0, 0, 0, 15, 0, 0, 0, 0, 0, 204, + 0, 0, 0, 24, 0, 0, 0, 48, 128, 3, 0, 0, 0, 64, 0, 16, + 4, 0, 0, 0, 0, 0, 0, 128, 0, 192, 0, 0, 0, 0, 136, 0, + 0, 0, 192, 0, 0, 128, 0, 0, 0, 3, 0, 0, 0, 0, 0, 224, + 0, 0, 3, 0, 0, 8, 0, 0, 0, 0, 196, 0, 2, 0, 0, 0, + 0, 0, 224, 3, 128, 1, 0, 0, 3, 0, 0, 0, 14, 0, 0, 0, + 96, 32, 0, 192, 0, 0, 0, 27, 0, 24, 0, 0, 12, 254, 255, 0, + 6, 0, 0, 0, 0, 0, 0, 112, 80, 0, 0, 0, 12, 0, 0, 0, + 0, 0, 128, 1, 0, 0, 32, 0, 16, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0 }; -/* East_Asian_Width: 3040 bytes. */ - -RE_UINT32 re_get_east_asian_width(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_east_asian_width_stage_1[f] << 5; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_east_asian_width_stage_2[pos + f] << 4; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_east_asian_width_stage_3[pos + f] << 3; - value = re_east_asian_width_stage_4[pos + code]; - - return value; -} +RE_UINT32 re_get_sentence_terminal(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* Joining_Group. */ + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_joining_group_stage_1[] = { - 0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; + v = re_sentence_terminal_table_1[field_2]; + v = re_sentence_terminal_table_2[(v << 5) | field_1]; + v = re_sentence_terminal_table_3[(v << 2) | field_0]; -static RE_UINT8 re_joining_group_stage_2[] = { - 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + return (v >> offset) & 0x1; +} + +/* Soft_Dotted. */ +static RE_UINT8 re_soft_dotted_table_1[] = { + 0, 1, 2, 2, 2, 2, 2, 3, 4, 2, 2, 5, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; -static RE_UINT8 re_joining_group_stage_3[] = { +static RE_UINT8 re_soft_dotted_table_2[] = { + 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 0, 14, 15, 0, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, + 0, 12, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_joining_group_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 45, 0, 3, 3, 43, 3, 45, 3, 4, 41, 4, 4, 13, 13, 13, 6, - 6, 31, 31, 35, 35, 33, 33, 39, 39, 1, 1, 11, 11, 55, 55, 55, - 0, 9, 29, 19, 22, 24, 26, 16, 43, 45, 45, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 29, - 0, 3, 3, 3, 0, 3, 43, 43, 45, 4, 4, 4, 4, 4, 4, 4, - 4, 13, 13, 13, 13, 13, 13, 13, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 31, 31, 31, 31, 31, 31, 31, 31, 31, 35, 35, 35, 33, 33, 39, - 1, 9, 9, 9, 9, 9, 9, 29, 29, 11, 38, 11, 19, 19, 19, 11, - 11, 11, 11, 11, 11, 22, 22, 22, 22, 26, 26, 26, 26, 56, 21, 13, - 41, 17, 17, 14, 43, 43, 43, 43, 43, 43, 43, 43, 55, 47, 55, 43, - 45, 45, 46, 46, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 31, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 33, 1, 0, 0, 21, - 2, 0, 5, 12, 12, 7, 7, 15, 44, 50, 18, 42, 42, 48, 49, 20, - 23, 25, 27, 36, 10, 8, 28, 32, 34, 30, 7, 37, 40, 5, 12, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, - 4, 4, 4, 4, 4, 4, 4, 13, 13, 6, 6, 31, 35, 1, 1, 1, - 9, 9, 11, 11, 11, 24, 24, 26, 26, 26, 22, 31, 31, 35, 13, 13, - 35, 31, 13, 3, 3, 55, 55, 45, 43, 43, 54, 54, 13, 35, 35, 19, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, - 4, 4, 13, 39, 9, 29, 22, 24, 45, 45, 31, 43, 57, 0, 6, 33, - 11, 58, 31, 1, 19, 0, 4, 4, 4, 31, 45, 86, 87, 88, 0, 0, - 59, 61, 61, 65, 65, 62, 0, 83, 0, 85, 85, 0, 0, 66, 80, 84, - 68, 68, 68, 69, 63, 81, 70, 71, 77, 60, 60, 73, 73, 76, 74, 74, - 74, 75, 0, 0, 78, 0, 0, 0, 0, 0, 0, 72, 64, 79, 82, 67, - 0, 0, 100, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 100, 0, 101, 0, - 101, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 18, 0, 19, 20, 0, 21, 0, 22, 23, 0, 24, 0, 17, 18, + 0, 19, 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Joining_Group: 788 bytes. */ - -RE_UINT32 re_get_joining_group(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_joining_group_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_joining_group_stage_2[pos + f] << 5; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_joining_group_stage_3[pos + f] << 4; - value = re_joining_group_stage_4[pos + code]; - - return value; -} - -/* Joining_Type. */ - -static RE_UINT8 re_joining_type_stage_1[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 6, - 7, 8, 4, 9, 4, 4, 10, 4, 4, 4, 4, 11, 4, 12, 13, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 14, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +static RE_UINT8 re_soft_dotted_table_3[] = { + 0, 0, 0, 0, 0, 6, 0, 0, 0, 128, 0, 0, 0, 2, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 32, 0, 0, 4, 0, 0, 0, 8, 0, + 0, 0, 64, 1, 4, 0, 0, 0, 0, 0, 64, 0, 16, 1, 0, 0, + 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, + 0, 0, 0, 16, 12, 0, 0, 0, 0, 0, 192, 0, 0, 12, 0, 0, + 0, 0, 0, 192, 0, 0, 12, 0, 192, 0, 0, 0, 0, 0, 0, 12, + 0, 192, 0, 0 }; -static RE_UINT8 re_joining_type_stage_2[] = { - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, - 0, 0, 4, 0, 0, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 23, 25, 26, 27, 28, 29, - 30, 31, 26, 32, 33, 34, 0, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, 50, 51, - 52, 53, 54, 0, 55, 0, 0, 0, 56, 57, 58, 0, 59, 60, 61, 62, - 63, 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 67, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 69, 0, 70, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, - 72, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 0, 0, 0, 0, - 77, 78, 0, 79, 80, 81, 82, 83, 84, 85, 86, 87, 0, 0, 0, 88, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 70, 0, 0, 0, 91, - 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 94, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 96, 0, 0, 97, 0, - 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 99, 100, 0, 0, - 101, 102, 103, 0, 104, 105, 106, 107, 108, 0, 0, 109, 33, 110, 0, 0, - 111, 112, 113, 114, 0, 0, 115, 116, 117, 118, 119, 0, 120, 0, 0, 0, - 121, 0, 0, 0, 0, 0, 0, 122, 123, 124, 125, 0, 0, 0, 0, 0, - 126, 0, 127, 0, 128, 129, 130, 0, 0, 0, 0, 131, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 134, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 136, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 138, 139, 0, 0, 140, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 141, 142, 143, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 144, 0, 0, 0, 134, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 146, 147, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 149, 2, 0, 0, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_soft_dotted(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_joining_type_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, - 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 2, 2, 2, 2, 6, - 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 9, 10, 11, 12, - 13, 14, 2, 2, 0, 15, 16, 12, 12, 17, 17, 18, 12, 12, 12, 12, - 19, 20, 21, 22, 22, 23, 0, 24, 0, 25, 26, 27, 12, 28, 2, 2, - 2, 29, 12, 30, 12, 31, 32, 18, 0, 0, 0, 0, 33, 2, 34, 0, - 0, 35, 12, 12, 12, 36, 37, 38, 0, 0, 33, 39, 40, 41, 0, 0, - 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, 0, 0, 12, 48, 49, 50, - 0, 0, 3, 2, 39, 2, 2, 2, 51, 0, 0, 0, 0, 0, 0, 52, - 5, 53, 5, 0, 54, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 56, - 57, 1, 0, 0, 54, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 56, - 60, 61, 55, 0, 0, 0, 62, 0, 63, 53, 0, 0, 54, 0, 0, 64, - 55, 0, 0, 0, 0, 0, 0, 65, 57, 1, 58, 0, 54, 0, 0, 0, - 66, 0, 0, 0, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 0, 0, - 67, 0, 0, 0, 0, 0, 0, 33, 68, 69, 70, 0, 54, 0, 0, 0, - 58, 71, 0, 0, 54, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 72, - 57, 1, 0, 0, 54, 0, 0, 0, 0, 66, 73, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 74, 51, 25, 75, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 74, 76, 0, 77, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 78, 55, 0, 0, 0, 0, 0, 0, 5, 75, - 79, 80, 2, 5, 2, 2, 2, 76, 58, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 80, 81, 82, 0, 0, 0, 83, 34, 0, 57, 0, - 84, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, - 0, 0, 85, 0, 0, 0, 85, 0, 0, 0, 54, 0, 0, 0, 54, 0, - 0, 0, 0, 0, 0, 0, 86, 77, 58, 5, 37, 1, 0, 0, 0, 0, - 87, 88, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 89, - 90, 12, 12, 12, 12, 91, 0, 0, 0, 0, 0, 0, 92, 34, 66, 45, - 0, 0, 25, 93, 0, 0, 0, 0, 0, 0, 58, 75, 94, 76, 3, 22, - 0, 0, 0, 0, 0, 0, 2, 75, 37, 0, 0, 0, 0, 0, 95, 8, - 66, 0, 0, 0, 0, 3, 37, 0, 4, 0, 0, 0, 96, 97, 0, 0, - 0, 0, 0, 0, 58, 98, 4, 0, 0, 0, 0, 0, 0, 99, 100, 0, - 0, 0, 101, 2, 81, 53, 56, 4, 2, 2, 2, 2, 2, 2, 2, 39, - 0, 102, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 76, 64, 0, 0, - 0, 0, 2, 2, 2, 2, 34, 0, 0, 0, 0, 0, 0, 25, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 2, 2, 2, 2, - 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 101, 77, 0, 0, 0, 33, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 104, 105, 0, 0, 70, 0, 0, 0, - 12, 12, 12, 12, 12, 12, 106, 0, 71, 0, 0, 0, 2, 2, 4, 25, - 0, 0, 0, 0, 33, 77, 0, 0, 25, 2, 4, 0, 0, 0, 0, 0, - 51, 0, 0, 0, 0, 0, 107, 108, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 109, 82, 0, 105, 56, 0, 0, 0, 0, 0, 56, - 0, 0, 0, 0, 0, 0, 110, 68, 55, 0, 0, 0, 0, 71, 58, 0, - 0, 0, 0, 0, 1, 53, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, - 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 34, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 33, 51, 111, 99, 0, 0, 0, 0, 0, 92, - 112, 113, 114, 115, 116, 117, 0, 0, 118, 119, 120, 0, 0, 121, 0, 0, - 122, 12, 12, 12, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 12, - 125, 2, 126, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 2, - 75, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0, 0, 0, 0, 127, 59, - 51, 0, 0, 0, 25, 40, 76, 0, 0, 0, 0, 0, 0, 0, 105, 0, - 4, 0, 0, 0, 0, 0, 33, 75, 0, 57, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 128, 58, 0, 0, 0, 25, 3, 51, 0, 0, - 34, 0, 0, 0, 33, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 73, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 129, - 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 86, - 34, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 131, - 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 6, 0, - 0, 0, 0, 80, 133, 37, 0, 0, 0, 0, 0, 0, 0, 25, 2, 59, - 0, 0, 99, 54, 34, 0, 0, 0, 5, 51, 0, 0, 0, 0, 3, 134, - 25, 0, 109, 45, 0, 0, 0, 0, 0, 64, 75, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 75, 6, 0, 0, 64, 2, 2, 64, 135, 0, - 0, 0, 0, 0, 0, 0, 109, 136, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, - 0, 0, 0, 0, 0, 0, 2, 34, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 0, 75, 0, 0, 25, 0, 0, 0, 0, 0, 0, - 0, 25, 51, 0, 0, 0, 0, 0, 0, 0, 0, 70, 37, 0, 0, 0, - 0, 0, 0, 0, 25, 4, 3, 2, 137, 37, 0, 0, 0, 96, 0, 0, - 85, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 75, 3, - 2, 2, 2, 2, 2, 76, 1, 0, 56, 0, 0, 3, 5, 2, 0, 0, - 75, 2, 2, 138, 139, 51, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, - 0, 0, 75, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, - 140, 37, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 2, 2, 2, 2, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_joining_type_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, - 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 5, 0, 5, 5, 0, 5, - 5, 5, 5, 0, 5, 0, 0, 0, 2, 0, 3, 3, 3, 3, 2, 3, - 2, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, - 3, 2, 2, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 2, 2, - 5, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 3, 3, 0, 3, 5, 5, - 5, 5, 5, 5, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 3, 3, - 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, - 3, 5, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 2, - 3, 2, 3, 2, 3, 2, 2, 3, 5, 5, 5, 0, 0, 3, 2, 2, - 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, - 2, 3, 2, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 5, 5, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 5, 5, 5, 0, 5, 5, 5, 5, 5, 0, 0, - 3, 2, 2, 2, 2, 2, 3, 3, 2, 3, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 2, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, - 2, 0, 2, 2, 2, 2, 0, 3, 2, 3, 3, 0, 0, 0, 0, 0, - 2, 2, 3, 3, 3, 0, 3, 2, 2, 3, 3, 2, 2, 0, 2, 2, - 2, 3, 2, 2, 2, 2, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 5, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, - 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, - 0, 5, 5, 0, 0, 0, 0, 5, 5, 0, 0, 5, 5, 5, 0, 0, - 5, 5, 0, 0, 0, 5, 0, 0, 0, 5, 5, 5, 5, 5, 0, 5, - 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 0, 0, 5, - 0, 0, 5, 0, 0, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, - 5, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5, 5, 5, 5, 0, 0, - 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 5, 0, 0, - 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5, 0, - 0, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, - 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 5, 5, 5, 5, 5, 5, 0, 5, 5, - 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, - 0, 5, 5, 0, 0, 5, 5, 0, 5, 5, 0, 0, 0, 0, 5, 5, - 0, 0, 5, 0, 0, 5, 5, 0, 0, 0, 5, 5, 5, 0, 0, 0, - 0, 0, 0, 0, 5, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 1, 5, 5, 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 5, 2, 2, 5, 2, 0, 0, 0, 0, 0, - 5, 5, 5, 0, 0, 0, 0, 5, 5, 0, 0, 5, 0, 0, 0, 0, - 5, 0, 5, 0, 0, 5, 5, 5, 0, 0, 0, 0, 5, 0, 5, 5, - 0, 0, 5, 5, 5, 5, 0, 0, 5, 5, 0, 5, 5, 5, 0, 0, - 5, 5, 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, - 0, 0, 0, 5, 0, 1, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0, - 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, - 2, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, - 5, 5, 0, 0, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, - 5, 0, 5, 5, 5, 0, 0, 5, 0, 5, 5, 5, 0, 5, 5, 0, - 2, 2, 2, 2, 2, 3, 0, 3, 0, 3, 3, 0, 0, 4, 3, 3, - 3, 3, 3, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 3, 2, 2, - 2, 3, 0, 0, 3, 5, 5, 0, 0, 0, 0, 2, 2, 2, 2, 3, - 2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 2, 2, 3, 2, 3, 3, - 2, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 2, 2, 0, - 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 5, 5, 5, 5, - 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 5, 5, - 5, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, - 5, 5, 0, 0, 5, 0, 5, 5, 5, 0, 5, 0, 0, 0, 0, 5, - 5, 0, 5, 5, 0, 0, 0, 0, 5, 5, 5, 0, 0, 5, 0, 5, - 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 5, - 5, 0, 0, 5, 5, 5, 5, 0, 5, 0, 5, 5, 0, 5, 5, 0, - 0, 0, 5, 0, 5, 5, 0, 5, 5, 5, 5, 0, 0, 5, 5, 5, - 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5, 5, - 2, 2, 2, 2, 5, 5, 5, 5, -}; + v = re_soft_dotted_table_1[field_2]; + v = re_soft_dotted_table_2[(v << 5) | field_1]; + v = re_soft_dotted_table_3[(v << 2) | field_0]; -/* Joining_Type: 3560 bytes. */ - -RE_UINT32 re_get_joining_type(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_joining_type_stage_1[f] << 6; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_joining_type_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_joining_type_stage_3[pos + f] << 3; - value = re_joining_type_stage_4[pos + code]; - - return value; + return (v >> offset) & 0x1; } -/* Line_Break. */ - -static RE_UINT8 re_line_break_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 10, 17, 5, 18, 10, 10, 19, 10, 20, 21, 22, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 24, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, -}; - -static RE_UINT8 re_line_break_stage_2[] = { - 0, 1, 2, 2, 2, 3, 4, 5, 2, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 2, 2, 2, 2, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 2, 51, 2, 2, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 2, 2, 2, 70, 2, 2, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 86, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 87, 79, 79, 79, 79, 79, 79, 79, 79, 88, 2, 2, 89, 90, 2, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 100, - 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, - 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, - 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, - 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, - 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 107, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 79, 79, 79, 79, 110, 111, 2, 2, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 109, 122, 123, 124, 2, 125, 126, 109, 2, 2, 127, 109, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 109, 139, 109, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 109, 149, 150, 109, 151, 152, 153, 154, 109, - 155, 156, 109, 157, 158, 159, 109, 109, 160, 161, 162, 163, 109, 164, 109, 165, - 2, 2, 2, 2, 2, 2, 2, 166, 167, 2, 168, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 2, 2, 2, 2, 169, 170, 171, 2, 172, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 2, 2, 2, 173, 174, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 2, 2, 2, 2, 175, 176, 177, 178, 109, 109, 109, 109, 179, 180, 181, 182, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 183, - 79, 79, 79, 79, 79, 184, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 79, 79, 185, 79, 79, 186, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 187, 188, 109, 109, 109, 109, 109, 109, - 2, 189, 190, 191, 192, 193, 194, 109, 195, 196, 197, 2, 2, 198, 2, 199, - 2, 2, 2, 2, 200, 201, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 202, 109, 203, 109, 109, 204, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 2, 205, 206, 109, 109, 109, 109, 109, 207, 208, 209, 109, 210, 211, 109, 109, - 79, 79, 212, 213, 79, 79, 79, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 228, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 228, - 229, 109, 230, 231, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, -}; - -static RE_UINT16 re_line_break_stage_3[] = { - 0, 1, 0, 0, 2, 3, 4, 5, 6, 6, 6, 7, 6, 6, 6, 8, - 9, 0, 0, 0, 10, 11, 12, 13, 6, 6, 14, 6, 6, 6, 14, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 14, 15, 16, 17, 6, 6, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 19, 20, 0, 6, 21, - 22, 23, 6, 6, 24, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 25, 26, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 27, 6, 6, 6, 28, 27, 6, 6, 6, 6, - 6, 29, 30, 0, 0, 0, 0, 31, 32, 33, 34, 34, 34, 35, 36, 33, - 6, 37, 0, 38, 6, 6, 6, 6, 6, 25, 0, 0, 4, 39, 40, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 41, 42, 42, 43, 4, 44, - 6, 45, 46, 6, 6, 6, 0, 0, 0, 47, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 48, 0, 49, 33, 4, 44, 6, 6, 6, 25, 50, 51, - 6, 6, 48, 52, 53, 54, 6, 28, 6, 6, 6, 55, 6, 56, 33, 33, - 33, 33, 33, 33, 6, 6, 57, 58, 33, 33, 59, 0, 52, 0, 0, 0, - 50, 6, 6, 6, 6, 6, 6, 60, 0, 0, 61, 6, 62, 4, 6, 6, - 63, 64, 65, 6, 6, 66, 67, 68, 69, 70, 71, 72, 73, 4, 74, 75, - 76, 77, 65, 6, 6, 66, 78, 79, 80, 81, 82, 83, 84, 4, 85, 33, - 76, 45, 24, 6, 6, 66, 86, 68, 87, 88, 89, 33, 73, 4, 90, 91, - 76, 64, 65, 6, 6, 66, 86, 68, 69, 81, 92, 72, 73, 4, 6, 33, - 93, 94, 95, 96, 97, 94, 6, 98, 99, 100, 101, 33, 84, 4, 6, 102, - 103, 57, 66, 6, 6, 66, 6, 104, 105, 100, 106, 56, 73, 4, 107, 6, - 108, 57, 66, 6, 6, 66, 109, 68, 105, 100, 106, 110, 73, 4, 111, 33, - 112, 57, 66, 6, 6, 6, 6, 113, 105, 114, 115, 6, 73, 4, 6, 116, - 117, 6, 28, 118, 6, 6, 24, 119, 28, 120, 121, 0, 84, 4, 122, 33, - 123, 124, 124, 124, 124, 124, 124, 125, 124, 126, 4, 127, 33, 33, 33, 33, - 128, 129, 124, 124, 130, 124, 124, 131, 132, 131, 4, 133, 33, 33, 33, 33, - 134, 135, 136, 26, 4, 44, 137, 138, 6, 27, 6, 6, 6, 139, 30, 140, - 141, 142, 0, 30, 0, 0, 0, 143, 144, 57, 145, 146, 33, 33, 33, 33, - 124, 124, 124, 124, 124, 124, 124, 124, 4, 147, 124, 124, 124, 124, 124, 124, - 124, 124, 4, 148, 6, 6, 6, 6, 45, 149, 6, 6, 6, 6, 6, 6, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 151, 151, 151, 151, - 151, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 95, 28, 95, 6, 6, 6, 6, - 6, 95, 6, 6, 6, 6, 95, 28, 95, 6, 28, 6, 6, 6, 6, 6, - 6, 6, 95, 6, 6, 6, 6, 6, 6, 6, 6, 153, 154, 6, 6, 139, - 6, 6, 6, 155, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 58, 58, - 156, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 156, 6, 6, 157, 6, 6, 6, 6, 6, 6, 6, 6, 6, 158, 6, 89, - 6, 57, 159, 33, 6, 6, 160, 33, 6, 6, 161, 33, 6, 57, 162, 33, - 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 163, 164, 4, 165, 6, 155, - 166, 167, 4, 165, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 89, - 168, 6, 6, 6, 6, 169, 6, 6, 6, 6, 6, 6, 6, 6, 58, 33, - 6, 6, 6, 28, 0, 170, 0, 170, 171, 4, 124, 124, 124, 131, 172, 33, - 124, 124, 124, 124, 124, 173, 124, 124, 124, 174, 4, 175, 6, 6, 6, 6, - 6, 6, 176, 177, 124, 124, 124, 124, 124, 124, 124, 178, 124, 124, 124, 179, - 4, 165, 4, 165, 124, 131, 0, 180, 33, 33, 33, 33, 33, 33, 33, 33, - 103, 6, 6, 6, 6, 6, 181, 0, 103, 182, 4, 183, 156, 25, 50, 139, - 184, 6, 6, 6, 61, 185, 4, 44, 6, 6, 6, 6, 48, 0, 170, 22, - 6, 6, 6, 6, 181, 0, 0, 186, 4, 187, 4, 44, 6, 6, 6, 188, - 6, 89, 6, 6, 6, 6, 6, 189, 6, 33, 190, 0, 0, 191, 192, 193, - 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 194, - 6, 6, 58, 58, 6, 6, 6, 6, 58, 58, 6, 195, 6, 6, 6, 58, - 6, 6, 6, 6, 6, 6, 57, 6, 57, 6, 196, 109, 6, 6, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 0, 212, 213, - 214, 215, 6, 139, 216, 217, 218, 219, 217, 217, 0, 0, 0, 0, 220, 33, - 221, 116, 222, 6, 223, 224, 6, 6, 6, 6, 225, 226, 227, 228, 227, 229, - 6, 230, 227, 229, 6, 6, 6, 6, 6, 6, 231, 6, 6, 6, 6, 6, - 232, 233, 234, 235, 236, 237, 238, 225, 6, 239, 240, 6, 241, 242, 6, 6, - 242, 6, 243, 244, 243, 6, 6, 14, 6, 6, 6, 6, 6, 245, 6, 6, - 6, 246, 240, 247, 6, 248, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 249, 6, - 6, 6, 6, 6, 28, 33, 33, 33, 6, 56, 33, 33, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 250, - 227, 227, 227, 227, 227, 227, 227, 227, 227, 228, 227, 227, 227, 227, 251, 6, - 227, 227, 252, 6, 253, 229, 242, 225, 254, 255, 229, 6, 252, 14, 6, 6, - 256, 257, 258, 259, 6, 6, 6, 260, 261, 6, 6, 6, 262, 263, 6, 264, - 6, 6, 6, 265, 6, 6, 6, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 6, 6, 6, 6, 6, 6, 6, 6, 14, 277, 278, 279, 280, 227, - 227, 227, 228, 6, 6, 6, 6, 6, 281, 6, 6, 6, 282, 279, 6, 6, - 283, 284, 284, 285, 6, 6, 6, 6, 6, 6, 6, 246, 6, 6, 6, 286, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 287, 229, 6, 6, 196, 6, - 6, 6, 58, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 28, 6, 6, 6, 6, 6, 28, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 176, 288, 289, - 6, 6, 6, 6, 45, 149, 6, 6, 6, 6, 6, 6, 6, 290, 291, 71, - 6, 6, 28, 33, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, 0, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 33, 33, 33, 33, 33, 33, - 267, 267, 267, 302, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 303, 33, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 304, 33, 33, 33, 267, 303, - 305, 279, 306, 307, 267, 308, 309, 310, 311, 312, 267, 267, 313, 267, 267, 267, - 314, 315, 316, 317, 318, 312, 267, 267, 313, 267, 267, 267, 314, 315, 319, 320, - 321, 267, 267, 267, 267, 267, 322, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 323, 267, 267, 267, 267, 267, 324, 267, 267, 267, 267, 303, 33, 325, 325, - 267, 267, 267, 323, 267, 267, 267, 267, 267, 227, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 6, 6, 6, 6, 6, 6, 6, 6, - 267, 267, 326, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 327, 267, 267, 267, 267, 267, 267, 323, 33, 6, 6, 6, 6, 6, 188, - 6, 328, 6, 6, 4, 329, 33, 33, 6, 6, 6, 6, 6, 176, 190, 185, - 6, 6, 6, 48, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 330, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 331, 33, 33, 33, 33, 33, 290, 6, - 332, 333, 6, 6, 25, 182, 6, 334, 6, 6, 6, 6, 6, 6, 335, 33, - 26, 6, 6, 6, 6, 6, 181, 0, 336, 337, 4, 165, 0, 0, 26, 338, - 4, 44, 6, 6, 48, 339, 6, 6, 176, 0, 170, 290, 150, 150, 150, 340, - 50, 6, 6, 6, 6, 6, 25, 0, 341, 342, 4, 343, 124, 124, 4, 344, - 6, 6, 6, 6, 6, 61, 180, 33, 333, 345, 4, 346, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 124, 347, 33, 33, 348, 6, 25, 349, 33, - 350, 350, 350, 33, 28, 28, 6, 6, 6, 6, 6, 6, 6, 33, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 25, 351, 4, 165, - 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, - 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, - 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, - 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, - 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, - 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, - 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, - 353, 352, 353, 353, 355, 33, 151, 151, 356, 357, 152, 152, 152, 152, 152, 358, - 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 28, 33, 360, 361, 34, 362, 363, 364, 365, 34, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 155, 33, 360, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 366, 33, 33, 6, 6, 6, 6, 6, 6, - 6, 6, 118, 6, 6, 6, 6, 6, 6, 33, 33, 33, 33, 33, 6, 367, - 0, 0, 368, 369, 0, 0, 370, 284, 371, 372, 373, 374, 323, 375, 57, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 376, - 377, 378, 267, 379, 267, 267, 267, 380, 267, 267, 267, 381, 382, 325, 383, 267, - 267, 267, 267, 384, 267, 267, 267, 323, 385, 385, 385, 386, 387, 28, 33, 388, - 6, 109, 6, 6, 28, 6, 6, 389, 6, 58, 6, 58, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 56, - 390, 6, 6, 6, 6, 6, 391, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 28, 6, 182, 89, 33, 33, 33, 33, 33, 6, 6, 6, 6, 6, 392, - 6, 6, 6, 139, 6, 6, 6, 6, 6, 6, 89, 33, 40, 6, 6, 182, - 6, 6, 6, 6, 182, 393, 6, 6, 6, 56, 6, 6, 6, 6, 48, 394, - 6, 6, 6, 395, 6, 6, 6, 6, 182, 6, 396, 33, 33, 33, 33, 33, - 6, 6, 6, 58, 4, 165, 6, 6, 6, 6, 182, 6, 6, 6, 6, 182, - 6, 6, 6, 6, 6, 33, 6, 6, 6, 6, 6, 6, 182, 290, 33, 33, - 6, 6, 6, 6, 6, 6, 28, 33, 6, 6, 58, 33, 6, 33, 33, 33, - 58, 66, 6, 6, 6, 6, 45, 397, 6, 6, 395, 6, 6, 6, 6, 6, - 6, 6, 6, 28, 290, 6, 33, 33, 33, 33, 33, 33, 6, 6, 398, 360, - 6, 6, 6, 399, 6, 6, 6, 400, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 22, 6, 6, 118, 6, 6, 6, 6, 6, - 401, 402, 109, 27, 6, 6, 58, 80, 6, 89, 403, 89, 6, 6, 6, 6, - 6, 6, 6, 6, 33, 33, 33, 33, 6, 6, 6, 6, 404, 360, 405, 33, - 6, 6, 6, 6, 6, 6, 58, 406, 6, 6, 58, 6, 6, 6, 56, 6, - 6, 6, 155, 407, 33, 27, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 89, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 56, 33, 6, 6, 6, 6, 6, 6, 56, 118, - 6, 6, 6, 6, 181, 33, 4, 165, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 6, 28, - 6, 6, 6, 6, 6, 33, 6, 6, 48, 0, 40, 155, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 28, 33, - 184, 6, 6, 6, 6, 6, 6, 0, 140, 396, 118, 6, 408, 4, 33, 71, - 184, 6, 6, 6, 6, 6, 0, 409, 410, 149, 6, 6, 6, 89, 4, 165, - 184, 6, 6, 6, 176, 0, 411, 4, 412, 33, 6, 6, 6, 6, 413, 33, - 184, 6, 6, 6, 6, 6, 25, 0, 414, 415, 4, 416, 27, 6, 139, 33, - 6, 6, 24, 6, 6, 181, 0, 417, 33, 33, 33, 33, 33, 33, 33, 33, - 28, 418, 6, 45, 6, 419, 6, 6, 6, 6, 6, 176, 0, 394, 4, 165, - 112, 64, 65, 6, 6, 66, 86, 420, 69, 81, 101, 393, 421, 422, 422, 33, - 6, 6, 6, 6, 6, 6, 142, 0, 423, 424, 4, 425, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 0, 0, 50, 33, 4, 165, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 176, 336, 0, 426, 427, 403, 345, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 0, 0, 428, 33, 4, 165, 429, 430, 33, 33, - 6, 6, 6, 6, 6, 25, 0, 89, 4, 165, 33, 33, 33, 33, 33, 33, - 124, 124, 124, 431, 124, 173, 4, 432, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 181, 0, 433, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 6, 6, 6, 6, 6, 6, 6, 6, 4, 44, 56, 290, - 33, 33, 33, 33, 6, 118, 6, 6, 6, 6, 61, 434, 435, 33, 33, 33, - 61, 184, 6, 6, 6, 6, 25, 436, 437, 33, 61, 50, 6, 6, 6, 6, - 6, 438, 0, 439, 440, 33, 33, 33, 6, 6, 6, 6, 6, 6, 6, 89, - 6, 66, 6, 6, 6, 176, 180, 0, 441, 33, 4, 44, 6, 139, 442, 6, - 6, 6, 434, 0, 0, 30, 180, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 28, 24, 6, 6, 6, 6, 443, 444, 445, 33, 4, 165, 45, 66, 6, 6, - 6, 446, 194, 89, 4, 165, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 447, 89, - 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 6, 448, 449, 6, 155, 450, - 6, 6, 6, 155, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 28, 451, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 182, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 452, 6, 6, 6, 6, - 453, 454, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 455, - 6, 6, 6, 6, 6, 28, 456, 457, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 282, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 28, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 89, 6, 6, 6, 28, 4, 458, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 6, 58, 459, 33, - 6, 6, 6, 6, 6, 6, 140, 460, 461, 33, 4, 462, 24, 6, 6, 393, - 6, 6, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 463, 464, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 465, 61, 0, 0, 0, 0, 0, - 0, 71, 184, 6, 33, 33, 33, 33, 33, 33, 33, 33, 466, 33, 33, 33, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 33, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 324, 33, - 267, 267, 267, 323, 33, 33, 33, 33, 33, 33, 467, 33, 468, 33, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 303, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 56, 6, 139, - 6, 89, 6, 469, 170, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 58, 33, - 6, 6, 6, 6, 28, 27, 6, 6, 6, 6, 6, 6, 142, 470, 0, 0, - 471, 50, 6, 6, 6, 472, 6, 6, 6, 6, 6, 6, 6, 89, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 473, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 182, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 28, 33, 6, 6, 6, 89, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 57, 6, 6, 6, 6, 6, - 6, 6, 6, 57, 474, 475, 6, 476, 109, 6, 6, 6, 6, 6, 6, 6, - 45, 189, 57, 57, 6, 6, 6, 477, 478, 118, 66, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 58, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 479, 4, 4, 4, 4, 4, 4, - 0, 0, 0, 0, 0, 0, 423, 25, 0, 0, 0, 0, 0, 103, 480, 6, - 481, 482, 33, 59, 30, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 180, 0, 0, 483, 484, 394, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 139, 423, 58, 4, 343, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 6, 6, 6, 181, 4, 485, - 6, 6, 6, 6, 6, 6, 6, 6, 64, 6, 180, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 181, 433, 4, 486, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 27, 6, - 6, 6, 6, 6, 6, 487, 488, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 27, 6, 6, 6, 6, 6, 6, 58, 33, 33, 33, 33, 33, 33, 33, 33, - 109, 6, 6, 6, 489, 27, 490, 491, 492, 493, 489, 195, 489, 490, 490, 83, - 6, 24, 6, 182, 494, 24, 6, 182, 33, 33, 33, 33, 33, 33, 155, 33, - 227, 495, 227, 227, 227, 496, 227, 227, 227, 227, 227, 227, 227, 497, 227, 227, - 227, 227, 227, 227, 227, 495, 267, 267, 267, 267, 267, 267, 498, 499, 499, 499, - 500, 267, 267, 501, 267, 267, 502, 503, 504, 505, 267, 267, 267, 267, 267, 506, - 267, 267, 267, 267, 267, 267, 267, 267, 507, 508, 509, 267, 510, 508, 508, 511, - 512, 513, 514, 267, 515, 516, 517, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 264, 267, 518, 6, 266, 267, 519, 6, 6, 520, 267, 267, 267, 267, 521, 522, - 267, 267, 523, 267, 267, 267, 267, 267, 267, 267, 249, 524, 267, 267, 249, 520, - 267, 267, 267, 267, 267, 267, 267, 267, 525, 526, 6, 6, 6, 6, 527, 528, - 267, 267, 267, 267, 529, 267, 530, 267, 509, 531, 267, 267, 267, 267, 267, 267, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 524, 267, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 266, 267, 267, 267, 267, 267, - 6, 524, 6, 6, 6, 6, 6, 6, 6, 267, 6, 520, 6, 6, 6, 6, - 6, 267, 6, 6, 6, 532, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 6, 533, 267, 508, 534, 267, 508, 535, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 536, 537, 267, 525, 538, 539, 267, 267, 267, 267, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 524, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 304, - 82, 33, 33, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 33, +/* Terminal_Punctuation. */ +static RE_UINT8 re_terminal_punctuation_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, + 15, 9, 16, 17, 18, 19, 20, 21, 9, 22, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, + 9, 9, 9, 9, 9, 9, 26, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; -static RE_UINT8 re_line_break_stage_4[] = { - 16, 16, 16, 16, 16, 16, 16, 16, 16, 18, 22, 20, 20, 21, 16, 16, - 19, 6, 3, 12, 9, 10, 12, 3, 1, 36, 12, 9, 8, 15, 8, 7, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 12, 12, 12, 6, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 9, 36, 12, 12, - 12, 12, 12, 1, 18, 2, 12, 16, 16, 16, 16, 16, 16, 29, 16, 16, - 4, 1, 10, 9, 9, 9, 12, 25, 25, 12, 25, 3, 12, 18, 12, 12, - 10, 9, 25, 25, 17, 12, 25, 25, 25, 25, 25, 3, 25, 25, 25, 1, - 12, 12, 12, 12, 12, 12, 12, 25, 17, 25, 25, 25, 17, 25, 12, 12, - 25, 12, 12, 12, 12, 12, 12, 12, 25, 25, 25, 25, 12, 25, 12, 17, - 16, 16, 16, 16, 16, 16, 16, 4, 16, 16, 16, 16, 4, 4, 4, 4, - 4, 4, 4, 16, 16, 16, 16, 16, 0, 0, 12, 12, 12, 12, 8, 12, - 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 0, 12, 0, 12, 12, - 12, 12, 0, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, - 16, 16, 12, 12, 12, 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 0, 12, 8, 18, 0, 0, 12, 12, 9, - 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 18, 16, - 12, 16, 16, 12, 16, 16, 6, 16, 0, 0, 0, 0, 0, 0, 0, 0, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, 0, 0, 0, 37, - 37, 37, 37, 12, 12, 0, 0, 0, 12, 10, 10, 10, 8, 8, 12, 12, - 16, 16, 16, 6, 16, 0, 6, 6, 11, 11, 10, 11, 11, 12, 12, 12, - 16, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 6, 12, 16, 16, - 16, 16, 16, 16, 16, 12, 12, 16, 16, 12, 16, 16, 16, 16, 12, 12, - 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, - 12, 16, 12, 12, 12, 12, 12, 12, 16, 16, 16, 0, 0, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 16, 16, 16, 12, 0, 0, 0, 0, 0, 0, - 16, 16, 16, 16, 12, 12, 12, 12, 8, 6, 12, 0, 0, 16, 9, 9, - 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 0, 0, 12, 16, 16, 16, 0, 0, 12, 0, - 12, 12, 12, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 0, 12, 12, - 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, - 12, 12, 16, 16, 16, 12, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, - 12, 12, 16, 16, 18, 18, 11, 11, 12, 16, 16, 16, 0, 12, 12, 12, - 12, 12, 12, 12, 12, 0, 0, 12, 12, 0, 0, 12, 12, 12, 12, 12, - 12, 0, 12, 12, 12, 12, 12, 12, 12, 0, 12, 0, 0, 0, 12, 12, - 12, 12, 0, 0, 16, 12, 16, 16, 16, 16, 16, 16, 16, 0, 0, 16, - 16, 0, 0, 16, 16, 16, 12, 0, 0, 0, 0, 0, 0, 0, 0, 16, - 0, 0, 0, 0, 12, 12, 0, 12, 12, 12, 16, 16, 0, 0, 11, 11, - 12, 12, 10, 10, 12, 12, 12, 12, 12, 10, 12, 9, 12, 12, 16, 0, - 0, 16, 16, 16, 0, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 12, - 12, 0, 12, 12, 0, 12, 12, 0, 12, 12, 0, 0, 16, 0, 16, 16, - 16, 16, 16, 0, 0, 0, 0, 16, 16, 0, 0, 16, 16, 16, 0, 0, - 0, 16, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 0, 12, 0, - 0, 0, 0, 0, 0, 0, 11, 11, 16, 16, 12, 12, 12, 16, 12, 0, - 12, 0, 12, 12, 0, 12, 12, 12, 16, 16, 16, 16, 16, 16, 0, 16, - 16, 16, 0, 16, 16, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 12, 9, 0, 0, 0, 0, 0, 0, 0, 12, 16, 16, 16, 16, 16, 16, - 0, 0, 0, 0, 0, 0, 16, 16, 0, 0, 16, 12, 0, 12, 12, 12, - 12, 12, 12, 0, 0, 0, 12, 12, 12, 0, 12, 12, 12, 12, 0, 0, - 0, 12, 12, 0, 12, 0, 12, 12, 0, 0, 0, 12, 12, 0, 0, 0, - 12, 12, 0, 0, 0, 0, 16, 16, 16, 16, 16, 0, 0, 0, 16, 16, - 16, 0, 16, 16, 16, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 16, - 12, 9, 12, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 12, 12, 12, - 12, 12, 0, 0, 0, 12, 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, - 0, 0, 0, 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 17, - 12, 16, 16, 16, 17, 12, 12, 12, 12, 12, 12, 12, 0, 12, 12, 12, - 0, 0, 0, 0, 0, 0, 12, 0, 0, 12, 12, 0, 0, 0, 0, 0, - 16, 16, 16, 16, 0, 12, 12, 12, 12, 12, 12, 16, 16, 12, 16, 16, - 16, 0, 16, 16, 16, 16, 12, 12, 0, 0, 0, 0, 12, 12, 12, 16, - 12, 10, 12, 12, 12, 12, 12, 12, 0, 0, 16, 16, 0, 12, 12, 12, - 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, 0, 0, - 0, 0, 16, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 0, 16, 0, - 0, 0, 16, 16, 12, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 9, - 24, 24, 24, 24, 24, 24, 24, 12, 11, 11, 18, 18, 0, 0, 0, 0, - 0, 24, 24, 0, 24, 0, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24, - 24, 24, 24, 24, 0, 24, 0, 24, 24, 24, 24, 24, 24, 24, 0, 0, - 24, 24, 24, 24, 24, 0, 24, 0, 11, 11, 0, 0, 24, 24, 24, 24, - 12, 17, 17, 17, 17, 12, 17, 17, 4, 17, 17, 18, 4, 6, 6, 6, - 6, 6, 4, 12, 6, 12, 12, 12, 12, 12, 12, 12, 18, 16, 12, 16, - 12, 16, 1, 2, 1, 2, 16, 16, 12, 12, 12, 12, 12, 0, 0, 0, - 16, 16, 16, 16, 16, 16, 16, 18, 16, 16, 16, 16, 16, 18, 16, 16, - 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 16, 16, 0, 18, 18, - 12, 12, 12, 12, 12, 12, 16, 12, 17, 17, 18, 17, 12, 12, 12, 12, - 12, 4, 4, 0, 0, 0, 0, 0, 11, 11, 18, 18, 12, 12, 12, 12, - 11, 11, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 12, 0, 0, - 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, - 33, 33, 33, 33, 33, 33, 33, 33, 12, 12, 12, 0, 0, 16, 16, 16, - 12, 18, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, - 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 2, 0, 0, 0, - 12, 12, 12, 18, 18, 18, 12, 12, 12, 12, 16, 16, 16, 0, 0, 0, - 12, 12, 16, 16, 16, 18, 18, 0, 12, 12, 16, 16, 0, 0, 0, 0, - 12, 0, 16, 16, 0, 0, 0, 0, 24, 24, 24, 24, 18, 18, 5, 24, - 18, 12, 18, 9, 24, 24, 0, 0, 11, 11, 0, 0, 0, 0, 0, 0, - 12, 12, 6, 6, 18, 18, 17, 12, 6, 6, 12, 16, 16, 16, 4, 0, - 12, 12, 12, 12, 12, 16, 16, 12, 12, 16, 12, 0, 0, 0, 0, 0, - 16, 16, 16, 16, 0, 0, 0, 0, 12, 0, 0, 0, 6, 6, 11, 11, - 24, 24, 24, 24, 24, 0, 0, 0, 24, 24, 24, 24, 0, 0, 0, 0, - 24, 24, 0, 0, 0, 0, 0, 0, 11, 11, 24, 0, 0, 0, 24, 24, - 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 0, 0, 12, 12, - 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24, 24, 0, 0, 16, - 16, 16, 16, 16, 16, 16, 16, 0, 12, 12, 12, 12, 16, 16, 16, 16, - 12, 12, 12, 12, 0, 0, 0, 0, 11, 11, 18, 18, 12, 18, 18, 18, - 16, 16, 16, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 12, 12, - 0, 0, 0, 18, 18, 18, 18, 18, 11, 11, 0, 0, 0, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 18, 18, 12, 12, 12, 0, 0, 12, 12, 12, - 16, 16, 16, 12, 16, 16, 16, 16, 16, 12, 12, 12, 12, 16, 12, 12, - 12, 12, 12, 12, 16, 12, 12, 16, 16, 16, 12, 0, 0, 0, 0, 0, - 16, 16, 0, 16, 16, 16, 16, 16, 0, 12, 0, 12, 0, 12, 0, 12, - 12, 12, 12, 12, 0, 0, 12, 12, 0, 0, 12, 12, 12, 0, 12, 12, - 12, 12, 12, 12, 12, 17, 12, 0, 18, 18, 18, 18, 18, 18, 18, 4, - 18, 18, 18, 28, 16, 42, 16, 16, 18, 4, 18, 18, 26, 25, 25, 12, - 3, 3, 1, 3, 3, 3, 1, 3, 25, 25, 12, 12, 14, 14, 14, 18, - 20, 20, 16, 16, 16, 16, 16, 4, 10, 10, 10, 10, 10, 10, 10, 10, - 12, 3, 3, 25, 5, 5, 12, 12, 12, 12, 12, 12, 8, 1, 2, 5, - 5, 5, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18, 12, - 18, 18, 18, 18, 12, 18, 18, 18, 30, 12, 12, 12, 12, 0, 16, 16, - 12, 12, 0, 0, 25, 12, 12, 12, 12, 12, 12, 12, 12, 1, 2, 25, - 12, 25, 25, 25, 25, 12, 12, 12, 12, 12, 12, 12, 12, 1, 2, 0, - 9, 9, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, 10, 9, 9, 10, 9, - 16, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 10, 12, 25, 12, 12, - 12, 12, 12, 25, 12, 12, 9, 12, 12, 25, 25, 12, 12, 12, 12, 12, - 12, 12, 12, 25, 12, 12, 12, 12, 12, 12, 12, 12, 25, 25, 12, 12, - 12, 12, 12, 25, 12, 12, 25, 12, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 12, 12, 12, 12, 25, 25, 12, 12, 12, 12, 12, 12, - 12, 25, 12, 12, 0, 0, 0, 0, 12, 12, 25, 12, 25, 12, 12, 12, - 25, 12, 25, 25, 12, 12, 12, 25, 25, 12, 12, 25, 12, 12, 12, 25, - 12, 25, 9, 9, 12, 25, 12, 12, 12, 12, 25, 12, 12, 25, 25, 25, - 25, 12, 12, 25, 12, 25, 12, 25, 25, 25, 25, 25, 25, 12, 25, 12, - 12, 12, 12, 12, 25, 25, 25, 25, 25, 12, 12, 12, 25, 12, 12, 12, - 12, 12, 25, 12, 12, 12, 12, 12, 25, 25, 12, 12, 25, 25, 25, 25, - 12, 12, 25, 25, 12, 12, 25, 25, 12, 12, 12, 12, 12, 25, 12, 12, - 12, 25, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 14, - 1, 2, 1, 2, 12, 12, 12, 12, 12, 12, 13, 13, 12, 12, 12, 12, - 12, 1, 2, 12, 12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, - 25, 25, 25, 25, 25, 25, 25, 12, 25, 25, 25, 25, 25, 12, 12, 12, - 12, 12, 25, 25, 25, 25, 12, 12, 25, 25, 12, 25, 25, 25, 25, 25, - 25, 25, 12, 12, 12, 12, 25, 25, 25, 12, 12, 25, 12, 12, 25, 25, - 13, 13, 13, 13, 12, 25, 25, 12, 12, 25, 12, 12, 12, 12, 25, 25, - 12, 12, 12, 12, 13, 13, 25, 25, 13, 12, 13, 13, 13, 40, 13, 13, - 12, 13, 13, 13, 12, 12, 12, 12, 25, 12, 25, 12, 12, 12, 12, 12, - 25, 25, 12, 25, 25, 25, 12, 25, 13, 25, 25, 12, 25, 25, 12, 25, - 12, 12, 12, 12, 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 25, 25, - 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 25, 25, 25, 25, 13, 12, 13, 13, 13, 25, 13, 13, 25, 25, 25, - 13, 13, 25, 25, 13, 25, 25, 13, 13, 13, 12, 25, 12, 12, 12, 12, - 25, 25, 13, 25, 25, 25, 25, 25, 25, 13, 13, 13, 13, 13, 25, 13, - 13, 40, 13, 25, 25, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, - 13, 13, 40, 40, 40, 40, 12, 12, 12, 12, 12, 3, 3, 3, 3, 3, - 3, 12, 6, 6, 13, 12, 12, 12, 1, 2, 1, 2, 1, 2, 1, 2, - 1, 2, 1, 2, 1, 2, 25, 25, 12, 12, 12, 12, 12, 1, 2, 12, - 12, 12, 12, 12, 12, 12, 1, 2, 12, 12, 12, 1, 2, 1, 2, 1, - 2, 1, 2, 1, 2, 1, 2, 1, 2, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 1, 2, 12, 12, 12, 12, 12, 12, 12, 25, 25, 25, - 16, 16, 12, 12, 0, 0, 0, 0, 0, 6, 18, 18, 18, 12, 6, 18, - 0, 0, 0, 0, 0, 0, 0, 12, 18, 0, 0, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 18, 18, - 18, 18, 18, 18, 18, 18, 12, 18, 1, 18, 12, 12, 3, 3, 12, 12, - 3, 3, 1, 2, 1, 2, 1, 2, 1, 2, 18, 18, 18, 18, 6, 12, - 18, 18, 12, 18, 18, 12, 12, 12, 12, 12, 26, 26, 18, 18, 18, 12, - 18, 18, 1, 18, 18, 18, 18, 18, 18, 18, 18, 12, 18, 12, 18, 18, - 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, - 13, 13, 13, 13, 13, 13, 0, 0, 18, 2, 2, 13, 13, 5, 13, 13, - 1, 2, 13, 13, 1, 2, 1, 2, 1, 2, 1, 2, 5, 1, 2, 2, - 13, 13, 16, 16, 16, 16, 16, 16, 13, 13, 13, 13, 13, 16, 13, 13, - 13, 13, 13, 5, 5, 13, 13, 13, 0, 38, 13, 38, 13, 38, 13, 38, - 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, - 13, 13, 13, 38, 13, 38, 13, 38, 13, 13, 13, 13, 13, 13, 38, 13, - 13, 13, 13, 13, 13, 38, 38, 0, 0, 16, 16, 5, 5, 5, 5, 13, - 5, 38, 13, 38, 13, 38, 13, 38, 13, 13, 13, 13, 13, 38, 38, 13, - 13, 13, 13, 5, 38, 5, 5, 13, 0, 0, 0, 0, 0, 13, 13, 13, - 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, - 13, 13, 13, 0, 0, 0, 0, 0, 38, 38, 38, 38, 38, 38, 38, 38, - 13, 13, 13, 13, 13, 5, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, - 12, 12, 12, 12, 12, 18, 6, 18, 11, 11, 12, 12, 0, 0, 0, 0, - 16, 16, 12, 18, 18, 18, 18, 18, 0, 0, 12, 12, 12, 12, 12, 0, - 12, 12, 16, 12, 12, 12, 16, 12, 12, 12, 12, 16, 12, 12, 12, 12, - 10, 12, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 17, 17, 6, 6, - 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, - 12, 12, 12, 12, 17, 12, 12, 16, 16, 16, 16, 16, 16, 16, 18, 18, - 31, 31, 31, 31, 31, 0, 0, 0, 16, 12, 12, 12, 12, 12, 12, 18, - 18, 18, 12, 12, 12, 12, 0, 12, 11, 11, 0, 0, 0, 0, 12, 12, - 11, 11, 24, 24, 24, 24, 24, 0, 12, 12, 12, 12, 16, 16, 0, 0, - 11, 11, 0, 0, 12, 18, 18, 18, 24, 24, 24, 0, 0, 0, 0, 0, - 0, 0, 0, 24, 24, 24, 24, 24, 18, 18, 12, 12, 12, 16, 16, 0, - 0, 12, 12, 12, 12, 12, 12, 0, 16, 16, 16, 18, 16, 16, 0, 0, - 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 34, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 0, - 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, - 0, 0, 0, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 37, 16, 37, - 37, 12, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, - 37, 37, 37, 37, 37, 0, 37, 0, 37, 37, 0, 37, 37, 0, 37, 37, - 12, 12, 12, 12, 12, 12, 2, 1, 12, 12, 12, 12, 10, 12, 0, 0, - 8, 2, 2, 8, 8, 6, 6, 1, 2, 14, 0, 0, 0, 0, 0, 0, - 13, 13, 13, 13, 13, 1, 2, 1, 2, 1, 2, 1, 2, 13, 13, 1, - 2, 13, 13, 13, 13, 13, 13, 13, 2, 13, 2, 0, 5, 5, 6, 6, - 13, 1, 2, 1, 2, 1, 2, 13, 13, 9, 10, 13, 0, 0, 0, 0, - 12, 12, 12, 12, 12, 0, 0, 30, 0, 6, 13, 13, 9, 10, 13, 13, - 1, 2, 13, 13, 2, 13, 2, 13, 13, 13, 5, 5, 13, 13, 13, 6, - 13, 13, 13, 1, 13, 2, 13, 13, 13, 13, 13, 1, 13, 2, 13, 1, - 2, 2, 1, 2, 2, 5, 13, 38, 38, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 5, 5, 0, 0, 13, 13, 13, 13, 13, 13, - 0, 0, 13, 13, 13, 0, 0, 0, 10, 9, 13, 13, 13, 9, 9, 0, - 0, 16, 16, 16, 23, 25, 0, 0, 12, 12, 12, 0, 12, 12, 0, 12, - 18, 18, 18, 0, 0, 0, 0, 12, 12, 12, 12, 12, 0, 0, 0, 12, - 12, 12, 12, 12, 12, 16, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, - 16, 16, 16, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 0, 18, - 18, 12, 12, 12, 12, 12, 0, 0, 12, 0, 0, 0, 12, 0, 0, 12, - 12, 12, 12, 0, 12, 12, 0, 0, 12, 12, 12, 12, 0, 0, 0, 18, - 12, 12, 0, 0, 0, 0, 0, 12, 12, 16, 16, 16, 0, 16, 16, 0, - 0, 0, 0, 0, 16, 16, 16, 16, 18, 18, 18, 18, 18, 18, 18, 18, - 12, 12, 12, 12, 12, 16, 16, 0, 18, 18, 18, 18, 18, 18, 14, 0, - 0, 18, 18, 18, 18, 18, 18, 18, 0, 12, 12, 12, 12, 0, 0, 0, - 12, 12, 12, 12, 12, 12, 11, 11, 16, 16, 16, 12, 12, 12, 18, 18, - 18, 18, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 0, 11, 11, - 18, 18, 18, 18, 12, 16, 16, 0, 12, 12, 12, 16, 12, 17, 12, 0, - 16, 12, 12, 12, 12, 18, 18, 12, 18, 16, 16, 16, 16, 12, 0, 0, - 11, 11, 12, 17, 12, 18, 18, 18, 18, 18, 12, 18, 18, 12, 16, 0, - 12, 0, 12, 12, 12, 12, 0, 12, 12, 18, 0, 0, 0, 0, 0, 0, - 12, 12, 0, 16, 16, 12, 16, 16, 12, 12, 16, 16, 0, 0, 16, 16, - 16, 16, 16, 16, 16, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 12, - 12, 12, 12, 18, 18, 18, 18, 12, 11, 11, 0, 18, 0, 12, 16, 12, - 16, 17, 18, 18, 6, 6, 12, 12, 12, 18, 18, 18, 18, 18, 18, 18, - 16, 18, 18, 12, 12, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 0, 0, 0, 24, 24, 24, 0, 0, 24, 24, 24, - 11, 11, 24, 24, 18, 18, 18, 24, 16, 16, 16, 12, 0, 0, 0, 0, - 0, 0, 16, 16, 16, 16, 16, 16, 16, 12, 17, 12, 16, 0, 0, 0, - 16, 16, 12, 16, 16, 16, 16, 17, 12, 18, 18, 18, 18, 17, 12, 16, - 12, 12, 16, 16, 16, 16, 16, 16, 16, 16, 18, 18, 18, 12, 17, 17, - 17, 18, 18, 0, 0, 0, 0, 0, 12, 18, 18, 18, 18, 18, 0, 0, - 17, 6, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 0, - 0, 0, 16, 0, 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, 12, 16, - 12, 12, 16, 16, 16, 16, 16, 0, 12, 12, 12, 16, 16, 16, 16, 12, - 12, 12, 12, 12, 12, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, - 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 0, 0, 0, - 1, 1, 1, 2, 2, 2, 12, 12, 12, 12, 2, 12, 12, 12, 1, 2, - 1, 2, 12, 12, 12, 12, 12, 12, 12, 1, 2, 2, 12, 12, 12, 12, - 4, 4, 4, 4, 4, 4, 4, 1, 2, 0, 0, 0, 0, 0, 0, 0, - 11, 11, 0, 0, 0, 0, 18, 18, 16, 16, 16, 16, 16, 18, 0, 0, - 18, 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18, 12, 0, 0, - 11, 11, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18, - 18, 12, 12, 0, 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, 0, 16, - 5, 5, 5, 5, 0, 0, 0, 0, 38, 38, 38, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 38, 38, 38, 38, 12, 12, 0, 0, 12, 16, 16, 18, - 16, 16, 12, 12, 12, 16, 16, 16, 16, 16, 16, 12, 12, 16, 16, 16, - 12, 12, 16, 16, 16, 16, 12, 12, 12, 12, 16, 16, 16, 12, 0, 0, - 0, 0, 12, 0, 0, 12, 12, 0, 0, 12, 12, 12, 12, 0, 12, 12, - 12, 12, 0, 12, 0, 12, 12, 12, 12, 12, 0, 12, 12, 12, 12, 0, - 12, 12, 12, 12, 12, 0, 12, 0, 12, 12, 12, 12, 0, 0, 11, 11, - 12, 12, 12, 12, 12, 16, 12, 12, 12, 12, 12, 12, 16, 12, 12, 18, - 18, 18, 18, 12, 0, 0, 0, 0, 16, 0, 0, 16, 16, 16, 16, 16, - 16, 16, 0, 16, 16, 0, 16, 16, 11, 11, 0, 0, 0, 0, 0, 9, - 11, 11, 0, 0, 0, 0, 1, 1, 12, 12, 12, 12, 10, 12, 12, 12, - 10, 12, 12, 12, 12, 0, 0, 0, 0, 12, 12, 0, 12, 0, 0, 12, - 12, 12, 12, 0, 12, 12, 12, 12, 0, 12, 0, 12, 0, 0, 0, 0, - 0, 0, 12, 0, 0, 0, 0, 12, 0, 12, 0, 12, 0, 12, 12, 12, - 0, 12, 12, 12, 0, 12, 12, 12, 25, 25, 25, 25, 25, 13, 13, 13, - 25, 25, 25, 25, 25, 25, 12, 12, 25, 25, 12, 12, 12, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, - 13, 13, 13, 13, 13, 40, 13, 13, 13, 13, 13, 13, 12, 12, 13, 13, - 13, 13, 13, 13, 13, 12, 12, 13, 13, 13, 13, 13, 12, 13, 13, 13, - 13, 13, 40, 40, 40, 13, 13, 40, 13, 13, 40, 40, 40, 13, 13, 13, - 13, 13, 13, 41, 41, 41, 41, 41, 13, 13, 40, 40, 13, 13, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 40, 40, 40, 13, 13, 13, 40, 13, 13, 13, - 13, 40, 40, 40, 13, 40, 40, 40, 13, 13, 13, 13, 13, 13, 13, 40, - 13, 40, 13, 13, 13, 13, 13, 13, 12, 13, 12, 13, 12, 13, 13, 13, - 13, 13, 40, 13, 13, 13, 13, 12, 13, 12, 12, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 12, 13, 13, 12, 12, 12, 12, 12, 12, - 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 40, 40, 13, 13, - 13, 13, 40, 13, 13, 13, 13, 13, 40, 13, 13, 13, 13, 40, 40, 13, - 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 40, 40, 40, - 13, 13, 13, 40, 40, 40, 40, 40, 12, 12, 12, 12, 12, 12, 3, 3, - 3, 5, 5, 5, 12, 12, 12, 12, 13, 13, 13, 40, 13, 13, 13, 13, - 13, 13, 13, 13, 40, 40, 40, 13, 13, 13, 13, 13, 40, 13, 13, 13, - 12, 12, 12, 12, 12, 12, 13, 13, 12, 12, 12, 12, 13, 13, 13, 40, - 13, 13, 13, 13, 13, 13, 40, 13, 40, 40, 13, 13, 40, 40, 40, 13, - 13, 13, 13, 13, 13, 40, 40, 13, 40, 40, 13, 40, 13, 13, 13, 13, - 13, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 13, 13, +static RE_UINT8 re_terminal_punctuation_table_2[] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, + 6, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 9, + 0, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 0, 0, 0, 17, 0, 18, 0, 0, 0, 0, 19, 0, + 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 23, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 30, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 32, 0, 0, 33, 0, 0, 34, 0, 0, 0, 0, 26, 0, + 0, 0, 35, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 38, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 39, 0, 0, 0, 0, 0, 1, 0, 0, 40, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 41, 0, + 0, 0, 42, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 0, 0, 0, 43, 0, 44, 0, 0, 45, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, + 0, 0, 47, 0, 0, 24, 48, 0, 0, 0, 49, 0, 0, 0, 50, 0, + 0, 51, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 57, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 49, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 33, 0, 0, 0, 61, 0, 62, 63, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Line_Break: 12816 bytes. */ - -RE_UINT32 re_get_line_break(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_line_break_stage_1[f] << 5; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_line_break_stage_2[pos + f] << 4; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_line_break_stage_3[pos + f] << 3; - value = re_line_break_stage_4[pos + code]; - - return value; -} - -/* Numeric_Type. */ - -static RE_UINT8 re_numeric_type_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 8, - 15, 16, 17, 8, 18, 19, 8, 8, 8, 8, 8, 8, 8, 8, 8, 20, - 21, 22, 23, 24, 25, 8, 8, 8, 8, 8, 8, 8, 8, 26, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 27, 8, 28, 29, 30, 8, - 31, 32, 8, 8, 33, 34, 8, 35, 8, 8, 8, 8, 36, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 37, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +static RE_UINT8 re_terminal_punctuation_table_3[] = { + 0, 0, 0, 0, 2, 80, 0, 140, 0, 0, 0, 64, 128, 0, 0, 0, + 0, 2, 0, 0, 8, 0, 0, 0, 0, 16, 0, 200, 0, 0, 16, 0, + 255, 23, 0, 0, 0, 0, 0, 3, 0, 0, 255, 127, 48, 0, 0, 0, + 0, 0, 0, 12, 0, 225, 7, 0, 0, 12, 0, 0, 254, 1, 0, 0, + 0, 64, 0, 0, 0, 56, 0, 0, 0, 0, 96, 0, 0, 0, 112, 4, + 60, 3, 0, 0, 0, 15, 0, 0, 0, 0, 0, 236, 0, 0, 0, 248, + 0, 0, 0, 192, 0, 0, 0, 48, 128, 3, 0, 0, 0, 64, 0, 16, + 2, 208, 0, 0, 6, 0, 0, 0, 0, 224, 0, 0, 0, 0, 248, 0, + 0, 0, 192, 0, 0, 192, 0, 0, 0, 128, 0, 0, 0, 0, 0, 224, + 0, 0, 0, 128, 0, 0, 3, 0, 0, 8, 0, 0, 0, 0, 247, 0, + 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 128, 0, 0, 0, 63, 0, + 0, 0, 0, 252, 0, 0, 0, 30, 0, 0, 224, 3, 128, 63, 0, 0, + 3, 0, 0, 0, 14, 0, 0, 0, 96, 32, 0, 192, 0, 0, 0, 31, + 0, 56, 0, 12, 60, 254, 255, 0, 0, 0, 0, 112, 80, 0, 0, 0, + 12, 0, 0, 0, 0, 0, 0, 24, 0, 0, 2, 0, 0, 0, 128, 1, + 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 128, 3, 16, 0, 0, 0, + 128, 7, 0, 0 }; -static RE_UINT8 re_numeric_type_stage_2[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 0, 1, 1, 1, 4, - 1, 1, 1, 1, 1, 5, 1, 6, 1, 5, 1, 5, 1, 7, 1, 8, - 1, 9, 1, 5, 1, 10, 1, 5, 1, 11, 1, 11, 12, 1, 1, 1, - 1, 4, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 1, 1, 1, 15, - 11, 1, 1, 1, 1, 16, 1, 17, 1, 1, 18, 1, 1, 11, 0, 1, - 1, 18, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 19, 20, 1, 1, 21, 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 23, 24, 25, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 27, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 28, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 29, 1, 1, 1, 1, 1, 30, 1, 31, 32, 33, 1, 1, 1, 1, 1, - 34, 1, 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 38, 39, 40, 41, 37, 42, 1, 1, - 1, 1, 1, 1, 43, 44, 1, 1, 1, 1, 1, 1, 1, 45, 1, 46, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 1, 1, 1, 1, - 1, 1, 1, 48, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 49, 1, 50, 51, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 52, 1, 53, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 54, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 56, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 52, 1, 1, 1, 1, 1, 1, - 1, 1, 55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 58, 1, 42, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 59, 60, 1, 61, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 62, 1, 1, 1, 1, - 63, 1, 1, 11, 4, 1, 1, 64, 1, 11, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 65, 66, 67, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 1, 1, - 1, 1, 1, 1, 68, 69, 70, 1, 1, 1, 1, 71, 72, 73, 1, 74, - 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 75, 76, 77, 78, 1, 79, 80, 1, 81, 82, 83, 1, 84, 85, 1, - 1, 1, 1, 86, 0, 1, 1, 1, 1, 87, 1, 1, 88, 89, 1, 1, - 1, 90, 1, 0, 91, 1, 1, 92, 1, 1, 1, 0, 1, 1, 1, 1, - 1, 11, 1, 11, 1, 1, 1, 1, 1, 11, 1, 4, 93, 1, 1, 1, - 1, 1, 1, 94, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 95, 1, 1, 1, 11, 3, 1, 1, 1, 1, 1, 1, 1, 1, 96, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 97, 98, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 99, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 100, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 101, 1, 102, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 103, - 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 104, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 105, 106, 1, 107, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 108, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 109, 110, 1, 111, 59, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 36, 1, 112, 1, 1, 1, 1, 113, 114, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 115, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 116, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 117, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 115, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; +RE_UINT32 re_get_terminal_punctuation(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_numeric_type_stage_3[] = { - 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 1, 2, 0, 0, - 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, - 0, 0, 0, 0, 5, 1, 6, 7, 0, 0, 0, 0, 5, 1, 8, 0, - 0, 0, 0, 0, 5, 1, 9, 0, 0, 0, 0, 0, 5, 1, 0, 10, - 0, 0, 0, 10, 5, 1, 11, 12, 0, 0, 1, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 13, 14, 0, 0, 0, 0, 0, 0, 15, 16, 17, - 0, 0, 0, 0, 0, 18, 12, 0, 0, 0, 0, 0, 1, 2, 11, 7, - 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 19, 0, 0, 0, 0, - 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, - 22, 21, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, - 23, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 24, 25, 26, - 11, 22, 24, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, - 0, 0, 0, 0, 0, 0, 30, 31, 22, 32, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 35, 0, 0, 0, 36, 7, 0, 9, - 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 7, 0, 0, - 0, 11, 36, 11, 0, 0, 0, 0, 11, 7, 0, 0, 0, 0, 36, 11, - 34, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 39, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, - 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, - 0, 42, 43, 0, 0, 0, 0, 35, 12, 0, 0, 35, 0, 12, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, 42, 0, 0, 0, 0, 0, 0, 0, - 44, 0, 0, 0, 0, 45, 0, 0, 46, 42, 0, 0, 0, 0, 0, 0, - 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 41, 41, 0, 0, 0, 0, 0, 0, 0, 39, - 0, 0, 0, 0, 0, 0, 0, 18, 0, 48, 12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 44, 0, 42, 0, 0, 0, 0, 0, 0, - 0, 0, 39, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, - 0, 0, 0, 0, 0, 44, 38, 0, 0, 0, 0, 0, 41, 0, 0, 0, - 44, 42, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 44, 0, - 0, 0, 0, 0, 18, 11, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, - 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 0, 0, 0, 38, 38, 12, - 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 50, 0, 0, 0, 0, 34, - 35, 11, 11, 11, 11, 11, 14, 0, 11, 11, 11, 11, 11, 11, 11, 12, - 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 11, 11, 14, - 0, 0, 0, 0, 14, 0, 0, 0, 41, 39, 0, 0, 0, 0, 0, 0, - 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 36, - 0, 0, 0, 0, 35, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, - 0, 0, 18, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, - 11, 11, 8, 11, 11, 11, 11, 11, 55, 12, 0, 0, 0, 0, 0, 56, - 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, - 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 0, 0, 36, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 22, 24, 11, 10, - 0, 0, 0, 57, 10, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, - 0, 0, 58, 59, 60, 1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, - 0, 0, 1, 2, 36, 11, 17, 0, 0, 0, 0, 0, 0, 0, 1, 61, - 0, 0, 0, 0, 1, 13, 9, 0, 0, 0, 1, 13, 11, 17, 0, 0, - 11, 11, 17, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 10, 0, 0, 0, 0, 1, 62, 7, 0, 0, 0, - 11, 11, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 14, 0, - 0, 0, 0, 0, 11, 11, 11, 12, 0, 5, 1, 1, 1, 1, 1, 1, - 35, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 11, - 11, 11, 11, 11, 11, 63, 47, 0, 36, 11, 11, 11, 11, 64, 11, 49, - 22, 65, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, - 38, 42, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 34, - 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, - 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_numeric_type_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, - 0, 2, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 3, - 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 0, 0, 0, 3, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 2, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 1, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, - 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, - 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, - 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, - 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, - 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 0, 0, 0, 0, - 3, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, 2, 2, 2, 1, 1, 0, 0, 0, -}; + v = re_terminal_punctuation_table_1[field_2]; + v = re_terminal_punctuation_table_2[(v << 5) | field_1]; + v = re_terminal_punctuation_table_3[(v << 2) | field_0]; -/* Numeric_Type: 3232 bytes. */ - -RE_UINT32 re_get_numeric_type(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_numeric_type_stage_1[f] << 5; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_numeric_type_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_numeric_type_stage_3[pos + f] << 3; - value = re_numeric_type_stage_4[pos + code]; - - return value; + return (v >> offset) & 0x1; } -/* Numeric_Value. */ - -static RE_UINT8 re_numeric_value_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 8, - 15, 16, 17, 8, 18, 19, 8, 8, 8, 8, 8, 8, 8, 8, 8, 20, - 21, 22, 23, 24, 25, 8, 8, 8, 8, 8, 8, 8, 8, 26, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 27, 8, 28, 29, 30, 8, - 31, 32, 8, 8, 33, 34, 8, 35, 8, 8, 8, 8, 36, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 37, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +/* Unified_Ideograph. */ +static RE_UINT8 re_unified_ideograph_table_1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 6, 7, 1, + 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_numeric_value_stage_2[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 0, 1, 1, 1, 4, - 1, 1, 1, 1, 1, 5, 1, 6, 1, 5, 1, 5, 1, 7, 1, 8, - 1, 9, 1, 5, 1, 10, 1, 5, 1, 11, 1, 11, 12, 1, 1, 1, - 1, 4, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 1, 1, 1, 15, - 11, 1, 1, 1, 1, 16, 1, 17, 1, 1, 18, 1, 1, 11, 0, 1, - 1, 18, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 19, 4, 1, 1, 20, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 22, 23, 24, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 26, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 28, 1, 1, 1, 1, 1, 29, 1, 30, 31, 32, 1, 1, 1, 1, 1, - 33, 1, 34, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 37, 38, 39, 40, 41, 42, 1, 1, - 1, 1, 1, 1, 43, 44, 1, 1, 1, 1, 1, 1, 1, 45, 1, 46, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 1, 1, 1, 1, - 1, 1, 1, 48, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 49, 1, 50, 51, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 52, 1, 53, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 54, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 56, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 57, 1, 1, 1, 1, 1, 1, - 1, 1, 58, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 59, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 60, 1, 61, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 62, 63, 1, 64, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 65, 1, 1, 1, 1, - 66, 1, 1, 11, 4, 1, 1, 67, 1, 11, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 68, 69, 70, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 1, 1, - 1, 1, 1, 1, 71, 72, 73, 1, 1, 1, 1, 74, 75, 76, 1, 77, - 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 78, 79, 80, 81, 1, 82, 83, 1, 84, 85, 86, 1, 87, 88, 1, - 1, 1, 1, 89, 0, 1, 1, 1, 1, 90, 1, 1, 91, 92, 1, 1, - 1, 93, 1, 0, 94, 1, 1, 95, 1, 1, 1, 0, 1, 1, 1, 1, - 1, 11, 1, 11, 1, 1, 1, 1, 1, 11, 1, 4, 96, 1, 1, 1, - 1, 1, 1, 97, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 98, 1, 1, 1, 11, 3, 1, 1, 1, 1, 1, 1, 1, 1, 99, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 100, 101, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 102, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 103, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 104, 1, 105, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 106, - 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 107, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 108, 109, 1, 110, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 111, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 112, 113, 1, 114, 115, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 116, 1, 117, 1, 1, 1, 1, 118, 119, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 120, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 121, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 122, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 123, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 124, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +static RE_UINT8 re_unified_ideograph_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 5, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, + 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_numeric_value_stage_3[] = { - 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 1, 2, 0, 0, - 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, - 0, 0, 0, 0, 5, 6, 7, 8, 0, 0, 0, 0, 5, 6, 9, 0, - 0, 0, 0, 0, 5, 6, 10, 0, 0, 0, 0, 0, 5, 6, 0, 11, - 0, 0, 0, 12, 5, 6, 13, 14, 0, 0, 1, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 15, 16, 0, 0, 0, 0, 0, 0, 17, 18, 19, - 0, 0, 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, 1, 2, 1, 2, - 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 1, 22, 0, 0, 0, 0, - 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 2, - 0, 0, 24, 25, 26, 27, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 26, 30, 31, 32, 33, 26, 30, 34, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 35, 36, 37, 0, 0, 0, 0, 0, 0, 38, 39, - 26, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, - 43, 0, 0, 0, 17, 2, 0, 44, 0, 0, 45, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 26, 46, 0, 0, 0, 47, 48, 49, 0, 0, 0, 0, - 26, 46, 0, 0, 0, 0, 50, 51, 52, 0, 0, 0, 0, 0, 0, 0, - 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, - 0, 55, 0, 0, 0, 0, 0, 0, 56, 57, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 58, 0, 0, 0, 0, 0, 59, 60, 0, 0, 0, 0, 61, - 62, 0, 0, 63, 0, 64, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 65, 0, 66, 0, 0, 0, 0, 0, 0, 0, - 67, 0, 0, 0, 0, 68, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, - 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 73, 73, 0, 0, 0, 0, 0, 0, 0, 74, - 0, 0, 0, 0, 0, 0, 0, 75, 0, 76, 77, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 78, 0, 79, 0, 0, 0, 0, 0, 0, - 0, 0, 80, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, - 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, - 0, 0, 0, 0, 0, 86, 53, 0, 0, 0, 0, 0, 0, 0, 77, 0, - 0, 0, 0, 0, 87, 0, 0, 0, 88, 89, 0, 0, 0, 0, 0, 90, - 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 38, 92, 0, 0, - 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 1, 2, 0, 0, 1, 2, - 0, 0, 0, 0, 0, 94, 95, 77, 0, 0, 0, 0, 0, 0, 96, 0, - 0, 0, 97, 0, 0, 0, 0, 98, 99, 6, 47, 100, 101, 102, 103, 0, - 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 18, 113, 114, 0, 0, 0, 0, 115, 0, 0, 0, - 116, 117, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, - 0, 0, 0, 119, 0, 0, 0, 120, 0, 0, 0, 0, 99, 121, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 123, 124, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 125, 26, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 0, 0, 0, 0, 0, 135, 0, 0, 0, 136, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 133, 0, 0, 0, 133, - 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, - 0, 0, 0, 0, 26, 126, 139, 140, 0, 0, 0, 141, 142, 0, 0, 0, - 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 144, 145, 146, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, 1, 2, 17, 18, 147, 0, - 0, 0, 0, 0, 0, 0, 1, 148, 0, 0, 0, 0, 1, 18, 149, 0, - 0, 0, 1, 150, 145, 151, 0, 0, 152, 153, 154, 0, 0, 0, 0, 0, - 6, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 0, 0, - 0, 0, 1, 168, 169, 0, 0, 0, 1, 170, 171, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 170, 172, 0, 0, 0, 0, 0, 26, 126, 173, 174, - 0, 5, 6, 1, 175, 176, 177, 6, 99, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 18, 113, 178, 179, 180, 181, 182, 183, 0, - 17, 18, 113, 178, 179, 184, 39, 185, 186, 187, 0, 0, 0, 0, 0, 0, - 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, - 0, 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, - 0, 0, 0, 0, 0, 74, 0, 0, 192, 70, 0, 70, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 193, 0, 194, 0, 0, 0, 57, 0, 0, 0, 0, - 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, - 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, - 0, 0, 196, 0, 0, 0, 0, 0, +static RE_UINT8 re_unified_ideograph_table_3[] = { + 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 31, 0, 192, 26, 128, + 154, 3, 0, 0, 255, 255, 255, 63, 255, 255, 31, 0, 3, 0, 255, 255, + 1, 0, 0, 0, 255, 7, 0, 0 }; -static RE_UINT8 re_numeric_value_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 2, 37, 39, 41, 43, 45, 47, 49, - 51, 53, 0, 0, 0, 0, 0, 0, 0, 0, 39, 41, 0, 0, 0, 0, - 0, 37, 0, 0, 22, 27, 32, 0, 0, 0, 0, 0, 0, 0, 2, 37, - 39, 41, 43, 45, 47, 49, 51, 53, 0, 0, 0, 0, 12, 16, 20, 22, - 32, 60, 0, 0, 0, 0, 0, 0, 0, 0, 22, 27, 32, 12, 16, 20, - 54, 99, 108, 0, 0, 0, 0, 0, 2, 37, 39, 41, 37, 39, 41, 0, - 4, 7, 9, 11, 14, 18, 21, 0, 54, 99, 108, 22, 27, 32, 12, 16, - 20, 0, 0, 0, 0, 0, 0, 0, 51, 53, 27, 38, 40, 42, 44, 46, - 48, 50, 52, 1, 0, 0, 0, 0, 0, 37, 39, 41, 43, 45, 47, 49, - 51, 53, 54, 64, 74, 84, 94, 95, 96, 97, 98, 99, 117, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 61, 62, 63, 0, 0, 0, 0, 0, 0, 0, - 51, 53, 37, 0, 0, 0, 0, 0, 2, 0, 0, 0, 43, 45, 47, 49, - 17, 15, 14, 23, 31, 21, 25, 29, 33, 19, 34, 16, 24, 30, 35, 37, - 37, 39, 41, 43, 45, 47, 49, 51, 53, 54, 55, 56, 94, 99, 103, 108, - 108, 112, 117, 0, 0, 47, 94, 121, 126, 2, 0, 0, 0, 0, 0, 0, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 37, 39, 41, 43, - 45, 47, 49, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 61, 62, 63, 64, 0, 0, 0, 0, 0, 0, 2, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 37, 39, 41, 43, 45, 47, 49, 51, 53, 54, 2, - 0, 0, 0, 0, 0, 0, 37, 39, 41, 43, 45, 47, 49, 51, 53, 54, - 53, 54, 37, 39, 41, 43, 45, 47, 49, 51, 53, 54, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 54, 64, 74, 0, 0, 0, 0, 0, 0, 0, 37, 39, 41, 43, 0, 0, - 53, 54, 0, 0, 0, 0, 0, 0, 54, 64, 74, 84, 94, 95, 96, 97, - 0, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 0, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, - 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, - 37, 0, 0, 49, 0, 0, 0, 117, 0, 41, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, - 0, 0, 0, 0, 45, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 140, - 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, - 41, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, - 0, 39, 0, 51, 0, 47, 0, 0, 0, 54, 0, 108, 64, 74, 0, 0, - 0, 0, 0, 0, 84, 0, 0, 0, 0, 41, 41, 41, 41, 0, 0, 0, - 0, 0, 0, 43, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, - 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 64, - 0, 0, 0, 0, 37, 39, 41, 0, 39, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 51, 0, 0, 0, - 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, - 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 99, 0, - 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 117, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 39, 0, 0, 108, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 99, 0, 0, 0, - 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 41, 43, 45, 47, 49, 51, 53, 2, 22, 27, 32, 12, 16, 20, 0, 0, - 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 47, 0, 47, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 0, 0, 0, 0, - 22, 27, 37, 45, 94, 103, 112, 121, 45, 54, 94, 99, 103, 108, 112, 45, - 54, 94, 99, 103, 108, 117, 121, 54, 37, 37, 37, 39, 39, 39, 39, 45, - 54, 54, 54, 54, 54, 74, 94, 94, 94, 94, 99, 101, 103, 103, 103, 103, - 103, 108, 112, 45, 94, 27, 27, 31, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 22, 0, 0, 0, 0, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 0, 0, 0, 0, 37, 45, 54, 94, 0, 0, 0, 0, - 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, - 0, 37, 39, 54, 64, 99, 0, 0, 37, 39, 41, 54, 64, 99, 108, 117, - 0, 37, 39, 41, 43, 45, 54, 64, 39, 41, 43, 43, 45, 54, 64, 99, - 0, 0, 0, 37, 45, 54, 64, 99, 0, 0, 0, 0, 0, 0, 37, 54, - 64, 99, 39, 41, 0, 0, 0, 0, 0, 0, 0, 0, 36, 27, 0, 0, - 53, 54, 64, 74, 84, 94, 95, 96, 0, 0, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 129, 130, 132, 133, 134, 135, 136, 13, 19, - 22, 23, 26, 27, 28, 31, 32, 34, 37, 39, 41, 43, 54, 64, 99, 108, - 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 94, 0, - 0, 0, 0, 0, 0, 37, 54, 64, 0, 37, 39, 41, 43, 54, 64, 99, - 0, 0, 37, 45, 54, 94, 99, 108, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 27, 22, 23, 31, 0, 0, 0, 0, 0, 0, 37, 39, 41, - 43, 45, 54, 64, 74, 99, 27, 0, 0, 37, 54, 64, 99, 0, 0, 0, - 0, 0, 37, 39, 41, 43, 45, 47, 49, 51, 53, 54, 64, 74, 84, 94, - 95, 96, 97, 98, 99, 108, 2, 37, 96, 97, 98, 99, 108, 0, 0, 0, - 51, 53, 54, 64, 0, 0, 0, 0, 96, 97, 98, 0, 0, 0, 0, 0, - 51, 53, 37, 39, 41, 43, 45, 47, 95, 96, 97, 98, 99, 0, 0, 0, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 14, 16, 18, 20, 21, - 22, 27, 27, 32, 3, 0, 0, 0, 41, 43, 45, 47, 49, 51, 53, 43, - 45, 47, 49, 51, 53, 37, 39, 41, 43, 45, 47, 49, 51, 53, 37, 39, - 41, 43, 45, 39, 41, 41, 43, 45, 47, 49, 51, 53, 37, 39, 41, 41, - 43, 45, 128, 131, 37, 39, 41, 41, 43, 45, 41, 41, 43, 43, 43, 43, - 47, 49, 49, 49, 51, 51, 53, 53, 53, 53, 39, 41, 43, 45, 47, 37, - 39, 41, 43, 43, 45, 45, 39, 41, 37, 39, 23, 31, 34, 23, 31, 16, - 22, 19, 22, 22, 27, 23, 31, 84, 94, 43, 45, 47, 49, 51, 53, 0, - 51, 53, 0, 54, 99, 117, 137, 140, 141, 142, 0, 0, 0, 0, 0, 0, - 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 37, 39, 41, 0, - 60, 61, 62, 63, 0, 0, 0, 0, 97, 98, 37, 39, 41, 43, 45, 37, - 45, 0, 0, 0, 0, 0, 0, 0, 51, 53, 2, 37, 39, 41, 43, 45, - 47, 49, 51, 53, 2, 37, 39, 41, 43, 45, 47, 49, 51, 53, 2, 37, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 126, 138, 139, 37, 39, 41, 43, 45, - 47, 49, 51, 53, 0, 22, 27, 32, 0, 37, 39, 117, 126, 0, 0, 0, - 120, 121, 122, 123, 124, 125, 0, 39, 102, 104, 109, 117, 27, 19, 0, 0, - 2, 2, 37, 39, 41, 43, 45, 47, 49, 51, 53, 2, 2, 0, 0, 0, - 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, - 0, 0, 43, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, - 53, 0, 0, 0, 0, 0, 0, 0, +RE_UINT32 re_get_unified_ideograph(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_unified_ideograph_table_1[field_2]; + v = re_unified_ideograph_table_2[(v << 5) | field_1]; + v = re_unified_ideograph_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Uppercase. */ +static RE_UINT8 re_uppercase_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, + 2, 10, 2, 11, 2, 2, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 14, 2, 2, 2, 2, 15, 2, 16, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_uppercase_table_2[] = { + 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, + 3, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, + 18, 19, 0, 3, 20, 3, 21, 3, 3, 22, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 25, + 0, 0, 0, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 28, 3, 3, 3, 29, 30, 31, 32, 0, 33, 34, 35, + 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 19, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 40, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 41, 0, 42, 3, 3, 3, 43, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 44, 45, 0, 0, 0, 0, 46, 3, 47, 48, 49, 50, 51, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 18, 52, 0, 0, 0, 26, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 18, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 56, 57, 58, 59, 60, 26, 61, 62, 63, 64, 65, 66, 55, 56, 57, + 58, 67, 25, 26, 61, 58, 68, 69, 70, 71, 40, 41, 26, 72, 73, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 74, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 75, 75, 61, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Numeric_Value: 4336 bytes. */ - -RE_UINT32 re_get_numeric_value(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_numeric_value_stage_1[f] << 5; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_numeric_value_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_numeric_value_stage_3[pos + f] << 3; - value = re_numeric_value_stage_4[pos + code]; - - return value; +static RE_UINT8 re_uppercase_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 255, 255, 127, 127, 85, 85, 85, 85, + 85, 85, 85, 170, 170, 84, 85, 85, 85, 85, 85, 43, 214, 206, 219, 177, + 213, 210, 174, 17, 144, 164, 170, 74, 85, 85, 210, 85, 85, 85, 5, 108, + 122, 85, 0, 0, 0, 0, 69, 128, 64, 215, 254, 255, 251, 15, 0, 0, + 0, 128, 28, 85, 85, 85, 144, 230, 255, 255, 255, 255, 255, 255, 0, 0, + 1, 84, 85, 85, 171, 42, 85, 85, 85, 85, 254, 255, 255, 255, 127, 0, + 191, 32, 0, 0, 255, 255, 63, 0, 0, 0, 255, 255, 255, 255, 255, 231, + 85, 85, 21, 64, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, + 0, 255, 0, 0, 0, 0, 0, 15, 0, 15, 0, 15, 0, 31, 0, 15, + 132, 56, 39, 62, 80, 61, 15, 192, 32, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, 5, 40, 4, 0, + 85, 21, 0, 0, 85, 85, 85, 5, 84, 85, 84, 85, 85, 85, 0, 106, + 85, 40, 69, 85, 85, 125, 95, 85, 244, 2, 0, 0, 0, 0, 32, 0, + 255, 0, 0, 0, 255, 255, 15, 0, 255, 255, 7, 0, 255, 255, 255, 3, + 0, 0, 240, 255, 255, 63, 0, 0, 0, 255, 255, 255, 3, 0, 0, 208, + 100, 222, 63, 0, 255, 3, 0, 0, 176, 231, 223, 31, 0, 0, 0, 123, + 95, 252, 1, 0, 0, 240, 255, 255, 63, 0, 0, 0, 3, 0, 0, 240, + 1, 0, 0, 0, 252, 255, 255, 7, 0, 0, 0, 240, 255, 255, 31, 0, + 255, 1, 0, 0, 0, 4, 0, 0, 3, 0, 0, 0, 255, 3, 255, 255 +}; + +RE_UINT32 re_get_uppercase(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_uppercase_table_1[field_2]; + v = re_uppercase_table_2[(v << 5) | field_1]; + v = re_uppercase_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; } -/* Bidi_Mirrored. */ +/* Variation_Selector. */ +RE_UINT32 re_get_variation_selector(RE_UINT32 codepoint) { + if (0x180B <= codepoint && codepoint <= 0x180D) + return 1; + if (0xFE00 <= codepoint && codepoint <= 0xFE0F) + return 1; + if (0x0E0100 <= codepoint && codepoint <= 0x0E01EF) + return 1; + + return 0; +} -static RE_UINT8 re_bidi_mirrored_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, +/* White_Space. */ +static RE_UINT8 re_white_space_table_1[] = { + 0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_bidi_mirrored_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, - 4, 5, 1, 6, 7, 8, 1, 9, 10, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +static RE_UINT8 re_white_space_table_2[] = { + 0, 1, 2, 2, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; -static RE_UINT8 re_bidi_mirrored_stage_3[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, - 6, 7, 8, 3, 3, 9, 3, 3, 10, 11, 12, 13, 14, 3, 3, 3, - 3, 3, 3, 3, 3, 15, 3, 16, 3, 3, 3, 3, 3, 3, 17, 18, - 19, 20, 21, 22, 3, 3, 3, 23, 24, 3, 3, 3, 3, 3, 3, 3, - 25, 3, 3, 3, 3, 3, 3, 3, 3, 26, 3, 3, 27, 28, 3, 3, - 3, 3, 3, 29, 30, 31, 32, 33, +static RE_UINT8 re_white_space_table_3[] = { + 0, 62, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, + 255, 7, 0, 0, 0, 131, 0, 0, 0, 0, 0, 128 }; -static RE_UINT8 re_bidi_mirrored_stage_4[] = { - 0, 0, 0, 0, 0, 3, 0, 80, 0, 0, 0, 40, 0, 0, 0, 40, - 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 24, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 96, 0, 0, 0, 0, 0, 0, 96, - 0, 96, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 30, 63, 98, 188, 87, 248, 15, 250, 255, 31, 60, 128, 245, 207, 255, 255, - 255, 159, 7, 1, 204, 255, 255, 193, 0, 62, 195, 255, 255, 63, 255, 255, - 0, 15, 0, 0, 3, 6, 0, 0, 0, 0, 0, 0, 0, 255, 63, 0, - 121, 59, 120, 112, 252, 255, 0, 0, 248, 255, 255, 249, 253, 255, 0, 1, - 63, 194, 55, 31, 58, 3, 240, 51, 0, 252, 255, 223, 83, 122, 48, 112, - 0, 0, 128, 1, 48, 188, 25, 254, 255, 255, 255, 255, 207, 191, 255, 255, - 255, 255, 127, 80, 124, 112, 136, 47, 0, 0, 0, 0, 0, 0, 0, 64, - 60, 54, 0, 48, 255, 3, 0, 0, 0, 255, 243, 15, 0, 0, 0, 0, - 0, 0, 0, 126, 48, 0, 0, 0, 0, 3, 0, 80, 0, 0, 0, 40, - 0, 0, 0, 168, 13, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, - 0, 0, 32, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_white_space(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* Bidi_Mirrored: 572 bytes. */ - -RE_UINT32 re_get_bidi_mirrored(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_bidi_mirrored_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_bidi_mirrored_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_bidi_mirrored_stage_3[pos + f] << 6; - pos += code; - value = (re_bidi_mirrored_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* Indic_Positional_Category. */ + v = re_white_space_table_1[field_2]; + v = re_white_space_table_2[(v << 5) | field_1]; + v = re_white_space_table_3[(v << 2) | field_0]; -static RE_UINT8 re_indic_positional_category_stage_1[] = { - 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + return (v >> offset) & 0x1; +} + +/* Word. */ +static RE_UINT8 re_word_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10, + 10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38, + 10, 10, 10, 10, 39, 40, 41, 10, 42, 10, 43, 44, 45, 10, 46, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 47, 13, 13, 13, 48, 49, 13, + 13, 13, 13, 50, 13, 13, 13, 13, 13, 13, 51, 10, 10, 10, 52, 10, + 13, 13, 13, 13, 53, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 54, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; -static RE_UINT8 re_indic_positional_category_stage_2[] = { +static RE_UINT16 re_word_table_2[] = { + 0, 1, 2, 3, 0, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 7, 8, 6, 6, 6, 9, 10, 11, 6, 12, + 6, 6, 6, 6, 11, 6, 6, 6, 6, 13, 14, 6, 15, 16, 17, 18, + 19, 6, 6, 20, 6, 6, 21, 22, 23, 6, 24, 6, 6, 25, 6, 26, + 6, 27, 28, 29, 0, 30, 31, 11, 6, 6, 6, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 42, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 52, 6, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 0, 69, 70, 71, 0, 72, 73, 74, 75, 76, 77, 78, 0, + 6, 6, 79, 6, 80, 6, 81, 82, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 83, 6, 84, 85, 86, 6, 87, 6, 88, 0, 89, 6, 6, 90, + 66, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 91, 3, 6, 6, 92, 93, 94, 95, 96, 6, 6, 97, 98, + 99, 6, 6, 100, 6, 101, 6, 102, 103, 104, 105, 106, 6, 107, 108, 0, + 28, 6, 103, 109, 108, 110, 111, 0, 6, 6, 112, 113, 6, 6, 6, 95, + 6, 114, 115, 80, 116, 88, 117, 67, 6, 6, 6, 6, 6, 6, 6, 118, + 6, 6, 6, 6, 6, 6, 6, 6, 90, 6, 119, 80, 6, 120, 121, 122, + 123, 124, 125, 126, 127, 0, 23, 128, 129, 130, 131, 6, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 133, 6, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 6, 10, 11, 9, 6, 12, 13, 5, 14, 15, 4, 16, 17, 18, 0, - 19, 20, 21, 4, 5, 14, 22, 4, 23, 24, 25, 4, 26, 0, 27, 28, - 0, 29, 30, 0, 0, 31, 32, 0, 33, 34, 0, 35, 36, 37, 38, 0, - 0, 39, 40, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 43, 43, 44, 44, 0, 45, 46, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 48, 49, 0, - 50, 0, 51, 52, 0, 0, 0, 0, 53, 54, 55, 56, 57, 58, 0, 59, - 0, 60, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 134, 103, 6, 6, 6, 6, 135, 6, 81, 6, 136, 137, 138, 138, 6, + 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 140, 141, 66, 6, 142, 66, 6, 82, 143, 13, 6, 6, 144, 6, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 77, + 6, 6, 6, 6, 145, 0, 23, 80, 6, 6, 6, 6, 6, 6, 6, 6, + 146, 147, 6, 148, 6, 6, 6, 25, 149, 150, 6, 6, 151, 6, 152, 153, + 6, 154, 6, 95, 6, 6, 155, 156, 6, 157, 95, 77, 6, 6, 158, 103, + 6, 137, 159, 160, 6, 6, 161, 162, 163, 164, 82, 79, 6, 6, 6, 165, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 166, 167, 28, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 157, 6, 6, 168, 0, 169, 170, 171, 6, 6, 25, 172, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 80, 23, 6, 173, 6, 174, 175, + 89, 176, 177, 178, 6, 6, 6, 77, 1, 2, 3, 105, 6, 103, 179, 0, + 180, 181, 182, 0, 6, 6, 6, 67, 0, 0, 6, 94, 0, 0, 0, 183, + 0, 0, 0, 0, 77, 6, 128, 111, 6, 184, 101, 67, 80, 6, 185, 0, + 6, 6, 6, 6, 80, 79, 186, 28, 6, 187, 6, 188, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 137, 102, 174, 0, 0, 0, 0, + 189, 190, 102, 137, 103, 0, 0, 191, 102, 168, 0, 0, 6, 192, 0, 0, + 193, 194, 0, 77, 77, 0, 74, 195, 6, 102, 102, 196, 25, 0, 0, 0, + 6, 6, 132, 0, 6, 196, 6, 196, 6, 197, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 198, 0, 0, 77, 110, 128, 0, 0, 23, 199, 137, + 6, 6, 195, 200, 6, 67, 23, 201, 6, 30, 202, 203, 6, 6, 204, 0, + 205, 206, 0, 0, 207, 116, 6, 208, 33, 209, 210, 211, 0, 0, 0, 0, + 6, 6, 212, 213, 6, 6, 214, 0, 0, 0, 0, 0, 6, 215, 216, 0, + 6, 6, 217, 0, 6, 100, 98, 0, 88, 112, 0, 0, 0, 0, 0, 0, + 6, 67, 0, 0, 0, 6, 6, 218, 219, 220, 221, 0, 0, 222, 223, 224, + 6, 103, 110, 6, 225, 0, 6, 100, 0, 0, 0, 0, 0, 0, 0, 0, + 226, 5, 227, 228, 173, 229, 0, 0, 230, 231, 197, 232, 233, 98, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 234, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 168, 0, 0, 0, + 6, 6, 6, 144, 6, 6, 6, 6, 6, 6, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 65, 66, 0, 0, 67, 68, 69, 70, 0, 71, 72, 0, 1, 73, 74, 75, - 0, 76, 77, 78, 0, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 82, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 100, 103, 98, 0, 0, 23, 106, 6, 137, 221, 235, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 6, 0, 0, 0, 0, 6, 6, 236, 6, 237, 0, 0, 238, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 114, + 6, 6, 6, 6, 6, 6, 102, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 103, 0, 239, 202, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 28, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 240, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 243, 244, 0, 0, + 0, 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 30, 6, 246, 247, 248, 6, 249, 250, 251, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 252, 253, 82, 30, 30, 134, 134, 226, 226, 254, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 255, 6, 256, 257, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 259, 260, 0, 0, 0, 0, 0, 0, 6, 261, 262, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 168, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 263, 0, 6, 6, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 85, 86, 87, 0, 57, 88, 0, 0, 89, 90, 91, 92, 57, 93, 94, 0, - 0, 95, 0, 0, 0, 0, 96, 97, 23, 98, 99, 100, 0, 0, 0, 0, - 0, 101, 102, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 105, 106, 0, - 0, 107, 108, 0, 0, 109, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, - 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 114, - 115, 116, 117, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 119, 0, 0, 120, 121, 0, 0, 0, 122, 123, 0, 124, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_indic_positional_category_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, - 10, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 4, 12, 13, 14, 0, 15, 0, 0, - 10, 0, 0, 0, 0, 0, 0, 16, 17, 0, 0, 0, 0, 0, 0, 0, - 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 23, 22, 0, 0, - 4, 24, 25, 26, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 27, 28, - 0, 0, 0, 0, 0, 0, 0, 29, 4, 12, 30, 31, 0, 32, 0, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, - 34, 35, 36, 37, 0, 15, 0, 0, 6, 38, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 27, 6, 39, 40, 23, 0, 41, 0, 0, - 42, 43, 44, 23, 0, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 19, 47, 48, 49, 36, 37, 0, 15, 0, 0, - 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 15, 50, 51, 52, 53, - 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 54, 28, 55, 0, - 56, 57, 28, 58, 0, 0, 0, 0, 0, 0, 0, 0, 54, 28, 59, 60, - 56, 61, 28, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, - 0, 0, 0, 0, 0, 63, 64, 65, 0, 0, 0, 0, 66, 67, 68, 1, - 69, 70, 0, 71, 72, 72, 71, 72, 72, 72, 72, 72, 72, 72, 72, 60, - 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 15, 74, 75, 76, 77, 78, - 0, 0, 0, 0, 0, 33, 62, 10, 79, 80, 81, 82, 83, 38, 0, 0, - 84, 85, 81, 86, 0, 0, 33, 87, 0, 0, 0, 0, 88, 60, 0, 0, - 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 89, 76, 90, - 91, 92, 93, 28, 94, 0, 0, 64, 95, 96, 6, 0, 97, 81, 98, 0, - 0, 0, 0, 0, 81, 99, 100, 81, 101, 0, 82, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 19, 102, 0, 0, 0, 0, 0, 0, 103, 76, 55, - 104, 93, 105, 106, 107, 28, 28, 108, 28, 101, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 109, 110, 111, 112, 101, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 5, 28, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, - 114, 115, 113, 62, 0, 0, 0, 0, 0, 2, 46, 116, 46, 0, 0, 0, - 0, 117, 118, 5, 28, 119, 0, 0, 0, 0, 0, 0, 58, 120, 121, 72, - 122, 123, 124, 22, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, - 0, 0, 0, 0, 38, 0, 0, 0, 16, 16, 19, 0, 0, 0, 0, 0, - 15, 126, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 81, 81, 81, 81, 127, 0, 0, 0, 0, 0, 0, - 28, 28, 28, 28, 23, 0, 0, 19, 0, 0, 128, 62, 0, 0, 0, 0, - 0, 128, 129, 59, 46, 0, 0, 0, 0, 0, 0, 0, 19, 50, 130, 131, - 132, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, - 0, 0, 83, 133, 134, 135, 0, 0, 19, 0, 0, 136, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 136, 0, 0, 0, 0, 109, 137, 138, 139, - 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 141, 0, 142, 0, 0, - 15, 54, 143, 26, 0, 0, 0, 0, 144, 145, 0, 59, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 146, 0, 147, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 28, 72, 121, 58, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 148, 149, 18, 0, 58, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 9, 150, 146, 38, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 15, 151, 72, 152, - 101, 0, 153, 60, 0, 0, 0, 0, 0, 0, 0, 48, 154, 109, 0, 16, - 0, 0, 0, 0, 0, 0, 0, 19, 148, 5, 146, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 128, 79, 6, 155, 13, 156, 0, 15, 0, 0, - 33, 27, 28, 38, 28, 38, 0, 0, 0, 0, 0, 0, 0, 157, 72, 121, - 158, 159, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 148, 72, 160, 161, - 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 151, 62, 163, 164, - 60, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 48, 72, 149, 165, - 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 166, 121, 164, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 167, 50, 168, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 148, 59, 28, 18, 0, 0, 0, 0, 0, 157, 72, 27, 81, - 60, 169, 0, 0, 0, 0, 0, 0, 170, 28, 171, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 5, 172, 55, 0, 0, 0, 0, 170, 1, 4, 0, - 0, 0, 10, 72, 72, 173, 38, 0, 0, 0, 0, 15, 9, 55, 28, 164, - 0, 0, 0, 0, 10, 72, 72, 72, 72, 72, 114, 72, 174, 175, 0, 0, - 0, 0, 0, 0, 83, 171, 16, 94, 176, 177, 0, 0, 0, 0, 0, 0, - 0, 0, 33, 178, 179, 147, 0, 0, 0, 0, 0, 0, 19, 180, 0, 0, -}; - -static RE_UINT8 re_indic_positional_category_stage_4[] = { - 0, 0, 0, 0, 5, 5, 5, 1, 0, 0, 5, 1, 6, 0, 1, 2, - 1, 6, 6, 6, 6, 5, 5, 5, 5, 1, 1, 1, 1, 6, 2, 1, - 0, 5, 6, 5, 5, 5, 6, 6, 0, 0, 6, 6, 0, 5, 1, 1, - 6, 0, 0, 2, 2, 0, 0, 4, 4, 6, 0, 0, 0, 0, 0, 1, - 0, 0, 5, 0, 0, 5, 5, 1, 1, 6, 6, 0, 0, 0, 0, 5, - 5, 0, 0, 5, 5, 6, 0, 0, 0, 6, 0, 0, 5, 5, 0, 0, - 6, 5, 0, 5, 5, 8, 0, 1, 1, 6, 0, 0, 0, 0, 5, 5, - 5, 5, 5, 5, 6, 0, 1, 5, 9, 0, 0, 4, 10, 6, 0, 0, - 0, 0, 5, 8, 0, 0, 1, 1, 5, 1, 1, 0, 0, 0, 2, 2, - 2, 0, 4, 4, 4, 5, 0, 0, 5, 0, 0, 0, 1, 0, 5, 5, - 7, 0, 5, 5, 0, 5, 6, 0, 8, 1, 1, 1, 1, 0, 5, 8, - 8, 0, 8, 8, 0, 1, 1, 0, 5, 5, 1, 1, 5, 0, 1, 1, - 1, 1, 1, 6, 6, 0, 2, 2, 1, 1, 5, 5, 6, 0, 6, 0, - 1, 2, 9, 2, 4, 10, 4, 1, 1, 5, 1, 1, 6, 6, 6, 0, - 3, 3, 3, 3, 3, 1, 0, 5, 5, 5, 5, 0, 6, 6, 6, 5, - 6, 0, 0, 0, 3, 0, 0, 0, 6, 6, 0, 0, 0, 6, 0, 6, - 0, 5, 0, 0, 0, 0, 1, 2, 0, 6, 5, 7, 6, 6, 7, 7, - 7, 7, 5, 5, 5, 7, 5, 5, 6, 0, 5, 5, 0, 6, 6, 6, - 6, 6, 6, 6, 0, 0, 6, 0, 1, 5, 5, 6, 6, 2, 5, 5, - 5, 5, 5, 6, 1, 0, 5, 1, 0, 6, 6, 0, 6, 0, 1, 1, - 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 5, 5, 5, - 0, 0, 6, 1, 2, 5, 5, 1, 1, 6, 0, 1, 1, 5, 0, 0, - 0, 0, 5, 6, 0, 0, 1, 5, 6, 6, 9, 10, 4, 2, 2, 2, - 4, 4, 5, 1, 1, 5, 5, 5, 5, 5, 0, 5, 5, 5, 6, 1, - 1, 8, 8, 5, 1, 1, 6, 1, 1, 6, 5, 6, 1, 3, 3, 3, - 1, 1, 3, 1, 1, 0, 0, 0, 6, 2, 1, 5, 0, 2, 6, 1, - 0, 1, 5, 1, 5, 6, 6, 5, 6, 1, 2, 2, 2, 2, 2, 5, - 5, 0, 0, 6, 5, 1, 5, 5, 6, 6, 6, 11, 7, 13, 2, 2, - 4, 4, 5, 8, 5, 5, 1, 0, 0, 1, 6, 6, 5, 6, 2, 1, - 1, 5, 1, 5, 1, 1, 1, 2, 2, 9, 1, 1, 2, 2, 5, 6, - 14, 6, 6, 6, 6, 6, 5, 5, 5, 1, 14, 14, 14, 14, 14, 14, - 14, 0, 0, 0, 5, 0, 0, 1, 1, 6, 5, 1, 6, 5, 0, 0, - 0, 0, 0, 6, 6, 6, 5, 6, 6, 6, 2, 2, 5, 6, 1, 12, - 11, 0, 0, 0, 5, 6, 5, 2, 2, 5, 6, 1, 2, 6, 6, 0, - 5, 1, 0, 0, 6, 3, 3, 5, 5, 3, 1, 3, 3, 1, 5, 5, - 0, 0, 0, 2, 6, 5, 2, 1, 0, 1, 0, 0, 6, 1, 1, 0, - 0, 14, 6, 6, 0, 5, 14, 0, 5, 6, 6, 0, 1, 5, 1, 0, - 1, 2, 1, 6, 6, 5, 5, 1, 2, 5, 7, 7, 2, 1, 6, 6, - 5, 5, 5, 8, 0, 6, 6, 5, 5, 5, 8, 8, 1, 0, 0, 2, - 4, 1, 0, 0, 0, 1, 2, 1, 1, 1, 6, 5, 5, 1, 6, 0, - 6, 2, 5, 9, 4, 1, 4, 5, 5, 1, 6, 6, 2, 9, 4, 10, - 5, 5, 1, 6, 1, 5, 1, 6, 1, 5, 2, 1, 0, 6, 0, 5, - 6, 6, 2, 5, 2, 0, 0, 0, 0, 5, 6, 6, 5, 5, 6, 0, - 5, 1, 0, 6, 6, 6, 5, 1, 6, 2, 6, 5, 1, 5, 5, 0, - 5, 5, 6, 5, 6, 0, 0, 6, 1, 1, 1, 0, 5, 5, 0, 1, - 6, 2, 1, 0, -}; - -/* Indic_Positional_Category: 2852 bytes. */ - -RE_UINT32 re_get_indic_positional_category(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_indic_positional_category_stage_1[f] << 6; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_indic_positional_category_stage_2[pos + f] << 3; - f = code >> 2; - code ^= f << 2; - pos = (RE_UINT32)re_indic_positional_category_stage_3[pos + f] << 2; - value = re_indic_positional_category_stage_4[pos + code]; - - return value; -} - -/* Indic_Syllabic_Category. */ - -static RE_UINT8 re_indic_syllabic_category_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_indic_syllabic_category_stage_2[] = { - 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 19, 20, - 2, 2, 21, 22, 23, 24, 25, 26, 27, 28, 2, 29, 2, 2, 2, 2, - 30, 31, 2, 2, 2, 2, 2, 2, 2, 2, 2, 32, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 33, 34, 35, 36, 37, 38, 2, 39, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 40, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 41, 42, 43, 44, 45, 46, 47, 2, 48, 49, 2, 50, 51, 52, 53, 2, - 54, 2, 2, 55, 56, 57, 2, 2, 58, 59, 60, 61, 2, 62, 2, 2, -}; - -static RE_UINT8 re_indic_syllabic_category_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 248, 264, 265, 266, 267, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 79, 79, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 8, 8, 8, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 12, - 13, 13, 13, 14, 15, 16, 10, 10, 17, 18, 2, 2, 19, 8, 10, 10, - 20, 21, 8, 22, 22, 9, 10, 10, 10, 10, 23, 10, 24, 25, 26, 12, - 13, 27, 27, 28, 0, 29, 0, 30, 17, 18, 2, 2, 26, 0, 0, 31, - 32, 21, 33, 34, 22, 9, 10, 10, 10, 10, 23, 10, 23, 35, 26, 36, - 37, 29, 27, 38, 39, 0, 40, 24, 0, 18, 2, 2, 41, 42, 0, 0, - 32, 21, 8, 43, 43, 9, 10, 10, 10, 10, 23, 10, 23, 40, 26, 12, - 13, 44, 44, 38, 0, 0, 0, 0, 17, 18, 2, 2, 0, 0, 45, 46, - 32, 21, 8, 22, 22, 9, 10, 10, 10, 10, 23, 10, 23, 40, 26, 12, - 13, 27, 27, 38, 0, 47, 0, 30, 17, 18, 2, 2, 48, 0, 0, 0, - 49, 21, 33, 19, 50, 51, 35, 23, 52, 53, 54, 25, 10, 10, 26, 47, - 37, 47, 55, 38, 0, 29, 0, 0, 0, 18, 2, 2, 0, 0, 0, 0, - 7, 56, 8, 50, 50, 9, 10, 10, 10, 10, 23, 10, 10, 10, 26, 57, - 13, 55, 55, 38, 0, 58, 54, 0, 17, 18, 2, 2, 0, 0, 0, 0, - 7, 21, 8, 50, 50, 9, 10, 10, 10, 10, 23, 10, 10, 40, 26, 12, - 13, 55, 55, 38, 0, 58, 0, 59, 17, 18, 2, 2, 60, 0, 0, 0, - 7, 21, 8, 50, 50, 9, 10, 10, 10, 10, 10, 10, 10, 10, 61, 62, - 13, 55, 55, 63, 0, 64, 0, 34, 17, 18, 2, 2, 0, 0, 65, 66, - 67, 21, 8, 8, 8, 33, 25, 10, 10, 10, 10, 10, 30, 10, 10, 48, - 10, 54, 68, 29, 13, 69, 13, 13, 0, 18, 2, 2, 47, 0, 0, 0, - 40, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 54, 13, 13, 70, 0, - 13, 44, 71, 72, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 35, 23, 54, 10, 10, 10, 10, 10, 10, 73, 10, 54, 13, 13, 74, 75, - 13, 76, 71, 77, 2, 2, 3, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 78, 79, 0, - 10, 10, 40, 10, 10, 10, 10, 10, 10, 10, 10, 53, 16, 13, 13, 80, - 81, 82, 83, 84, 85, 85, 86, 85, 85, 85, 85, 85, 85, 85, 85, 87, - 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, 89, 8, 90, 13, 13, 91, 92, 93, - 2, 2, 94, 95, 96, 17, 97, 98, 99, 100, 101, 102, 103, 104, 10, 10, - 105, 106, 71, 107, 2, 2, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 110, 10, 10, 23, 11, 111, 0, 0, 110, 10, 10, 10, 11, 111, 0, 0, - 110, 10, 10, 10, 11, 0, 0, 0, 110, 10, 10, 23, 112, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, 113, 8, 8, 8, 8, 47, 13, 13, - 13, 80, 114, 115, 116, 0, 0, 117, 2, 2, 3, 0, 0, 0, 0, 0, - 118, 10, 10, 10, 10, 10, 10, 54, 13, 13, 119, 0, 120, 121, 122, 0, - 0, 18, 2, 2, 10, 10, 10, 10, 123, 124, 124, 125, 126, 127, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 13, 13, 13, 13, - 128, 121, 129, 0, 2, 2, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 131, 13, 0, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 89, 110, 132, 133, 134, 135, 13, 13, 13, 13, 136, 137, 138, - 2, 2, 3, 0, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 139, 140, 8, 8, 110, 10, 10, 10, 10, 10, 10, 10, 10, 141, 13, 13, - 13, 142, 10, 0, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 143, 8, 144, 10, 10, 10, 10, 10, 145, 13, 146, 147, 2, 2, 148, 149, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 150, 13, 13, 151, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 152, 13, 128, 121, 153, 0, 0, - 2, 2, 3, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 154, 155, 155, 155, 156, 0, 0, 0, 65, 157, 158, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 0, - 0, 0, 0, 160, 161, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, 0, - 5, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 164, 165, 166, 10, 10, 10, 10, 10, 131, 13, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 167, 168, 169, 170, 10, 171, 0, 0, 0, - 172, 8, 8, 8, 144, 10, 10, 10, 10, 10, 10, 10, 10, 173, 13, 13, - 13, 174, 0, 0, 2, 2, 3, 0, 155, 155, 155, 155, 175, 0, 0, 176, - 2, 2, 177, 10, 10, 10, 10, 10, 167, 124, 178, 129, 10, 10, 10, 10, - 10, 131, 13, 179, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 181, 8, 9, 110, 10, 10, 10, 10, 10, 10, 10, 10, 182, 13, 13, 183, - 184, 0, 0, 0, 2, 2, 3, 0, 10, 185, 10, 10, 2, 2, 177, 54, - 8, 144, 10, 10, 10, 10, 10, 10, 10, 10, 103, 13, 186, 187, 0, 0, - 121, 121, 121, 188, 2, 2, 3, 0, 10, 10, 10, 10, 40, 189, 190, 102, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 106, - 191, 0, 0, 0, 0, 0, 0, 0, 144, 10, 131, 13, 0, 192, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 96, 193, 10, 194, 121, 195, 13, 37, 196, 2, 2, 3, 0, - 103, 58, 0, 80, 10, 40, 40, 10, 10, 10, 10, 10, 10, 26, 197, 198, - 2, 2, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 200, 201, 8, 8, 110, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, - 13, 202, 0, 0, 203, 204, 204, 204, 204, 205, 2, 2, 0, 0, 0, 206, - 207, 8, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 208, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 207, 110, 10, 10, 10, 10, 10, 10, 10, 131, 13, 13, 209, 210, 2, 2, - 0, 211, 0, 0, 124, 212, 10, 10, 10, 10, 10, 10, 182, 0, 0, 0, - 207, 8, 8, 8, 9, 10, 10, 10, 10, 10, 10, 10, 131, 13, 13, 13, - 213, 0, 214, 76, 2, 2, 3, 0, 215, 2, 2, 2, 2, 199, 0, 0, - 8, 8, 10, 10, 30, 10, 10, 10, 10, 10, 10, 13, 13, 216, 0, 217, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 54, 23, 30, 10, 10, 10, 30, 10, 10, 53, 0, 8, 8, 144, 10, - 10, 10, 10, 10, 10, 10, 10, 166, 13, 13, 218, 0, 2, 2, 3, 0, - 7, 21, 8, 22, 22, 9, 10, 10, 10, 10, 23, 10, 23, 40, 219, 12, - 13, 27, 27, 38, 0, 29, 0, 220, 17, 221, 155, 163, 155, 163, 0, 0, - 8, 8, 8, 144, 10, 10, 10, 10, 10, 10, 10, 10, 10, 103, 13, 13, - 222, 223, 0, 0, 2, 2, 3, 224, 0, 0, 0, 0, 0, 0, 0, 0, - 21, 8, 8, 110, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 225, - 226, 227, 0, 0, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 8, 144, 10, 10, 10, 10, 10, 10, 10, 131, 13, 109, 13, 228, - 229, 0, 0, 0, 0, 0, 8, 109, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 8, 144, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 230, - 76, 0, 0, 0, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 144, 10, 10, 10, 10, 10, 10, 10, 166, 231, 13, 232, 53, 0, - 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 54, 233, 13, 13, 234, 0, 2, 2, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 144, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 225, 235, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 19, 144, 10, 10, 10, 10, - 10, 10, 10, 10, 103, 13, 47, 80, 236, 76, 0, 0, 0, 0, 0, 0, - 237, 13, 238, 10, 10, 10, 10, 10, 10, 10, 10, 10, 239, 240, 241, 242, - 0, 243, 0, 0, 237, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 244, 245, 121, 121, 246, 247, 248, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 50, 144, 10, 10, 10, 10, 10, 10, 10, 131, 13, 37, 13, 228, - 227, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 199, 25, 10, 10, 10, - 10, 10, 10, 10, 249, 85, 85, 85, 85, 85, 86, 85, 13, 250, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 33, 43, 10, 10, 10, 10, 10, 10, 10, 10, 10, 103, 37, 251, 44, - 252, 253, 0, 0, 2, 2, 3, 0, 8, 43, 50, 10, 10, 10, 10, 10, - 10, 10, 11, 37, 44, 254, 0, 0, 2, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 255, 37, 0, 0, -}; - -static RE_UINT8 re_indic_syllabic_category_stage_4[] = { - 0, 0, 0, 0, 0, 11, 0, 0, 34, 34, 34, 34, 34, 34, 0, 0, - 11, 0, 0, 0, 0, 0, 29, 29, 0, 0, 0, 11, 1, 1, 1, 2, - 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 12, 9, 9, - 4, 3, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 0, 27, 27, 0, - 0, 9, 9, 9, 8, 8, 9, 9, 0, 0, 34, 34, 0, 0, 8, 8, - 11, 1, 1, 2, 0, 8, 8, 8, 8, 0, 0, 8, 12, 0, 12, 12, - 12, 0, 12, 0, 0, 0, 12, 12, 12, 12, 0, 0, 9, 0, 0, 9, - 9, 5, 13, 0, 0, 0, 0, 9, 12, 12, 0, 12, 1, 0, 29, 0, - 0, 1, 1, 2, 8, 8, 8, 0, 0, 0, 0, 8, 0, 12, 12, 0, - 4, 0, 9, 9, 9, 9, 9, 0, 9, 5, 0, 0, 0, 27, 0, 0, - 0, 12, 12, 12, 1, 26, 11, 11, 0, 20, 0, 0, 8, 8, 0, 8, - 9, 9, 0, 9, 0, 12, 27, 27, 27, 4, 4, 4, 0, 0, 9, 9, - 0, 12, 0, 0, 0, 0, 1, 23, 8, 0, 8, 8, 8, 12, 0, 0, - 0, 0, 0, 12, 12, 0, 0, 0, 12, 12, 12, 0, 9, 0, 9, 9, - 1, 8, 8, 8, 0, 3, 9, 9, 0, 9, 9, 0, 0, 0, 12, 0, - 0, 14, 14, 0, 12, 12, 12, 6, 6, 3, 9, 9, 9, 5, 16, 0, - 13, 13, 13, 9, 0, 0, 13, 13, 13, 13, 13, 13, 0, 0, 1, 2, - 0, 0, 5, 0, 9, 0, 9, 0, 9, 9, 6, 0, 25, 25, 25, 25, - 30, 1, 6, 0, 0, 12, 0, 12, 9, 9, 6, 9, 20, 20, 0, 0, - 9, 0, 0, 0, 0, 1, 0, 0, 0, 29, 0, 29, 0, 4, 0, 0, - 9, 9, 1, 2, 9, 9, 1, 1, 6, 3, 0, 0, 22, 22, 22, 22, - 22, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 0, 0, 0, - 0, 0, 29, 0, 12, 8, 8, 8, 8, 8, 8, 9, 9, 9, 1, 25, - 2, 7, 6, 20, 20, 20, 20, 12, 34, 34, 0, 11, 0, 0, 11, 0, - 12, 12, 8, 8, 9, 9, 12, 12, 12, 12, 20, 20, 20, 12, 9, 25, - 25, 12, 12, 9, 9, 25, 25, 25, 25, 25, 12, 12, 12, 9, 9, 9, - 9, 12, 12, 12, 12, 12, 20, 9, 9, 9, 9, 25, 25, 25, 12, 25, - 34, 34, 25, 25, 9, 9, 0, 0, 8, 8, 8, 12, 6, 0, 0, 0, - 12, 0, 9, 9, 12, 12, 12, 8, 9, 28, 28, 29, 18, 30, 29, 29, - 29, 6, 7, 29, 3, 29, 0, 0, 11, 12, 12, 12, 9, 19, 19, 19, - 21, 21, 1, 21, 21, 21, 21, 21, 21, 21, 9, 29, 12, 12, 12, 10, - 10, 10, 10, 10, 10, 10, 0, 0, 24, 24, 24, 24, 24, 0, 0, 0, - 9, 21, 21, 21, 25, 25, 0, 0, 34, 34, 34, 0, 12, 12, 12, 9, - 12, 20, 20, 19, 21, 21, 17, 19, 19, 19, 19, 0, 7, 9, 9, 9, - 1, 25, 25, 25, 25, 25, 6, 29, 29, 0, 0, 29, 1, 1, 1, 18, - 2, 8, 8, 8, 4, 9, 9, 9, 5, 12, 12, 12, 1, 18, 2, 8, - 8, 8, 12, 12, 12, 19, 19, 19, 9, 9, 6, 7, 19, 19, 12, 12, - 34, 34, 3, 12, 12, 12, 21, 21, 8, 8, 4, 9, 21, 21, 6, 6, - 19, 19, 9, 9, 1, 1, 29, 4, 27, 27, 27, 0, 27, 27, 27, 27, - 27, 27, 0, 0, 27, 14, 14, 27, 27, 27, 11, 0, 0, 0, 0, 29, - 31, 32, 0, 0, 11, 11, 11, 11, 29, 0, 0, 0, 27, 0, 0, 0, - 8, 8, 9, 8, 8, 8, 5, 12, 12, 12, 12, 1, 12, 12, 10, 10, - 10, 10, 12, 12, 12, 12, 10, 19, 19, 12, 12, 12, 12, 19, 12, 1, - 1, 2, 8, 8, 20, 9, 9, 9, 5, 1, 0, 0, 27, 27, 1, 1, - 0, 0, 8, 9, 34, 34, 12, 12, 10, 10, 10, 25, 9, 9, 9, 21, - 21, 21, 21, 6, 1, 1, 18, 2, 12, 12, 12, 4, 9, 20, 20, 20, - 5, 0, 0, 0, 12, 9, 0, 12, 9, 9, 9, 20, 20, 20, 20, 0, - 21, 21, 0, 0, 11, 11, 11, 0, 0, 0, 12, 25, 24, 25, 24, 0, - 0, 2, 7, 0, 12, 8, 12, 12, 12, 12, 12, 21, 21, 21, 21, 9, - 25, 6, 0, 0, 4, 4, 4, 0, 0, 0, 0, 7, 34, 0, 0, 0, - 1, 1, 2, 14, 14, 8, 8, 8, 9, 9, 5, 0, 0, 0, 35, 35, - 35, 35, 35, 35, 35, 35, 34, 34, 0, 0, 0, 33, 1, 1, 2, 8, - 9, 5, 4, 0, 9, 9, 9, 7, 6, 0, 34, 34, 12, 9, 9, 0, - 10, 12, 12, 12, 5, 3, 15, 15, 0, 29, 4, 9, 0, 34, 34, 34, - 1, 5, 4, 26, 0, 0, 27, 0, 9, 4, 6, 0, 12, 12, 0, 4, - 0, 0, 1, 1, 0, 0, 27, 27, 9, 9, 5, 1, 1, 2, 4, 3, - 0, 0, 29, 1, 9, 9, 9, 1, 1, 2, 5, 4, 3, 0, 0, 0, - 1, 1, 2, 5, 4, 0, 0, 0, 9, 1, 2, 5, 2, 9, 9, 9, - 9, 9, 5, 4, 0, 20, 20, 20, 9, 9, 9, 6, 2, 5, 4, 0, - 5, 3, 0, 0, 8, 9, 9, 9, 9, 9, 9, 12, 12, 12, 12, 29, - 6, 1, 1, 1, 1, 2, 15, 20, 20, 20, 20, 11, 0, 11, 0, 7, - 15, 15, 15, 15, 15, 15, 21, 21, 21, 21, 1, 2, 26, 7, 0, 0, - 0, 3, 0, 0, 0, 0, 19, 19, 9, 1, 1, 0, 0, 0, 9, 0, - 1, 2, 4, 9, 6, 7, 16, 20, 9, 1, 2, 7, 12, 12, 11, 9, -}; - -/* Indic_Syllabic_Category: 3496 bytes. */ - -RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_indic_syllabic_category_stage_1[f] << 6; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_indic_syllabic_category_stage_2[pos + f] << 5; - f = code >> 2; - code ^= f << 2; - pos = (RE_UINT32)re_indic_syllabic_category_stage_3[pos + f] << 2; - value = re_indic_syllabic_category_stage_4[pos + code]; - - return value; -} - -/* Emoji. */ - -static RE_UINT8 re_emoji_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_emoji_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 1, -}; - -static RE_UINT8 re_emoji_stage_3[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 4, 1, 1, 5, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 8, - 1, 1, 1, 9, 1, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 1, - 1, 1, 1, 1, 19, 1, 1, 1, 1, 1, 1, 1, 20, 21, 1, 1, - 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 1, 1, 1, 1, 1, - 24, 1, 1, 25, 1, 26, 27, 28, 29, 30, 1, 1, 31, 32, 33, 34, - 32, 32, 32, 35, 36, 37, 38, 39, 32, 40, 32, 41, 1, 1, 1, 42, - 1, 1, 1, 1, 43, 44, 45, 46, 1, 47, 48, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_emoji_stage_4[] = { - 0, 0, 0, 0, 8, 4, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 2, - 0, 0, 240, 3, 0, 6, 0, 0, 0, 0, 0, 12, 0, 1, 0, 0, - 0, 128, 0, 0, 0, 254, 15, 7, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 64, 0, 1, 0, 0, 0, 0, 0, 0, 120, - 31, 64, 50, 33, 77, 196, 0, 7, 5, 255, 15, 128, 105, 1, 0, 200, - 0, 0, 252, 26, 3, 12, 3, 96, 48, 193, 26, 0, 0, 6, 191, 39, - 36, 191, 84, 32, 2, 1, 24, 0, 144, 80, 184, 0, 24, 0, 0, 0, - 0, 0, 224, 0, 2, 0, 1, 128, 0, 0, 0, 0, 0, 0, 48, 0, - 224, 0, 0, 24, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 32, 0, 0, 128, 2, 0, 0, 0, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 192, 0, 64, 254, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 192, 255, 255, 255, 6, 0, 0, 4, 0, 128, 252, 7, - 0, 0, 3, 0, 0, 0, 0, 0, 255, 255, 255, 255, 243, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 206, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 185, 255, 255, 255, 255, 255, 255, 255, 255, 191, - 255, 255, 255, 255, 255, 255, 255, 63, 0, 126, 255, 255, 255, 128, 249, 7, - 128, 60, 97, 0, 48, 1, 6, 16, 28, 0, 14, 112, 10, 129, 8, 252, - 255, 255, 0, 0, 0, 0, 0, 0, 63, 248, 39, 0, 63, 26, 249, 7, - 0, 0, 0, 0, 255, 15, 0, 0, 0, 224, 255, 255, 255, 255, 255, 247, - 191, 255, 255, 255, 255, 255, 123, 252, 255, 255, 255, 255, 231, 199, 255, 255, - 255, 231, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 15, 7, - 7, 0, 63, 0, 0, 0, 0, 0, -}; - -/* Emoji: 652 bytes. */ - -RE_UINT32 re_get_emoji(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_emoji_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_emoji_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_emoji_stage_3[pos + f] << 6; - pos += code; - value = (re_emoji_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 80, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 94, 6, 6, 6, 6, 6, 6, + 80, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 269, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 111, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 89, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_word_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 135, 254, 255, 255, 7, + 0, 4, 32, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, + 31, 80, 0, 0, 255, 255, 223, 188, 64, 215, 255, 255, 251, 255, 255, 255, + 255, 255, 191, 255, 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 254, 255, + 255, 255, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, 0, 0, 255, 7, + 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159, 0, 0, 255, 255, + 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 63, 36, 255, 63, 0, 0, + 255, 255, 255, 15, 255, 7, 0, 0, 255, 255, 223, 255, 255, 0, 248, 255, + 207, 255, 254, 255, 239, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176, + 207, 255, 3, 80, 238, 135, 249, 255, 255, 253, 109, 211, 135, 57, 2, 94, + 192, 255, 63, 0, 238, 191, 251, 255, 255, 253, 237, 243, 191, 59, 1, 0, + 207, 255, 0, 254, 238, 159, 249, 255, 159, 57, 224, 176, 207, 255, 2, 0, + 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, 192, 255, 0, 0, + 255, 223, 253, 255, 255, 253, 255, 227, 223, 61, 96, 7, 207, 255, 0, 0, + 239, 223, 253, 255, 255, 253, 239, 243, 223, 61, 96, 64, 207, 255, 6, 0, + 223, 125, 240, 128, 207, 255, 0, 252, 238, 255, 127, 252, 255, 255, 251, 47, + 127, 132, 95, 255, 192, 255, 12, 0, 254, 255, 255, 255, 255, 255, 255, 7, + 255, 127, 255, 3, 214, 247, 255, 255, 175, 255, 255, 63, 95, 63, 255, 243, + 1, 0, 0, 3, 255, 3, 160, 194, 255, 254, 255, 255, 255, 31, 254, 255, + 223, 255, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 255, 3, 255, 255, + 255, 255, 255, 63, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, + 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, + 255, 255, 255, 231, 255, 255, 0, 0, 255, 255, 63, 63, 255, 159, 255, 255, + 255, 199, 255, 1, 255, 223, 31, 0, 255, 255, 31, 0, 255, 255, 15, 0, + 255, 223, 13, 0, 255, 255, 143, 48, 255, 3, 0, 0, 0, 56, 255, 3, + 255, 255, 255, 1, 255, 7, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, + 255, 15, 255, 15, 192, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, + 255, 3, 255, 3, 255, 255, 255, 159, 128, 0, 255, 255, 1, 0, 0, 0, + 255, 15, 255, 3, 0, 248, 15, 0, 255, 255, 255, 0, 255, 227, 255, 255, + 255, 1, 255, 255, 0, 0, 247, 255, 255, 255, 255, 251, 63, 63, 255, 170, + 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 48, 0, 0, + 0, 0, 0, 128, 1, 0, 16, 0, 0, 0, 2, 128, 0, 0, 255, 31, + 255, 255, 1, 0, 132, 252, 47, 62, 80, 189, 255, 243, 224, 67, 0, 0, + 255, 1, 0, 0, 0, 0, 192, 255, 255, 127, 255, 255, 31, 248, 15, 0, + 255, 128, 0, 128, 255, 255, 127, 0, 127, 127, 127, 127, 0, 128, 0, 0, + 224, 0, 0, 0, 254, 255, 62, 31, 255, 255, 127, 230, 224, 255, 255, 255, + 255, 127, 0, 0, 255, 31, 0, 0, 255, 31, 255, 255, 255, 15, 0, 0, + 255, 255, 247, 191, 0, 0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, + 252, 7, 0, 0, 0, 0, 224, 255, 255, 16, 0, 0, 63, 0, 255, 3, + 255, 255, 255, 232, 255, 63, 255, 255, 1, 128, 255, 3, 255, 63, 255, 3, + 255, 255, 127, 252, 7, 0, 0, 56, 255, 255, 124, 0, 126, 126, 126, 0, + 127, 127, 255, 255, 255, 55, 255, 3, 15, 0, 255, 255, 127, 248, 255, 255, + 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, + 0, 0, 248, 255, 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 15, + 255, 255, 24, 0, 0, 224, 0, 0, 0, 0, 223, 255, 252, 252, 252, 28, + 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 0, 0, 0, 32, + 0, 224, 255, 255, 15, 255, 62, 0, 255, 255, 15, 255, 255, 0, 255, 255, + 15, 0, 0, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, + 255, 255, 255, 192, 111, 240, 239, 254, 255, 255, 63, 135, 127, 0, 0, 0, + 255, 255, 7, 0, 255, 0, 255, 3, 255, 27, 3, 0, 31, 0, 0, 0, + 192, 255, 0, 128, 255, 1, 255, 3, 240, 0, 255, 255, 255, 255, 79, 0, + 31, 222, 255, 23, 255, 255, 251, 255, 255, 255, 255, 64, 127, 189, 255, 191, + 255, 7, 255, 3, 255, 253, 237, 251, 159, 57, 129, 224, 207, 31, 31, 0, + 255, 7, 255, 195, 3, 0, 0, 0, 191, 0, 255, 3, 255, 255, 63, 255, + 1, 0, 0, 63, 17, 0, 255, 3, 255, 3, 0, 128, 127, 242, 111, 255, + 255, 255, 191, 249, 15, 0, 255, 3, 255, 252, 255, 255, 255, 255, 255, 252, + 27, 0, 0, 0, 255, 255, 255, 35, 255, 253, 255, 255, 1, 0, 255, 3, + 0, 0, 252, 255, 255, 254, 127, 0, 127, 251, 255, 255, 255, 255, 127, 180, + 191, 253, 255, 255, 255, 127, 251, 1, 0, 0, 1, 0, 248, 255, 255, 224, + 255, 135, 255, 255, 255, 128, 255, 255, 27, 0, 3, 0, 0, 0, 7, 0, + 255, 7, 255, 31, 255, 1, 255, 99, 224, 227, 7, 248, 231, 15, 0, 0, + 0, 60, 0, 0, 28, 0, 0, 0, 255, 255, 255, 223, 100, 222, 255, 235, + 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, + 63, 255, 255, 255, 253, 255, 255, 247, 247, 207, 255, 255, 255, 255, 127, 248, + 255, 31, 32, 0, 16, 0, 0, 248, 254, 255, 0, 0, 127, 255, 255, 249, + 219, 7, 0, 0, 255, 31, 255, 63, 255, 67, 0, 0, 31, 0, 127, 0, + 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, + 238, 251, 255, 15, 3, 0, 255, 255 +}; + +RE_UINT32 re_get_word(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_word_table_1[field_2]; + v = re_word_table_2[(v << 5) | field_1]; + v = re_word_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; } -/* Emoji_Presentation. */ - -static RE_UINT8 re_emoji_presentation_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, +/* Word_Break. */ +static RE_UINT8 re_word_break_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 13, 14, 15, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 16, 10, 10, 10, 10, 10, 10, 10, 10, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 10, 10, 13, 29, 10, 10, + 10, 30, 10, 10, 10, 10, 10, 10, 10, 10, 31, 32, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 33, 10, 10, 34, + 10, 10, 10, 10, 35, 36, 37, 10, 38, 10, 39, 40, 41, 10, 42, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 43, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 +}; + +static RE_UINT16 re_word_break_table_2[] = { + 0, 1, 2, 3, 4, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 8, 7, 9, 9, 9, 10, 11, 12, 7, 13, + 7, 7, 7, 7, 14, 7, 7, 7, 7, 15, 16, 7, 17, 18, 19, 20, + 21, 7, 22, 23, 7, 7, 24, 25, 26, 27, 28, 7, 7, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 53, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 36, 79, 80, 36, 36, 81, 82, 36, 83, 84, 85, 86, 87, 88, 89, 36, + 36, 90, 91, 92, 93, 7, 94, 95, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 96, 7, 97, 98, 99, 7, 100, 7, 101, 36, 102, 7, 7, 103, + 104, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 105, 106, 7, 7, 107, 108, 109, 110, 111, 36, 112, 113, 114, + 115, 7, 7, 116, 117, 118, 7, 119, 120, 121, 62, 36, 36, 36, 122, 36, + 123, 36, 124, 125, 126, 127, 128, 36, 129, 130, 131, 132, 133, 134, 7, 135, + 7, 136, 137, 138, 139, 140, 141, 142, 7, 7, 7, 7, 7, 7, 9, 143, + 7, 7, 7, 7, 7, 7, 7, 7, 103, 7, 144, 138, 7, 145, 146, 147, + 148, 149, 150, 151, 152, 36, 127, 153, 154, 155, 156, 7, 157, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 158, 7, 159, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 160, 120, 7, 7, 7, 7, 161, 7, 94, 7, 162, 163, 164, 164, 9, + 36, 165, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 166, 167, 36, 36, 168, 169, 169, 170, 171, 15, 7, 7, 172, 7, 36, 173, + 36, 36, 36, 36, 36, 36, 173, 174, 169, 169, 175, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 176, 36, 177, 138, 7, 7, 7, 7, 7, 7, 7, 7, + 178, 179, 7, 180, 181, 7, 7, 182, 183, 7, 7, 7, 7, 7, 184, 185, + 186, 187, 7, 188, 189, 130, 190, 191, 30, 192, 193, 194, 40, 195, 196, 197, + 7, 198, 199, 200, 36, 201, 202, 203, 204, 205, 7, 206, 7, 7, 7, 207, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 208, 209, 210, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 211, 212, 213, 7, 7, 214, 215, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 138, 177, 7, 216, 7, 217, 218, + 219, 220, 221, 222, 7, 7, 7, 223, 224, 2, 3, 225, 226, 120, 227, 228, + 229, 230, 231, 36, 7, 7, 7, 232, 36, 36, 7, 233, 36, 36, 36, 234, + 36, 36, 36, 36, 194, 7, 235, 128, 7, 236, 237, 238, 138, 7, 239, 36, + 7, 7, 7, 7, 138, 240, 241, 210, 7, 242, 7, 243, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 163, 119, 217, 36, 36, 36, 36, + 244, 245, 119, 163, 120, 36, 36, 246, 119, 247, 36, 36, 7, 8, 36, 36, + 248, 249, 36, 194, 194, 36, 85, 250, 7, 119, 119, 251, 214, 36, 36, 36, + 7, 7, 157, 36, 7, 251, 7, 251, 7, 252, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 7, 253, 36, 36, 194, 254, 255, 36, 36, 177, 256, 163, + 133, 257, 258, 259, 133, 260, 261, 262, 133, 263, 264, 265, 133, 195, 266, 36, + 267, 268, 36, 36, 269, 139, 270, 271, 272, 273, 274, 275, 36, 36, 36, 36, + 7, 276, 277, 278, 7, 27, 279, 36, 36, 36, 36, 36, 7, 280, 281, 36, + 7, 27, 282, 36, 7, 283, 114, 36, 284, 285, 36, 36, 36, 36, 36, 36, + 7, 286, 36, 36, 36, 7, 7, 287, 288, 289, 290, 36, 36, 291, 292, 293, + 294, 295, 296, 7, 297, 36, 7, 116, 36, 36, 36, 36, 36, 36, 36, 36, + 298, 299, 300, 301, 302, 303, 36, 36, 304, 305, 306, 307, 308, 114, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 309, 36, 36, 36, 36, 36, 310, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 247, 36, 36, 36, + 7, 7, 7, 172, 7, 7, 7, 7, 7, 7, 243, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 311, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 312, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 116, 120, 114, 36, 36, 177, 313, 7, 314, 315, 316, 102, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 7, 7, 36, 36, 36, 36, 7, 7, 317, 9, 318, 36, 36, 319, + 320, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 321, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 322, 323, 324, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 325, 326, 327, 36, 36, + 36, 36, 328, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 37, 7, 329, 330, 331, 7, 332, 333, 334, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 335, 336, 95, 37, 37, 160, 160, 298, 298, 337, 338, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 9, 339, 9, 340, 341, 342, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 343, 344, 36, 36, 36, 36, 36, 36, 7, 345, 346, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 7, 347, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 348, 36, 7, 7, 349, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 331, 350, 351, 352, 353, 354, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 177, 206, 206, 159, 36, 36, 355, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 356, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 122, + 357, 9, 9, 9, 36, 36, 36, 36, 9, 9, 9, 9, 9, 9, 9, 358, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36 }; -static RE_UINT8 re_emoji_presentation_stage_2[] = { +static RE_UINT8 re_word_break_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 5, 0, 0, 0, 0, 6, 0, 0, 0, 0, 7, 0, 8, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 7, 0, 0, 0, 0, + 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 12, + 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 11, 0, 10, 0, 0, 11, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 11, 11, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 11, 11, 11, 11, 11, 0, 11, 11, 0, 0, 11, 11, 11, 11, 7, 11, + 0, 0, 0, 0, 0, 0, 11, 10, 11, 11, 11, 0, 11, 0, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 0, 11, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 7, 11, 0, 0, 0, 0, 0, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, + 0, 14, 14, 0, 14, 14, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, + 15, 15, 15, 11, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 13, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 7, 0, 11, 11, + 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 11, 14, 14, 14, 14, 14, 14, 14, 13, 0, 14, + 14, 14, 14, 14, 14, 11, 11, 14, 14, 0, 14, 14, 14, 14, 11, 11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 0, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, + 11, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 11, 11, 0, 0, 7, 0, 11, 0, 0, 14, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 11, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 11, 14, 14, 14, 11, 14, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 11, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 11, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, + 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 0, 0, 0, 11, 11, 11, 11, 0, 0, 14, 11, 14, 14, + 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 11, 11, 0, 11, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 14, 0, + 0, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 11, + 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 0, 11, 11, 0, 11, 11, 0, 0, 14, 0, 14, 14, + 14, 14, 14, 0, 0, 0, 0, 14, 14, 0, 0, 14, 14, 14, 0, 0, + 0, 14, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 14, 14, 11, 11, 11, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, + 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 0, 11, 11, 11, 11, 11, 0, 0, 14, 11, 14, 14, + 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 14, 14, 14, 14, 14, 14, + 0, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, + 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 11, 11, 0, 11, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 11, 0, 11, 11, 11, 11, 11, 11, 0, 0, 0, 11, 11, + 11, 0, 11, 11, 11, 11, 0, 0, 0, 11, 11, 0, 11, 0, 11, 11, + 0, 0, 0, 11, 11, 0, 0, 0, 11, 11, 11, 0, 0, 0, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 14, 14, + 14, 14, 14, 0, 0, 0, 14, 14, 14, 0, 14, 14, 14, 14, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 11, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 0, 11, 11, 11, 0, 0, 0, 0, 0, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 0, 0, 14, 11, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 11, 0, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 11, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 14, 11, 0, + 0, 0, 0, 0, 11, 11, 11, 14, 0, 0, 0, 0, 0, 0, 0, 11, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, + 0, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 14, 0, 0, 0, 0, 14, + 14, 14, 14, 14, 14, 0, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 14, 0, 14, 0, 0, 0, 0, 14, 14, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 11, 11, 11, 11, 11, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, + 14, 0, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 0, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 14, 14, 0, 0, + 11, 11, 11, 11, 11, 11, 0, 11, 0, 0, 0, 0, 0, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 0, + 11, 0, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 14, 14, 14, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 0, 0, + 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 11, 11, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 11, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 13, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 11, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 11, 11, 11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 14, 11, 11, + 11, 11, 11, 11, 14, 11, 11, 14, 14, 14, 11, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, + 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 11, 0, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, + 0, 0, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 0, 0, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 0, 14, 16, 13, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 10, 2, 2, 13, 13, 13, 13, 13, 12, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, + 12, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, 0, 11, 0, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 11, 0, 0, 0, 11, 11, 11, 11, 11, 0, 0, + 0, 0, 0, 0, 11, 0, 11, 0, 11, 0, 11, 11, 11, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 0, 0, 0, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 14, + 14, 14, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, + 0, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 11, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 17, 17, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, + 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, + 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 14, 11, 11, 11, 14, 11, 11, 11, 11, 14, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 11, 11, 11, 11, 11, 11, 0, 0, 0, 11, 0, 11, 11, 14, + 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 14, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 0, 14, 14, 14, 0, 0, 14, 14, 0, 0, 0, 0, 0, 14, 14, + 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, + 0, 0, 11, 11, 11, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 0, + 0, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 15, 14, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 15, 0, + 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 7, 0, 0, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, + 7, 0, 8, 0, 7, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 13, + 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 7, 0, 8, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 14, 14, + 0, 0, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, + 0, 0, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 0, 0, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 11, 11, 0, 0, 0, 11, 0, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 0, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, + 11, 14, 14, 14, 0, 14, 14, 0, 0, 0, 0, 0, 14, 14, 14, 14, + 11, 11, 11, 11, 0, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 0, 14, 14, 14, 0, 0, 0, 0, 14, + 11, 11, 11, 11, 11, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 14, 14, 0, 0, 0, + 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 11, 14, 14, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 14, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 11, 11, 11, 11, 0, 0, 0, 0, 14, 14, 14, 14, 0, 14, 14, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 0, 11, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 14, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 11, 11, 11, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, + 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 0, 11, 11, 11, 11, 11, 0, 14, 14, 11, 14, 14, + 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 11, 11, 11, + 11, 11, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 14, 11, + 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, -}; - -static RE_UINT8 re_emoji_presentation_stage_3[] = { + 14, 14, 14, 14, 11, 11, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, + 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 14, 14, 0, 0, + 14, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 4, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 14, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 17, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 20, 0, 0, 21, - 22, 23, 24, 0, 0, 0, 0, 0, 25, 26, 25, 27, 28, 25, 29, 30, - 25, 31, 32, 25, 25, 25, 25, 33, 25, 34, 35, 36, 37, 18, 0, 38, - 25, 25, 39, 0, 25, 25, 40, 41, 0, 0, 0, 0, 0, 0, 0, 42, - 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 25, 47, 48, 25, - 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_emoji_presentation_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 12, 0, 30, 9, 0, 0, 0, 0, 96, - 0, 0, 48, 0, 0, 255, 15, 0, 0, 0, 0, 128, 0, 0, 8, 0, - 2, 12, 0, 96, 48, 64, 16, 0, 0, 4, 44, 36, 32, 12, 0, 0, - 0, 1, 0, 0, 0, 80, 184, 0, 0, 0, 224, 0, 0, 0, 1, 128, - 0, 0, 0, 24, 0, 0, 33, 0, 16, 0, 0, 0, 0, 128, 0, 0, - 0, 64, 254, 7, 192, 255, 255, 255, 2, 0, 0, 4, 0, 128, 124, 7, - 0, 0, 3, 0, 255, 255, 255, 255, 1, 224, 191, 255, 255, 255, 255, 223, - 255, 255, 15, 0, 255, 135, 15, 0, 255, 255, 17, 255, 255, 255, 255, 127, - 253, 255, 255, 255, 255, 255, 255, 159, 255, 255, 255, 63, 0, 120, 255, 255, - 255, 0, 0, 4, 0, 0, 96, 0, 0, 0, 0, 248, 255, 255, 0, 0, - 63, 16, 39, 0, 0, 24, 240, 7, 255, 15, 0, 0, 0, 224, 255, 255, - 255, 255, 255, 247, 191, 255, 255, 255, 255, 255, 123, 252, 231, 199, 255, 255, - 255, 231, 255, 255, 0, 0, 15, 7, 7, 0, 63, 0, -}; - -/* Emoji_Presentation: 544 bytes. */ - -RE_UINT32 re_get_emoji_presentation(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_emoji_presentation_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_emoji_presentation_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_emoji_presentation_stage_3[pos + f] << 5; - pos += code; - value = (re_emoji_presentation_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Emoji_Modifier. */ - -static RE_UINT8 re_emoji_modifier_stage_1[] = { - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -}; - -static RE_UINT8 re_emoji_modifier_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -}; - -static RE_UINT8 re_emoji_modifier_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_emoji_modifier_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, -}; - -/* Emoji_Modifier: 130 bytes. */ - -RE_UINT32 re_get_emoji_modifier(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_emoji_modifier_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_emoji_modifier_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_emoji_modifier_stage_3[pos + f] << 7; - pos += code; - value = (re_emoji_modifier_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Emoji_Modifier_Base. */ - -static RE_UINT8 re_emoji_modifier_base_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_emoji_modifier_base_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, -}; - -static RE_UINT8 re_emoji_modifier_base_stage_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 0, 0, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 14, 0, 14, 14, 0, 0, 14, 14, 14, 14, 11, + 14, 11, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, + 14, 11, 0, 11, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, - 0, 6, 7, 0, 0, 8, 9, 0, 0, 10, 11, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_emoji_modifier_base_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 60, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 156, 28, 0, 0, 0, 0, 0, 0, - 204, 255, 1, 0, 192, 255, 255, 17, 238, 128, 2, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 48, 4, 0, 0, 97, 0, 0, 0, 0, 0, - 224, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 112, 0, - 1, 16, 0, 0, 0, 0, 0, 0, 0, 128, 0, 255, 64, 0, 255, 115, - 0, 0, 0, 0, 0, 0, 96, 11, 0, 224, 254, 63, 0, 0, 0, 0, -}; - -/* Emoji_Modifier_Base: 324 bytes. */ - -RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_emoji_modifier_base_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_emoji_modifier_base_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_emoji_modifier_base_stage_3[pos + f] << 6; - pos += code; - value = (re_emoji_modifier_base_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Emoji_Component. */ - -static RE_UINT8 re_emoji_component_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_emoji_component_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 5, 1, - 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_emoji_component_stage_3[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 6, - 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 8, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_emoji_component_stage_4[] = { - 0, 0, 0, 0, 8, 4, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, - 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, - 0, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -}; - -/* Emoji_Component: 340 bytes. */ - -RE_UINT32 re_get_emoji_component(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_emoji_component_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_emoji_component_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_emoji_component_stage_3[pos + f] << 6; - pos += code; - value = (re_emoji_component_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Extended_Pictographic. */ - -static RE_UINT8 re_extended_pictographic_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_extended_pictographic_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 9, -}; - -static RE_UINT8 re_extended_pictographic_stage_3[] = { - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 11, 14, 14, 14, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 3, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 6, 0, 7, 8, - 0, 0, 0, 9, 0, 0, 10, 11, 12, 13, 14, 13, 15, 16, 17, 0, - 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 19, 20, 0, 0, - 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, - 13, 13, 13, 13, 23, 24, 25, 26, 27, 28, 13, 13, 13, 13, 13, 29, - 13, 13, 13, 13, 30, 31, 13, 13, 13, 32, 13, 13, 0, 33, 0, 34, - 35, 36, 37, 13, 38, 39, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 30, -}; - -static RE_UINT8 re_extended_pictographic_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 2, 0, 0, 240, 3, 0, 6, 0, 0, - 0, 0, 0, 12, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 0, 254, 15, 7, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 64, 0, 1, 0, 0, 0, 0, 0, 0, 120, - 191, 255, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 63, 0, 255, 255, 255, 255, 255, 255, 63, 255, 87, 32, 2, 1, 24, 0, - 144, 80, 184, 0, 248, 0, 0, 0, 0, 0, 224, 0, 2, 0, 1, 128, - 0, 0, 0, 0, 0, 0, 48, 0, 224, 0, 0, 24, 0, 0, 0, 0, - 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32, - 0, 0, 128, 2, 0, 0, 0, 0, 0, 224, 0, 0, 0, 128, 0, 0, - 0, 0, 0, 0, 0, 240, 3, 192, 0, 64, 254, 7, 0, 224, 255, 255, - 255, 255, 255, 255, 63, 0, 0, 0, 254, 255, 0, 4, 0, 128, 252, 247, - 0, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 7, - 255, 255, 255, 255, 255, 255, 255, 63, 192, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, - 0, 0, 224, 255, 255, 255, 255, 255, 0, 240, 0, 0, 0, 0, 0, 0, - 0, 255, 0, 252, 0, 0, 0, 0, 0, 255, 0, 0, 0, 192, 255, 255, - 0, 240, 255, 255, 255, 255, 255, 247, 191, 255, 255, 255, 255, 255, 255, 255, -}; - -/* Extended_Pictographic: 596 bytes. */ - -RE_UINT32 re_get_extended_pictographic(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_extended_pictographic_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_extended_pictographic_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_extended_pictographic_stage_3[pos + f] << 6; - pos += code; - value = (re_extended_pictographic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* NFD_Quick_Check. */ - -static RE_UINT8 re_nfd_quick_check_stage_1[] = { - 0, 1, 2, 3, 4, 1, 1, 5, 1, 1, 1, 6, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_nfd_quick_check_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 9, 5, 10, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 12, 5, 5, 5, 5, 5, 5, 5, 5, 13, 5, - 5, 5, 5, 5, 14, 15, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 17, 5, -}; - -static RE_UINT8 re_nfd_quick_check_stage_3[] = { - 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 7, 8, 9, - 10, 11, 0, 12, 0, 0, 0, 0, 13, 0, 0, 14, 0, 0, 0, 0, - 0, 0, 0, 0, 15, 16, 0, 17, 18, 19, 0, 0, 0, 20, 21, 22, - 0, 23, 0, 24, 0, 22, 0, 25, 0, 0, 0, 0, 0, 26, 27, 0, - 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 31, 31, 32, 33, 34, 35, 36, 37, - 38, 0, 0, 0, 39, 0, 40, 41, 42, 43, 44, 45, 46, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, - 0, 48, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 51, 0, - 0, 0, 0, 0, 31, 31, 31, 31, 52, 53, 31, 54, 55, 56, 0, 0, - 0, 0, 57, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, - 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 62, 63, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 31, 31, 31, 31, 31, 31, 31, 31, 65, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_nfd_quick_check_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 191, 255, 126, 62, 191, 255, 126, 190, - 255, 255, 252, 255, 63, 255, 241, 126, 248, 241, 243, 255, 63, 255, 255, 127, - 0, 0, 0, 0, 3, 128, 1, 0, 0, 224, 255, 223, 207, 255, 49, 255, - 255, 255, 255, 207, 192, 255, 15, 0, 27, 0, 0, 0, 0, 0, 16, 64, - 224, 215, 1, 0, 0, 252, 1, 0, 0, 124, 24, 0, 0, 0, 0, 0, - 139, 112, 0, 2, 0, 0, 0, 2, 0, 0, 139, 112, 0, 0, 192, 0, - 6, 0, 207, 252, 252, 252, 63, 3, 0, 0, 0, 0, 124, 0, 0, 0, - 5, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 18, 0, - 0, 0, 0, 255, 0, 0, 0, 0, 0, 24, 0, 176, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 78, 0, 0, 0, 0, - 0, 25, 0, 48, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 28, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 129, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, - 8, 32, 132, 16, 0, 2, 104, 1, 2, 0, 8, 32, 132, 16, 0, 2, - 0, 0, 0, 0, 64, 0, 0, 0, 64, 85, 4, 0, 0, 0, 0, 40, - 11, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 11, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 3, - 255, 255, 63, 63, 255, 255, 255, 255, 63, 63, 255, 170, 255, 255, 255, 63, - 255, 255, 255, 255, 255, 255, 223, 95, 222, 255, 207, 239, 255, 255, 220, 63, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 12, 0, 0, - 0, 0, 0, 12, 0, 64, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, - 16, 18, 0, 0, 80, 0, 0, 0, 146, 2, 0, 0, 5, 224, 51, 3, - 51, 3, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 15, 60, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 80, 85, 85, 165, 2, 219, 54, 0, 0, 16, 64, 0, 80, 85, 85, - 165, 2, 219, 54, 0, 0, 144, 71, 255, 255, 255, 255, 15, 0, 0, 0, - 255, 63, 229, 127, 101, 252, 255, 255, 255, 255, 255, 255, 255, 63, 255, 255, - 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 160, 0, 252, 127, 95, - 219, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 192, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 12, - 0, 0, 0, 192, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, - 1, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 0, 0, 0, 0, -}; - -/* NFD_Quick_Check: 996 bytes. */ - -RE_UINT32 re_get_nfd_quick_check(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_nfd_quick_check_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_nfd_quick_check_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_nfd_quick_check_stage_3[pos + f] << 6; - pos += code; - value = (re_nfd_quick_check_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* NFC_Quick_Check. */ - -static RE_UINT8 re_nfc_quick_check_stage_1[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, - 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static RE_UINT8 re_nfc_quick_check_stage_2[] = { - 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 4, 5, 6, 0, 7, 8, 9, 10, 8, 11, 0, 0, 12, 13, - 14, 0, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 19, - 20, 0, 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 0, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 0, 14, 14, 0, 14, + 14, 14, 14, 14, 14, 14, 11, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 0, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 0, + 14, 14, 0, 14, 14, 14, 14, 14, 11, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, + 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 14, + 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 14, + 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 11, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 25, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 29, 30, 0, 0, 0, 8, 0, 0, 31, 0, 32, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 14, 14, 0, + 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, + 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 25, 25, 25, 25, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_nfc_quick_check_stage_3[] = { + 0, 0, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 10, 11, - 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 18, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 20, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 22, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 24, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 17, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 10, 0, 29, 30, 31, - 29, 0, 26, 27, 28, 10, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 0, - 0, 0, 0, 0, 0, 33, 33, 33, 35, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, - 0, 0, 0, 0, 0, 0, 0, 19, 0, 39, 26, 26, 26, 40, 0, 38, - 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 11, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, - 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 45, 46, 47, 48, 49, 15, 15, 15, 15, 15, 15, 15, 45, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 41, 0, 0, 0, 0, - 0, 0, 0, 50, 0, 49, 47, 51, 52, 47, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 53, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 56, 31, 0, 0, 0, 0, 0, 0, 0, - 15, 15, 15, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_nfc_quick_check_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2, - 2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 2, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, - 2, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 2, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 2, 2, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, - 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2, - 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, - 0, 2, 2, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, - 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, - 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 2, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 1, -}; - -/* NFC_Quick_Check: 1592 bytes. */ - -RE_UINT32 re_get_nfc_quick_check(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_nfc_quick_check_stage_1[f] << 5; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_nfc_quick_check_stage_2[pos + f] << 4; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_nfc_quick_check_stage_3[pos + f] << 3; - value = re_nfc_quick_check_stage_4[pos + code]; - - return value; -} - -/* NFKD_Quick_Check. */ - -static RE_UINT8 re_nfkd_quick_check_stage_1[] = { - 0, 1, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 2, 2, 7, 8, - 2, 2, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 0, 0, 11, 0, 0, 11, 11, 0, 0, 11, 11, 11, 11, 0, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 11, 11, 11, + 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 0, 0, 11, 11, 11, + 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 0, + 11, 11, 11, 11, 11, 0, 11, 0, 0, 0, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, + 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 0, 14, 14, 0, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 11, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 11, 11, 0, 11, 0, 0, 11, 0, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 0, 11, 11, 11, 11, 0, 11, 0, 11, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, 0, 11, 0, 11, 0, 11, 0, 11, 11, 11, + 0, 11, 11, 0, 11, 0, 0, 11, 0, 11, 0, 11, 0, 11, 0, 11, + 0, 11, 11, 0, 11, 0, 0, 11, 11, 11, 11, 0, 11, 11, 11, 11, + 11, 11, 11, 0, 11, 11, 11, 11, 0, 11, 11, 11, 11, 0, 11, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 0, 11, 11, 11, 0, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_nfkd_quick_check_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 17, 18, 19, - 20, 21, 22, 23, 24, 7, 7, 7, 7, 7, 25, 7, 26, 27, 28, 29, - 30, 31, 32, 33, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 34, 35, 7, 7, 7, 36, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 37, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 33, 38, 39, 33, 40, 41, 42, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 43, 44, 7, 45, 46, 47, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 48, 7, 7, 49, 50, 51, 52, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 53, 7, - 7, 54, 55, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 33, 33, 56, 7, 7, 7, 7, 7, -}; +RE_UINT32 re_get_word_break(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -static RE_UINT8 re_nfkd_quick_check_stage_3[] = { - 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, - 11, 12, 0, 0, 0, 13, 14, 15, 0, 0, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 0, 28, 0, 0, 0, - 0, 29, 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 33, 0, 0, 0, 34, 0, 0, 35, 36, 0, 0, 0, 0, 0, - 0, 0, 37, 0, 38, 0, 39, 0, 0, 0, 40, 0, 0, 0, 41, 0, - 0, 0, 39, 0, 0, 0, 42, 0, 0, 43, 0, 0, 0, 43, 44, 0, - 45, 0, 46, 47, 48, 49, 0, 0, 0, 50, 0, 0, 0, 0, 0, 51, - 52, 53, 54, 0, 0, 0, 0, 0, 0, 55, 56, 57, 58, 59, 0, 0, - 59, 59, 59, 59, 60, 59, 59, 61, 62, 59, 63, 64, 59, 65, 66, 67, - 68, 69, 70, 71, 72, 40, 0, 0, 73, 74, 75, 59, 76, 77, 78, 0, - 79, 80, 81, 82, 83, 84, 0, 85, 0, 86, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 59, 59, 59, 59, 87, 45, 0, 0, 88, 0, 0, 51, 0, - 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 0, 0, 43, 59, 59, 59, 59, 59, 59, 91, 0, - 92, 93, 94, 95, 96, 94, 95, 97, 0, 98, 59, 59, 99, 0, 0, 0, - 100, 59, 101, 100, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 103, - 0, 0, 104, 0, 0, 0, 0, 0, 59, 59, 59, 59, 59, 105, 0, 0, - 106, 107, 59, 108, 59, 59, 61, 0, 109, 110, 111, 59, 59, 112, 113, 59, - 59, 64, 114, 59, 4, 59, 115, 116, 117, 114, 118, 119, 59, 59, 59, 120, - 121, 59, 59, 59, 59, 100, 122, 123, 0, 0, 0, 0, 124, 125, 0, 0, - 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 129, 0, 0, - 0, 0, 130, 15, 0, 58, 92, 0, 59, 59, 65, 59, 131, 132, 133, 59, - 134, 135, 136, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 7, 59, 59, - 59, 59, 59, 59, 59, 59, 137, 59, 133, 138, 139, 140, 141, 142, 0, 0, - 143, 144, 145, 39, 102, 0, 0, 0, 146, 60, 147, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -static RE_UINT8 re_nfkd_quick_check_stage_4[] = { - 0, 0, 0, 0, 1, 133, 60, 119, 191, 255, 126, 62, 191, 255, 126, 190, - 255, 255, 252, 255, 63, 255, 253, 254, 249, 243, 243, 255, 63, 255, 255, 255, - 3, 128, 1, 0, 240, 255, 255, 223, 207, 255, 63, 255, 255, 255, 255, 207, - 192, 255, 15, 0, 0, 0, 255, 1, 0, 0, 0, 63, 31, 0, 0, 0, - 27, 0, 0, 0, 0, 0, 16, 68, 240, 215, 1, 0, 0, 252, 1, 0, - 0, 124, 127, 0, 0, 0, 55, 2, 139, 112, 0, 2, 0, 0, 0, 2, - 0, 0, 139, 112, 0, 0, 192, 0, 6, 0, 207, 252, 252, 252, 63, 3, - 128, 0, 0, 0, 124, 0, 0, 0, 0, 0, 224, 1, 5, 0, 8, 0, - 0, 2, 18, 0, 0, 0, 0, 255, 0, 24, 0, 176, 0, 0, 72, 0, - 0, 0, 0, 78, 0, 25, 0, 48, 0, 0, 16, 0, 0, 28, 0, 0, - 0, 1, 0, 0, 129, 13, 0, 0, 0, 0, 0, 116, 0, 0, 8, 0, - 0, 0, 0, 48, 0, 16, 0, 0, 8, 32, 132, 16, 0, 2, 232, 3, - 2, 0, 8, 32, 132, 16, 0, 2, 64, 0, 0, 0, 0, 0, 0, 16, - 64, 85, 4, 0, 0, 0, 0, 40, 11, 0, 0, 0, 0, 112, 255, 247, - 255, 191, 255, 255, 255, 7, 0, 1, 0, 0, 0, 248, 255, 255, 255, 255, - 255, 255, 255, 15, 255, 255, 255, 3, 255, 255, 63, 63, 63, 63, 255, 170, - 255, 255, 255, 63, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127, - 255, 7, 130, 0, 112, 128, 216, 80, 128, 3, 128, 128, 0, 0, 243, 255, - 255, 127, 255, 31, 239, 254, 111, 62, 87, 189, 251, 251, 225, 3, 255, 255, - 0, 2, 0, 12, 0, 64, 0, 0, 0, 224, 0, 0, 16, 18, 0, 0, - 80, 176, 1, 0, 146, 2, 0, 0, 5, 224, 51, 3, 51, 3, 0, 0, - 0, 240, 0, 0, 15, 60, 0, 0, 0, 6, 0, 0, 255, 7, 0, 0, - 0, 0, 112, 0, 0, 128, 0, 0, 0, 0, 0, 128, 255, 255, 63, 0, - 1, 0, 0, 0, 0, 0, 64, 7, 0, 80, 85, 85, 165, 2, 219, 54, - 0, 0, 16, 216, 0, 0, 144, 199, 0, 0, 254, 255, 255, 127, 252, 255, - 255, 255, 255, 127, 255, 0, 255, 255, 0, 0, 1, 0, 0, 0, 0, 3, - 0, 0, 0, 240, 15, 0, 0, 0, 255, 63, 229, 127, 101, 252, 255, 255, - 255, 63, 255, 255, 127, 0, 248, 160, 255, 255, 127, 95, 219, 255, 255, 255, - 255, 255, 3, 0, 0, 0, 248, 255, 0, 0, 255, 255, 255, 0, 0, 0, - 0, 0, 255, 31, 0, 0, 255, 3, 159, 255, 247, 255, 127, 15, 215, 255, - 255, 255, 255, 31, 254, 255, 255, 255, 252, 252, 252, 28, 127, 127, 0, 0, - 0, 0, 0, 20, 0, 8, 0, 0, 0, 192, 0, 0, 0, 24, 0, 0, - 0, 0, 0, 88, 0, 0, 0, 12, 0, 0, 0, 192, 255, 255, 255, 223, - 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, - 95, 252, 253, 255, 255, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, - 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 255, 7, 255, 255, - 255, 127, 255, 255, 255, 255, 0, 0, 7, 0, 255, 255, 255, 1, 3, 0, -}; + v = re_word_break_table_1[field_2]; + v = re_word_break_table_2[(v << 5) | field_1]; + v = re_word_break_table_3[(v << 5) | field_0]; -/* NFKD_Quick_Check: 1504 bytes. */ - -RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_nfkd_quick_check_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_nfkd_quick_check_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_nfkd_quick_check_stage_3[pos + f] << 5; - pos += code; - value = (re_nfkd_quick_check_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return v; } -/* NFKC_Quick_Check. */ - -static RE_UINT8 re_nfkc_quick_check_stage_1[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 6, - 4, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 9, 10, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +/* XDigit. */ +static RE_UINT8 re_xdigit_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 10, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, + 8, 12, 8, 13, 14, 15, 16, 17, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 18, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 19, 8, 8, 20, 8, 21, 8, 8, 8, 22, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; -static RE_UINT8 re_nfkc_quick_check_stage_2[] = { - 0, 0, 1, 0, 2, 3, 0, 4, 0, 0, 5, 6, 7, 8, 9, 10, - 0, 0, 0, 0, 0, 0, 11, 0, 0, 12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 13, 14, 15, 16, 17, 18, 0, 0, 15, 19, 15, 20, - 0, 21, 0, 22, 15, 20, 0, 23, 24, 0, 24, 25, 26, 27, 28, 0, - 29, 0, 0, 30, 0, 31, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, - 0, 0, 0, 0, 35, 36, 37, 0, 0, 0, 38, 0, 0, 39, 40, 41, - 42, 43, 44, 0, 45, 46, 47, 0, 48, 0, 0, 0, 49, 0, 0, 0, - 0, 50, 51, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 26, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 57, 24, 51, 51, 51, 58, - 59, 0, 60, 61, 62, 51, 63, 0, 64, 65, 51, 51, 51, 51, 51, 51, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 66, 0, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 51, 51, 51, 51, 69, 70, 51, 71, 72, 73, 74, 75, - 51, 51, 51, 51, 76, 77, 78, 79, 80, 81, 51, 82, 83, 51, 84, 85, - 0, 0, 86, 0, 87, 0, 0, 0, 0, 0, 0, 0, 15, 20, 0, 0, - 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 90, 91, 92, 0, 0, 0, 0, 0, 0, 0, 0, - 51, 93, 94, 95, 96, 97, 51, 51, 51, 51, 98, 51, 51, 51, 51, 99, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 103, 104, 105, 0, 106, 107, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 51, 51, 51, 51, 51, 51, 51, 51, 108, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_xdigit_table_2[] = { + 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, + 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, + 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; -static RE_UINT8 re_nfkc_quick_check_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, - 0, 0, 0, 0, 0, 0, 5, 6, 1, 7, 0, 0, 0, 0, 0, 6, - 8, 9, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 11, 1, - 0, 0, 0, 12, 9, 0, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 0, 0, 0, 0, 0, 22, 23, 24, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 26, 7, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 27, 0, 0, 0, 28, 1, 0, 0, 0, 0, 0, 0, 0, 29, - 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, - 0, 0, 31, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, - 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 34, 35, 0, 0, 0, 0, - 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, - 36, 0, 37, 0, 0, 0, 0, 0, 0, 38, 0, 31, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 35, 0, 0, 0, 0, - 0, 22, 0, 0, 0, 0, 0, 0, 39, 40, 41, 22, 0, 7, 42, 43, - 7, 0, 39, 40, 41, 22, 0, 7, 0, 0, 0, 0, 0, 30, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 44, 45, 46, 0, - 0, 0, 0, 0, 0, 45, 45, 45, 47, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 49, 11, 50, - 11, 51, 11, 11, 11, 52, 0, 1, 0, 0, 0, 53, 11, 11, 11, 11, - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, - 0, 0, 0, 0, 0, 0, 0, 42, 43, 56, 39, 42, 39, 42, 0, 57, - 11, 52, 58, 0, 49, 6, 59, 60, 6, 43, 6, 6, 0, 0, 61, 11, - 11, 25, 11, 9, 0, 1, 0, 0, 62, 63, 64, 65, 66, 67, 68, 68, - 69, 43, 11, 11, 11, 11, 11, 11, 0, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 0, 0, 70, 0, 0, - 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 52, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, - 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 11, 11, 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 71, 52, - 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 0, 63, 11, 11, 25, 73, 11, 0, 0, 0, 0, - 11, 11, 11, 25, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 25, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 43, - 0, 0, 0, 8, 0, 0, 0, 0, 11, 12, 74, 25, 75, 73, 11, 11, - 11, 11, 11, 11, 11, 12, 11, 11, 11, 11, 11, 43, 0, 0, 0, 0, - 25, 0, 53, 76, 11, 11, 25, 77, 78, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 43, 0, 0, 0, 53, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 12, 0, 0, 11, 11, 11, 11, 11, 11, - 11, 11, 73, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 11, 9, - 0, 0, 11, 43, 0, 0, 11, 11, 79, 11, 50, 11, 25, 80, 81, 11, - 11, 11, 11, 11, 11, 11, 11, 9, 63, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 25, 73, 73, 73, 82, 25, 25, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 31, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 83, 0, 0, 0, 0, 0, 31, 0, 0, - 0, 0, 0, 84, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, - 1, 0, 0, 0, 0, 0, 0, 0, 11, 11, 85, 11, 11, 11, 11, 11, - 11, 11, 11, 85, 86, 87, 11, 88, 62, 11, 11, 11, 11, 11, 11, 11, - 51, 89, 85, 85, 11, 11, 11, 90, 77, 73, 91, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 12, 11, 11, 11, 11, 92, 11, 11, 11, 11, 11, 11, - 62, 11, 11, 11, 93, 63, 50, 94, 41, 56, 93, 54, 93, 50, 50, 95, - 11, 68, 11, 80, 96, 68, 11, 80, 11, 52, 11, 11, 11, 25, 11, 11, - 11, 11, 0, 0, 0, 82, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 52, 0, 11, 11, 11, 11, 11, 80, 11, 1, 43, 0, 0, 0, 0, 0, - 11, 11, 11, 12, 0, 0, 0, 0, +static RE_UINT8 re_xdigit_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 255, 3, 0, 0, + 192, 255, 0, 0, 255, 3, 255, 3, 0, 0, 192, 255, 0, 192, 255, 255, + 255, 255, 255, 255 }; -static RE_UINT8 re_nfkc_quick_check_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2, - 2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 2, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, - 2, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 2, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 1, 1, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, - 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, - 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, - 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, - 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, - 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, - 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, - 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, - 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, - 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 2, 2, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, - 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, - 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, - 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, - 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, - 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, - 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, - 0, 1, 1, 1, 0, 1, 1, 1, -}; +RE_UINT32 re_get_xdigit(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* NFKC_Quick_Check: 2688 bytes. */ - -RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_nfkc_quick_check_stage_1[f] << 6; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_nfkc_quick_check_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_nfkc_quick_check_stage_3[pos + f] << 3; - value = re_nfkc_quick_check_stage_4[pos + code]; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* Alphanumeric. */ + v = re_xdigit_table_1[field_2]; + v = re_xdigit_table_2[(v << 5) | field_1]; + v = re_xdigit_table_3[(v << 2) | field_0]; -static RE_UINT8 re_alphanumeric_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 21, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 23, 24, 5, 25, 26, + return (v >> offset) & 0x1; +} + +/* XID_Continue. */ +static RE_UINT8 re_xid_continue_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 12, 12, + 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 17, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 9, 9, 12, 30, 9, 9, + 9, 31, 9, 9, 9, 9, 9, 9, 9, 9, 32, 33, 12, 12, 12, 12, + 12, 34, 12, 35, 9, 9, 9, 9, 9, 9, 9, 9, 36, 9, 9, 37, + 9, 9, 9, 9, 38, 39, 40, 9, 41, 9, 42, 43, 9, 9, 44, 9, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 45, 12, 12, 12, 46, 47, 12, + 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 49, 9, 9, 9, 50, 9, + 12, 12, 12, 12, 51, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -16224,715 +25950,263 @@ static RE_UINT8 re_alphanumeric_stage_1[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 52, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; -static RE_UINT8 re_alphanumeric_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 32, 31, 31, 31, 31, 31, 31, 31, 33, 34, 35, 31, - 36, 37, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39, - 1, 1, 1, 1, 40, 1, 41, 42, 43, 44, 45, 46, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 47, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 48, 49, 1, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 1, 59, 60, 61, 62, 63, 64, 65, 31, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 31, 78, 79, 80, 31, - 1, 1, 1, 81, 82, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 84, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 85, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 86, 87, 31, 31, 88, 89, - 1, 1, 1, 1, 1, 1, 1, 90, 1, 1, 91, 31, 31, 31, 31, 31, - 1, 92, 93, 31, 31, 31, 31, 31, 31, 31, 31, 31, 94, 31, 31, 31, - 31, 31, 31, 31, 95, 96, 97, 98, 31, 31, 31, 31, 31, 31, 31, 31, - 99, 100, 101, 31, 31, 31, 31, 31, 102, 103, 31, 31, 31, 31, 104, 31, - 31, 105, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 1, 1, 106, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 107, 108, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 109, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 110, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 111, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_alphanumeric_stage_3[] = { - 0, 0, 0, 1, 2, 3, 2, 3, 0, 0, 4, 5, 6, 7, 6, 7, +static RE_UINT16 re_xid_continue_table_2[] = { + 0, 1, 2, 3, 0, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 7, 8, 6, 6, 6, 9, 10, 11, 6, 12, + 6, 6, 6, 6, 13, 6, 6, 6, 6, 14, 15, 6, 16, 17, 18, 19, + 20, 6, 6, 21, 6, 6, 22, 23, 24, 6, 25, 6, 6, 26, 6, 27, + 6, 28, 29, 30, 0, 31, 32, 11, 6, 6, 6, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 43, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 53, 6, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 0, 70, 71, 72, 0, 73, 74, 75, 76, 77, 78, 79, 0, + 6, 6, 80, 6, 81, 6, 82, 83, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 84, 6, 85, 86, 87, 6, 88, 6, 89, 90, 91, 6, 6, 92, + 67, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 93, 3, 6, 6, 94, 95, 96, 97, 98, 6, 6, 99, 100, + 101, 6, 6, 102, 6, 103, 6, 104, 105, 106, 107, 108, 6, 109, 110, 0, + 29, 6, 105, 111, 112, 113, 114, 0, 6, 6, 115, 116, 6, 6, 6, 97, + 6, 117, 118, 81, 119, 89, 120, 68, 6, 6, 6, 6, 6, 6, 6, 121, + 6, 6, 6, 6, 6, 6, 6, 6, 92, 6, 122, 81, 6, 123, 124, 125, + 0, 126, 127, 128, 129, 0, 129, 130, 131, 132, 133, 6, 134, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 135, 105, 6, 6, 6, 6, 136, 6, 82, 6, 137, 138, 139, 139, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 140, 141, 67, 6, 142, 67, 6, 83, 143, 14, 6, 6, 144, 6, 0, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 10, 0, - 0, 0, 0, 0, 11, 0, 0, 12, 13, 6, 14, 6, 6, 6, 6, 15, - 6, 6, 6, 6, 6, 6, 6, 6, 16, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 2, 6, 17, 6, 6, 18, 0, 0, 19, 20, 6, 21, 22, - 0, 3, 6, 6, 6, 23, 24, 6, 6, 6, 6, 6, 6, 25, 26, 27, - 0, 6, 6, 6, 28, 6, 6, 6, 6, 6, 6, 9, 6, 6, 3, 29, - 6, 30, 31, 0, 6, 18, 3, 0, 0, 0, 6, 32, 0, 33, 34, 6, - 6, 6, 6, 35, 36, 37, 38, 2, 39, 40, 41, 42, 43, 44, 38, 45, - 46, 40, 41, 47, 48, 49, 50, 51, 52, 14, 41, 53, 54, 55, 38, 56, - 57, 40, 41, 53, 58, 59, 38, 60, 61, 62, 63, 24, 64, 65, 50, 0, - 66, 67, 41, 68, 69, 70, 38, 0, 66, 67, 41, 71, 69, 72, 38, 73, - 66, 67, 6, 74, 75, 76, 38, 77, 78, 79, 6, 80, 81, 82, 50, 83, - 2, 6, 6, 3, 84, 1, 0, 0, 85, 6, 86, 87, 88, 89, 0, 0, - 55, 0, 1, 0, 23, 6, 31, 2, 90, 23, 6, 31, 0, 0, 0, 0, - 6, 6, 6, 91, 1, 6, 6, 6, 6, 92, 6, 6, 93, 6, 6, 94, - 6, 6, 6, 6, 95, 96, 6, 6, 95, 6, 6, 97, 98, 7, 6, 6, - 6, 98, 6, 6, 6, 3, 0, 0, 6, 0, 6, 6, 6, 6, 6, 99, - 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 27, 6, 2, 3, 6, 6, 6, 6, 100, 18, - 36, 101, 6, 101, 6, 101, 36, 102, 6, 6, 6, 38, 18, 103, 1, 0, - 0, 1, 6, 6, 6, 6, 6, 18, 6, 6, 3, 6, 6, 6, 6, 51, - 6, 104, 105, 18, 50, 6, 92, 106, 6, 6, 105, 6, 1, 1, 0, 0, - 6, 105, 6, 6, 6, 104, 2, 106, 1, 1, 107, 0, 0, 0, 0, 0, - 6, 6, 6, 108, 109, 1, 0, 0, 6, 6, 89, 6, 6, 6, 15, 9, - 6, 6, 6, 110, 68, 6, 6, 92, 18, 6, 6, 74, 0, 0, 111, 112, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 113, 106, - 6, 99, 6, 6, 99, 114, 6, 92, 6, 6, 6, 115, 116, 117, 31, 116, - 0, 0, 0, 0, 0, 0, 0, 118, 0, 31, 0, 0, 0, 0, 0, 0, - 119, 120, 121, 89, 122, 0, 6, 6, 18, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 6, 6, 1, 0, - 6, 6, 104, 6, 6, 104, 6, 6, 6, 6, 6, 6, 6, 6, 123, 83, - 6, 6, 93, 6, 6, 6, 124, 0, 6, 110, 125, 125, 125, 125, 6, 6, - 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 127, 0, 128, 129, 2, 6, 6, 6, 6, 130, 2, 6, 6, 6, 6, 94, - 131, 6, 6, 2, 6, 6, 6, 6, 104, 0, 6, 3, 0, 0, 0, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 51, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 31, 0, 0, 0, 0, 6, 6, 92, - 31, 6, 105, 0, 6, 6, 104, 132, 6, 6, 6, 6, 6, 6, 6, 0, - 0, 113, 133, 6, 6, 6, 6, 6, 134, 6, 6, 6, 135, 0, 0, 113, - 15, 6, 136, 0, 6, 6, 6, 101, 6, 6, 6, 6, 137, 1, 0, 138, - 6, 6, 3, 6, 6, 22, 6, 31, 6, 6, 6, 139, 126, 1, 6, 104, - 6, 6, 6, 110, 92, 1, 6, 79, 6, 6, 6, 104, 140, 141, 6, 142, - 143, 144, 125, 6, 6, 94, 136, 6, 6, 6, 6, 6, 6, 6, 3, 1, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 101, 6, 145, 6, 6, 105, - 6, 6, 6, 6, 6, 6, 92, 6, 6, 6, 6, 6, 6, 1, 0, 0, - 110, 146, 41, 147, 148, 6, 6, 6, 6, 6, 6, 9, 0, 149, 6, 6, - 6, 6, 6, 92, 0, 6, 6, 6, 6, 133, 6, 6, 136, 0, 0, 105, - 0, 0, 0, 0, 0, 0, 0, 150, 6, 6, 6, 6, 6, 6, 6, 31, - 0, 1, 2, 3, 2, 3, 50, 6, 6, 6, 6, 104, 151, 152, 0, 0, - 35, 6, 7, 153, 92, 92, 0, 0, 6, 6, 6, 6, 6, 6, 6, 3, - 0, 0, 0, 0, 6, 6, 6, 106, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 31, 6, 6, 6, 55, 0, 0, - 6, 6, 28, 6, 3, 6, 6, 3, 6, 92, 6, 6, 154, 155, 0, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 92, 1, 6, 6, 154, 6, 105, - 6, 6, 136, 6, 6, 6, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 110, 6, 51, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 156, 6, 6, 157, 6, 51, 6, 110, 6, 104, 0, 0, 0, 0, 6, 158, - 6, 51, 6, 1, 0, 0, 0, 0, 6, 6, 6, 159, 0, 0, 0, 0, - 160, 161, 6, 51, 0, 0, 6, 31, 6, 31, 0, 0, 23, 6, 106, 0, - 6, 6, 6, 51, 6, 51, 6, 22, 6, 9, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 18, 0, 0, 0, 6, 6, 6, 22, 6, 6, 6, 22, - 6, 6, 136, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 31, 107, 6, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 110, - 6, 6, 6, 6, 51, 0, 50, 0, 133, 6, 6, 18, 0, 6, 18, 1, - 6, 6, 6, 162, 163, 6, 6, 164, 6, 6, 6, 6, 165, 166, 0, 0, - 6, 14, 6, 167, 0, 0, 0, 0, 168, 19, 18, 6, 6, 6, 18, 1, - 39, 40, 41, 53, 58, 169, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 170, 171, 0, 0, 6, 6, 6, 6, 172, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 173, 0, 174, 0, 0, - 6, 6, 6, 104, 175, 1, 0, 0, 6, 6, 6, 176, 1, 0, 0, 0, - 6, 74, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 18, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 1, 126, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 6, 6, 30, 177, 0, - 6, 6, 6, 178, 0, 6, 6, 6, 6, 179, 0, 0, 6, 6, 6, 18, - 41, 6, 6, 125, 55, 1, 0, 133, 6, 133, 23, 110, 0, 0, 0, 0, - 180, 6, 6, 181, 182, 1, 183, 6, 104, 184, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 110, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 104, 0, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 18, 6, 104, 1, 0, 0, 0, 0, 0, 0, 6, 92, 0, - 6, 6, 6, 0, 101, 1, 149, 185, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 21, 6, 6, 6, 124, 6, 0, 0, 0, 0, 186, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 136, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 22, - 6, 104, 0, 0, 0, 22, 187, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 105, - 6, 6, 6, 6, 6, 6, 3, 31, 18, 188, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 150, 6, 6, 6, 36, 189, 190, 108, 6, 6, 6, - 191, 192, 6, 193, 194, 67, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 195, 6, 67, 94, 6, 94, - 6, 150, 6, 150, 104, 6, 104, 6, 41, 6, 41, 6, 196, 6, 6, 6, - 7, 134, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 31, 198, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 105, 1, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 106, 0, 0, 0, - 6, 6, 6, 6, 199, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 108, 6, 200, 201, 202, 203, 204, 205, 206, 105, 207, 105, 0, 0, 0, 0, - 0, 0, 0, 6, 1, 6, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 110, 0, 0, - 6, 6, 6, 106, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 92, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 55, 0, - 6, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_alphanumeric_stage_4[] = { - 0, 0, 255, 3, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, - 195, 255, 3, 0, 31, 80, 32, 0, 223, 188, 64, 215, 251, 255, 191, 255, - 3, 252, 127, 2, 255, 1, 255, 191, 182, 0, 255, 135, 7, 0, 255, 254, - 255, 195, 239, 31, 254, 225, 255, 159, 0, 224, 48, 4, 255, 252, 255, 31, - 223, 63, 240, 255, 248, 3, 255, 239, 255, 223, 225, 255, 207, 255, 239, 159, - 249, 255, 255, 253, 197, 227, 159, 89, 128, 176, 3, 16, 238, 135, 109, 195, - 135, 25, 2, 94, 192, 255, 63, 0, 238, 191, 237, 227, 191, 27, 1, 0, - 0, 30, 238, 159, 159, 25, 192, 176, 2, 0, 236, 199, 61, 214, 24, 199, - 199, 29, 129, 0, 239, 223, 253, 255, 255, 227, 223, 29, 96, 7, 239, 227, - 96, 64, 6, 0, 255, 231, 223, 93, 240, 128, 0, 252, 236, 255, 127, 252, - 251, 47, 127, 128, 95, 255, 12, 0, 127, 32, 214, 247, 175, 255, 255, 59, - 95, 32, 255, 243, 3, 255, 127, 249, 255, 63, 191, 32, 255, 247, 255, 61, - 127, 61, 61, 127, 61, 255, 63, 63, 255, 199, 15, 0, 13, 0, 128, 16, - 255, 127, 255, 15, 31, 0, 128, 0, 239, 255, 239, 15, 127, 0, 0, 222, - 111, 4, 128, 255, 255, 170, 223, 95, 220, 31, 207, 15, 2, 128, 132, 252, - 47, 62, 80, 189, 224, 67, 31, 120, 255, 128, 127, 127, 0, 128, 224, 0, - 254, 3, 62, 31, 127, 224, 224, 255, 240, 143, 252, 255, 255, 249, 124, 0, - 255, 0, 47, 0, 252, 232, 247, 255, 5, 0, 0, 56, 60, 0, 126, 126, - 126, 0, 127, 248, 248, 224, 127, 95, 219, 255, 248, 255, 223, 255, 252, 252, - 252, 28, 255, 183, 15, 255, 62, 0, 63, 253, 191, 145, 55, 0, 255, 192, - 111, 240, 239, 254, 199, 255, 112, 0, 71, 0, 30, 0, 255, 23, 159, 64, - 127, 189, 129, 224, 187, 7, 255, 131, 179, 0, 63, 127, 0, 63, 17, 0, - 63, 1, 26, 0, 231, 127, 255, 32, 127, 251, 127, 180, 203, 0, 191, 253, - 123, 1, 255, 224, 11, 0, 240, 0, 255, 67, 100, 222, 255, 235, 191, 231, - 223, 223, 255, 123, 95, 252, 63, 255, 247, 207, 219, 7, 128, 63, 143, 8, - 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 238, 251, -}; - -/* Alphanumeric: 2912 bytes. */ - -RE_UINT32 re_get_alphanumeric(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_alphanumeric_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_alphanumeric_stage_2[pos + f] << 4; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_alphanumeric_stage_3[pos + f] << 4; - pos += code; - value = (re_alphanumeric_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Any. */ - -RE_UINT32 re_get_any(RE_UINT32 ch) { - return 1; -} - -/* Blank. */ - -static RE_UINT8 re_blank_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_blank_stage_2[] = { - 0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_blank_stage_3[] = { - 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, - 3, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_blank_stage_4[] = { - 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 78, + 6, 6, 6, 6, 145, 0, 24, 81, 6, 6, 6, 6, 6, 6, 6, 6, + 146, 147, 6, 148, 6, 6, 6, 26, 149, 150, 6, 6, 151, 6, 152, 153, + 6, 154, 6, 97, 6, 6, 155, 156, 6, 157, 97, 78, 6, 6, 158, 105, + 6, 138, 159, 160, 6, 6, 161, 162, 163, 164, 83, 80, 6, 6, 6, 165, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 166, 167, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 157, 6, 6, 168, 0, 169, 170, 171, 6, 6, 26, 172, 6, + 6, 6, 81, 173, 6, 6, 6, 6, 6, 81, 24, 6, 174, 6, 175, 1, + 91, 176, 177, 178, 6, 6, 6, 78, 1, 2, 3, 107, 6, 105, 179, 0, + 180, 181, 182, 0, 6, 6, 6, 68, 0, 0, 6, 96, 0, 0, 0, 183, + 0, 0, 0, 0, 78, 6, 184, 114, 6, 185, 103, 68, 81, 6, 186, 0, + 6, 6, 6, 6, 81, 80, 187, 29, 6, 188, 6, 189, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 138, 104, 175, 0, 0, 0, 0, + 190, 191, 104, 138, 105, 0, 0, 192, 104, 168, 0, 0, 6, 193, 0, 0, + 194, 195, 0, 78, 78, 0, 75, 196, 6, 104, 104, 197, 26, 0, 0, 0, + 6, 6, 134, 0, 6, 197, 6, 197, 6, 198, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 199, 0, 0, 78, 200, 184, 0, 0, 24, 201, 138, + 6, 6, 196, 202, 6, 68, 24, 203, 6, 31, 204, 205, 6, 6, 206, 0, + 207, 208, 0, 0, 209, 119, 6, 210, 34, 211, 212, 213, 0, 0, 0, 0, + 6, 6, 214, 215, 6, 6, 216, 0, 0, 0, 0, 0, 6, 217, 218, 0, + 6, 6, 219, 0, 6, 102, 100, 0, 89, 115, 0, 0, 0, 0, 0, 0, + 6, 68, 0, 0, 0, 6, 6, 220, 221, 222, 223, 0, 0, 224, 225, 226, + 6, 105, 200, 6, 227, 0, 6, 102, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 5, 229, 230, 174, 231, 0, 0, 232, 233, 198, 234, 235, 100, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 236, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 168, 0, 0, 0, + 6, 6, 6, 144, 6, 6, 6, 6, 6, 6, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 7, 0, 0, 0, 128, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, -}; - -/* Blank: 218 bytes. */ - -RE_UINT32 re_get_blank(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_blank_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_blank_stage_2[pos + f] << 3; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_blank_stage_3[pos + f] << 7; - pos += code; - value = (re_blank_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Graph. */ - -static RE_UINT8 re_graph_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 7, 7, 7, 14, - 15, 16, 17, 18, 19, 13, 20, 13, 21, 13, 13, 13, 13, 22, 7, 7, - 23, 24, 13, 13, 13, 13, 25, 26, 13, 13, 27, 28, 29, 30, 31, 32, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 33, 7, 34, 35, 7, 36, 7, 7, 7, 37, 13, 38, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 39, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, -}; - -static RE_UINT8 re_graph_stage_2[] = { - 0, 1, 2, 2, 2, 2, 3, 4, 2, 2, 5, 6, 7, 2, 8, 9, - 10, 11, 2, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 2, 25, 2, 2, 26, 27, 28, 29, 2, 2, 2, 2, 2, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 2, 43, 2, 2, 44, 45, - 46, 47, 2, 48, 2, 2, 2, 2, 49, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 50, 51, 52, 53, 54, 55, 56, 57, 2, 58, - 59, 60, 61, 62, 63, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 64, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 65, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 66, 2, 2, 67, 68, 2, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 78, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 2, 2, 2, 2, 80, 81, 82, 83, 2, 2, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 79, 94, 95, 96, 2, 97, 98, 79, 2, 2, 99, 79, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 79, 111, 79, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 79, 121, 122, 79, 123, 124, 125, 126, 79, - 127, 128, 79, 129, 130, 131, 79, 79, 132, 133, 134, 135, 79, 136, 79, 137, - 2, 2, 2, 2, 2, 2, 2, 138, 139, 2, 140, 79, 79, 79, 79, 79, - 2, 2, 2, 2, 2, 2, 2, 2, 141, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 2, 2, 2, 2, 142, 79, 79, 79, - 2, 2, 2, 2, 143, 144, 145, 146, 79, 79, 79, 79, 147, 148, 149, 150, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 68, - 2, 2, 2, 2, 2, 151, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 2, 2, 152, 2, 2, 153, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 154, 155, 79, 79, 79, 79, 79, 79, - 2, 156, 157, 158, 159, 160, 161, 79, 162, 163, 164, 2, 2, 165, 2, 166, - 2, 2, 2, 2, 2, 167, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 168, 79, 169, 79, 79, 170, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 2, 171, 172, 79, 79, 79, 79, 79, 173, 174, 175, 79, 176, 177, 79, 79, - 178, 179, 180, 181, 182, 79, 2, 2, 2, 2, 2, 2, 2, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 192, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 193, 2, - 194, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 195, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 196, 79, 79, 79, 79, 79, 79, 79, 79, - 2, 2, 2, 2, 197, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 198, 79, 2, 65, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 199, -}; - -static RE_UINT8 re_graph_stage_3[] = { - 0, 0, 1, 2, 2, 2, 2, 3, 0, 0, 1, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, - 5, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 7, 2, 2, - 8, 1, 2, 2, 9, 2, 10, 11, 2, 12, 2, 2, 2, 2, 2, 2, - 13, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, 14, 2, 2, 2, 8, - 2, 2, 15, 3, 2, 16, 17, 0, 0, 0, 2, 18, 0, 19, 2, 2, - 20, 21, 22, 23, 24, 25, 26, 3, 27, 21, 22, 28, 29, 30, 31, 32, - 33, 6, 22, 34, 35, 36, 26, 37, 38, 21, 22, 34, 39, 40, 26, 9, - 41, 42, 43, 44, 45, 46, 31, 17, 12, 47, 22, 48, 49, 50, 26, 51, - 12, 47, 22, 52, 49, 53, 26, 54, 55, 47, 2, 2, 56, 57, 26, 2, - 58, 59, 2, 60, 61, 62, 31, 63, 1, 2, 2, 10, 2, 64, 0, 0, - 65, 2, 66, 15, 67, 68, 0, 0, 2, 2, 2, 2, 69, 2, 70, 1, - 2, 69, 2, 12, 12, 17, 0, 0, 2, 2, 2, 2, 71, 2, 2, 2, - 2, 2, 2, 2, 72, 73, 2, 2, 72, 2, 2, 74, 75, 76, 2, 2, - 2, 75, 2, 2, 2, 8, 2, 70, 2, 77, 2, 2, 2, 2, 2, 78, - 1, 70, 2, 2, 2, 2, 2, 79, 12, 11, 2, 32, 2, 80, 12, 81, - 2, 2, 2, 2, 2, 15, 77, 77, 3, 77, 2, 2, 2, 2, 2, 79, - 2, 2, 17, 2, 2, 2, 2, 82, 2, 3, 64, 64, 83, 2, 15, 11, - 2, 2, 64, 2, 77, 84, 2, 2, 2, 85, 2, 2, 2, 3, 2, 86, - 77, 77, 15, 3, 0, 0, 0, 0, 2, 2, 2, 2, 64, 2, 2, 70, - 2, 2, 2, 2, 2, 2, 2, 87, 2, 2, 2, 88, 48, 2, 2, 2, - 79, 2, 2, 8, 9, 2, 2, 17, 2, 2, 2, 2, 2, 2, 2, 89, - 2, 78, 2, 2, 78, 90, 2, 15, 2, 2, 2, 91, 91, 92, 2, 93, - 94, 2, 95, 2, 2, 3, 91, 96, 3, 70, 2, 2, 0, 2, 2, 36, - 64, 2, 2, 2, 2, 2, 2, 2, 2, 2, 32, 0, 17, 0, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 26, 2, 97, 2, 2, 2, 2, 2, 2, - 2, 2, 3, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 98, - 2, 2, 71, 2, 2, 2, 99, 100, 2, 32, 101, 101, 101, 101, 2, 2, - 2, 2, 2, 2, 2, 0, 0, 0, 2, 89, 2, 2, 2, 2, 2, 80, - 2, 2, 2, 2, 2, 82, 0, 64, 1, 2, 2, 2, 1, 2, 2, 2, - 2, 7, 2, 2, 2, 2, 2, 2, 102, 2, 2, 1, 2, 2, 2, 2, - 3, 2, 2, 17, 2, 2, 80, 2, 2, 3, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 82, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, - 70, 2, 2, 2, 32, 2, 2, 2, 2, 2, 64, 0, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2, 103, 0, 0, 51, - 2, 2, 64, 77, 2, 2, 2, 9, 2, 2, 2, 2, 104, 77, 2, 2, - 2, 2, 2, 2, 2, 105, 2, 70, 2, 2, 2, 2, 13, 44, 2, 3, - 2, 2, 2, 32, 15, 68, 2, 2, 2, 2, 2, 2, 106, 94, 2, 32, - 107, 108, 101, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 15, 77, - 2, 2, 80, 2, 109, 2, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, 2, 77, 0, 0, - 32, 110, 2, 111, 112, 2, 2, 2, 2, 2, 2, 2, 14, 19, 2, 2, - 2, 2, 2, 2, 0, 2, 2, 2, 2, 113, 2, 2, 9, 0, 0, 15, - 2, 77, 2, 2, 2, 114, 115, 91, 2, 2, 2, 2, 2, 2, 2, 86, - 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 116, 117, 101, 118, - 119, 2, 76, 120, 15, 15, 0, 0, 2, 2, 2, 2, 2, 2, 2, 17, - 121, 2, 2, 122, 2, 2, 2, 2, 3, 64, 36, 0, 0, 2, 2, 15, - 2, 70, 2, 2, 2, 36, 2, 64, 2, 2, 123, 2, 17, 2, 2, 17, - 2, 13, 2, 2, 124, 82, 0, 0, 2, 15, 77, 2, 2, 124, 2, 64, - 2, 2, 9, 2, 2, 2, 105, 0, 2, 2, 2, 32, 2, 82, 9, 0, - 125, 2, 2, 126, 2, 127, 2, 2, 2, 3, 51, 0, 0, 0, 2, 128, - 2, 129, 2, 130, 0, 0, 0, 0, 2, 2, 2, 131, 2, 113, 2, 2, - 132, 133, 2, 134, 79, 79, 2, 2, 2, 2, 0, 0, 2, 2, 109, 32, - 2, 2, 2, 135, 2, 97, 2, 136, 2, 137, 138, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 79, 0, 0, 0, 2, 2, 2, 106, 2, 2, 2, 139, - 2, 2, 9, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, - 2, 2, 9, 2, 2, 77, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, - 2, 2, 2, 2, 15, 113, 2, 140, 2, 2, 2, 2, 141, 2, 79, 77, - 2, 2, 2, 91, 32, 2, 2, 32, 2, 2, 2, 2, 15, 2, 1, 11, - 2, 6, 2, 3, 0, 0, 0, 0, 142, 13, 77, 2, 2, 2, 17, 77, - 20, 21, 22, 143, 39, 144, 145, 11, 2, 2, 2, 2, 2, 146, 0, 0, - 2, 2, 2, 2, 9, 77, 0, 0, 2, 2, 2, 97, 2, 15, 0, 0, - 2, 2, 2, 2, 11, 77, 70, 0, 2, 2, 2, 79, 77, 0, 0, 0, - 2, 8, 64, 2, 0, 0, 0, 0, 2, 2, 2, 64, 0, 0, 0, 0, - 0, 0, 2, 2, 2, 2, 2, 147, 0, 0, 4, 2, 2, 4, 11, 0, - 2, 2, 2, 2, 9, 2, 2, 2, 2, 2, 106, 0, 2, 2, 2, 79, - 22, 2, 2, 76, 82, 2, 70, 2, 2, 113, 69, 32, 0, 0, 0, 0, - 148, 2, 2, 149, 9, 77, 150, 2, 3, 151, 77, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 79, 0, 0, 0, 0, 2, 2, 2, 152, - 2, 77, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 3, 11, - 2, 2, 2, 2, 80, 0, 0, 0, 2, 2, 3, 79, 0, 0, 0, 0, - 2, 2, 2, 2, 32, 0, 0, 0, 2, 2, 2, 79, 2, 3, 44, 0, - 0, 0, 0, 0, 0, 2, 15, 82, 2, 2, 2, 2, 82, 89, 6, 153, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, - 2, 17, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 10, 2, 2, 2, - 99, 2, 0, 0, 0, 0, 80, 0, 2, 2, 2, 2, 2, 2, 2, 106, - 2, 3, 0, 0, 0, 106, 154, 2, 2, 2, 2, 2, 2, 2, 2, 64, - 2, 2, 2, 2, 2, 2, 17, 70, 79, 68, 80, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 82, 2, 2, 7, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 79, 0, 2, 2, 2, 2, 82, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 80, 2, 2, 2, 2, 2, 32, 2, 79, - 2, 2, 2, 2, 2, 91, 2, 2, 2, 12, 155, 146, 156, 2, 2, 2, - 157, 158, 2, 159, 160, 47, 2, 2, 2, 2, 97, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 85, 2, 2, 2, 64, 94, 1, 0, 0, 0, 0, 0, - 76, 161, 162, 0, 0, 0, 0, 0, 2, 2, 70, 15, 44, 0, 0, 0, - 0, 0, 0, 0, 2, 2, 2, 130, 2, 2, 2, 2, 163, 32, 0, 0, - 2, 2, 2, 2, 64, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 2, 2, 2, 11, 0, 0, 0, 0, 1, 2, 2, 15, 0, 0, 0, 0, - 156, 2, 164, 165, 166, 167, 168, 169, 89, 64, 170, 64, 0, 0, 0, 14, - 2, 2, 64, 2, 2, 2, 2, 2, 2, 80, 3, 1, 1, 1, 2, 82, - 70, 2, 2, 2, 2, 2, 70, 2, 2, 2, 70, 0, 0, 0, 31, 2, - 106, 2, 2, 64, 79, 14, 82, 0, 2, 2, 2, 2, 2, 82, 70, 17, - 2, 2, 2, 2, 2, 2, 2, 80, 2, 2, 2, 2, 2, 79, 64, 0, - 64, 2, 2, 2, 9, 77, 2, 2, 9, 2, 15, 0, 0, 0, 0, 0, - 119, 2, 2, 2, 2, 2, 2, 171, 2, 2, 172, 2, 8, 2, 2, 2, - 2, 2, 2, 2, 2, 80, 15, 173, 106, 82, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 32, 0, 0, 2, 2, 2, 11, 2, 2, 2, 2, - 2, 15, 2, 2, 2, 2, 2, 2, 2, 2, 14, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 36, 0, 2, 15, 0, 0, 0, 0, 0, 0, - 174, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, -}; - -static RE_UINT8 re_graph_stage_4[] = { - 0, 0, 254, 255, 255, 255, 255, 127, 255, 252, 240, 215, 251, 255, 127, 254, - 255, 231, 255, 0, 255, 135, 31, 0, 255, 223, 255, 191, 3, 0, 255, 63, - 255, 79, 255, 7, 223, 63, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243, - 159, 121, 128, 176, 207, 255, 238, 135, 109, 211, 135, 57, 2, 94, 192, 255, - 127, 0, 238, 191, 237, 243, 191, 59, 1, 0, 3, 254, 238, 159, 159, 57, - 192, 176, 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, 253, 255, - 255, 227, 223, 61, 96, 7, 128, 255, 239, 243, 96, 64, 6, 0, 239, 223, - 223, 253, 240, 255, 236, 255, 127, 252, 251, 47, 127, 132, 95, 255, 28, 0, - 255, 15, 214, 247, 175, 255, 95, 63, 255, 243, 255, 254, 255, 31, 191, 32, - 255, 61, 127, 61, 61, 127, 61, 255, 127, 255, 255, 3, 63, 63, 255, 1, - 15, 0, 13, 0, 63, 0, 241, 255, 255, 199, 255, 207, 255, 159, 15, 240, - 255, 248, 255, 251, 255, 170, 223, 255, 207, 239, 220, 127, 0, 248, 255, 124, - 243, 255, 63, 255, 15, 254, 255, 128, 1, 128, 127, 127, 224, 255, 124, 0, - 63, 192, 15, 128, 7, 0, 126, 126, 126, 0, 127, 248, 248, 224, 127, 95, - 219, 255, 252, 255, 247, 255, 127, 15, 252, 252, 252, 28, 0, 62, 255, 239, - 255, 183, 135, 255, 143, 255, 15, 224, 15, 255, 63, 253, 191, 145, 191, 255, - 55, 248, 255, 143, 255, 131, 255, 240, 111, 240, 239, 254, 63, 135, 63, 254, - 7, 255, 3, 30, 0, 254, 7, 252, 0, 128, 3, 32, 127, 189, 237, 251, - 129, 224, 207, 31, 255, 235, 7, 128, 127, 251, 127, 180, 191, 253, 251, 1, - 3, 128, 255, 224, 240, 0, 100, 222, 239, 255, 191, 231, 223, 223, 255, 123, - 95, 252, 255, 249, 219, 7, 159, 255, 150, 254, 247, 10, 132, 234, 150, 170, - 150, 247, 247, 94, 238, 251, 123, 252, 231, 199, 15, 7, 2, 0, -}; - -/* Graph: 3150 bytes. */ - -RE_UINT32 re_get_graph(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_graph_stage_1[f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_graph_stage_2[pos + f] << 3; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_graph_stage_3[pos + f] << 4; - pos += code; - value = (re_graph_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Print. */ - -static RE_UINT8 re_print_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 5, 9, - 10, 11, 12, 13, 14, 15, 16, 5, 17, 15, 15, 18, 15, 19, 20, 21, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 23, 24, 5, 25, 26, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 28, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 28, -}; - -static RE_UINT8 re_print_stage_2[] = { - 0, 1, 1, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 1, 15, 16, 1, 1, 17, 18, 19, 20, 21, 22, 23, 24, 1, 25, - 26, 27, 1, 1, 28, 1, 1, 1, 1, 1, 1, 29, 30, 31, 32, 33, - 34, 35, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, - 1, 1, 1, 1, 39, 1, 40, 41, 42, 43, 44, 45, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 46, 47, 47, 47, 47, 47, 47, 47, 47, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 48, 49, 1, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 1, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 47, 79, 80, 81, 82, - 1, 1, 1, 83, 84, 85, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 1, 1, 1, 1, 86, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 1, 1, 87, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 1, 1, 88, 89, 47, 47, 90, 91, - 1, 1, 1, 1, 1, 1, 1, 92, 1, 1, 93, 47, 47, 47, 47, 47, - 1, 94, 95, 47, 47, 47, 47, 47, 47, 47, 47, 47, 96, 47, 47, 47, - 97, 98, 99, 100, 101, 102, 103, 104, 1, 1, 105, 47, 47, 47, 47, 47, - 106, 107, 108, 47, 47, 47, 47, 47, 109, 110, 47, 47, 111, 112, 113, 47, - 114, 115, 116, 1, 1, 1, 117, 118, 119, 120, 121, 47, 47, 47, 47, 47, - 1, 1, 1, 1, 1, 1, 122, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 123, 124, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 125, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 126, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 1, 1, 127, 47, 47, 47, 47, 47, - 128, 38, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 129, -}; - -static RE_UINT8 re_print_stage_3[] = { - 0, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 4, 5, 1, 1, 1, 6, 7, 1, 8, 1, 9, 10, - 11, 1, 1, 1, 1, 1, 1, 1, 12, 1, 13, 1, 1, 14, 1, 15, - 1, 16, 17, 18, 0, 19, 20, 1, 1, 1, 1, 1, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 30, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 40, 44, 45, 46, 47, 1, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 0, 57, 58, 59, 0, 1, 1, 60, 61, 62, 11, 63, 0, - 1, 1, 1, 1, 1, 1, 64, 1, 1, 1, 65, 1, 66, 67, 68, 1, - 69, 1, 15, 70, 71, 1, 1, 72, 1, 1, 1, 1, 70, 1, 1, 73, - 74, 75, 76, 77, 1, 1, 78, 79, 80, 1, 1, 73, 1, 81, 1, 82, - 2, 83, 84, 85, 1, 86, 87, 1, 88, 1, 2, 89, 79, 16, 0, 0, - 1, 1, 86, 70, 1, 1, 1, 90, 1, 91, 92, 1, 93, 15, 9, 94, - 1, 1, 1, 1, 1, 1, 1, 95, 72, 1, 96, 78, 1, 97, 98, 99, - 1, 100, 1, 101, 102, 1, 103, 104, 1, 1, 1, 1, 86, 1, 1, 1, - 1, 105, 18, 1, 1, 1, 1, 1, 1, 1, 1, 106, 107, 1, 1, 1, - 1, 108, 2, 1, 1, 1, 1, 109, 1, 64, 1, 110, 75, 111, 111, 1, - 1, 1, 112, 0, 95, 1, 1, 76, 1, 1, 1, 1, 1, 1, 82, 113, - 1, 1, 54, 1, 7, 1, 1, 1, 114, 6, 1, 1, 108, 94, 1, 115, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 82, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 112, 1, 1, 1, 1, 116, 1, 117, 1, - 1, 118, 1, 1, 1, 1, 1, 119, 1, 1, 1, 1, 1, 1, 120, 121, - 1, 122, 1, 119, 1, 1, 123, 1, 1, 1, 124, 70, 1, 1, 125, 2, - 1, 75, 126, 1, 1, 1, 127, 75, 128, 129, 1, 9, 1, 1, 1, 130, - 1, 1, 1, 1, 1, 115, 131, 56, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 132, 1, 1, 71, 0, 133, 134, 135, 1, 1, 1, 136, 1, - 1, 1, 103, 1, 137, 1, 138, 139, 71, 1, 140, 141, 1, 1, 1, 89, - 54, 1, 1, 1, 1, 2, 142, 143, 144, 145, 146, 0, 1, 1, 1, 94, - 147, 148, 1, 1, 149, 150, 103, 78, 0, 0, 0, 0, 70, 1, 104, 56, - 1, 151, 81, 94, 152, 1, 153, 0, 1, 1, 1, 1, 78, 154, 155, 56, - 1, 9, 1, 156, 0, 0, 0, 0, 1, 75, 82, 138, 0, 0, 0, 0, - 157, 158, 159, 1, 2, 160, 0, 161, 162, 163, 0, 0, 1, 164, 137, 1, - 165, 166, 167, 1, 1, 0, 1, 168, 1, 169, 107, 170, 171, 172, 0, 0, - 1, 1, 173, 0, 1, 174, 1, 175, 1, 176, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 1, 9, 71, 0, 0, 0, 0, 75, - 1, 1, 177, 178, 1, 1, 179, 180, 1, 97, 117, 75, 1, 1, 132, 181, - 182, 2, 0, 0, 183, 154, 1, 184, 21, 185, 186, 187, 0, 0, 0, 0, - 1, 1, 188, 0, 1, 1, 176, 0, 0, 0, 0, 0, 1, 107, 78, 0, - 1, 1, 189, 190, 1, 73, 191, 0, 15, 86, 0, 0, 0, 0, 0, 0, - 1, 56, 0, 0, 0, 1, 1, 192, 0, 0, 0, 0, 0, 100, 3, 193, - 1, 1, 9, 1, 1, 194, 1, 73, 195, 196, 197, 116, 137, 198, 0, 0, - 199, 200, 176, 201, 202, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, - 0, 0, 0, 0, 0, 0, 1, 203, 1, 1, 1, 1, 71, 0, 0, 0, - 1, 1, 1, 204, 1, 1, 1, 1, 1, 1, 205, 0, 0, 0, 0, 0, - 1, 206, 0, 0, 0, 0, 0, 0, 1, 1, 105, 0, 0, 0, 0, 0, - 1, 73, 2, 207, 0, 0, 103, 208, 1, 1, 209, 210, 112, 0, 0, 0, - 0, 0, 1, 1, 94, 0, 0, 0, 1, 1, 211, 1, 212, 0, 0, 205, - 1, 1, 1, 1, 1, 1, 1, 119, 1, 1, 1, 1, 1, 1, 1, 174, - 2, 0, 213, 214, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 56, - 1, 1, 1, 215, 216, 205, 0, 0, 1, 1, 1, 1, 1, 1, 1, 82, - 1, 217, 1, 1, 1, 1, 1, 173, 1, 1, 218, 0, 0, 0, 0, 76, - 1, 1, 75, 73, 0, 0, 0, 0, 1, 1, 97, 1, 11, 219, 220, 1, - 221, 222, 223, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 224, 1, 1, - 1, 1, 1, 1, 1, 1, 225, 1, 1, 1, 1, 1, 226, 227, 0, 0, - 228, 229, 0, 0, 0, 0, 0, 0, 1, 230, 207, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 163, 1, 1, 1, 1, 1, 1, 231, 0, - 1, 1, 232, 0, 0, 0, 0, 0, 0, 0, 0, 233, 1, 234, 0, 0, - 54, 78, 0, 0, 0, 0, 0, 0, 220, 235, 236, 237, 238, 239, 0, 240, - 1, 86, 1, 1, 76, 241, 242, 82, 116, 1, 1, 116, 1, 190, 0, 243, - 244, 56, 245, 218, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 82, 246, - 1, 1, 1, 76, 1, 1, 73, 118, 86, 1, 176, 1, 9, 247, 0, 0, - 144, 1, 1, 248, 1, 249, 13, 1, 1, 1, 76, 250, 251, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 75, 0, 1, 234, 1, 1, 1, 1, 1, 1, - 78, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 252, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 150, 78, 0, 0, 0, 0, 0, 0, 0, - 253, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 78, -}; - -static RE_UINT8 re_print_stage_4[] = { - 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 252, - 240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 254, 255, 255, 255, 127, 254, - 255, 231, 254, 255, 255, 0, 255, 255, 255, 135, 31, 0, 255, 255, 255, 223, - 255, 191, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 255, 231, - 255, 63, 255, 127, 255, 255, 255, 79, 255, 7, 0, 0, 255, 255, 223, 63, - 0, 0, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176, - 207, 255, 255, 127, 238, 135, 249, 255, 255, 253, 109, 211, 135, 57, 2, 94, - 192, 255, 127, 0, 238, 191, 251, 255, 255, 253, 237, 243, 191, 59, 1, 0, - 207, 255, 3, 254, 238, 159, 249, 255, 159, 57, 192, 176, 207, 255, 255, 0, - 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, 192, 255, 255, 7, - 255, 223, 253, 255, 255, 253, 255, 227, 223, 61, 96, 7, 207, 255, 128, 255, - 255, 253, 239, 243, 223, 61, 96, 64, 207, 255, 6, 0, 239, 223, 253, 255, - 223, 253, 240, 255, 207, 255, 255, 255, 236, 255, 127, 252, 255, 255, 251, 47, - 127, 132, 95, 255, 192, 255, 28, 0, 254, 255, 255, 255, 255, 255, 255, 135, - 255, 255, 255, 15, 214, 247, 255, 255, 175, 255, 255, 63, 95, 63, 255, 243, - 255, 254, 255, 255, 255, 31, 254, 255, 255, 255, 255, 254, 255, 223, 255, 7, - 191, 32, 255, 255, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, - 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 31, 255, 255, 255, 3, - 255, 255, 63, 63, 255, 255, 255, 1, 255, 223, 31, 0, 255, 255, 127, 0, - 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 255, 63, 255, 3, 255, 3, - 255, 127, 255, 3, 255, 7, 255, 255, 255, 255, 63, 0, 255, 15, 255, 15, - 241, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 199, - 255, 255, 255, 207, 255, 255, 255, 159, 255, 255, 15, 240, 255, 255, 255, 248, - 255, 227, 255, 255, 255, 1, 255, 255, 255, 255, 255, 7, 255, 255, 255, 251, - 63, 63, 255, 170, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127, - 255, 252, 255, 255, 223, 255, 243, 255, 255, 127, 255, 31, 0, 0, 255, 255, - 255, 255, 1, 0, 127, 0, 0, 0, 255, 255, 207, 255, 255, 255, 63, 255, - 255, 127, 255, 255, 255, 255, 15, 254, 255, 128, 1, 128, 127, 127, 127, 127, - 255, 255, 0, 0, 0, 0, 255, 15, 224, 255, 255, 255, 15, 0, 255, 255, - 255, 31, 255, 255, 127, 0, 255, 255, 255, 15, 0, 0, 255, 255, 255, 0, - 124, 0, 0, 0, 0, 0, 128, 255, 255, 15, 255, 3, 63, 192, 255, 3, - 255, 255, 15, 128, 255, 191, 255, 195, 255, 63, 255, 243, 7, 0, 0, 248, - 126, 126, 126, 0, 127, 127, 255, 255, 255, 63, 255, 3, 127, 248, 255, 255, - 255, 63, 255, 255, 127, 0, 248, 224, 255, 255, 127, 95, 219, 255, 255, 255, - 3, 0, 248, 255, 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 63, - 255, 255, 247, 255, 127, 15, 223, 255, 252, 252, 252, 28, 127, 127, 0, 62, - 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 135, 255, 255, 255, - 255, 255, 143, 255, 255, 127, 255, 15, 1, 0, 0, 0, 15, 224, 255, 255, - 255, 255, 255, 191, 15, 255, 63, 0, 255, 3, 255, 255, 255, 255, 15, 255, - 15, 128, 0, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 191, 255, - 128, 255, 0, 0, 255, 255, 55, 248, 255, 255, 255, 143, 255, 255, 255, 131, - 255, 255, 255, 240, 111, 240, 239, 254, 255, 255, 63, 135, 255, 1, 255, 1, - 127, 248, 127, 0, 255, 255, 63, 254, 255, 255, 7, 255, 255, 255, 3, 30, - 0, 254, 0, 0, 255, 1, 0, 0, 255, 255, 7, 0, 255, 255, 7, 252, - 255, 0, 255, 3, 255, 63, 252, 255, 255, 255, 0, 128, 3, 32, 255, 255, - 255, 1, 255, 3, 254, 255, 31, 0, 255, 255, 251, 255, 127, 189, 255, 191, - 255, 7, 255, 3, 255, 253, 237, 251, 159, 57, 129, 224, 207, 31, 31, 0, - 255, 255, 255, 235, 31, 0, 255, 3, 255, 31, 0, 0, 255, 3, 0, 0, - 255, 255, 7, 128, 31, 0, 0, 0, 7, 0, 0, 0, 255, 253, 255, 255, - 255, 255, 127, 255, 63, 0, 255, 255, 255, 254, 127, 0, 127, 251, 255, 255, - 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251, 1, 255, 255, 3, 128, - 255, 127, 31, 0, 15, 0, 0, 0, 255, 127, 255, 1, 255, 195, 0, 0, - 255, 63, 63, 0, 63, 0, 255, 251, 251, 255, 255, 224, 255, 135, 255, 255, - 255, 128, 255, 255, 0, 0, 7, 0, 240, 0, 255, 255, 255, 7, 255, 31, - 255, 1, 255, 243, 127, 254, 255, 255, 63, 0, 0, 0, 100, 222, 255, 235, - 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, - 63, 255, 255, 255, 255, 207, 255, 255, 255, 15, 0, 248, 254, 255, 0, 0, - 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 255, 63, 159, 255, 127, 0, - 255, 15, 255, 195, 0, 0, 254, 255, 255, 255, 31, 0, 150, 254, 247, 10, - 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, - 0, 0, 3, 0, 255, 127, 254, 255, 254, 255, 254, 255, 192, 255, 255, 255, - 7, 0, 255, 255, 255, 1, 3, 0, 255, 31, 255, 7, 255, 63, 0, 0, - 255, 255, 123, 252, 231, 199, 255, 255, 255, 63, 15, 7, 7, 0, 63, 0, - 3, 0, 255, 255, 2, 0, 0, 0, + 6, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 102, 105, 100, 0, 0, 24, 108, 6, 138, 223, 237, 91, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 6, 0, 0, 0, 0, 6, 6, 238, 6, 239, 0, 0, 240, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 117, + 6, 6, 6, 6, 6, 6, 104, 0, 134, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 105, 0, 241, 204, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 242, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 0, 0, + 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 31, 6, 248, 249, 250, 6, 251, 252, 253, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 254, 255, 83, 31, 31, 135, 135, 228, 228, 256, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 257, 6, 258, 259, 260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 261, 262, 0, 0, 0, 0, 0, 0, 6, 263, 264, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 168, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 265, 0, 6, 6, 115, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 250, 266, 267, 268, 269, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 81, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 96, 6, 6, 6, 6, 6, 6, + 81, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 271, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 114, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 91, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_xid_continue_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 135, 254, 255, 255, 7, + 0, 4, 160, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, + 31, 80, 0, 0, 255, 255, 223, 184, 192, 215, 255, 255, 251, 255, 255, 255, + 255, 255, 191, 255, 251, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, + 255, 1, 254, 255, 255, 255, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, + 0, 0, 255, 7, 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159, + 0, 0, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 63, 36, + 255, 63, 0, 0, 255, 255, 255, 15, 255, 7, 0, 0, 255, 255, 223, 255, + 255, 0, 248, 255, 207, 255, 254, 255, 239, 159, 249, 255, 255, 253, 197, 243, + 159, 121, 128, 176, 207, 255, 3, 80, 238, 135, 249, 255, 255, 253, 109, 211, + 135, 57, 2, 94, 192, 255, 63, 0, 238, 191, 251, 255, 255, 253, 237, 243, + 191, 59, 1, 0, 207, 255, 0, 254, 238, 159, 249, 255, 159, 57, 224, 176, + 207, 255, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, + 192, 255, 0, 0, 255, 223, 253, 255, 255, 253, 255, 227, 223, 61, 96, 7, + 207, 255, 0, 0, 239, 223, 253, 255, 255, 253, 239, 243, 223, 61, 96, 64, + 207, 255, 6, 0, 223, 125, 240, 128, 207, 255, 0, 252, 238, 255, 127, 252, + 255, 255, 251, 47, 127, 132, 95, 255, 192, 255, 12, 0, 254, 255, 255, 255, + 255, 255, 255, 7, 255, 127, 255, 3, 214, 247, 255, 255, 175, 255, 255, 63, + 95, 63, 255, 243, 1, 0, 0, 3, 255, 3, 160, 194, 255, 254, 255, 255, + 255, 31, 254, 255, 223, 255, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, + 255, 3, 255, 255, 255, 255, 255, 63, 191, 32, 255, 255, 255, 255, 255, 247, + 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, + 255, 255, 61, 255, 255, 255, 255, 231, 0, 254, 3, 0, 255, 255, 0, 0, + 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, 255, 223, 31, 0, + 255, 255, 31, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 143, 48, + 255, 3, 0, 0, 0, 56, 255, 3, 255, 255, 255, 1, 255, 7, 255, 255, + 255, 255, 63, 0, 255, 255, 255, 127, 255, 15, 255, 15, 192, 255, 255, 255, + 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 7, 255, 255, 255, 159, + 255, 3, 255, 3, 128, 0, 255, 191, 1, 0, 0, 0, 255, 15, 255, 3, + 0, 248, 15, 0, 255, 255, 255, 0, 255, 227, 255, 255, 255, 1, 255, 255, + 0, 0, 247, 255, 255, 255, 255, 251, 63, 63, 255, 170, 255, 255, 223, 95, + 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 0, 128, 1, 0, 16, 0, + 0, 0, 2, 128, 0, 0, 255, 31, 226, 255, 1, 0, 132, 252, 47, 63, + 80, 253, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 255, 127, 255, 255, + 31, 248, 15, 0, 255, 128, 0, 128, 255, 255, 127, 0, 127, 127, 127, 127, + 224, 0, 0, 0, 254, 255, 62, 31, 255, 255, 127, 230, 224, 255, 255, 255, + 255, 127, 0, 0, 255, 31, 0, 0, 255, 31, 255, 255, 255, 15, 0, 0, + 255, 255, 240, 191, 0, 0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, + 252, 7, 0, 0, 0, 0, 224, 255, 255, 16, 0, 0, 63, 0, 255, 3, + 255, 255, 255, 232, 255, 63, 255, 255, 1, 128, 255, 3, 255, 63, 255, 3, + 255, 255, 127, 252, 7, 0, 0, 56, 255, 255, 124, 0, 126, 126, 126, 0, + 127, 127, 255, 255, 255, 55, 255, 3, 15, 0, 255, 255, 127, 248, 255, 255, + 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, + 0, 0, 248, 255, 240, 255, 255, 255, 255, 255, 252, 255, 255, 0, 0, 0, + 255, 255, 24, 0, 0, 224, 0, 0, 0, 0, 138, 170, 252, 252, 252, 28, + 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 0, 0, 0, 32, + 255, 255, 1, 0, 0, 224, 255, 255, 15, 255, 62, 0, 255, 255, 15, 255, + 255, 0, 255, 255, 15, 0, 0, 0, 63, 253, 255, 255, 255, 255, 191, 145, + 255, 255, 55, 0, 255, 255, 255, 192, 111, 240, 239, 254, 255, 255, 63, 135, + 127, 0, 0, 0, 255, 255, 7, 0, 255, 0, 255, 3, 255, 27, 3, 0, + 128, 0, 255, 255, 31, 0, 0, 0, 192, 255, 0, 128, 255, 1, 255, 3, + 240, 0, 255, 255, 255, 255, 79, 0, 31, 222, 255, 23, 255, 255, 251, 255, + 255, 255, 255, 64, 127, 189, 255, 191, 255, 7, 255, 3, 255, 253, 237, 251, + 159, 57, 129, 224, 207, 31, 31, 0, 255, 7, 255, 195, 3, 0, 0, 0, + 191, 0, 255, 3, 255, 255, 63, 255, 1, 0, 0, 63, 17, 0, 255, 3, + 255, 3, 0, 128, 127, 242, 111, 255, 255, 255, 191, 249, 15, 0, 255, 3, + 255, 252, 255, 255, 255, 255, 255, 252, 27, 0, 0, 0, 255, 255, 255, 35, + 255, 253, 255, 255, 1, 0, 255, 3, 0, 0, 252, 255, 255, 254, 127, 0, + 127, 251, 255, 255, 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251, 1, + 0, 0, 1, 0, 248, 255, 255, 224, 255, 135, 255, 255, 255, 128, 255, 255, + 27, 0, 3, 0, 0, 0, 7, 0, 255, 7, 255, 31, 255, 1, 255, 99, + 224, 227, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, + 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, + 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, + 247, 207, 255, 255, 255, 255, 127, 248, 255, 31, 32, 0, 16, 0, 0, 248, + 254, 255, 0, 0, 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 255, 63, + 255, 67, 0, 0, 31, 0, 127, 0, 150, 254, 247, 10, 132, 234, 150, 170, + 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255 }; -/* Print: 2792 bytes. */ - -RE_UINT32 re_get_print(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_print_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_print_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_print_stage_3[pos + f] << 5; - pos += code; - value = (re_print_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} +RE_UINT32 re_get_xid_continue(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* Word. */ + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_xid_continue_table_1[field_2]; + v = re_xid_continue_table_2[(v << 5) | field_1]; + v = re_xid_continue_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} -static RE_UINT8 re_word_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 21, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 23, 24, 5, 25, 26, +/* XID_Start. */ +static RE_UINT8 re_xid_start_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 12, 12, + 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 17, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 9, 9, 12, 30, 9, 9, + 9, 31, 9, 9, 9, 9, 9, 9, 9, 9, 32, 33, 12, 12, 12, 12, + 12, 34, 12, 35, 9, 9, 9, 9, 9, 9, 9, 9, 36, 9, 9, 37, + 9, 9, 9, 9, 9, 38, 9, 9, 39, 9, 40, 41, 9, 9, 9, 9, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 42, 12, 12, 12, 43, 44, 12, + 12, 12, 12, 45, 12, 12, 12, 12, 12, 12, 46, 9, 9, 9, 47, 9, + 12, 12, 12, 12, 48, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -16944,339 +26218,8 @@ static RE_UINT8 re_word_stage_1[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 27, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static RE_UINT8 re_word_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 32, 31, 31, 31, 31, 31, 31, 31, 33, 34, 35, 31, - 36, 37, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39, - 1, 1, 1, 1, 40, 1, 41, 42, 43, 44, 45, 46, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 47, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 48, 49, 1, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 1, 59, 60, 61, 62, 63, 64, 65, 31, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 31, 78, 79, 80, 31, - 1, 1, 1, 81, 82, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 84, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 85, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 86, 87, 31, 31, 88, 89, - 1, 1, 1, 1, 1, 1, 1, 90, 1, 1, 91, 31, 31, 31, 31, 31, - 1, 92, 93, 31, 31, 31, 31, 31, 31, 31, 31, 31, 94, 31, 31, 31, - 31, 95, 96, 31, 97, 98, 99, 100, 31, 31, 101, 31, 31, 31, 31, 31, - 102, 103, 104, 31, 31, 31, 31, 31, 105, 106, 31, 31, 31, 31, 107, 31, - 31, 108, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 1, 1, 109, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 110, 111, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 112, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 113, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 114, 31, 31, 31, 31, 31, - 31, 39, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_word_stage_3[] = { - 0, 0, 0, 1, 2, 3, 2, 4, 0, 0, 5, 6, 7, 8, 7, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 0, - 7, 7, 7, 7, 7, 7, 7, 12, 13, 7, 14, 7, 7, 7, 7, 15, - 7, 7, 7, 7, 7, 7, 7, 7, 14, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 2, 7, 16, 7, 7, 17, 2, 7, 18, 19, 7, 3, 20, - 0, 4, 7, 7, 7, 7, 21, 7, 7, 7, 7, 7, 7, 22, 23, 24, - 0, 7, 7, 7, 25, 7, 7, 7, 7, 7, 7, 10, 7, 7, 7, 26, - 7, 7, 27, 0, 7, 28, 4, 0, 0, 0, 7, 29, 0, 30, 14, 7, - 7, 7, 7, 7, 7, 7, 31, 2, 22, 32, 23, 33, 34, 35, 31, 36, - 37, 32, 23, 38, 39, 40, 41, 42, 43, 14, 23, 44, 45, 46, 31, 47, - 48, 32, 23, 44, 49, 50, 31, 51, 52, 53, 54, 21, 55, 56, 41, 0, - 57, 58, 23, 59, 60, 61, 31, 0, 62, 58, 23, 63, 60, 64, 31, 65, - 62, 58, 7, 7, 66, 67, 31, 68, 69, 70, 7, 71, 72, 73, 41, 74, - 2, 7, 7, 4, 75, 1, 0, 0, 76, 7, 77, 27, 78, 79, 0, 0, - 46, 80, 1, 81, 82, 7, 83, 2, 84, 82, 7, 83, 85, 0, 0, 0, - 7, 7, 7, 7, 1, 7, 7, 7, 7, 27, 7, 7, 86, 7, 7, 87, - 7, 7, 7, 7, 88, 89, 7, 7, 88, 7, 7, 90, 91, 8, 7, 7, - 7, 91, 7, 7, 7, 25, 0, 0, 7, 0, 7, 7, 7, 7, 7, 92, - 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 24, 7, 2, 4, 7, 7, 7, 7, 93, 17, - 57, 94, 7, 94, 7, 95, 57, 96, 7, 7, 7, 7, 7, 97, 1, 0, - 98, 1, 7, 7, 7, 7, 7, 17, 7, 7, 4, 7, 7, 7, 7, 42, - 7, 75, 28, 28, 41, 7, 27, 94, 7, 7, 28, 7, 1, 1, 0, 0, - 7, 28, 7, 7, 7, 75, 7, 24, 1, 1, 99, 75, 0, 0, 0, 0, - 7, 7, 7, 7, 28, 1, 100, 95, 7, 7, 7, 7, 7, 7, 7, 95, - 7, 7, 7, 101, 59, 7, 7, 27, 17, 7, 7, 25, 0, 102, 7, 4, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 103, - 7, 92, 7, 7, 92, 104, 7, 27, 7, 7, 7, 105, 106, 107, 83, 106, - 108, 0, 0, 109, 46, 110, 0, 111, 0, 83, 0, 0, 0, 7, 7, 46, - 112, 113, 114, 79, 115, 0, 7, 7, 17, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 7, 7, 1, 0, - 7, 7, 75, 7, 7, 75, 7, 7, 7, 7, 7, 7, 7, 7, 116, 95, - 7, 7, 86, 7, 7, 7, 117, 109, 7, 118, 119, 119, 119, 119, 7, 7, - 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 120, 0, 2, 121, 2, 7, 7, 7, 7, 122, 2, 7, 7, 7, 7, 87, - 123, 7, 7, 2, 7, 7, 7, 7, 75, 0, 7, 4, 0, 0, 0, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 42, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 83, 0, 0, 0, 0, 7, 7, 27, - 83, 7, 28, 0, 7, 7, 7, 124, 7, 7, 7, 7, 7, 7, 7, 10, - 0, 125, 126, 7, 7, 7, 7, 7, 127, 7, 7, 7, 128, 0, 0, 125, - 7, 7, 101, 0, 7, 7, 7, 95, 7, 7, 7, 7, 42, 1, 7, 129, - 7, 7, 27, 7, 7, 95, 7, 83, 7, 7, 7, 7, 130, 1, 7, 75, - 7, 7, 7, 118, 27, 1, 7, 70, 7, 7, 7, 7, 20, 98, 7, 128, - 131, 132, 119, 7, 7, 87, 101, 7, 7, 7, 7, 7, 7, 7, 133, 1, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 95, 7, 134, 7, 7, 28, - 7, 7, 7, 7, 7, 7, 27, 7, 7, 7, 7, 7, 7, 1, 0, 0, - 118, 135, 23, 136, 137, 7, 7, 7, 7, 7, 7, 10, 0, 30, 7, 7, - 7, 7, 7, 27, 0, 7, 7, 7, 7, 126, 7, 7, 101, 0, 0, 28, - 7, 0, 7, 138, 139, 0, 0, 84, 7, 7, 7, 7, 7, 7, 7, 83, - 0, 1, 2, 3, 2, 4, 41, 7, 7, 7, 7, 75, 140, 141, 0, 0, - 142, 7, 8, 143, 27, 27, 0, 0, 7, 7, 7, 7, 7, 7, 7, 4, - 0, 0, 0, 0, 7, 7, 7, 94, 0, 0, 0, 0, 0, 0, 0, 144, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 83, 7, 7, 7, 46, 46, 0, - 7, 7, 139, 7, 4, 7, 7, 4, 7, 27, 7, 7, 145, 146, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 27, 1, 7, 7, 145, 7, 28, - 7, 7, 101, 7, 7, 7, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 118, 7, 42, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 147, 7, 7, 148, 7, 42, 7, 118, 7, 75, 0, 0, 0, 0, 7, 149, - 7, 42, 7, 1, 0, 0, 0, 0, 7, 7, 7, 150, 0, 0, 0, 0, - 151, 152, 7, 153, 0, 0, 7, 83, 7, 83, 0, 0, 82, 7, 118, 0, - 7, 7, 7, 42, 7, 42, 7, 20, 7, 10, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 17, 0, 0, 0, 7, 7, 7, 20, 7, 7, 7, 20, - 7, 7, 101, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 83, 99, 7, 7, 46, 0, 0, 0, 0, 0, 0, 0, 0, 7, 118, - 7, 7, 7, 7, 118, 0, 41, 109, 7, 7, 7, 4, 0, 7, 17, 1, - 7, 7, 7, 84, 154, 7, 7, 155, 7, 7, 7, 7, 156, 157, 0, 0, - 7, 14, 7, 158, 0, 0, 0, 0, 159, 18, 17, 7, 7, 7, 4, 1, - 22, 32, 23, 160, 49, 161, 162, 94, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 4, 21, 0, 0, 7, 7, 7, 7, 163, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 164, 46, 165, 0, 0, - 7, 7, 7, 7, 166, 1, 0, 0, 7, 7, 7, 17, 1, 0, 0, 0, - 7, 25, 28, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 4, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 1, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 7, 7, 167, 168, 0, - 7, 7, 7, 75, 99, 7, 7, 7, 7, 169, 0, 0, 7, 7, 7, 17, - 23, 7, 7, 8, 46, 1, 0, 126, 7, 126, 82, 118, 0, 0, 0, 0, - 170, 7, 7, 171, 101, 1, 172, 7, 75, 173, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 118, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 75, 0, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 17, 7, 75, 1, 0, 0, 0, 0, 0, 0, 7, 27, 94, - 7, 7, 7, 118, 95, 1, 30, 174, 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 3, 7, 7, 7, 117, 7, 0, 0, 0, 0, 175, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 101, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 20, - 7, 75, 0, 0, 0, 20, 176, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 28, - 7, 7, 7, 7, 7, 7, 4, 83, 17, 177, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 178, 179, 180, 0, 181, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 84, 7, 7, 7, 57, 183, 184, 185, 7, 7, 7, - 186, 187, 7, 188, 189, 58, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 164, 7, 58, 87, 7, 87, - 7, 84, 7, 84, 75, 7, 75, 7, 23, 7, 23, 7, 190, 7, 7, 7, - 7, 7, 7, 134, 7, 7, 83, 191, 110, 100, 2, 0, 0, 0, 0, 0, - 8, 127, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 83, 27, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 1, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 94, 118, 0, 0, - 7, 7, 7, 7, 28, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 185, 7, 194, 195, 196, 197, 198, 199, 103, 28, 200, 28, 0, 0, 0, 0, - 0, 0, 0, 7, 1, 7, 1, 7, 1, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 118, 0, 0, - 7, 7, 7, 94, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 27, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 46, 0, - 7, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_word_stage_4[] = { - 0, 0, 255, 3, 254, 255, 255, 135, 255, 7, 0, 4, 32, 4, 255, 255, - 127, 255, 195, 255, 3, 0, 31, 80, 223, 188, 64, 215, 251, 255, 191, 255, - 127, 2, 255, 1, 255, 191, 182, 0, 7, 0, 255, 195, 239, 159, 255, 253, - 255, 159, 255, 231, 63, 36, 255, 63, 255, 15, 223, 63, 248, 255, 207, 255, - 249, 255, 197, 243, 159, 121, 128, 176, 3, 80, 238, 135, 109, 211, 135, 57, - 2, 94, 192, 255, 63, 0, 238, 191, 237, 243, 191, 59, 1, 0, 0, 254, - 238, 159, 159, 57, 192, 176, 2, 0, 236, 199, 61, 214, 24, 199, 199, 61, - 129, 0, 255, 223, 253, 255, 255, 227, 223, 61, 96, 7, 239, 223, 239, 243, - 96, 64, 6, 0, 223, 125, 240, 128, 0, 252, 236, 255, 127, 252, 251, 47, - 127, 132, 95, 255, 12, 0, 255, 127, 214, 247, 175, 255, 95, 63, 255, 243, - 0, 3, 160, 194, 255, 254, 255, 31, 223, 255, 64, 0, 191, 32, 255, 247, - 255, 61, 127, 61, 61, 127, 61, 255, 63, 63, 255, 199, 31, 0, 15, 0, - 13, 0, 143, 48, 0, 56, 128, 0, 0, 248, 255, 0, 247, 255, 255, 251, - 255, 170, 223, 95, 220, 31, 207, 15, 0, 48, 0, 128, 16, 0, 2, 128, - 132, 252, 47, 62, 80, 189, 224, 67, 31, 248, 255, 128, 127, 0, 127, 127, - 224, 0, 62, 31, 127, 230, 224, 255, 247, 191, 128, 255, 252, 255, 255, 249, - 124, 0, 255, 232, 1, 128, 126, 126, 126, 0, 255, 55, 127, 248, 248, 224, - 127, 95, 219, 255, 24, 0, 0, 224, 252, 252, 252, 28, 255, 239, 255, 183, - 0, 32, 15, 255, 62, 0, 63, 253, 191, 145, 55, 0, 255, 192, 111, 240, - 239, 254, 63, 135, 112, 0, 79, 0, 31, 30, 255, 23, 255, 64, 127, 189, - 237, 251, 129, 224, 207, 31, 191, 0, 63, 255, 0, 63, 17, 0, 255, 252, - 27, 0, 255, 35, 127, 251, 127, 180, 191, 253, 251, 1, 255, 224, 11, 0, - 240, 0, 255, 99, 224, 227, 7, 248, 231, 15, 0, 60, 28, 0, 100, 222, - 255, 235, 239, 255, 191, 231, 223, 223, 255, 123, 95, 252, 247, 207, 32, 0, - 219, 7, 255, 67, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, - 238, 251, -}; - -/* Word: 2962 bytes. */ - -RE_UINT32 re_get_word(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_word_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_word_stage_2[pos + f] << 4; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_word_stage_3[pos + f] << 4; - pos += code; - value = (re_word_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* XDigit. */ - -static RE_UINT8 re_xdigit_stage_1[] = { - 0, 1, 1, 1, 1, 2, 1, 3, 4, 1, 1, 5, 1, 1, 6, 7, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_xdigit_stage_2[] = { - 0, 1, 1, 2, 3, 4, 4, 5, 6, 1, 1, 7, 8, 9, 10, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 11, 12, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, - 1, 1, 15, 1, 1, 1, 16, 1, 17, 18, 19, 20, 21, 1, 22, 1, - 1, 1, 1, 1, 1, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 24, 1, 1, 1, 1, - 25, 18, 1, 1, 26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_xdigit_stage_3[] = { - 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 3, 2, 0, 2, 2, 2, 4, 2, 2, 2, 2, 2, 5, 2, 5, - 2, 5, 2, 5, 2, 5, 2, 5, 2, 6, 2, 6, 3, 2, 2, 2, - 2, 4, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, - 6, 2, 2, 2, 2, 7, 2, 6, 2, 2, 8, 2, 2, 6, 0, 2, - 2, 8, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 6, 4, 2, 2, 9, 2, 6, 2, 2, 2, 2, 2, 0, - 2, 2, 2, 2, 10, 11, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 0, 2, 2, 2, 2, 5, 2, 0, 12, 2, 2, 6, - 2, 2, 2, 0, 2, 2, 2, 2, 2, 6, 2, 6, 2, 2, 2, 2, - 2, 6, 2, 4, 0, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, - 2, 6, 2, 2, 2, 6, 3, 2, 2, 3, 2, 2, 2, 6, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 13, 2, 2, 2, 2, 2, 4, 2, 2, - 2, 2, 2, 2, 2, 6, 2, 2, -}; - -static RE_UINT8 re_xdigit_stage_4[] = { - 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 3, 0, 0, - 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 0, 0, - 0, 0, 255, 3, 0, 0, 0, 0, 192, 255, 0, 0, 0, 0, 0, 0, - 255, 3, 255, 3, 0, 0, 0, 0, 0, 0, 255, 3, 0, 0, 255, 3, - 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 255, 0, 192, 255, 255, 255, 255, 255, 255, -}; - -/* XDigit: 592 bytes. */ - -RE_UINT32 re_get_xdigit(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_xdigit_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_xdigit_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_xdigit_stage_3[pos + f] << 6; - pos += code; - value = (re_xdigit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Posix_Digit. */ - -static RE_UINT8 re_posix_digit_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_posix_digit_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_posix_digit_stage_3[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_posix_digit_stage_4[] = { - 0, 0, 0, 0, 0, 0, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -/* Posix_Digit: 130 bytes. */ - -RE_UINT32 re_get_posix_digit(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_posix_digit_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_posix_digit_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_posix_digit_stage_3[pos + f] << 7; - pos += code; - value = (re_posix_digit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Posix_AlNum. */ - -static RE_UINT8 re_posix_alnum_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 21, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 23, 24, 5, 25, 26, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -17291,1529 +26234,1580 @@ static RE_UINT8 re_posix_alnum_stage_1[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; -static RE_UINT8 re_posix_alnum_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 32, 31, 31, 31, 31, 31, 31, 31, 33, 34, 35, 31, - 36, 37, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39, - 1, 1, 1, 1, 40, 1, 41, 42, 43, 44, 45, 46, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 47, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 48, 49, 1, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 1, 59, 60, 61, 62, 63, 64, 65, 31, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 31, 78, 79, 80, 31, - 1, 1, 1, 81, 82, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 84, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 85, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 86, 87, 31, 31, 88, 89, - 1, 1, 1, 1, 1, 1, 1, 90, 1, 1, 91, 31, 31, 31, 31, 31, - 1, 92, 93, 31, 31, 31, 31, 31, 31, 31, 31, 31, 94, 31, 31, 31, - 31, 31, 31, 31, 95, 96, 97, 98, 31, 31, 31, 31, 31, 31, 31, 31, - 99, 100, 101, 31, 31, 31, 31, 31, 102, 103, 31, 31, 31, 31, 104, 31, - 31, 105, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 1, 1, 106, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 107, 108, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 109, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 110, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 111, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_posix_alnum_stage_3[] = { - 0, 1, 2, 2, 0, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 6, 7, 0, 0, 8, 9, 10, 11, 5, 12, - 5, 5, 5, 5, 13, 5, 5, 5, 5, 14, 15, 5, 16, 17, 18, 19, - 20, 5, 21, 22, 5, 5, 23, 24, 25, 5, 26, 5, 5, 27, 28, 29, - 30, 31, 32, 33, 0, 34, 35, 36, 5, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 49, 53, 54, 55, 56, 57, 0, - 58, 59, 60, 61, 58, 62, 63, 64, 58, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 0, 75, 76, 77, 0, 78, 0, 79, 80, 81, 82, 0, 0, - 5, 83, 25, 5, 84, 5, 85, 86, 5, 5, 87, 5, 88, 89, 90, 5, - 91, 5, 73, 0, 92, 5, 5, 93, 72, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 94, 2, 5, 5, 95, 96, 97, 97, 98, 5, 99, 100, 0, - 0, 5, 5, 32, 5, 101, 5, 102, 103, 104, 25, 105, 5, 106, 107, 0, - 108, 5, 103, 109, 0, 110, 0, 0, 5, 111, 112, 0, 5, 113, 5, 114, - 5, 115, 116, 117, 118, 65, 0, 119, 5, 5, 5, 5, 5, 5, 0, 120, - 93, 5, 121, 117, 5, 122, 123, 124, 0, 0, 0, 125, 126, 0, 0, 0, - 127, 128, 129, 5, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 130, 5, 107, 5, 131, 103, 5, 5, 5, 5, 132, - 5, 85, 5, 133, 115, 134, 134, 5, 0, 135, 0, 0, 0, 0, 0, 0, - 136, 137, 72, 5, 138, 72, 5, 86, 139, 14, 5, 5, 140, 73, 0, 25, - 5, 5, 5, 5, 5, 102, 0, 0, 5, 5, 5, 5, 5, 5, 5, 92, - 5, 5, 5, 5, 31, 0, 25, 117, 141, 142, 5, 143, 5, 5, 5, 92, - 144, 145, 5, 5, 146, 5, 147, 144, 148, 149, 5, 97, 5, 5, 150, 151, - 28, 101, 152, 82, 5, 153, 135, 154, 5, 115, 155, 156, 5, 103, 157, 158, - 159, 160, 86, 161, 5, 5, 5, 33, 5, 5, 5, 5, 5, 162, 163, 108, - 5, 5, 5, 164, 5, 5, 165, 0, 166, 167, 168, 5, 5, 27, 169, 5, - 5, 117, 25, 5, 170, 5, 149, 171, 0, 0, 0, 172, 5, 5, 5, 82, - 0, 2, 2, 173, 5, 103, 174, 0, 175, 176, 177, 0, 5, 5, 5, 73, - 0, 0, 5, 178, 0, 0, 0, 0, 0, 0, 0, 0, 82, 5, 179, 0, - 5, 26, 101, 73, 117, 5, 180, 0, 5, 5, 5, 5, 117, 25, 181, 108, - 5, 161, 5, 61, 0, 0, 0, 0, 5, 115, 102, 149, 0, 0, 0, 0, - 182, 183, 102, 115, 103, 0, 0, 184, 102, 165, 0, 0, 5, 185, 0, 0, - 186, 102, 0, 82, 82, 0, 79, 187, 5, 102, 102, 152, 27, 0, 0, 0, - 5, 5, 16, 0, 5, 152, 5, 152, 5, 149, 0, 0, 0, 0, 0, 0, - 82, 188, 189, 0, 0, 0, 0, 115, 5, 5, 189, 0, 145, 32, 25, 16, - 5, 152, 190, 191, 5, 5, 192, 0, 193, 194, 0, 0, 195, 118, 5, 16, - 40, 49, 196, 61, 0, 0, 0, 0, 5, 5, 197, 0, 5, 5, 198, 0, - 0, 0, 0, 0, 5, 199, 200, 0, 5, 103, 201, 0, 5, 202, 0, 0, - 65, 33, 0, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 5, 5, 203, - 0, 0, 0, 0, 0, 204, 30, 205, 5, 206, 25, 5, 207, 0, 5, 32, - 208, 209, 78, 210, 170, 211, 0, 0, 212, 213, 214, 215, 216, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 115, 5, 5, 5, 5, 165, 0, 0, 0, - 5, 5, 5, 140, 5, 5, 5, 5, 5, 5, 61, 0, 0, 0, 0, 0, - 5, 140, 0, 0, 0, 0, 0, 0, 5, 5, 217, 0, 0, 0, 0, 0, - 5, 32, 103, 0, 0, 0, 25, 155, 5, 92, 61, 218, 92, 0, 0, 0, - 0, 0, 5, 5, 0, 0, 0, 0, 5, 5, 219, 5, 220, 0, 0, 221, - 5, 5, 5, 5, 5, 5, 5, 222, 5, 5, 5, 5, 5, 5, 5, 152, - 103, 0, 223, 224, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 108, - 5, 5, 5, 225, 226, 0, 0, 0, 5, 5, 227, 5, 228, 229, 230, 5, - 231, 232, 233, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 234, 235, 86, - 227, 227, 131, 131, 208, 208, 236, 0, 237, 238, 0, 0, 0, 0, 0, 0, - 5, 239, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 241, - 5, 5, 5, 5, 5, 5, 187, 0, 5, 5, 242, 0, 0, 0, 0, 0, - 230, 243, 244, 245, 246, 247, 0, 0, 0, 25, 248, 248, 107, 0, 0, 0, - 5, 5, 5, 5, 5, 5, 115, 0, 5, 178, 5, 5, 5, 5, 5, 5, - 117, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 249, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 78, 117, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_posix_alnum_stage_4[] = { - 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 7, 0, 4, 32, 4, - 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, - 32, 0, 0, 0, 0, 0, 223, 188, 64, 215, 255, 255, 251, 255, 255, 255, - 255, 255, 191, 255, 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, - 255, 1, 0, 0, 0, 0, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, - 0, 0, 255, 7, 255, 255, 255, 254, 0, 192, 255, 255, 255, 255, 239, 31, - 254, 225, 0, 156, 0, 0, 255, 255, 0, 224, 255, 255, 255, 255, 3, 0, - 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 255, 252, 255, 31, 0, 0, - 255, 255, 255, 1, 255, 7, 0, 0, 255, 255, 223, 63, 0, 0, 240, 255, - 248, 3, 255, 255, 255, 255, 255, 239, 255, 223, 225, 255, 15, 0, 254, 255, - 239, 159, 249, 255, 255, 253, 197, 227, 159, 89, 128, 176, 15, 0, 3, 16, - 238, 135, 249, 255, 255, 253, 109, 195, 135, 25, 2, 94, 0, 0, 63, 0, - 238, 191, 251, 255, 255, 253, 237, 227, 191, 27, 1, 0, 15, 0, 0, 30, - 238, 159, 249, 255, 159, 25, 192, 176, 15, 0, 2, 0, 236, 199, 61, 214, - 24, 199, 255, 195, 199, 29, 129, 0, 239, 223, 253, 255, 255, 253, 255, 227, - 223, 29, 96, 7, 15, 0, 0, 0, 255, 253, 239, 227, 223, 29, 96, 64, - 15, 0, 6, 0, 255, 255, 255, 231, 223, 93, 240, 128, 15, 0, 0, 252, - 236, 255, 127, 252, 255, 255, 251, 47, 127, 128, 95, 255, 0, 0, 12, 0, - 254, 255, 255, 255, 255, 255, 255, 7, 127, 32, 0, 0, 214, 247, 255, 255, - 175, 255, 255, 59, 95, 32, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, - 255, 31, 254, 255, 3, 255, 255, 254, 255, 255, 255, 31, 255, 255, 127, 249, - 255, 255, 0, 60, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, - 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, - 255, 255, 0, 0, 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, - 255, 223, 15, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 207, 255, - 255, 1, 128, 16, 255, 7, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, - 255, 15, 255, 1, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 0, 0, - 255, 255, 255, 15, 254, 255, 31, 0, 128, 0, 0, 0, 255, 255, 239, 255, - 239, 15, 0, 0, 255, 243, 0, 252, 191, 255, 3, 0, 255, 255, 127, 0, - 0, 224, 0, 252, 255, 255, 255, 63, 255, 1, 255, 255, 0, 222, 111, 4, - 128, 255, 31, 0, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, - 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, - 80, 189, 255, 243, 224, 67, 0, 0, 0, 0, 192, 255, 255, 127, 255, 255, - 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, 0, 128, 0, 0, - 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 224, 224, 255, 255, 255, - 255, 127, 0, 0, 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 240, 143, - 0, 0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, 124, 0, 0, 0, - 191, 255, 255, 255, 255, 0, 0, 0, 47, 0, 0, 0, 0, 0, 252, 232, - 255, 255, 7, 0, 255, 255, 247, 255, 255, 255, 0, 124, 255, 63, 0, 0, - 255, 255, 127, 252, 5, 0, 0, 56, 255, 255, 60, 0, 126, 126, 126, 0, - 127, 127, 255, 255, 255, 0, 255, 255, 15, 0, 255, 255, 127, 248, 255, 255, - 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, - 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 15, - 0, 0, 223, 255, 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, - 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 31, 0, 255, 255, 1, 0, - 15, 255, 62, 0, 255, 255, 15, 255, 63, 253, 255, 255, 255, 255, 191, 145, - 255, 255, 55, 0, 255, 255, 255, 192, 111, 240, 239, 254, 31, 0, 0, 0, - 128, 0, 255, 255, 63, 0, 0, 0, 112, 0, 255, 255, 255, 255, 71, 0, - 30, 0, 0, 20, 255, 255, 251, 255, 255, 255, 159, 64, 127, 189, 255, 191, - 159, 25, 129, 224, 187, 7, 0, 128, 179, 0, 0, 0, 255, 255, 63, 127, - 0, 0, 0, 63, 17, 0, 0, 0, 255, 255, 63, 1, 0, 0, 0, 128, - 255, 252, 255, 255, 26, 0, 0, 0, 255, 255, 231, 127, 255, 255, 255, 32, - 255, 253, 255, 255, 255, 255, 127, 127, 0, 0, 252, 255, 255, 254, 127, 0, - 127, 251, 255, 255, 255, 255, 127, 180, 203, 0, 0, 0, 191, 253, 255, 255, - 255, 127, 123, 1, 127, 0, 0, 0, 248, 255, 255, 224, 255, 135, 255, 255, - 255, 128, 255, 255, 11, 0, 0, 0, 255, 255, 255, 0, 0, 0, 7, 0, - 240, 0, 255, 255, 255, 7, 255, 31, 255, 1, 255, 67, 255, 255, 223, 255, - 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, - 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, - 247, 15, 0, 0, 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 128, 63, - 0, 64, 0, 0, 255, 15, 0, 0, 143, 8, 0, 0, 150, 254, 247, 10, - 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, - 255, 3, 255, 255, 3, 0, 255, 255, -}; - -/* Posix_AlNum: 2600 bytes. */ - -RE_UINT32 re_get_posix_alnum(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_posix_alnum_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_posix_alnum_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_posix_alnum_stage_3[pos + f] << 5; - pos += code; - value = (re_posix_alnum_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Posix_Punct. */ - -static RE_UINT8 re_posix_punct_stage_1[] = { - 0, 1, 2, 3, 3, 4, 3, 5, 6, 7, 3, 8, 3, 9, 10, 11, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, -}; - -static RE_UINT8 re_posix_punct_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 1, 17, 18, 1, 19, 20, 21, 22, 23, 24, 25, 1, 1, 26, - 27, 28, 29, 29, 30, 29, 29, 31, 29, 29, 29, 32, 33, 34, 35, 36, - 37, 38, 39, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 40, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 41, 1, 42, 43, 44, 45, 46, 47, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 48, 1, 49, 50, 51, - 1, 52, 1, 53, 1, 54, 1, 1, 55, 56, 57, 58, 1, 1, 1, 59, - 60, 61, 62, 1, 63, 64, 65, 66, 67, 68, 69, 1, 70, 1, 71, 72, - 1, 1, 1, 1, 73, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 74, 75, 1, 1, 76, 68, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 77, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 78, 79, 80, 81, 1, 1, 82, 83, 29, 29, 84, 1, 1, 1, 1, 1, - 1, 85, 86, 1, 1, 1, 1, 1, 1, 87, 1, 1, 88, 89, 90, 1, - 91, 92, 93, 29, 29, 29, 94, 95, 96, 97, 98, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_posix_punct_stage_3[] = { - 0, 1, 2, 3, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 8, 9, 0, 0, 10, - 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 12, 0, 13, 14, 15, 16, - 17, 0, 0, 18, 0, 0, 19, 20, 21, 0, 0, 0, 0, 0, 0, 22, - 0, 23, 14, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 25, - 0, 0, 0, 10, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 28, - 0, 0, 0, 29, 30, 0, 0, 0, 0, 0, 31, 32, 0, 0, 0, 33, - 0, 34, 35, 0, 0, 0, 0, 0, 36, 37, 0, 0, 38, 39, 40, 0, - 0, 0, 41, 0, 39, 0, 0, 42, 0, 0, 0, 43, 44, 0, 0, 0, - 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 48, - 0, 49, 0, 0, 0, 0, 50, 0, 51, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 52, 0, 0, 0, 39, 53, 39, 0, 0, 0, 0, 54, 0, 0, - 0, 0, 12, 55, 0, 0, 0, 56, 0, 57, 0, 39, 0, 0, 58, 0, - 0, 0, 0, 0, 0, 59, 60, 61, 62, 63, 64, 65, 66, 53, 0, 0, - 67, 68, 69, 0, 70, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 71, 51, 0, 56, 72, 0, 0, 53, 53, 53, 72, 73, 53, 53, 53, - 53, 53, 53, 74, 75, 53, 53, 53, 0, 0, 0, 0, 0, 0, 0, 76, - 0, 0, 0, 27, 0, 0, 0, 0, 53, 77, 78, 0, 79, 53, 53, 80, - 53, 53, 53, 53, 53, 53, 72, 81, 82, 83, 0, 0, 47, 45, 0, 42, - 0, 0, 0, 0, 84, 0, 53, 85, 64, 86, 87, 53, 86, 88, 53, 53, - 0, 0, 0, 0, 0, 0, 53, 53, 0, 0, 0, 0, 62, 53, 71, 39, - 89, 0, 0, 90, 0, 0, 0, 91, 92, 93, 0, 0, 94, 0, 0, 0, - 0, 95, 0, 96, 0, 0, 97, 98, 0, 97, 34, 0, 0, 0, 99, 0, - 0, 0, 56, 100, 0, 0, 39, 26, 0, 0, 42, 0, 0, 0, 0, 101, - 0, 102, 0, 0, 0, 103, 93, 0, 0, 39, 0, 0, 0, 0, 0, 104, - 44, 62, 105, 106, 0, 0, 0, 0, 1, 2, 2, 107, 0, 0, 0, 108, - 109, 110, 0, 111, 112, 45, 62, 113, 0, 0, 0, 0, 34, 0, 27, 0, - 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 5, 114, 0, 0, 0, 0, - 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 115, 34, 0, 0, 116, 117, - 0, 111, 0, 0, 118, 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, - 0, 0, 120, 0, 0, 121, 93, 0, 0, 0, 85, 122, 0, 0, 123, 0, - 0, 124, 0, 0, 0, 102, 0, 0, 0, 0, 125, 0, 0, 0, 126, 0, - 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 128, 129, 0, 0, 0, 0, - 0, 56, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 11, 0, 34, 71, 0, 130, 109, 0, 0, - 0, 0, 131, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, - 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 0, 134, 0, 0, 0, 0, - 0, 0, 0, 97, 0, 0, 0, 135, 0, 110, 136, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, - 53, 53, 53, 53, 53, 53, 53, 72, 53, 139, 53, 140, 141, 142, 53, 43, - 53, 53, 143, 0, 0, 0, 0, 0, 53, 53, 92, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 144, 42, 135, 135, 31, 31, 102, 102, 145, 0, - 0, 137, 0, 146, 147, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 39, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 148, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 26, 53, 150, 53, 53, 80, 151, 152, 72, - 62, 78, 41, 153, 86, 129, 0, 154, 155, 156, 157, 107, 0, 0, 0, 0, - 53, 53, 53, 53, 53, 53, 72, 158, 53, 53, 53, 80, 53, 53, 159, 160, - 150, 53, 161, 53, 63, 21, 0, 0, 162, 53, 53, 163, 53, 164, 165, 53, - 53, 53, 80, 166, 167, 0, 0, 0, -}; - -static RE_UINT8 re_posix_punct_stage_4[] = { - 0, 0, 0, 0, 254, 255, 0, 252, 1, 0, 0, 248, 1, 0, 0, 120, - 254, 219, 211, 137, 0, 0, 128, 0, 60, 0, 252, 255, 224, 175, 255, 255, - 0, 0, 32, 64, 176, 0, 0, 0, 0, 0, 64, 0, 4, 0, 0, 0, - 0, 0, 0, 252, 0, 230, 0, 0, 0, 0, 0, 64, 73, 0, 0, 0, - 0, 0, 24, 0, 192, 255, 0, 200, 0, 60, 0, 0, 0, 0, 16, 64, - 0, 2, 0, 96, 255, 63, 0, 0, 0, 0, 192, 195, 0, 0, 255, 127, - 48, 0, 1, 0, 0, 0, 12, 44, 0, 0, 3, 0, 0, 0, 1, 0, - 0, 0, 248, 7, 0, 0, 128, 128, 16, 0, 0, 0, 0, 128, 0, 0, - 0, 0, 0, 2, 0, 0, 16, 0, 0, 0, 0, 128, 0, 128, 0, 12, - 254, 255, 255, 252, 0, 0, 80, 61, 32, 0, 0, 0, 0, 0, 0, 192, - 191, 223, 255, 7, 0, 252, 0, 0, 0, 0, 0, 8, 255, 1, 0, 0, - 0, 0, 255, 3, 1, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 24, - 0, 56, 0, 0, 0, 0, 96, 0, 0, 0, 112, 15, 255, 7, 0, 0, - 49, 0, 0, 0, 255, 255, 255, 255, 127, 63, 0, 0, 255, 7, 240, 31, - 0, 0, 0, 240, 0, 0, 0, 248, 255, 0, 8, 0, 0, 0, 0, 160, - 3, 224, 0, 224, 0, 224, 0, 96, 0, 0, 255, 255, 255, 0, 255, 255, - 255, 255, 255, 127, 0, 0, 0, 124, 0, 124, 0, 0, 123, 3, 208, 193, - 175, 66, 0, 12, 31, 188, 0, 0, 0, 12, 255, 255, 127, 0, 0, 0, - 255, 255, 63, 0, 0, 0, 240, 255, 255, 255, 207, 255, 255, 255, 63, 255, - 224, 7, 0, 222, 255, 127, 255, 255, 255, 255, 0, 0, 255, 255, 255, 251, - 255, 255, 15, 0, 0, 0, 255, 15, 30, 255, 255, 255, 1, 0, 193, 224, - 0, 0, 195, 255, 15, 0, 0, 0, 0, 252, 255, 255, 255, 0, 1, 0, - 255, 255, 1, 0, 0, 224, 0, 0, 0, 0, 8, 64, 0, 0, 252, 0, - 255, 255, 127, 0, 3, 0, 0, 0, 0, 6, 0, 0, 0, 15, 192, 3, - 0, 0, 240, 0, 0, 192, 0, 0, 0, 0, 0, 23, 254, 63, 0, 192, - 0, 0, 128, 3, 0, 8, 0, 0, 0, 2, 0, 0, 0, 0, 252, 255, - 0, 0, 0, 48, 255, 255, 247, 255, 127, 15, 0, 0, 63, 0, 0, 0, - 127, 127, 0, 48, 7, 0, 0, 0, 0, 0, 128, 255, 0, 0, 0, 254, - 255, 115, 255, 15, 255, 255, 255, 31, 0, 0, 128, 1, 0, 0, 255, 1, - 0, 1, 0, 0, 0, 0, 127, 0, 0, 0, 0, 30, 0, 0, 224, 3, - 128, 63, 0, 0, 0, 0, 0, 216, 0, 0, 48, 0, 224, 33, 0, 232, - 0, 0, 0, 63, 0, 248, 0, 40, 64, 0, 0, 0, 254, 255, 255, 0, - 14, 0, 0, 0, 255, 31, 0, 0, 0, 0, 0, 220, 62, 0, 0, 0, - 0, 0, 224, 255, 255, 255, 3, 128, 0, 0, 31, 0, 0, 0, 32, 0, - 48, 0, 0, 0, 0, 0, 128, 7, 0, 0, 0, 144, 127, 254, 255, 255, - 31, 28, 0, 0, 24, 240, 255, 255, 255, 195, 255, 255, 35, 0, 0, 0, - 2, 0, 0, 8, 8, 0, 0, 0, 0, 224, 223, 255, 239, 15, 0, 0, - 0, 16, 1, 0, 0, 64, 0, 0, 255, 15, 255, 255, 255, 127, 254, 255, - 254, 255, 254, 255, 0, 28, 0, 0, 192, 255, 255, 255, 7, 0, 255, 255, - 255, 255, 255, 15, 255, 1, 3, 0, 255, 31, 255, 7, 255, 255, 255, 1, - 255, 15, 0, 0, 255, 0, 255, 3, 255, 239, 255, 255, 255, 255, 123, 252, - 231, 199, 255, 255, 255, 231, 255, 255, 255, 63, 15, 7, 7, 0, 63, 0, -}; - -/* Posix_Punct: 1984 bytes. */ - -RE_UINT32 re_get_posix_punct(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_posix_punct_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_posix_punct_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_posix_punct_stage_3[pos + f] << 5; - pos += code; - value = (re_posix_punct_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Posix_XDigit. */ - -static RE_UINT8 re_posix_xdigit_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_posix_xdigit_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_posix_xdigit_stage_3[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_posix_xdigit_stage_4[] = { - 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -/* Posix_XDigit: 130 bytes. */ - -RE_UINT32 re_get_posix_xdigit(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_posix_xdigit_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_posix_xdigit_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_posix_xdigit_stage_3[pos + f] << 7; - pos += code; - value = (re_posix_xdigit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* All_Cases. */ - -static RE_UINT8 re_all_cases_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_all_cases_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 7, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 9, 10, 11, 12, - 6, 13, 6, 6, 14, 6, 6, 6, 6, 6, 6, 6, 15, 16, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 17, 18, 6, 6, 6, 19, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 20, 6, 6, 6, 21, - 6, 6, 6, 6, 22, 6, 6, 6, 6, 6, 6, 6, 23, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 24, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 25, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 26, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, -}; - -static RE_UINT8 re_all_cases_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, - 0, 0, 0, 0, 0, 0, 9, 0, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 18, 18, 18, 18, 18, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 21, 34, 18, 18, 35, 18, - 18, 18, 18, 18, 36, 18, 37, 38, 39, 18, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 18, 18, 18, 64, 65, - 66, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 18, 18, 18, - 77, 78, 18, 18, 18, 18, 18, 18, 79, 80, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 81, 82, 82, 82, 83, 0, 84, 85, 85, 85, - 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_xid_start_table_2[] = { + 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 0, 7, 8, 9, 4, 10, + 4, 4, 4, 4, 11, 4, 4, 4, 4, 12, 13, 4, 14, 0, 15, 16, + 0, 4, 17, 18, 4, 4, 19, 20, 21, 22, 23, 4, 4, 24, 25, 26, + 27, 28, 29, 17, 0, 30, 31, 0, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 45, 49, 50, 51, 52, 46, 0, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 0, + 68, 69, 67, 0, 70, 71, 72, 0, 73, 0, 74, 75, 76, 0, 0, 0, + 4, 77, 78, 79, 80, 4, 81, 82, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 83, 4, 84, 85, 86, 4, 87, 4, 88, 0, 22, 4, 4, 89, + 68, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 90, 1, 4, 4, 91, 92, 93, 93, 94, 4, 95, 96, 0, + 0, 4, 4, 29, 4, 97, 4, 98, 99, 0, 15, 100, 4, 101, 102, 0, + 103, 4, 104, 0, 0, 105, 0, 0, 106, 95, 107, 0, 108, 109, 4, 110, + 4, 111, 112, 113, 114, 115, 0, 116, 4, 4, 4, 4, 4, 4, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 89, 4, 117, 113, 4, 118, 119, 120, + 0, 0, 0, 121, 122, 0, 0, 0, 123, 124, 125, 4, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 87, 87, 87, 88, 89, 90, 90, 90, 90, 90, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 94, + 4, 126, 99, 4, 4, 4, 4, 127, 4, 81, 4, 128, 103, 129, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 95, 96, 97, 97, 97, 97, 97, 98, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, - 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 101, 18, 18, 18, - 18, 18, 102, 103, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 104, 105, 93, 94, 104, 105, 104, 105, 93, 94, 106, 107, 104, 105, 108, 109, - 104, 105, 104, 105, 104, 105, 110, 111, 112, 113, 114, 115, 116, 117, 112, 118, - 0, 0, 0, 0, 119, 120, 121, 0, 0, 122, 0, 0, 123, 123, 124, 124, - 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 130, 131, 68, 4, 132, 68, 4, 82, 106, 12, 4, 4, 133, 4, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 126, 127, 127, 127, 128, 128, 128, 129, 0, 0, - 82, 82, 82, 82, 82, 83, 85, 85, 85, 85, 85, 86, 130, 131, 132, 133, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 37, 134, 135, 0, - 136, 136, 136, 136, 137, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 134, + 4, 4, 4, 4, 75, 0, 15, 113, 4, 4, 4, 4, 4, 4, 4, 4, + 135, 136, 4, 137, 113, 4, 4, 22, 138, 139, 4, 4, 140, 4, 141, 142, + 143, 144, 4, 95, 139, 95, 0, 145, 25, 146, 67, 134, 32, 147, 148, 149, + 4, 14, 150, 151, 4, 152, 153, 154, 155, 156, 82, 157, 4, 4, 4, 144, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 158, 159, 160, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 161, 4, 4, 162, 0, 163, 164, 165, 4, 4, 93, 166, 4, + 4, 4, 113, 32, 4, 4, 4, 4, 4, 113, 15, 4, 167, 4, 31, 168, + 0, 0, 0, 169, 4, 4, 4, 134, 0, 1, 1, 170, 113, 99, 171, 0, + 172, 173, 174, 0, 4, 4, 4, 88, 0, 0, 4, 104, 0, 0, 0, 0, + 0, 0, 0, 0, 134, 4, 175, 0, 4, 23, 176, 98, 113, 4, 177, 0, + 4, 4, 4, 4, 113, 15, 178, 160, 4, 179, 4, 111, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 103, 98, 31, 0, 0, 0, 0, + 180, 181, 98, 103, 99, 0, 0, 182, 98, 162, 0, 0, 4, 183, 0, 0, + 184, 98, 0, 134, 134, 0, 74, 185, 4, 98, 98, 147, 93, 0, 0, 0, + 4, 4, 14, 0, 4, 147, 4, 147, 4, 111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 186, 0, 0, 134, 187, 110, 0, 0, 15, 185, 103, + 108, 188, 0, 0, 108, 22, 15, 14, 108, 67, 189, 190, 108, 147, 191, 0, + 192, 193, 0, 0, 194, 114, 99, 0, 48, 45, 195, 56, 0, 0, 0, 0, + 4, 104, 196, 56, 4, 22, 197, 0, 0, 0, 0, 0, 4, 133, 198, 0, + 4, 22, 199, 0, 4, 200, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, + 4, 193, 0, 0, 0, 4, 4, 201, 202, 203, 204, 0, 0, 205, 175, 206, + 207, 208, 209, 4, 210, 0, 4, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 211, 133, 73, 212, 22, 0, 0, 0, 213, 175, 214, 215, 216, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 46, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 162, 0, 0, 0, + 4, 4, 4, 133, 4, 4, 4, 4, 4, 4, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 18, 139, 18, 18, 18, 102, 0, 0, - 18, 18, 18, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 78, 18, 78, 18, 18, 18, 18, 18, 18, 18, 0, 140, - 18, 141, 142, 18, 18, 143, 144, 18, 145, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 147, 147, - 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, 0, 0, 0, 0, 0, 0, - 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 11, 11, 4, 5, 15, 15, 8, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 29, 99, 0, 0, 0, 15, 217, 4, 22, 111, 218, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 149, 149, 149, 149, 149, 150, 150, 150, 150, 150, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 151, 150, 150, 150, 150, 152, + 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 219, 0, 166, 0, 0, 220, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 188, + 4, 4, 4, 4, 4, 4, 98, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 153, 153, 153, 153, 153, 153, 154, 0, 155, 155, 155, 155, 155, 155, 156, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 99, 0, 221, 222, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 160, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 223, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 11, 11, 11, 11, 15, 15, 15, 15, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 15, 15, 15, 15, + 4, 4, 30, 4, 225, 226, 227, 4, 228, 229, 230, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 231, 232, 82, 30, 30, 126, 126, 211, 211, 150, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 233, 234, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 193, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 185, 0, 4, 4, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 157, 157, 157, 157, 158, 159, 159, 159, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 227, 236, 237, 238, 239, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 113, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 104, 4, 4, 4, 4, 4, 4, + 113, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 241, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 73, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 17, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_all_cases_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, - 5, 6, 5, 7, 5, 5, 5, 5, 5, 5, 5, 8, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, - 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 11, - 5, 5, 5, 5, 5, 12, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 13, - 14, 15, 14, 15, 14, 15, 14, 15, 16, 17, 14, 15, 14, 15, 14, 15, - 0, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, - 15, 0, 14, 15, 14, 15, 14, 15, 18, 14, 15, 14, 15, 14, 15, 19, - 20, 21, 14, 15, 14, 15, 22, 14, 15, 23, 23, 14, 15, 0, 24, 25, - 26, 14, 15, 23, 27, 28, 29, 30, 14, 15, 31, 0, 29, 32, 33, 34, - 14, 15, 14, 15, 14, 15, 35, 14, 15, 35, 0, 0, 14, 15, 35, 14, - 15, 36, 36, 14, 15, 14, 15, 37, 14, 15, 0, 0, 14, 15, 0, 38, - 0, 0, 0, 0, 39, 40, 41, 39, 40, 41, 39, 40, 41, 14, 15, 14, - 15, 14, 15, 14, 15, 42, 14, 15, 0, 39, 40, 41, 14, 15, 43, 44, - 45, 0, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 0, 0, 0, 0, - 0, 0, 46, 14, 15, 47, 48, 49, 49, 14, 15, 50, 51, 52, 14, 15, - 53, 54, 55, 56, 57, 0, 58, 58, 0, 59, 0, 60, 61, 0, 0, 0, - 58, 62, 0, 63, 0, 64, 65, 0, 66, 67, 65, 68, 69, 0, 0, 67, - 0, 70, 71, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, - 74, 0, 75, 74, 0, 0, 0, 76, 74, 77, 78, 78, 79, 0, 0, 0, - 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 82, 0, - 0, 0, 0, 0, 0, 83, 0, 0, 14, 15, 14, 15, 0, 0, 14, 15, - 0, 0, 0, 33, 33, 33, 0, 84, 0, 0, 0, 0, 0, 0, 85, 0, - 86, 86, 86, 0, 87, 0, 88, 88, 89, 1, 90, 1, 1, 91, 1, 1, - 92, 93, 94, 1, 95, 1, 1, 1, 96, 97, 0, 98, 1, 1, 99, 1, - 1, 100, 1, 1, 101, 102, 102, 102, 103, 5, 104, 5, 5, 105, 5, 5, - 106, 107, 108, 5, 109, 5, 5, 5, 110, 111, 112, 113, 5, 5, 114, 5, - 5, 115, 5, 5, 116, 117, 117, 118, 119, 120, 0, 0, 0, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 0, 14, 15, 130, 14, 15, 0, 45, 45, 45, - 131, 131, 131, 131, 131, 131, 131, 131, 1, 1, 132, 1, 133, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 134, 1, 1, 135, 136, 1, 1, 1, 1, 1, - 1, 1, 137, 1, 1, 1, 1, 1, 5, 5, 138, 5, 139, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 140, 5, 5, 141, 142, 5, 5, 5, 5, 5, - 5, 5, 143, 5, 5, 5, 5, 5, 144, 144, 144, 144, 144, 144, 144, 144, - 14, 15, 145, 146, 14, 15, 14, 15, 14, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 14, 15, 14, 15, 14, 15, 147, 14, 15, 14, 15, 14, 15, 14, - 15, 14, 15, 14, 15, 14, 15, 148, 0, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, - 0, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 0, 151, 151, 151, 151, 151, 151, 151, 151, - 151, 151, 151, 151, 151, 151, 0, 151, 0, 0, 0, 0, 0, 151, 0, 0, - 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 0, 0, 152, 152, 152, - 153, 153, 153, 153, 153, 153, 153, 153, 118, 118, 118, 118, 118, 118, 0, 0, - 123, 123, 123, 123, 123, 123, 0, 0, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 0, 0, 0, 0, 0, 0, 0, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 0, 0, 163, 163, 163, 0, 164, 0, 0, 0, 165, 0, 0, - 0, 0, 0, 0, 0, 0, 166, 0, 167, 168, 14, 15, 14, 15, 14, 15, - 14, 15, 14, 15, 14, 15, 0, 0, 0, 0, 0, 169, 0, 0, 170, 0, - 118, 118, 118, 118, 118, 118, 118, 118, 123, 123, 123, 123, 123, 123, 123, 123, - 0, 118, 0, 118, 0, 118, 0, 118, 0, 123, 0, 123, 0, 123, 0, 123, - 171, 171, 172, 172, 172, 172, 173, 173, 174, 174, 175, 175, 176, 176, 0, 0, - 118, 118, 0, 177, 0, 0, 0, 0, 123, 123, 178, 178, 179, 0, 180, 0, - 0, 0, 0, 177, 0, 0, 0, 0, 181, 181, 181, 181, 179, 0, 0, 0, - 118, 118, 0, 182, 0, 0, 0, 0, 123, 123, 183, 183, 0, 0, 0, 0, - 118, 118, 0, 184, 0, 126, 0, 0, 123, 123, 185, 185, 130, 0, 0, 0, - 186, 186, 187, 187, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0, - 0, 0, 189, 190, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 0, 193, 193, 193, 193, 193, 193, 193, 193, - 194, 194, 194, 194, 194, 194, 194, 194, 0, 0, 0, 14, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 0, 0, 0, 0, 0, 0, - 14, 15, 197, 198, 199, 200, 201, 14, 15, 14, 15, 14, 15, 202, 203, 204, - 205, 0, 14, 15, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 206, 206, - 0, 0, 0, 14, 15, 14, 15, 0, 0, 0, 14, 15, 0, 0, 0, 0, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 0, 207, - 0, 0, 0, 0, 0, 207, 0, 0, 14, 15, 208, 209, 14, 15, 14, 15, - 0, 14, 15, 14, 15, 210, 14, 15, 0, 0, 0, 14, 15, 211, 0, 0, - 14, 15, 14, 15, 149, 0, 14, 15, 14, 15, 212, 213, 214, 215, 212, 0, - 216, 217, 218, 219, 14, 15, 14, 15, 0, 0, 14, 15, 150, 220, 221, 0, - 0, 0, 0, 222, 0, 0, 0, 0, 223, 223, 223, 223, 223, 223, 223, 223, - 0, 0, 0, 0, 0, 14, 15, 0, 224, 224, 224, 224, 224, 224, 224, 224, - 225, 225, 225, 225, 225, 225, 225, 225, 224, 224, 224, 224, 0, 0, 0, 0, - 225, 225, 225, 225, 0, 0, 0, 0, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 0, 0, 0, 0, 0, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 0, 0, 0, 0, 0, 226, 226, 226, 226, 226, 226, 226, 226, - 226, 226, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 0, 0, 0, 0, -}; +static RE_UINT8 re_xid_start_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, + 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 0, 0, 223, 184, + 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, + 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 0, 0, 0, 0, 255, 255, + 255, 135, 7, 0, 255, 7, 0, 0, 0, 192, 254, 255, 255, 255, 47, 0, + 96, 192, 0, 156, 0, 0, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, + 63, 0, 2, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 63, 4, + 16, 1, 0, 0, 255, 255, 255, 1, 255, 255, 223, 255, 255, 0, 0, 0, + 240, 255, 255, 255, 255, 255, 255, 35, 0, 0, 1, 255, 3, 0, 254, 255, + 225, 159, 249, 255, 255, 253, 197, 35, 0, 64, 0, 176, 3, 0, 3, 16, + 224, 135, 249, 255, 255, 253, 109, 3, 0, 0, 0, 94, 0, 0, 28, 0, + 224, 191, 251, 255, 255, 253, 237, 35, 0, 0, 1, 0, 3, 0, 0, 2, + 224, 159, 249, 255, 0, 0, 0, 176, 3, 0, 2, 0, 232, 199, 61, 214, + 24, 199, 255, 3, 224, 223, 253, 255, 255, 253, 255, 35, 0, 0, 0, 7, + 3, 0, 0, 0, 225, 223, 253, 255, 255, 253, 239, 35, 0, 0, 0, 64, + 3, 0, 6, 0, 240, 223, 253, 255, 255, 255, 255, 39, 0, 64, 112, 128, + 3, 0, 0, 252, 224, 255, 127, 252, 255, 255, 251, 47, 127, 0, 0, 0, + 254, 255, 255, 255, 255, 255, 5, 0, 214, 247, 255, 255, 175, 255, 5, 32, + 95, 0, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, 255, 31, 0, 0, + 0, 31, 0, 0, 255, 7, 0, 128, 0, 0, 63, 60, 98, 192, 225, 255, + 3, 64, 0, 0, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, + 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, + 255, 255, 255, 7, 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, + 255, 223, 3, 0, 255, 255, 3, 0, 255, 223, 1, 0, 255, 255, 15, 0, + 0, 0, 128, 16, 255, 5, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, + 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 0, 0, 255, 255, 127, 0, + 255, 255, 31, 0, 128, 0, 0, 0, 224, 255, 255, 255, 224, 15, 0, 0, + 248, 255, 255, 255, 1, 192, 0, 252, 63, 0, 0, 0, 15, 0, 0, 0, + 0, 224, 0, 252, 255, 255, 255, 63, 255, 1, 255, 255, 255, 255, 255, 231, + 0, 222, 111, 4, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, + 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 63, + 80, 253, 255, 243, 224, 67, 0, 0, 255, 127, 255, 255, 31, 120, 12, 0, + 255, 128, 0, 0, 127, 127, 127, 127, 224, 0, 0, 0, 254, 3, 62, 31, + 255, 255, 127, 224, 255, 127, 0, 0, 255, 255, 255, 31, 255, 31, 255, 255, + 0, 12, 0, 0, 255, 127, 0, 128, 0, 0, 128, 255, 252, 255, 255, 255, + 255, 249, 255, 255, 252, 7, 0, 0, 0, 0, 224, 255, 187, 247, 255, 255, + 7, 0, 0, 0, 0, 0, 252, 104, 63, 0, 255, 255, 255, 255, 7, 0, + 0, 128, 0, 0, 223, 255, 0, 124, 247, 15, 0, 0, 255, 255, 127, 196, + 255, 255, 98, 62, 5, 0, 0, 56, 255, 7, 28, 0, 126, 126, 126, 0, + 127, 127, 255, 255, 255, 3, 255, 255, 15, 0, 255, 255, 127, 248, 255, 255, + 255, 255, 255, 15, 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 160, + 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, + 0, 0, 255, 3, 0, 0, 138, 170, 192, 255, 255, 255, 252, 252, 252, 28, + 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 1, 0, + 255, 7, 255, 255, 15, 255, 62, 0, 255, 255, 15, 255, 255, 0, 255, 255, + 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, 255, 255, 255, 192, + 1, 0, 239, 254, 31, 0, 0, 0, 255, 3, 3, 0, 128, 0, 255, 255, + 255, 255, 255, 0, 144, 0, 255, 255, 255, 255, 71, 0, 30, 0, 0, 20, + 255, 255, 251, 255, 255, 15, 0, 0, 127, 189, 255, 191, 0, 0, 1, 224, + 128, 7, 0, 128, 176, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, + 255, 7, 0, 1, 0, 0, 0, 128, 127, 242, 111, 255, 255, 255, 0, 128, + 2, 0, 0, 0, 255, 252, 255, 255, 10, 0, 0, 0, 1, 248, 255, 255, + 255, 255, 7, 4, 0, 0, 1, 240, 255, 3, 0, 32, 255, 253, 255, 255, + 0, 0, 252, 255, 127, 251, 255, 255, 64, 0, 0, 0, 191, 253, 255, 255, + 255, 3, 0, 1, 255, 63, 0, 0, 248, 255, 255, 224, 255, 7, 1, 0, + 11, 0, 0, 0, 0, 0, 7, 0, 240, 0, 255, 255, 255, 7, 255, 31, + 255, 1, 255, 3, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, + 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, + 253, 255, 255, 247, 255, 31, 128, 63, 0, 64, 0, 0, 15, 8, 0, 0, + 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, + 238, 251, 255, 15, 3, 0, 255, 255 +}; + +RE_UINT32 re_get_xid_start(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_xid_start_table_1[field_2]; + v = re_xid_start_table_2[(v << 5) | field_1]; + v = re_xid_start_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} -/* All_Cases: 2544 bytes. */ - -static RE_AllCases re_all_cases_table[] = { - {{ 0, 0, 0}}, - {{ 32, 0, 0}}, - {{ 32, 232, 0}}, - {{ 32, 8415, 0}}, - {{ 32, 300, 0}}, - {{ -32, 0, 0}}, - {{ -32, 199, 0}}, - {{ -32, 8383, 0}}, - {{ -32, 268, 0}}, - {{ 743, 775, 0}}, - {{ 32, 8294, 0}}, - {{ 7615, 0, 0}}, - {{ -32, 8262, 0}}, - {{ 121, 0, 0}}, - {{ 1, 0, 0}}, - {{ -1, 0, 0}}, - {{ -199, 0, 0}}, - {{ -232, 0, 0}}, - {{ -121, 0, 0}}, - {{ -300, -268, 0}}, - {{ 195, 0, 0}}, - {{ 210, 0, 0}}, - {{ 206, 0, 0}}, - {{ 205, 0, 0}}, - {{ 79, 0, 0}}, - {{ 202, 0, 0}}, - {{ 203, 0, 0}}, - {{ 207, 0, 0}}, - {{ 97, 0, 0}}, - {{ 211, 0, 0}}, - {{ 209, 0, 0}}, - {{ 163, 0, 0}}, - {{ 213, 0, 0}}, - {{ 130, 0, 0}}, - {{ 214, 0, 0}}, - {{ 218, 0, 0}}, - {{ 217, 0, 0}}, - {{ 219, 0, 0}}, - {{ 56, 0, 0}}, - {{ 1, 2, 0}}, - {{ -1, 1, 0}}, - {{ -2, -1, 0}}, - {{ -79, 0, 0}}, - {{ -97, 0, 0}}, - {{ -56, 0, 0}}, - {{ -130, 0, 0}}, - {{ 10795, 0, 0}}, - {{ -163, 0, 0}}, - {{ 10792, 0, 0}}, - {{ 10815, 0, 0}}, - {{ -195, 0, 0}}, - {{ 69, 0, 0}}, - {{ 71, 0, 0}}, - {{ 10783, 0, 0}}, - {{ 10780, 0, 0}}, - {{ 10782, 0, 0}}, - {{ -210, 0, 0}}, - {{ -206, 0, 0}}, - {{ -205, 0, 0}}, - {{ -202, 0, 0}}, - {{ -203, 0, 0}}, - {{ 42319, 0, 0}}, - {{ 42315, 0, 0}}, - {{ -207, 0, 0}}, - {{ 42280, 0, 0}}, - {{ 42308, 0, 0}}, - {{ -209, 0, 0}}, - {{ -211, 0, 0}}, - {{ 10743, 0, 0}}, - {{ 42305, 0, 0}}, - {{ 10749, 0, 0}}, - {{ -213, 0, 0}}, - {{ -214, 0, 0}}, - {{ 10727, 0, 0}}, - {{ -218, 0, 0}}, - {{ 42307, 0, 0}}, - {{ 42282, 0, 0}}, - {{ -69, 0, 0}}, - {{ -217, 0, 0}}, - {{ -71, 0, 0}}, - {{ -219, 0, 0}}, - {{ 42261, 0, 0}}, - {{ 42258, 0, 0}}, - {{ 84, 116, 7289}}, - {{ 116, 0, 0}}, - {{ 38, 0, 0}}, - {{ 37, 0, 0}}, - {{ 64, 0, 0}}, - {{ 63, 0, 0}}, - {{ 7235, 0, 0}}, - {{ 32, 62, 0}}, - {{ 32, 96, 0}}, - {{ 32, 57, 92}}, - {{ -84, 32, 7205}}, - {{ 32, 86, 0}}, - {{ -743, 32, 0}}, - {{ 32, 54, 0}}, - {{ 32, 80, 0}}, - {{ 31, 32, 0}}, - {{ 32, 47, 0}}, - {{ 32, 7549, 0}}, - {{ -38, 0, 0}}, - {{ -37, 0, 0}}, - {{ 7219, 0, 0}}, - {{ -32, 30, 0}}, - {{ -32, 64, 0}}, - {{ -32, 25, 60}}, - {{ -116, -32, 7173}}, - {{ -32, 54, 0}}, - {{ -775, -32, 0}}, - {{ -32, 22, 0}}, - {{ -32, 48, 0}}, - {{ -31, 1, 0}}, - {{ -32, -1, 0}}, - {{ -32, 15, 0}}, - {{ -32, 7517, 0}}, - {{ -64, 0, 0}}, - {{ -63, 0, 0}}, - {{ 8, 0, 0}}, - {{ -62, -30, 0}}, - {{ -57, -25, 35}}, - {{ -47, -15, 0}}, - {{ -54, -22, 0}}, - {{ -8, 0, 0}}, - {{ -86, -54, 0}}, - {{ -80, -48, 0}}, - {{ 7, 0, 0}}, - {{ -116, 0, 0}}, - {{ -92, -60, -35}}, - {{ -96, -64, 0}}, - {{ -7, 0, 0}}, - {{ 80, 0, 0}}, - {{ 32, 6254, 0}}, - {{ 32, 6253, 0}}, - {{ 32, 6244, 0}}, - {{ 32, 6242, 0}}, - {{ 32, 6242, 6243}}, - {{ 32, 6236, 0}}, - {{ -32, 6222, 0}}, - {{ -32, 6221, 0}}, - {{ -32, 6212, 0}}, - {{ -32, 6210, 0}}, - {{ -32, 6210, 6211}}, - {{ -32, 6204, 0}}, - {{ -80, 0, 0}}, - {{ 1, 6181, 0}}, - {{ -1, 6180, 0}}, - {{ 15, 0, 0}}, - {{ -15, 0, 0}}, - {{ 48, 0, 0}}, - {{ -48, 0, 0}}, - {{ 7264, 0, 0}}, - {{ 3008, 0, 0}}, - {{ 38864, 0, 0}}, - {{ -6254, -6222, 0}}, - {{ -6253, -6221, 0}}, - {{ -6244, -6212, 0}}, - {{ -6242, -6210, 0}}, - {{ -6242, -6210, 1}}, - {{ -6243, -6211, -1}}, - {{ -6236, -6204, 0}}, - {{ -6181, -6180, 0}}, - {{ 35266, 35267, 0}}, - {{ -3008, 0, 0}}, - {{ 35332, 0, 0}}, - {{ 3814, 0, 0}}, - {{ 35384, 0, 0}}, - {{ 1, 59, 0}}, - {{ -1, 58, 0}}, - {{ -59, -58, 0}}, - {{ -7615, 0, 0}}, - {{ 74, 0, 0}}, - {{ 86, 0, 0}}, - {{ 100, 0, 0}}, - {{ 128, 0, 0}}, - {{ 112, 0, 0}}, - {{ 126, 0, 0}}, - {{ 9, 0, 0}}, - {{ -74, 0, 0}}, - {{ -9, 0, 0}}, - {{ -7289, -7205, -7173}}, - {{ -86, 0, 0}}, - {{ -7235, 0, 0}}, - {{ -100, 0, 0}}, - {{ -7219, 0, 0}}, - {{ -112, 0, 0}}, - {{ -128, 0, 0}}, - {{ -126, 0, 0}}, - {{ -7549, -7517, 0}}, - {{ -8415, -8383, 0}}, - {{ -8294, -8262, 0}}, - {{ 28, 0, 0}}, - {{ -28, 0, 0}}, - {{ 16, 0, 0}}, - {{ -16, 0, 0}}, - {{ 26, 0, 0}}, - {{ -26, 0, 0}}, - {{-10743, 0, 0}}, - {{ -3814, 0, 0}}, - {{-10727, 0, 0}}, - {{-10795, 0, 0}}, - {{-10792, 0, 0}}, - {{-10780, 0, 0}}, - {{-10749, 0, 0}}, - {{-10783, 0, 0}}, - {{-10782, 0, 0}}, - {{-10815, 0, 0}}, - {{ -7264, 0, 0}}, - {{-35266, 1, 0}}, - {{-35267, -1, 0}}, - {{-35332, 0, 0}}, - {{-42280, 0, 0}}, - {{-42308, 0, 0}}, - {{-42319, 0, 0}}, - {{-42315, 0, 0}}, - {{-42305, 0, 0}}, - {{-42258, 0, 0}}, - {{-42282, 0, 0}}, - {{-42261, 0, 0}}, - {{ 928, 0, 0}}, - {{-42307, 0, 0}}, - {{-35384, 0, 0}}, - {{ -928, 0, 0}}, - {{-38864, 0, 0}}, - {{ 40, 0, 0}}, - {{ -40, 0, 0}}, - {{ 34, 0, 0}}, - {{ -34, 0, 0}}, +/* All cases. */ +static RE_UINT8 re_all_cases_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, + 2, 11, 2, 12, 2, 2, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 14, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; -/* All_Cases: 2736 bytes. */ - -int re_get_all_cases(RE_UINT32 ch, RE_UINT32* codepoints) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - RE_AllCases* all_cases; - int count; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_all_cases_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_all_cases_stage_2[pos + f] << 5; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_all_cases_stage_3[pos + f] << 3; - value = re_all_cases_stage_4[pos + code]; - - all_cases = &re_all_cases_table[value]; - - codepoints[0] = ch; - count = 1; - - while (count < RE_MAX_CASES && all_cases->diffs[count - 1] != 0) { - codepoints[count] = (RE_UINT32)((RE_INT32)ch + all_cases->diffs[count - - 1]); - ++count; - } - - return count; +static RE_UINT8 re_all_cases_table_2[] = { + 0, 0, 1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 6, 14, 15, 16, 17, 0, 0, 0, 0, 0, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 6, 29, 6, 6, 30, 31, 32, 33, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 39, + 0, 0, 0, 0, 40, 36, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, + 6, 6, 6, 43, 44, 6, 6, 6, 45, 46, 47, 48, 46, 49, 50, 51, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 56, 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 59, 60, 61, 62, 6, 6, 6, 63, 34, 64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 66, 67, 0, 0, 0, 0, 68, 6, 69, 70, 71, 72, 73, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 0, 0, 0, 0, 0, + 79, 80, 81, 0, 0, 82, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 85, 86, 85, 86, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 88, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 89, 90, 91, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_all_cases_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 134, 1, 3, 1, 1, 1, 1, + 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, + 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 83, + 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 29, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 133, 15, 16, 16, 16, 16, 16, 16, 0, 23, 23, 25, 25, 23, 23, 27, + 27, 23, 23, 25, 25, 23, 23, 28, 28, 0, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 29, 23, 23, 25, 25, 23, 23, 136, + 53, 30, 16, 16, 16, 16, 30, 28, 28, 31, 32, 25, 25, 0, 33, 34, + 35, 23, 23, 36, 37, 47, 38, 38, 16, 16, 51, 0, 36, 39, 49, 40, + 16, 16, 16, 16, 16, 16, 41, 28, 28, 42, 0, 0, 16, 16, 41, 43, + 43, 44, 45, 25, 25, 23, 23, 46, 16, 16, 0, 0, 16, 16, 0, 48, + 0, 0, 0, 0, 155, 155, 24, 149, 149, 17, 156, 156, 26, 23, 23, 43, + 43, 23, 23, 25, 25, 23, 23, 28, 28, 23, 23, 25, 25, 33, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 150, 150, 18, 16, 16, 47, 48, 16, 16, 16, 16, 16, 16, 16, 16, + 49, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 50, 25, 25, 51, 52, 108, + 106, 23, 23, 53, 54, 55, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 106, 104, 107, 30, 30, 0, 31, 32, 0, 34, 0, 35, 112, 0, 0, 0, + 36, 113, 0, 37, 0, 110, 111, 0, 38, 38, 115, 101, 114, 0, 0, 36, + 0, 105, 39, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 103, 0, 0, + 41, 0, 120, 42, 0, 0, 0, 117, 41, 54, 44, 45, 55, 0, 0, 0, + 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 116, 0, + 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 0, 0, 16, 16, 0, 0, 0, 75, 76, 76, 0, 56, + 0, 0, 0, 0, 0, 0, 57, 0, 58, 59, 58, 0, 60, 0, 61, 62, + 0, 1, 6, 1, 1, 7, 1, 1, 8, 142, 10, 1, 145, 1, 1, 1, + 63, 64, 0, 151, 65, 65, 66, 65, 65, 67, 65, 65, 57, 58, 59, 58, + 0, 1, 6, 1, 1, 7, 1, 1, 8, 9, 10, 1, 11, 1, 1, 1, + 63, 64, 151, 19, 65, 65, 66, 65, 65, 67, 65, 65, 60, 61, 62, 71, + 138, 140, 0, 0, 0, 159, 157, 71, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 144, 158, 74, 56, 141, 139, 0, 28, 28, 74, 16, 16, 0, 75, 76, 76, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 1, 1, 12, 1, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 1, + 65, 68, 69, 65, 65, 65, 65, 65, 65, 65, 70, 65, 65, 65, 65, 65, + 1, 1, 12, 1, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 1, + 65, 68, 69, 65, 65, 65, 65, 65, 65, 65, 70, 65, 65, 65, 65, 65, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 16, 16, 20, 20, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 28, 23, 23, 25, 25, 23, 23, 28, 28, 23, 23, 25, 25, 23, 23, 28, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 78, 78, 78, 78, 78, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 78, 78, 78, 78, 78, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 80, 80, 80, 80, 80, 80, 0, 80, 0, 0, 0, 0, 0, 80, 0, 0, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 0, 82, 82, 82, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 81, 81, 81, 81, 81, 81, 0, 0, 81, 81, 81, 81, 81, 81, 0, 0, + 146, 147, 148, 161, 162, 163, 164, 152, 154, 0, 0, 0, 0, 0, 0, 0, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 102, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 153, 0, 0, 83, 0, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 0, 0, 81, 81, 81, 81, 81, 81, 0, 0, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 0, 0, 81, 81, 81, 81, 81, 81, 0, 0, + 0, 81, 0, 81, 0, 81, 0, 81, 0, 81, 0, 81, 0, 81, 0, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 84, 84, 85, 85, 86, 86, 87, 87, 90, 90, 88, 88, 75, 75, 0, 0, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 0, 28, 0, 0, 0, 0, 81, 81, 84, 84, 28, 0, 143, 0, + 0, 0, 0, 28, 0, 0, 0, 0, 85, 85, 86, 86, 28, 0, 0, 0, + 81, 81, 0, 0, 0, 0, 0, 0, 81, 81, 87, 87, 0, 0, 0, 0, + 81, 81, 0, 0, 0, 89, 0, 0, 81, 81, 88, 88, 89, 0, 0, 0, + 0, 0, 0, 28, 0, 0, 0, 0, 90, 90, 75, 75, 28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 160, 0, 0, 0, 135, 137, 0, 0, 0, 0, + 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 0, 0, 0, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 93, 93, 94, 94, 95, 95, 94, 94, 93, 93, + 96, 96, 97, 97, 96, 96, 98, 98, 57, 57, 99, 99, 57, 57, 98, 98, + 93, 93, 94, 94, 95, 95, 94, 94, 93, 93, 96, 96, 97, 97, 96, 96, + 98, 98, 57, 57, 99, 99, 57, 57, 98, 98, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, + 16, 16, 101, 102, 103, 50, 52, 28, 28, 23, 23, 25, 25, 104, 105, 106, + 107, 0, 16, 16, 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 108, 106, + 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 25, 25, 23, 23, 0, + 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 80, 80, 80, 80, 80, 0, 80, 0, 0, 0, 0, 0, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 154, 22, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, + 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 25, 25, 109, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 25, 25, 110, 0, 0, + 16, 16, 16, 16, 77, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 111, 112, 113, 114, 115, 0, + 116, 117, 118, 119, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 0, 16, 16, 77, 120, 121, 28, 28, 23, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 0, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 0, 0, 0, 0, 0, + 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, + 126, 126, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 128, 128, 128, 128, + 129, 129, 129, 129, 129, 129, 129, 129, 126, 126, 126, 126, 126, 126, 126, 126, + 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126, 126, 126, 126, 126, + 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128, + 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, + 126, 126, 126, 126, 0, 0, 0, 0, 129, 129, 129, 129, 129, 129, 129, 129, + 128, 128, 128, 128, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, + 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126, 0, 0, 0, 0, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 130, 130, 98, 98, 130, 130, 99, 99, 130, 130, 98, 98, 130, 130, 131, 131, + 130, 130, 98, 98, 130, 130, 99, 99, 130, 130, 98, 98, 130, 130, 132, 132, + 72, 72, 130, 130, 98, 98, 130, 130, 99, 99, 130, 130, 98, 98, 130, 130, + 131, 131, 130, 130, 98, 98, 130, 130, 99, 99, 130, 130, 98, 98, 130, 130, + 132, 132, 72, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_AllCases re_all_cases_table_4[] = { + { 0, 0, 0}, + { 32, 0, 0}, + { 32, 304, 0}, + { 32, 8490, 0}, + { 32, 383, 0}, + { 32, 8491, 0}, + { 32, 976, 0}, + { 32, 1013, 0}, + { 32, 977, 1012}, + { 252, 921, 8126}, + { 32, 1008, 0}, + { 777, 924, 0}, + { 32, 7296, 0}, + { 32, 7297, 0}, + { 32, 7298, 0}, + { 376, 0, 0}, + { 1, 0, 0}, + { 14, 456, 0}, + { 2, 498, 0}, + { 96, 962, 0}, + { 1, 7303, 0}, + { 1, 7835, 0}, + {47811, 42570, 0}, + { 3, 0, 0}, + { 2, 453, 0}, + { 7, 0, 0}, + { 6, 459, 0}, + { 127, 0, 0}, + { 15, 0, 0}, + { 391, 0, 0}, + { 978, 0, 0}, + { 991, 0, 0}, + { 989, 0, 0}, + { 83, 0, 0}, + { 982, 0, 0}, + { 971, 0, 0}, + { 1011, 0, 0}, + { 1015, 0, 0}, + { 1023, 0, 0}, + { 1007, 0, 0}, + { 1002, 0, 0}, + { 806, 0, 0}, + { 810, 0, 0}, + { 31, 0, 0}, + { 827, 0, 0}, + { 825, 0, 0}, + { 805, 0, 0}, + { 99, 0, 0}, + { 72, 0, 0}, + { 958, 0, 0}, + {11871, 0, 0}, + { 935, 0, 0}, + {11864, 0, 0}, + { 963, 0, 0}, + { 205, 0, 0}, + { 201, 0, 0}, + { 140, 0, 0}, + { 42, 0, 0}, + { 37, 0, 0}, + { 39, 0, 0}, + { 64, 0, 0}, + { 67, 0, 0}, + { 65, 0, 0}, + { 96, 982, 0}, + { 96, 1009, 0}, + { 96, 0, 0}, + { 96, 981, 0}, + { 96, 8486, 0}, + { 96, 7299, 0}, + { 96, 7300, 7301}, + { 96, 7302, 0}, + { 24, 0, 0}, + { 98, 0, 0}, + { 48, 0, 0}, + { 11, 0, 0}, + { 134, 0, 0}, + { 130, 0, 0}, + { 80, 0, 0}, + { 208, 0, 0}, + {15776, 0, 0}, + {15840, 0, 0}, + { 8, 0, 0}, + { 3136, 0, 0}, + { 7745, 0, 0}, + { 202, 0, 0}, + { 186, 0, 0}, + { 190, 0, 0}, + { 172, 0, 0}, + { 144, 0, 0}, + { 9, 0, 0}, + { 128, 0, 0}, + { 124, 0, 0}, + { 16, 0, 0}, + { 102, 0, 0}, + { 106, 0, 0}, + { 110, 0, 0}, + { 26, 0, 0}, + { 30, 0, 0}, + { 38, 0, 0}, + { 46, 0, 0}, + { 112, 0, 0}, + {11785, 0, 0}, + {12574, 0, 0}, + {11801, 0, 0}, + {11836, 0, 0}, + {11807, 0, 0}, + {11839, 0, 0}, + {11810, 0, 0}, + {11841, 0, 0}, + {47620, 0, 0}, + {42472, 0, 0}, + {42444, 0, 0}, + {42487, 0, 0}, + {42445, 0, 0}, + {42433, 0, 0}, + {42436, 0, 0}, + {42286, 0, 0}, + {42294, 0, 0}, + {42287, 0, 0}, + { 3296, 0, 0}, + {42311, 0, 0}, + {47688, 0, 0}, + {47312, 0, 0}, + {47152, 0, 0}, + {47184, 0, 0}, + {47216, 0, 0}, + { 40, 0, 0}, + { 56, 0, 0}, + { 88, 0, 0}, + { 104, 0, 0}, + { 34, 0, 0}, + { 62, 0, 0}, + { 94, 0, 0}, + { 345, 0, 0}, + { 32, 305, 0}, + { 8545, 107, 0}, + { 300, 115, 0}, + { 8686, 229, 0}, + { 66, 946, 0}, + { 96, 949, 0}, + { 73, 952, 1012}, + { 108, 952, 977}, + { 220, 953, 8126}, + { 7419, 921, 953}, + { 106, 954, 0}, + { 809, 956, 0}, + { 6290, 1074, 0}, + { 6293, 1076, 0}, + { 6300, 1086, 0}, + { 15, 457, 0}, + { 3, 499, 0}, + { 97, 963, 0}, + { 6373, 1123, 0}, + { 251, 7777, 0}, + {47810, 42571, 0}, + { 1, 454, 0}, + { 1, 460, 0}, + { 118, 960, 0}, + { 80, 961, 0}, + { 115, 966, 0}, + { 8847, 969, 0}, + { 6306, 1089, 0}, + { 6310, 1090, 7301}, + { 6311, 1090, 7300}, + { 6316, 1098, 0} +}; + +int re_get_all_cases(RE_UINT32 codepoint, RE_UINT32* cases) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_all_cases_table_1[field_2]; + v = re_all_cases_table_2[(v << 5) | field_1]; + v = re_all_cases_table_3[(v << 5) | field_0]; + + cases[0] = codepoint; + + if (re_all_cases_table_4[v].delta == 0) + return 1; + + cases[1] = codepoint ^ re_all_cases_table_4[v].delta; + + if (re_all_cases_table_4[v].others[0] == 0) + return 2; + + cases[2] = re_all_cases_table_4[v].others[0]; + + if (re_all_cases_table_4[v].others[1] == 0) + return 3; + + cases[3] = re_all_cases_table_4[v].others[1]; + + return 4; } -/* Simple_Case_Folding. */ +/* Simple case folding. */ +static RE_UINT8 re_simple_folding_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, + 2, 11, 2, 12, 2, 2, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 14, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; -static RE_UINT8 re_simple_case_folding_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, +static RE_UINT8 re_simple_folding_table_2[] = { + 0, 0, 1, 0, 0, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, + 4, 12, 13, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, + 20, 21, 0, 4, 22, 4, 23, 4, 4, 24, 25, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, + 0, 0, 0, 0, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 31, 4, 4, 4, 32, 33, 34, 35, 33, 36, 37, 38, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 40, 41, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 44, 45, 0, 46, 4, 4, 4, 47, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 48, 49, 0, 0, 0, 0, 50, 4, 51, 52, 53, 54, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 57, 58, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, + 60, 61, 0, 0, 0, 62, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 64, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_simple_case_folding_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 7, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 10, 11, - 6, 12, 6, 6, 13, 6, 6, 6, 6, 6, 6, 6, 14, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 15, 16, 6, 6, 6, 17, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 18, - 6, 6, 6, 6, 19, 6, 6, 6, 6, 6, 6, 6, 20, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 21, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 22, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 23, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +static RE_UINT8 re_simple_folding_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 66, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 18, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 65, 0, 1, 0, 1, 0, 1, 0, 0, 3, 0, 5, 0, 3, 0, 49, + 0, 3, 0, 5, 0, 3, 0, 10, 0, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 67, 3, 0, 5, 0, 3, 0, 64, + 0, 78, 1, 0, 1, 0, 78, 10, 0, 81, 80, 5, 0, 0, 36, 79, + 77, 3, 0, 84, 85, 0, 86, 86, 1, 0, 0, 0, 84, 83, 0, 82, + 1, 0, 1, 0, 1, 0, 70, 10, 0, 71, 0, 0, 1, 0, 70, 17, + 0, 73, 72, 5, 0, 3, 0, 69, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 2, 3, 0, 9, 1, 0, 4, 5, 0, 3, 0, 17, + 0, 3, 0, 5, 0, 3, 0, 10, 0, 3, 0, 5, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 2, 1, 0, 1, 0, 41, 32, 1, 0, 1, 0, 1, 0, 1, 0, + 75, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 110, 5, 0, 74, 109, 0, + 0, 3, 0, 76, 60, 58, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 53, + 0, 0, 0, 0, 0, 0, 24, 0, 20, 22, 20, 0, 29, 0, 31, 30, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 39, 39, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 40, 44, 0, 0, 0, 12, 13, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 33, 26, 0, 0, 34, 29, 0, 10, 0, 8, 1, 0, 0, 52, 51, 51, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 10, 3, 0, 5, 0, 3, 0, 10, 0, 3, 0, 5, 0, 3, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 61, 61, 61, 61, 61, 61, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 113, 113, 113, 113, 113, 113, 0, 113, 0, 0, 0, 0, 0, 113, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 0, 0, + 89, 90, 91, 92, 93, 94, 95, 96, 130, 0, 0, 0, 0, 0, 0, 0, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 0, 0, 87, 87, 87, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 62, 0, 0, 98, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 6, 0, 6, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 59, 59, 10, 0, 97, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 56, 57, 57, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 54, 54, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 52, 52, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 99, 100, 0, 0, 0, 0, + 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 42, 42, 45, 45, 46, 46, 45, 45, 42, 42, + 15, 15, 16, 16, 15, 15, 21, 21, 24, 24, 25, 25, 24, 24, 21, 21, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 102, 111, 103, 0, 0, 10, 0, 3, 0, 5, 0, 106, 104, 107, + 105, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 108, 107, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 3, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 5, 0, 128, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 5, 0, 122, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 120, 123, 121, 118, 119, 0, + 114, 116, 115, 88, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 35, 117, 129, 10, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 0, 0, 0, 0, + 23, 23, 23, 23, 23, 23, 23, 23, 27, 27, 27, 27, 27, 27, 27, 27, + 23, 23, 23, 23, 23, 23, 23, 23, 37, 37, 37, 37, 37, 37, 37, 37, + 43, 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 37, 37, 37, 37, 37, 37, 37, 37, + 23, 23, 23, 23, 23, 23, 23, 23, 27, 27, 27, 27, 27, 27, 27, 27, + 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 19, 21, 21, 19, 19, 25, 25, 19, 19, 21, 21, 19, 19, 28, 28, + 19, 19, 21, 21, 19, 19, 25, 25, 19, 19, 21, 21, 19, 19, 38, 38, + 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT16 re_simple_folding_table_4[] = { + 0, 1, 2, 3, 6, 7, 8, 9, + 11, 14, 15, 16, 19, 22, 24, 26, + 30, 31, 32, 34, 37, 38, 39, 40, + 42, 46, 48, 56, 62, 64, 65, 67, + 72, 74, 76, 80, 83, 88, 94, 96, + 98, 99, 102, 104, 105, 106, 110, 112, + 124, 127, 128, 130, 134, 140, 144, 172, + 186, 190, 201, 202, 205, 208, 250, 252, + 268, 345, 376, 391, 777, 805, 806, 810, + 825, 827, 935, 958, 963, 971, 978, 982, + 989, 991, 1002, 1007, 1011, 1015, 1023, 3136, + 3296, 6322, 6325, 6332, 6338, 6342, 6343, 6348, + 6372, 7175, 7745, 8513, 8654, 8943, 11785, 11801, + 11807, 11810, 11836, 11839, 11841, 11864, 11871, 12574, + 15776, 15840, 42286, 42287, 42294, 42311, 42433, 42436, + 42444, 42445, 42472, 42487, 47152, 47184, 47216, 47312, + 47620, 47688, 47811 +}; + +RE_UINT32 re_get_simple_case_folding(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_simple_folding_table_1[field_2]; + v = re_simple_folding_table_2[(v << 5) | field_1]; + v = re_simple_folding_table_3[(v << 5) | field_0]; + + return codepoint ^ re_simple_folding_table_4[v]; +} + +/* Full case folding. */ +static RE_UINT8 re_full_folding_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; -static RE_UINT8 re_simple_case_folding_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 2, 2, 5, 5, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 7, 8, 8, 7, 6, 6, 6, 6, 6, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 8, 20, 6, 6, 21, 6, - 6, 6, 6, 6, 22, 6, 23, 24, 25, 6, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_full_folding_table_2[] = { + 0, 0, 1, 0, 0, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, + 4, 12, 13, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, + 20, 21, 0, 4, 22, 4, 23, 4, 4, 24, 25, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 27, 28, - 29, 30, 1, 2, 31, 32, 0, 0, 33, 34, 35, 6, 6, 6, 36, 37, - 38, 38, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, - 39, 7, 6, 6, 6, 6, 6, 6, 40, 41, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 42, 43, 43, 43, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 32, 4, 4, 4, 33, 34, 35, 36, 37, 38, 39, 40, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 45, 45, 45, 45, 46, 47, 0, 0, 0, 0, 0, 0, + 46, 47, 0, 48, 4, 4, 4, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 49, 50, 51, 51, 51, 51, 51, 52, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 53, 54, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 0, 55, 0, 48, 0, 55, 0, 55, 0, 48, 0, 56, 0, 55, 0, 0, - 0, 55, 0, 55, 0, 55, 0, 57, 0, 58, 0, 59, 0, 60, 0, 61, - 0, 0, 0, 0, 62, 63, 64, 0, 0, 0, 0, 0, 65, 65, 0, 0, - 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 50, 51, 0, 0, 0, 0, 52, 4, 53, 54, 55, 56, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 67, 68, 68, 68, 0, 0, 0, 0, 0, 0, - 43, 43, 43, 43, 43, 44, 0, 0, 0, 0, 0, 0, 69, 70, 71, 72, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 23, 73, 33, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 53, 0, 0, - 6, 6, 6, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 6, 7, 6, 6, 6, 6, 6, 6, 6, 0, 74, - 6, 75, 27, 6, 6, 76, 77, 6, 78, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 81, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 82, 82, 82, 82, 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, + 63, 64, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 84, 84, 84, 84, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_simple_case_folding_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, - 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 3, 0, 3, 0, 3, 0, - 0, 3, 0, 3, 0, 3, 0, 3, 4, 3, 0, 3, 0, 3, 0, 5, - 0, 6, 3, 0, 3, 0, 7, 3, 0, 8, 8, 3, 0, 0, 9, 10, - 11, 3, 0, 8, 12, 0, 13, 14, 3, 0, 0, 0, 13, 15, 0, 16, - 3, 0, 3, 0, 3, 0, 17, 3, 0, 17, 0, 0, 3, 0, 17, 3, - 0, 18, 18, 3, 0, 3, 0, 19, 3, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 20, 3, 0, 20, 3, 0, 20, 3, 0, 3, 0, 3, - 0, 3, 0, 3, 0, 0, 3, 0, 0, 20, 3, 0, 3, 0, 21, 22, - 23, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 24, 3, 0, 25, 26, 0, 0, 3, 0, 27, 28, 29, 3, 0, - 0, 0, 0, 0, 0, 30, 0, 0, 3, 0, 3, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 31, 0, - 32, 32, 32, 0, 33, 0, 34, 34, 1, 1, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 35, 36, 37, 0, 0, 0, 38, 39, 0, - 40, 41, 0, 0, 42, 43, 0, 3, 0, 44, 3, 0, 0, 23, 23, 23, - 45, 45, 45, 45, 45, 45, 45, 45, 3, 0, 0, 0, 0, 0, 0, 0, - 46, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, - 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 0, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 48, 0, 0, 0, 0, 0, 48, 0, 0, - 49, 49, 49, 49, 49, 49, 0, 0, 50, 51, 52, 53, 53, 54, 55, 56, - 57, 0, 0, 0, 0, 0, 0, 0, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 0, 0, 58, 58, 58, 3, 0, 3, 0, 3, 0, 0, 0, - 0, 0, 0, 59, 0, 0, 60, 0, 49, 49, 49, 49, 49, 49, 49, 49, - 0, 49, 0, 49, 0, 49, 0, 49, 49, 49, 61, 61, 62, 0, 63, 0, - 64, 64, 64, 64, 62, 0, 0, 0, 49, 49, 65, 65, 0, 0, 0, 0, - 49, 49, 66, 66, 44, 0, 0, 0, 67, 67, 68, 68, 62, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 71, 0, 0, 0, 0, - 0, 0, 72, 0, 0, 0, 0, 0, 73, 73, 73, 73, 73, 73, 73, 73, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 3, 0, 75, 76, 77, 0, 0, 3, - 0, 3, 0, 3, 0, 78, 79, 80, 81, 0, 3, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 82, 82, 0, 0, 0, 3, 0, 3, 0, 0, - 0, 3, 0, 3, 0, 83, 3, 0, 0, 0, 0, 3, 0, 84, 0, 0, - 3, 0, 85, 86, 87, 88, 85, 0, 89, 90, 91, 92, 3, 0, 3, 0, - 0, 0, 3, 0, 41, 93, 94, 0, 95, 95, 95, 95, 95, 95, 95, 95, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 0, 0, 0, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 0, 0, 0, -}; - -/* Simple_Case_Folding: 1848 bytes. */ - -static RE_INT32 re_simple_case_folding_table[] = { - 0, - 32, - 775, - 1, - -121, - -268, - 210, - 206, - 205, - 79, - 202, - 203, - 207, - 211, - 209, - 213, - 214, - 218, - 217, - 219, - 2, - -97, - -56, - -130, - 10795, - -163, - 10792, - -195, - 69, - 71, - 116, - 38, - 37, - 64, - 63, - 8, - -30, - -25, - -15, - -22, - -54, - -48, - -60, - -64, - -7, - 80, - 15, - 48, - 7264, - -8, - -6222, - -6221, - -6212, - -6210, - -6211, - -6204, - -6180, - 35267, - -3008, - -58, - -7615, - -74, - -9, - -7173, - -86, - -100, - -112, - -128, - -126, - -7517, - -8383, - -8262, - 28, - 16, - 26, - -10743, - -3814, - -10727, - -10780, - -10749, - -10783, - -10782, - -10815, - -35332, - -42280, - -42308, - -42319, - -42315, - -42305, - -42258, - -42282, - -42261, - 928, - -42307, - -35384, - -38864, - 40, - 34, -}; - -/* Simple_Case_Folding: 392 bytes. */ - -RE_UINT32 re_get_simple_case_folding(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - RE_INT32 diff; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_simple_case_folding_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_simple_case_folding_stage_2[pos + f] << 5; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_simple_case_folding_stage_3[pos + f] << 3; - value = re_simple_case_folding_stage_4[pos + code]; - - diff = re_simple_case_folding_table[value]; - - return (RE_UINT32)((RE_INT32)ch + diff); -} - -/* Full_Case_Folding. */ - -static RE_UINT8 re_full_case_folding_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_full_case_folding_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 7, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 10, 11, - 6, 12, 6, 6, 13, 6, 6, 6, 6, 6, 6, 6, 14, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 15, 16, 6, 6, 6, 17, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 18, 6, 6, 6, 19, - 6, 6, 6, 6, 20, 6, 6, 6, 6, 6, 6, 6, 21, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 22, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 23, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 24, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, -}; - -static RE_UINT8 re_full_case_folding_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 2, 2, 5, 6, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 8, 9, 9, 10, 7, 7, 7, 7, 7, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 9, 22, 7, 7, 23, 7, - 7, 7, 7, 7, 24, 7, 25, 26, 27, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 29, 30, - 31, 32, 33, 2, 34, 35, 36, 0, 37, 38, 39, 7, 7, 7, 40, 41, - 42, 42, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, - 43, 44, 7, 7, 7, 7, 7, 7, 45, 46, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 47, 48, 48, 48, 49, 0, 0, 0, 0, 0, - 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 51, 51, 51, 51, 52, 53, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 55, 56, 57, 57, 57, 57, 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 59, 60, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 0, 61, 0, 54, 0, 61, 0, 61, 0, 54, 62, 63, 0, 61, 0, 0, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 0, 0, 0, 0, 80, 81, 82, 0, 0, 0, 0, 0, 83, 83, 0, 0, - 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 85, 86, 86, 86, 0, 0, 0, 0, 0, 0, - 48, 48, 48, 48, 48, 49, 0, 0, 0, 0, 0, 0, 87, 88, 89, 90, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 25, 91, 37, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 92, 0, 0, - 7, 7, 7, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 44, 7, 44, 7, 7, 7, 7, 7, 7, 7, 0, 93, - 7, 94, 29, 7, 7, 95, 96, 7, 97, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 98, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_full_folding_table_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 101, 101, 101, 101, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 101, 101, 101, 101, 102, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 80, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 103, 103, 103, 103, 103, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 105, 105, 105, 105, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_full_case_folding_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 3, 4, 0, 4, 0, 4, 0, 4, 0, - 5, 0, 4, 0, 4, 0, 4, 0, 0, 4, 0, 4, 0, 4, 0, 4, - 0, 6, 4, 0, 4, 0, 4, 0, 7, 4, 0, 4, 0, 4, 0, 8, - 0, 9, 4, 0, 4, 0, 10, 4, 0, 11, 11, 4, 0, 0, 12, 13, - 14, 4, 0, 11, 15, 0, 16, 17, 4, 0, 0, 0, 16, 18, 0, 19, - 4, 0, 4, 0, 4, 0, 20, 4, 0, 20, 0, 0, 4, 0, 20, 4, - 0, 21, 21, 4, 0, 4, 0, 22, 4, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 23, 4, 0, 23, 4, 0, 23, 4, 0, 4, 0, 4, - 0, 4, 0, 4, 0, 0, 4, 0, 24, 23, 4, 0, 4, 0, 25, 26, - 27, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 28, 4, 0, 29, 30, 0, 0, 4, 0, 31, 32, 33, 4, 0, - 0, 0, 0, 0, 0, 34, 0, 0, 4, 0, 4, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 35, 0, - 36, 36, 36, 0, 37, 0, 38, 38, 39, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, - 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 0, 0, 0, 44, 45, 0, - 46, 47, 0, 0, 48, 49, 0, 4, 0, 50, 4, 0, 0, 27, 27, 27, - 51, 51, 51, 51, 51, 51, 51, 51, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 4, 0, 4, 0, 52, 4, 0, 4, 0, 4, 0, 4, - 0, 4, 0, 4, 0, 4, 0, 0, 0, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, - 0, 0, 0, 0, 0, 0, 0, 54, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 55, 0, 0, 0, 0, 0, 55, 0, 0, - 56, 56, 56, 56, 56, 56, 0, 0, 57, 58, 59, 60, 60, 61, 62, 63, - 64, 0, 0, 0, 0, 0, 0, 0, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 0, 0, 65, 65, 65, 4, 0, 4, 0, 4, 0, 66, 67, - 68, 69, 70, 71, 0, 0, 72, 0, 56, 56, 56, 56, 56, 56, 56, 56, - 73, 0, 74, 0, 75, 0, 76, 0, 0, 56, 0, 56, 0, 56, 0, 56, - 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, - 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, - 81, 81, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82, - 0, 0, 83, 84, 85, 0, 86, 87, 56, 56, 88, 88, 89, 0, 90, 0, - 0, 0, 91, 92, 93, 0, 94, 95, 96, 96, 96, 96, 97, 0, 0, 0, - 0, 0, 98, 99, 0, 0, 100, 101, 56, 56, 102, 102, 0, 0, 0, 0, - 0, 0, 103, 104, 105, 0, 106, 107, 56, 56, 108, 108, 50, 0, 0, 0, - 0, 0, 109, 110, 111, 0, 112, 113, 114, 114, 115, 115, 116, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, 118, 119, 0, 0, 0, 0, - 0, 0, 120, 0, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, 121, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, - 122, 122, 122, 122, 122, 122, 122, 122, 4, 0, 123, 124, 125, 0, 0, 4, - 0, 4, 0, 4, 0, 126, 127, 128, 129, 0, 4, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 130, 130, 0, 0, 0, 4, 0, 4, 0, 0, - 4, 0, 4, 0, 4, 0, 0, 0, 0, 4, 0, 4, 0, 131, 4, 0, - 0, 0, 0, 4, 0, 132, 0, 0, 4, 0, 133, 134, 135, 136, 133, 0, - 137, 138, 139, 140, 4, 0, 4, 0, 0, 0, 4, 0, 47, 141, 142, 0, - 143, 143, 143, 143, 143, 143, 143, 143, 144, 145, 146, 147, 148, 149, 150, 0, - 0, 0, 0, 151, 152, 153, 154, 155, 156, 156, 156, 156, 156, 156, 156, 156, - 156, 156, 156, 156, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 0, 0, 0, 0, 0, 157, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 0, 0, 0, 0, 0, 0, -}; - -/* Full_Case_Folding: 2048 bytes. */ - -static RE_FullCaseFolding re_full_case_folding_table[] = { - { 0, { 0, 0}}, - { 32, { 0, 0}}, - { 775, { 0, 0}}, - { -108, { 115, 0}}, - { 1, { 0, 0}}, - { -199, { 775, 0}}, - { 371, { 110, 0}}, - { -121, { 0, 0}}, - { -268, { 0, 0}}, - { 210, { 0, 0}}, - { 206, { 0, 0}}, - { 205, { 0, 0}}, - { 79, { 0, 0}}, - { 202, { 0, 0}}, - { 203, { 0, 0}}, - { 207, { 0, 0}}, - { 211, { 0, 0}}, - { 209, { 0, 0}}, - { 213, { 0, 0}}, - { 214, { 0, 0}}, - { 218, { 0, 0}}, - { 217, { 0, 0}}, - { 219, { 0, 0}}, - { 2, { 0, 0}}, - { -390, { 780, 0}}, - { -97, { 0, 0}}, - { -56, { 0, 0}}, - { -130, { 0, 0}}, - { 10795, { 0, 0}}, - { -163, { 0, 0}}, - { 10792, { 0, 0}}, - { -195, { 0, 0}}, - { 69, { 0, 0}}, - { 71, { 0, 0}}, - { 116, { 0, 0}}, - { 38, { 0, 0}}, - { 37, { 0, 0}}, - { 64, { 0, 0}}, - { 63, { 0, 0}}, - { 41, { 776, 769}}, - { 21, { 776, 769}}, - { 8, { 0, 0}}, - { -30, { 0, 0}}, - { -25, { 0, 0}}, - { -15, { 0, 0}}, - { -22, { 0, 0}}, - { -54, { 0, 0}}, - { -48, { 0, 0}}, - { -60, { 0, 0}}, - { -64, { 0, 0}}, - { -7, { 0, 0}}, - { 80, { 0, 0}}, - { 15, { 0, 0}}, - { 48, { 0, 0}}, - { -34, {1410, 0}}, - { 7264, { 0, 0}}, - { -8, { 0, 0}}, - { -6222, { 0, 0}}, - { -6221, { 0, 0}}, - { -6212, { 0, 0}}, - { -6210, { 0, 0}}, - { -6211, { 0, 0}}, - { -6204, { 0, 0}}, - { -6180, { 0, 0}}, - { 35267, { 0, 0}}, - { -3008, { 0, 0}}, - { -7726, { 817, 0}}, - { -7715, { 776, 0}}, - { -7713, { 778, 0}}, - { -7712, { 778, 0}}, - { -7737, { 702, 0}}, - { -58, { 0, 0}}, - { -7723, { 115, 0}}, - { -7051, { 787, 0}}, - { -7053, { 787, 768}}, - { -7055, { 787, 769}}, - { -7057, { 787, 834}}, - { -128, { 953, 0}}, - { -136, { 953, 0}}, - { -112, { 953, 0}}, - { -120, { 953, 0}}, - { -64, { 953, 0}}, - { -72, { 953, 0}}, - { -66, { 953, 0}}, - { -7170, { 953, 0}}, - { -7176, { 953, 0}}, - { -7173, { 834, 0}}, - { -7174, { 834, 953}}, - { -74, { 0, 0}}, - { -7179, { 953, 0}}, - { -7173, { 0, 0}}, - { -78, { 953, 0}}, - { -7180, { 953, 0}}, - { -7190, { 953, 0}}, - { -7183, { 834, 0}}, - { -7184, { 834, 953}}, - { -86, { 0, 0}}, - { -7189, { 953, 0}}, - { -7193, { 776, 768}}, - { -7194, { 776, 769}}, - { -7197, { 834, 0}}, - { -7198, { 776, 834}}, - { -100, { 0, 0}}, - { -7197, { 776, 768}}, - { -7198, { 776, 769}}, - { -7203, { 787, 0}}, - { -7201, { 834, 0}}, - { -7202, { 776, 834}}, - { -112, { 0, 0}}, - { -118, { 953, 0}}, - { -7210, { 953, 0}}, - { -7206, { 953, 0}}, - { -7213, { 834, 0}}, - { -7214, { 834, 953}}, - { -128, { 0, 0}}, - { -126, { 0, 0}}, - { -7219, { 953, 0}}, - { -7517, { 0, 0}}, - { -8383, { 0, 0}}, - { -8262, { 0, 0}}, - { 28, { 0, 0}}, - { 16, { 0, 0}}, - { 26, { 0, 0}}, - {-10743, { 0, 0}}, - { -3814, { 0, 0}}, - {-10727, { 0, 0}}, - {-10780, { 0, 0}}, - {-10749, { 0, 0}}, - {-10783, { 0, 0}}, - {-10782, { 0, 0}}, - {-10815, { 0, 0}}, - {-35332, { 0, 0}}, - {-42280, { 0, 0}}, - {-42308, { 0, 0}}, - {-42319, { 0, 0}}, - {-42315, { 0, 0}}, - {-42305, { 0, 0}}, - {-42258, { 0, 0}}, - {-42282, { 0, 0}}, - {-42261, { 0, 0}}, - { 928, { 0, 0}}, - {-42307, { 0, 0}}, - {-35384, { 0, 0}}, - {-38864, { 0, 0}}, - {-64154, { 102, 0}}, - {-64155, { 105, 0}}, - {-64156, { 108, 0}}, - {-64157, { 102, 105}}, - {-64158, { 102, 108}}, - {-64146, { 116, 0}}, - {-64147, { 116, 0}}, - {-62879, {1398, 0}}, - {-62880, {1381, 0}}, - {-62881, {1387, 0}}, - {-62872, {1398, 0}}, - {-62883, {1389, 0}}, - { 40, { 0, 0}}, - { 34, { 0, 0}}, -}; - -/* Full_Case_Folding: 1264 bytes. */ - -int re_get_full_case_folding(RE_UINT32 ch, RE_UINT32* codepoints) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - RE_FullCaseFolding* case_folding; - int count; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_full_case_folding_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_full_case_folding_stage_2[pos + f] << 5; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_full_case_folding_stage_3[pos + f] << 3; - value = re_full_case_folding_stage_4[pos + code]; - - case_folding = &re_full_case_folding_table[value]; - - codepoints[0] = (RE_UINT32)((RE_INT32)ch + case_folding->diff); - count = 1; - - while (count < RE_MAX_FOLDED && case_folding->codepoints[count - 1] != 0) { - codepoints[count] = case_folding->codepoints[count - 1]; - ++count; - } - - return count; + 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 18, 61, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 79, 0, 1, 0, 1, 0, 1, 0, 0, 3, 0, 5, 0, 3, 0, 51, + 0, 3, 0, 5, 0, 3, 0, 10, 0, 100, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 81, 3, 0, 5, 0, 3, 0, 77, + 0, 93, 1, 0, 1, 0, 93, 10, 0, 96, 95, 5, 0, 0, 37, 94, + 92, 3, 0, 99, 101, 0, 102, 102, 1, 0, 0, 0, 99, 98, 0, 97, + 1, 0, 1, 0, 1, 0, 85, 10, 0, 86, 0, 0, 1, 0, 85, 17, + 0, 88, 87, 5, 0, 3, 0, 84, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 2, 3, 0, 9, 1, 0, 4, 5, 0, 3, 0, 17, + 0, 3, 0, 5, 0, 3, 0, 10, 0, 3, 0, 5, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 82, 2, 1, 0, 1, 0, 42, 33, 1, 0, 1, 0, 1, 0, 1, 0, + 90, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 158, 5, 0, 89, 157, 0, + 0, 3, 0, 91, 72, 70, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 57, + 0, 0, 0, 0, 0, 0, 25, 0, 20, 22, 20, 0, 30, 0, 32, 31, + 24, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 40, 40, 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, + 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 41, 45, 0, 0, 0, 12, 13, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 34, 27, 0, 0, 35, 30, 0, 10, 0, 8, 1, 0, 0, 55, 54, 54, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 10, 3, 0, 5, 0, 3, 0, 10, 0, 3, 0, 5, 0, 3, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 73, 73, 73, 73, 73, 73, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 161, 161, 161, 161, 161, 161, 0, 161, 0, 0, 0, 0, 0, 161, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 0, 0, + 105, 106, 107, 108, 109, 110, 111, 112, 178, 0, 0, 0, 0, 0, 0, 0, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 0, 0, 103, 103, 103, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 146, 142, 144, 141, 145, 75, 0, 0, 143, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 0, 0, + 139, 0, 140, 0, 137, 0, 138, 0, 0, 6, 0, 6, 0, 6, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 53, 53, 53, 53, 53, 53, 53, 56, 56, 56, 56, 56, 56, 56, 56, + 62, 62, 62, 62, 62, 62, 62, 62, 64, 64, 64, 64, 64, 64, 64, 64, + 67, 67, 67, 67, 67, 67, 67, 67, 69, 69, 69, 69, 69, 69, 69, 69, + 0, 0, 68, 113, 118, 0, 116, 114, 6, 6, 71, 71, 117, 0, 115, 0, + 0, 0, 63, 135, 129, 0, 134, 133, 65, 65, 66, 66, 136, 0, 0, 0, + 0, 0, 130, 128, 0, 0, 132, 131, 6, 6, 60, 60, 0, 0, 0, 0, + 0, 0, 123, 122, 121, 0, 120, 119, 6, 6, 59, 59, 7, 0, 0, 0, + 0, 0, 58, 125, 125, 0, 127, 126, 52, 52, 55, 55, 124, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 147, 148, 0, 0, 0, 0, + 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 43, 43, 46, 46, 47, 47, 46, 46, 43, 43, + 15, 15, 16, 16, 15, 15, 21, 21, 25, 25, 26, 26, 25, 25, 21, 21, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 150, 159, 151, 0, 0, 10, 0, 3, 0, 5, 0, 154, 152, 155, + 153, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 156, 155, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 3, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 5, 0, 176, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 5, 0, 170, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 168, 171, 169, 166, 167, 0, + 162, 164, 163, 104, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 36, 165, 177, 10, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 182, 183, 180, 181, 179, 185, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 189, 186, 187, 190, 188, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, + 23, 23, 23, 23, 23, 23, 23, 23, 28, 28, 28, 28, 28, 28, 28, 28, + 23, 23, 23, 23, 23, 23, 23, 23, 38, 38, 38, 38, 38, 38, 38, 38, + 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 44, 44, 44, 44, 44, 44, 44, 44, 38, 38, 38, 38, 38, 38, 38, 38, + 23, 23, 23, 23, 23, 23, 23, 23, 28, 28, 28, 28, 28, 28, 28, 28, + 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 19, 21, 21, 19, 19, 26, 26, 19, 19, 21, 21, 19, 19, 29, 29, + 19, 19, 21, 21, 19, 19, 26, 26, 19, 19, 21, 21, 19, 19, 39, 39, + 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_FullCaseFolding re_full_folding_table_4[] = { + { 0, 0, 0}, + { 1, 0, 0}, + { 2, 0, 0}, + { 3, 0, 0}, + { 6, 0, 0}, + { 7, 0, 0}, + { 8, 0, 0}, + { 9, 0, 0}, + { 11, 0, 0}, + { 14, 0, 0}, + { 15, 0, 0}, + { 16, 0, 0}, + { 19, 0, 0}, + { 22, 0, 0}, + { 24, 0, 0}, + { 26, 0, 0}, + { 30, 0, 0}, + { 31, 0, 0}, + { 32, 0, 0}, + { 34, 0, 0}, + { 37, 0, 0}, + { 38, 0, 0}, + { 39, 0, 0}, + { 40, 0, 0}, + { 41, 776, 769}, + { 42, 0, 0}, + { 46, 0, 0}, + { 48, 0, 0}, + { 56, 0, 0}, + { 62, 0, 0}, + { 64, 0, 0}, + { 65, 0, 0}, + { 67, 0, 0}, + { 72, 0, 0}, + { 74, 0, 0}, + { 76, 0, 0}, + { 80, 0, 0}, + { 83, 0, 0}, + { 88, 0, 0}, + { 94, 0, 0}, + { 96, 0, 0}, + { 98, 0, 0}, + { 99, 0, 0}, + { 102, 0, 0}, + { 104, 0, 0}, + { 105, 0, 0}, + { 106, 0, 0}, + { 110, 0, 0}, + { 112, 0, 0}, + { 117, 776, 769}, + { 124, 0, 0}, + { 127, 0, 0}, + { 128, 0, 0}, + { 128, 953, 0}, + { 130, 0, 0}, + { 134, 0, 0}, + { 136, 953, 0}, + { 140, 0, 0}, + { 142, 953, 0}, + { 144, 0, 0}, + { 172, 0, 0}, + { 172, 115, 0}, + { 176, 953, 0}, + { 182, 953, 0}, + { 184, 953, 0}, + { 186, 0, 0}, + { 190, 0, 0}, + { 192, 953, 0}, + { 194, 953, 0}, + { 200, 953, 0}, + { 201, 0, 0}, + { 202, 0, 0}, + { 205, 0, 0}, + { 208, 0, 0}, + { 226, 1410, 0}, + { 250, 0, 0}, + { 252, 0, 0}, + { 268, 0, 0}, + { 345, 0, 0}, + { 345, 775, 0}, + { 376, 0, 0}, + { 391, 0, 0}, + { 410, 780, 0}, + { 777, 0, 0}, + { 805, 0, 0}, + { 806, 0, 0}, + { 810, 0, 0}, + { 825, 0, 0}, + { 827, 0, 0}, + { 935, 0, 0}, + { 958, 0, 0}, + { 963, 0, 0}, + { 971, 0, 0}, + { 978, 0, 0}, + { 982, 0, 0}, + { 989, 0, 0}, + { 991, 0, 0}, + { 1002, 0, 0}, + { 1007, 0, 0}, + { 1011, 0, 0}, + { 1013, 110, 0}, + { 1015, 0, 0}, + { 1023, 0, 0}, + { 3136, 0, 0}, + { 3296, 0, 0}, + { 6322, 0, 0}, + { 6325, 0, 0}, + { 6332, 0, 0}, + { 6338, 0, 0}, + { 6342, 0, 0}, + { 6343, 0, 0}, + { 6348, 0, 0}, + { 6372, 0, 0}, + { 7170, 953, 0}, + { 7174, 834, 953}, + { 7175, 0, 0}, + { 7175, 834, 0}, + { 7181, 953, 0}, + { 7192, 953, 0}, + { 7202, 776, 834}, + { 7203, 834, 0}, + { 7205, 787, 0}, + { 7206, 776, 769}, + { 7207, 776, 768}, + { 7221, 953, 0}, + { 7226, 953, 0}, + { 7230, 834, 953}, + { 7231, 834, 0}, + { 7274, 776, 769}, + { 7274, 953, 0}, + { 7275, 776, 768}, + { 7278, 776, 834}, + { 7279, 834, 0}, + { 7280, 834, 953}, + { 7281, 834, 0}, + { 7284, 953, 0}, + { 7291, 953, 0}, + { 7313, 787, 769}, + { 7315, 787, 834}, + { 7317, 787, 0}, + { 7319, 787, 768}, + { 7904, 778, 0}, + { 7907, 776, 0}, + { 7917, 115, 0}, + { 7919, 778, 0}, + { 7931, 702, 0}, + { 7934, 817, 0}, + { 8513, 0, 0}, + { 8654, 0, 0}, + { 8943, 0, 0}, + {11785, 0, 0}, + {11801, 0, 0}, + {11807, 0, 0}, + {11810, 0, 0}, + {11836, 0, 0}, + {11839, 0, 0}, + {11841, 0, 0}, + {11864, 0, 0}, + {11871, 0, 0}, + {12574, 0, 0}, + {15776, 0, 0}, + {15840, 0, 0}, + {42286, 0, 0}, + {42287, 0, 0}, + {42294, 0, 0}, + {42311, 0, 0}, + {42433, 0, 0}, + {42436, 0, 0}, + {42444, 0, 0}, + {42445, 0, 0}, + {42472, 0, 0}, + {42487, 0, 0}, + {47152, 0, 0}, + {47184, 0, 0}, + {47216, 0, 0}, + {47312, 0, 0}, + {47620, 0, 0}, + {47688, 0, 0}, + {47811, 0, 0}, + {64354, 102, 108}, + {64356, 108, 0}, + {64357, 102, 105}, + {64358, 102, 0}, + {64359, 105, 0}, + {64373, 116, 0}, + {64374, 116, 0}, + {65120, 1381, 0}, + {65121, 1387, 0}, + {65123, 1389, 0}, + {65127, 1398, 0}, + {65128, 1398, 0} +}; + +int re_get_full_case_folding(RE_UINT32 codepoint, RE_UINT32* folded) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + RE_UINT16* data; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_full_folding_table_1[field_2]; + v = re_full_folding_table_2[(v << 5) | field_1]; + v = re_full_folding_table_3[(v << 5) | field_0]; + + data = re_full_folding_table_4[v].data; + folded[0] = codepoint ^ data[0]; + + if (data[1] == 0) + return 1; + + folded[1] = data[1]; + + if (data[2] == 0) + return 2; + + folded[2] = data[2]; + + return 3; } /* Property function table. */ - RE_GetPropertyFunc re_get_property[] = { - re_get_general_category, - re_get_block, - re_get_script, - 0, - re_get_word_break, - re_get_grapheme_cluster_break, - re_get_sentence_break, - re_get_math, re_get_alphabetic, - re_get_lowercase, - re_get_uppercase, + re_get_alphanumeric, + re_get_any, + re_get_ascii_hex_digit, + re_get_bidi_class, + re_get_bidi_control, + re_get_bidi_mirrored, + re_get_blank, + re_get_block, + re_get_canonical_combining_class, re_get_cased, re_get_case_ignorable, - re_get_changes_when_lowercased, - re_get_changes_when_uppercased, - re_get_changes_when_titlecased, re_get_changes_when_casefolded, re_get_changes_when_casemapped, - re_get_id_start, - re_get_id_continue, - re_get_xid_start, - re_get_xid_continue, + re_get_changes_when_lowercased, + re_get_changes_when_titlecased, + re_get_changes_when_uppercased, + re_get_dash, + re_get_decomposition_type, re_get_default_ignorable_code_point, - re_get_grapheme_extend, + re_get_deprecated, + re_get_diacritic, + re_get_east_asian_width, + re_get_emoji, + re_get_emoji_component, + re_get_emoji_modifier, + re_get_emoji_modifier_base, + re_get_emoji_presentation, + re_get_extended_pictographic, + re_get_extender, + re_get_general_category, + re_get_graph, re_get_grapheme_base, + re_get_grapheme_cluster_break, + re_get_grapheme_extend, re_get_grapheme_link, - re_get_white_space, - re_get_bidi_control, - re_get_join_control, - re_get_dash, - re_get_hyphen, - re_get_quotation_mark, - re_get_terminal_punctuation, - re_get_other_math, + re_get_hangul_syllable_type, re_get_hex_digit, - re_get_ascii_hex_digit, - re_get_other_alphabetic, + re_get_hyphen, + re_get_id_continue, re_get_ideographic, - re_get_diacritic, - re_get_extender, - re_get_other_lowercase, - re_get_other_uppercase, - re_get_noncharacter_code_point, - re_get_other_grapheme_extend, re_get_ids_binary_operator, + re_get_id_start, re_get_ids_trinary_operator, - re_get_radical, - re_get_unified_ideograph, - re_get_other_default_ignorable_code_point, - re_get_deprecated, - re_get_soft_dotted, - re_get_logical_order_exception, - re_get_other_id_start, - re_get_other_id_continue, - re_get_sentence_terminal, - re_get_variation_selector, - re_get_pattern_white_space, - re_get_pattern_syntax, - re_get_prepended_concatenation_mark, - re_get_regional_indicator, - re_get_hangul_syllable_type, - re_get_bidi_class, - re_get_canonical_combining_class, - re_get_decomposition_type, - re_get_east_asian_width, + re_get_indic_positional_category, + re_get_indic_syllabic_category, + re_get_join_control, re_get_joining_group, re_get_joining_type, re_get_line_break, - re_get_numeric_type, - re_get_numeric_value, - re_get_bidi_mirrored, - re_get_indic_positional_category, - re_get_indic_syllabic_category, - re_get_emoji, - re_get_emoji_presentation, - re_get_emoji_modifier, - re_get_emoji_modifier_base, - re_get_emoji_component, - re_get_extended_pictographic, - re_get_nfd_quick_check, + re_get_logical_order_exception, + re_get_lowercase, + re_get_math, re_get_nfc_quick_check, - re_get_nfkd_quick_check, + re_get_nfd_quick_check, re_get_nfkc_quick_check, - re_get_alphanumeric, - re_get_any, - re_get_blank, - re_get_graph, - re_get_print, - re_get_word, - re_get_xdigit, - re_get_posix_digit, + re_get_nfkd_quick_check, + re_get_noncharacter_code_point, + re_get_numeric_type, + re_get_numeric_value, + re_get_other_alphabetic, + re_get_other_default_ignorable_code_point, + re_get_other_grapheme_extend, + re_get_other_id_continue, + re_get_other_id_start, + re_get_other_lowercase, + re_get_other_math, + re_get_other_uppercase, + re_get_pattern_syntax, + re_get_pattern_white_space, re_get_posix_alnum, + re_get_posix_digit, re_get_posix_punct, re_get_posix_xdigit, + re_get_prepended_concatenation_mark, + re_get_print, + re_get_quotation_mark, + re_get_radical, + re_get_regional_indicator, + re_get_script, + 0, + re_get_sentence_break, + re_get_sentence_terminal, + re_get_soft_dotted, + re_get_terminal_punctuation, + re_get_unified_ideograph, + re_get_uppercase, + re_get_variation_selector, + re_get_white_space, + re_get_word, + re_get_word_break, + re_get_xdigit, + re_get_xid_continue, + re_get_xid_start }; diff --git a/regex_2/_regex_unicode.h b/regex_2/_regex_unicode.h index 77e5764..ea8e48c 100644 --- a/regex_2/_regex_unicode.h +++ b/regex_2/_regex_unicode.h @@ -13,7 +13,6 @@ typedef unsigned char BOOL; #define RE_ASCII_MAX 0x7F #define RE_LOCALE_MAX 0xFF -#define RE_UNICODE_MAX 0x10FFFF #define RE_MAX_CASES 4 #define RE_MAX_FOLDED 3 @@ -31,13 +30,13 @@ typedef struct RE_PropertyValue { RE_UINT16 id; } RE_PropertyValue; -typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 ch); +typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 codepoint); -#define RE_PROP_GC 0x0 -#define RE_PROP_CASED 0xB -#define RE_PROP_UPPERCASE 0xA -#define RE_PROP_LOWERCASE 0x9 -#define RE_PROP_SCX 0x3 +#define RE_PROP_GC 0x1E +#define RE_PROP_CASED 0xA +#define RE_PROP_UPPERCASE 0x56 +#define RE_PROP_LOWERCASE 0x33 +#define RE_PROP_SCX 0x50 #define RE_PROP_C 30 #define RE_PROP_L 31 @@ -46,254 +45,254 @@ typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 ch); #define RE_PROP_P 34 #define RE_PROP_S 35 #define RE_PROP_Z 36 -#define RE_PROP_ASSIGNED 38 -#define RE_PROP_CASEDLETTER 37 +#define RE_PROP_ASSIGNED 37 +#define RE_PROP_CASEDLETTER 38 #define RE_PROP_CN 0 -#define RE_PROP_LU 1 -#define RE_PROP_LL 2 -#define RE_PROP_LT 3 -#define RE_PROP_LM 4 -#define RE_PROP_LO 5 -#define RE_PROP_MN 6 -#define RE_PROP_ME 7 -#define RE_PROP_MC 8 +#define RE_PROP_CC 1 +#define RE_PROP_ZS 2 +#define RE_PROP_PO 3 +#define RE_PROP_SC 4 +#define RE_PROP_PS 5 +#define RE_PROP_PE 6 +#define RE_PROP_SM 7 +#define RE_PROP_PD 8 #define RE_PROP_ND 9 -#define RE_PROP_NL 10 -#define RE_PROP_NO 11 -#define RE_PROP_ZS 12 -#define RE_PROP_ZL 13 -#define RE_PROP_ZP 14 -#define RE_PROP_CC 15 -#define RE_PROP_CF 16 -#define RE_PROP_CO 17 -#define RE_PROP_CS 18 -#define RE_PROP_PD 19 -#define RE_PROP_PS 20 -#define RE_PROP_PE 21 -#define RE_PROP_PC 22 -#define RE_PROP_PO 23 -#define RE_PROP_SM 24 -#define RE_PROP_SC 25 -#define RE_PROP_SK 26 -#define RE_PROP_SO 27 -#define RE_PROP_PI 28 -#define RE_PROP_PF 29 +#define RE_PROP_LU 10 +#define RE_PROP_SK 11 +#define RE_PROP_PC 12 +#define RE_PROP_LL 13 +#define RE_PROP_SO 14 +#define RE_PROP_LO 15 +#define RE_PROP_PI 16 +#define RE_PROP_CF 17 +#define RE_PROP_NO 18 +#define RE_PROP_PF 19 +#define RE_PROP_LT 20 +#define RE_PROP_LM 21 +#define RE_PROP_MN 22 +#define RE_PROP_ME 23 +#define RE_PROP_MC 24 +#define RE_PROP_NL 25 +#define RE_PROP_ZL 26 +#define RE_PROP_ZP 27 +#define RE_PROP_CS 28 +#define RE_PROP_CO 29 -#define RE_PROP_C_MASK 0x00078001 -#define RE_PROP_L_MASK 0x0000003E -#define RE_PROP_M_MASK 0x000001C0 -#define RE_PROP_N_MASK 0x00000E00 -#define RE_PROP_P_MASK 0x30F80000 -#define RE_PROP_S_MASK 0x0F000000 -#define RE_PROP_Z_MASK 0x00007000 +#define RE_PROP_C_MASK 0x30020003 +#define RE_PROP_L_MASK 0x0030A400 +#define RE_PROP_M_MASK 0x01C00000 +#define RE_PROP_N_MASK 0x02040200 +#define RE_PROP_P_MASK 0x00091168 +#define RE_PROP_S_MASK 0x00004890 +#define RE_PROP_Z_MASK 0x0C000004 -#define RE_PROP_ALNUM 0x530001 -#define RE_PROP_ALPHA 0x080001 -#define RE_PROP_ANY 0x540001 -#define RE_PROP_ASCII 0x010001 -#define RE_PROP_BLANK 0x550001 -#define RE_PROP_CNTRL 0x00000F -#define RE_PROP_DIGIT 0x000009 -#define RE_PROP_GRAPH 0x560001 -#define RE_PROP_LOWER 0x090001 -#define RE_PROP_PRINT 0x570001 -#define RE_PROP_SPACE 0x1A0001 -#define RE_PROP_UPPER 0x0A0001 -#define RE_PROP_WORD 0x580001 -#define RE_PROP_XDIGIT 0x590001 -#define RE_PROP_POSIX_ALNUM 0x5B0001 -#define RE_PROP_POSIX_DIGIT 0x5A0001 -#define RE_PROP_POSIX_PUNCT 0x5C0001 -#define RE_PROP_POSIX_XDIGIT 0x5D0001 +#define RE_PROP_ALNUM 0x010001 +#define RE_PROP_ALPHA 0x000001 +#define RE_PROP_ANY 0x020001 +#define RE_PROP_ASCII 0x080001 +#define RE_PROP_BLANK 0x070001 +#define RE_PROP_CNTRL 0x1E0001 +#define RE_PROP_DIGIT 0x1E0009 +#define RE_PROP_GRAPH 0x1F0001 +#define RE_PROP_LOWER 0x330001 +#define RE_PROP_PRINT 0x4B0001 +#define RE_PROP_SPACE 0x580001 +#define RE_PROP_UPPER 0x560001 +#define RE_PROP_WORD 0x590001 +#define RE_PROP_XDIGIT 0x5B0001 +#define RE_PROP_POSIX_ALNUM 0x460001 +#define RE_PROP_POSIX_DIGIT 0x470001 +#define RE_PROP_POSIX_PUNCT 0x480001 +#define RE_PROP_POSIX_XDIGIT 0x490001 #define RE_WBREAK_OTHER 0 -#define RE_WBREAK_DOUBLEQUOTE 1 -#define RE_WBREAK_SINGLEQUOTE 2 -#define RE_WBREAK_HEBREWLETTER 3 -#define RE_WBREAK_CR 4 -#define RE_WBREAK_LF 5 -#define RE_WBREAK_NEWLINE 6 -#define RE_WBREAK_EXTEND 7 -#define RE_WBREAK_REGIONALINDICATOR 8 -#define RE_WBREAK_FORMAT 9 -#define RE_WBREAK_KATAKANA 10 +#define RE_WBREAK_LF 1 +#define RE_WBREAK_NEWLINE 2 +#define RE_WBREAK_CR 3 +#define RE_WBREAK_WSEGSPACE 4 +#define RE_WBREAK_DOUBLEQUOTE 5 +#define RE_WBREAK_SINGLEQUOTE 6 +#define RE_WBREAK_MIDNUM 7 +#define RE_WBREAK_MIDNUMLET 8 +#define RE_WBREAK_NUMERIC 9 +#define RE_WBREAK_MIDLETTER 10 #define RE_WBREAK_ALETTER 11 -#define RE_WBREAK_MIDLETTER 12 -#define RE_WBREAK_MIDNUM 13 -#define RE_WBREAK_MIDNUMLET 14 -#define RE_WBREAK_NUMERIC 15 -#define RE_WBREAK_EXTENDNUMLET 16 -#define RE_WBREAK_ZWJ 17 -#define RE_WBREAK_WSEGSPACE 18 +#define RE_WBREAK_EXTENDNUMLET 12 +#define RE_WBREAK_FORMAT 13 +#define RE_WBREAK_EXTEND 14 +#define RE_WBREAK_HEBREWLETTER 15 +#define RE_WBREAK_ZWJ 16 +#define RE_WBREAK_KATAKANA 17 +#define RE_WBREAK_REGIONALINDICATOR 18 #define RE_WBREAK_EBASE 19 #define RE_WBREAK_EBASEGAZ 20 #define RE_WBREAK_EMODIFIER 21 #define RE_WBREAK_GLUEAFTERZWJ 22 #define RE_GBREAK_OTHER 0 -#define RE_GBREAK_PREPEND 1 -#define RE_GBREAK_CR 2 -#define RE_GBREAK_LF 3 -#define RE_GBREAK_CONTROL 4 -#define RE_GBREAK_EXTEND 5 -#define RE_GBREAK_REGIONALINDICATOR 6 -#define RE_GBREAK_SPACINGMARK 7 -#define RE_GBREAK_L 8 -#define RE_GBREAK_V 9 -#define RE_GBREAK_T 10 +#define RE_GBREAK_CONTROL 1 +#define RE_GBREAK_LF 2 +#define RE_GBREAK_CR 3 +#define RE_GBREAK_EXTEND 4 +#define RE_GBREAK_PREPEND 5 +#define RE_GBREAK_SPACINGMARK 6 +#define RE_GBREAK_L 7 +#define RE_GBREAK_V 8 +#define RE_GBREAK_T 9 +#define RE_GBREAK_ZWJ 10 #define RE_GBREAK_LV 11 #define RE_GBREAK_LVT 12 -#define RE_GBREAK_ZWJ 13 +#define RE_GBREAK_REGIONALINDICATOR 13 #define RE_GBREAK_EBASE 14 #define RE_GBREAK_EBASEGAZ 15 #define RE_GBREAK_EMODIFIER 16 #define RE_GBREAK_GLUEAFTERZWJ 17 #define RE_LBREAK_UNKNOWN 0 -#define RE_LBREAK_OPENPUNCTUATION 1 -#define RE_LBREAK_CLOSEPUNCTUATION 2 -#define RE_LBREAK_QUOTATION 3 -#define RE_LBREAK_GLUE 4 -#define RE_LBREAK_NONSTARTER 5 -#define RE_LBREAK_EXCLAMATION 6 -#define RE_LBREAK_BREAKSYMBOLS 7 -#define RE_LBREAK_INFIXNUMERIC 8 -#define RE_LBREAK_PREFIXNUMERIC 9 -#define RE_LBREAK_POSTFIXNUMERIC 10 -#define RE_LBREAK_NUMERIC 11 -#define RE_LBREAK_ALPHABETIC 12 -#define RE_LBREAK_IDEOGRAPHIC 13 -#define RE_LBREAK_INSEPARABLE 14 +#define RE_LBREAK_COMBININGMARK 1 +#define RE_LBREAK_BREAKAFTER 2 +#define RE_LBREAK_LINEFEED 3 +#define RE_LBREAK_MANDATORYBREAK 4 +#define RE_LBREAK_CARRIAGERETURN 5 +#define RE_LBREAK_SPACE 6 +#define RE_LBREAK_EXCLAMATION 7 +#define RE_LBREAK_QUOTATION 8 +#define RE_LBREAK_ALPHABETIC 9 +#define RE_LBREAK_PREFIXNUMERIC 10 +#define RE_LBREAK_POSTFIXNUMERIC 11 +#define RE_LBREAK_OPENPUNCTUATION 12 +#define RE_LBREAK_CLOSEPARENTHESIS 13 +#define RE_LBREAK_INFIXNUMERIC 14 #define RE_LBREAK_HYPHEN 15 -#define RE_LBREAK_COMBININGMARK 16 -#define RE_LBREAK_BREAKBEFORE 17 -#define RE_LBREAK_BREAKAFTER 18 -#define RE_LBREAK_SPACE 19 -#define RE_LBREAK_MANDATORYBREAK 20 -#define RE_LBREAK_CARRIAGERETURN 21 -#define RE_LBREAK_LINEFEED 22 -#define RE_LBREAK_CONTINGENTBREAK 23 +#define RE_LBREAK_BREAKSYMBOLS 16 +#define RE_LBREAK_NUMERIC 17 +#define RE_LBREAK_CLOSEPUNCTUATION 18 +#define RE_LBREAK_NEXTLINE 19 +#define RE_LBREAK_GLUE 20 +#define RE_LBREAK_AMBIGUOUS 21 +#define RE_LBREAK_BREAKBEFORE 22 +#define RE_LBREAK_HEBREWLETTER 23 #define RE_LBREAK_COMPLEXCONTEXT 24 -#define RE_LBREAK_AMBIGUOUS 25 -#define RE_LBREAK_BREAKBOTH 26 -#define RE_LBREAK_SURROGATE 27 -#define RE_LBREAK_ZWSPACE 28 -#define RE_LBREAK_NEXTLINE 29 -#define RE_LBREAK_WORDJOINER 30 -#define RE_LBREAK_JL 31 -#define RE_LBREAK_JV 32 -#define RE_LBREAK_JT 33 -#define RE_LBREAK_H2 34 -#define RE_LBREAK_H3 35 -#define RE_LBREAK_CLOSEPARENTHESIS 36 -#define RE_LBREAK_HEBREWLETTER 37 -#define RE_LBREAK_CONDITIONALJAPANESESTARTER 38 -#define RE_LBREAK_REGIONALINDICATOR 39 -#define RE_LBREAK_EBASE 40 -#define RE_LBREAK_EMODIFIER 41 -#define RE_LBREAK_ZWJ 42 +#define RE_LBREAK_JL 25 +#define RE_LBREAK_JV 26 +#define RE_LBREAK_JT 27 +#define RE_LBREAK_NONSTARTER 28 +#define RE_LBREAK_ZWSPACE 29 +#define RE_LBREAK_ZWJ 30 +#define RE_LBREAK_BREAKBOTH 31 +#define RE_LBREAK_INSEPARABLE 32 +#define RE_LBREAK_WORDJOINER 33 +#define RE_LBREAK_IDEOGRAPHIC 34 +#define RE_LBREAK_EBASE 35 +#define RE_LBREAK_CONDITIONALJAPANESESTARTER 36 +#define RE_LBREAK_H2 37 +#define RE_LBREAK_H3 38 +#define RE_LBREAK_SURROGATE 39 +#define RE_LBREAK_CONTINGENTBREAK 40 +#define RE_LBREAK_REGIONALINDICATOR 41 +#define RE_LBREAK_EMODIFIER 42 -extern char* re_strings[1425]; -extern RE_Property re_properties[168]; -extern RE_PropertyValue re_property_values[1568]; +extern char* re_strings[1447]; +extern RE_Property re_properties[173]; +extern RE_PropertyValue re_property_values[1589]; extern RE_UINT16 re_expand_on_folding[104]; extern RE_GetPropertyFunc re_get_property[94]; -RE_UINT32 re_get_general_category(RE_UINT32 ch); -RE_UINT32 re_get_block(RE_UINT32 ch); -RE_UINT32 re_get_script(RE_UINT32 ch); -int re_get_script_extensions(RE_UINT32 ch, RE_UINT8* scripts); -RE_UINT32 re_get_word_break(RE_UINT32 ch); -RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 ch); -RE_UINT32 re_get_sentence_break(RE_UINT32 ch); -RE_UINT32 re_get_math(RE_UINT32 ch); -RE_UINT32 re_get_alphabetic(RE_UINT32 ch); -RE_UINT32 re_get_lowercase(RE_UINT32 ch); -RE_UINT32 re_get_uppercase(RE_UINT32 ch); -RE_UINT32 re_get_cased(RE_UINT32 ch); -RE_UINT32 re_get_case_ignorable(RE_UINT32 ch); -RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 ch); -RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 ch); -RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 ch); -RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 ch); -RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 ch); -RE_UINT32 re_get_id_start(RE_UINT32 ch); -RE_UINT32 re_get_id_continue(RE_UINT32 ch); -RE_UINT32 re_get_xid_start(RE_UINT32 ch); -RE_UINT32 re_get_xid_continue(RE_UINT32 ch); -RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 ch); -RE_UINT32 re_get_grapheme_extend(RE_UINT32 ch); -RE_UINT32 re_get_grapheme_base(RE_UINT32 ch); -RE_UINT32 re_get_grapheme_link(RE_UINT32 ch); -RE_UINT32 re_get_white_space(RE_UINT32 ch); -RE_UINT32 re_get_bidi_control(RE_UINT32 ch); -RE_UINT32 re_get_join_control(RE_UINT32 ch); -RE_UINT32 re_get_dash(RE_UINT32 ch); -RE_UINT32 re_get_hyphen(RE_UINT32 ch); -RE_UINT32 re_get_quotation_mark(RE_UINT32 ch); -RE_UINT32 re_get_terminal_punctuation(RE_UINT32 ch); -RE_UINT32 re_get_other_math(RE_UINT32 ch); -RE_UINT32 re_get_hex_digit(RE_UINT32 ch); -RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 ch); -RE_UINT32 re_get_other_alphabetic(RE_UINT32 ch); -RE_UINT32 re_get_ideographic(RE_UINT32 ch); -RE_UINT32 re_get_diacritic(RE_UINT32 ch); -RE_UINT32 re_get_extender(RE_UINT32 ch); -RE_UINT32 re_get_other_lowercase(RE_UINT32 ch); -RE_UINT32 re_get_other_uppercase(RE_UINT32 ch); -RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 ch); -RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 ch); -RE_UINT32 re_get_ids_binary_operator(RE_UINT32 ch); -RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 ch); -RE_UINT32 re_get_radical(RE_UINT32 ch); -RE_UINT32 re_get_unified_ideograph(RE_UINT32 ch); -RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 ch); -RE_UINT32 re_get_deprecated(RE_UINT32 ch); -RE_UINT32 re_get_soft_dotted(RE_UINT32 ch); -RE_UINT32 re_get_logical_order_exception(RE_UINT32 ch); -RE_UINT32 re_get_other_id_start(RE_UINT32 ch); -RE_UINT32 re_get_other_id_continue(RE_UINT32 ch); -RE_UINT32 re_get_sentence_terminal(RE_UINT32 ch); -RE_UINT32 re_get_variation_selector(RE_UINT32 ch); -RE_UINT32 re_get_pattern_white_space(RE_UINT32 ch); -RE_UINT32 re_get_pattern_syntax(RE_UINT32 ch); -RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 ch); -RE_UINT32 re_get_regional_indicator(RE_UINT32 ch); -RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 ch); -RE_UINT32 re_get_bidi_class(RE_UINT32 ch); -RE_UINT32 re_get_canonical_combining_class(RE_UINT32 ch); -RE_UINT32 re_get_decomposition_type(RE_UINT32 ch); -RE_UINT32 re_get_east_asian_width(RE_UINT32 ch); -RE_UINT32 re_get_joining_group(RE_UINT32 ch); -RE_UINT32 re_get_joining_type(RE_UINT32 ch); -RE_UINT32 re_get_line_break(RE_UINT32 ch); -RE_UINT32 re_get_numeric_type(RE_UINT32 ch); -RE_UINT32 re_get_numeric_value(RE_UINT32 ch); -RE_UINT32 re_get_bidi_mirrored(RE_UINT32 ch); -RE_UINT32 re_get_indic_positional_category(RE_UINT32 ch); -RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 ch); -RE_UINT32 re_get_emoji(RE_UINT32 ch); -RE_UINT32 re_get_emoji_presentation(RE_UINT32 ch); -RE_UINT32 re_get_emoji_modifier(RE_UINT32 ch); -RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 ch); -RE_UINT32 re_get_emoji_component(RE_UINT32 ch); -RE_UINT32 re_get_extended_pictographic(RE_UINT32 ch); -RE_UINT32 re_get_nfd_quick_check(RE_UINT32 ch); -RE_UINT32 re_get_nfc_quick_check(RE_UINT32 ch); -RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 ch); -RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 ch); -RE_UINT32 re_get_alphanumeric(RE_UINT32 ch); -RE_UINT32 re_get_any(RE_UINT32 ch); -RE_UINT32 re_get_blank(RE_UINT32 ch); -RE_UINT32 re_get_graph(RE_UINT32 ch); -RE_UINT32 re_get_print(RE_UINT32 ch); -RE_UINT32 re_get_word(RE_UINT32 ch); -RE_UINT32 re_get_xdigit(RE_UINT32 ch); -RE_UINT32 re_get_posix_digit(RE_UINT32 ch); -RE_UINT32 re_get_posix_alnum(RE_UINT32 ch); -RE_UINT32 re_get_posix_punct(RE_UINT32 ch); -RE_UINT32 re_get_posix_xdigit(RE_UINT32 ch); -int re_get_all_cases(RE_UINT32 ch, RE_UINT32* codepoints); -RE_UINT32 re_get_simple_case_folding(RE_UINT32 ch); -int re_get_full_case_folding(RE_UINT32 ch, RE_UINT32* codepoints); +RE_UINT32 re_get_alphabetic(RE_UINT32 codepoint); +RE_UINT32 re_get_alphanumeric(RE_UINT32 codepoint); +RE_UINT32 re_get_any(RE_UINT32 codepoint); +RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 codepoint); +RE_UINT32 re_get_bidi_class(RE_UINT32 codepoint); +RE_UINT32 re_get_bidi_control(RE_UINT32 codepoint); +RE_UINT32 re_get_bidi_mirrored(RE_UINT32 codepoint); +RE_UINT32 re_get_blank(RE_UINT32 codepoint); +RE_UINT32 re_get_block(RE_UINT32 codepoint); +RE_UINT32 re_get_canonical_combining_class(RE_UINT32 codepoint); +RE_UINT32 re_get_cased(RE_UINT32 codepoint); +RE_UINT32 re_get_case_ignorable(RE_UINT32 codepoint); +RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 codepoint); +RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 codepoint); +RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 codepoint); +RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 codepoint); +RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 codepoint); +RE_UINT32 re_get_dash(RE_UINT32 codepoint); +RE_UINT32 re_get_decomposition_type(RE_UINT32 codepoint); +RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 codepoint); +RE_UINT32 re_get_deprecated(RE_UINT32 codepoint); +RE_UINT32 re_get_diacritic(RE_UINT32 codepoint); +RE_UINT32 re_get_east_asian_width(RE_UINT32 codepoint); +RE_UINT32 re_get_emoji(RE_UINT32 codepoint); +RE_UINT32 re_get_emoji_component(RE_UINT32 codepoint); +RE_UINT32 re_get_emoji_modifier(RE_UINT32 codepoint); +RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 codepoint); +RE_UINT32 re_get_emoji_presentation(RE_UINT32 codepoint); +RE_UINT32 re_get_extended_pictographic(RE_UINT32 codepoint); +RE_UINT32 re_get_extender(RE_UINT32 codepoint); +RE_UINT32 re_get_general_category(RE_UINT32 codepoint); +RE_UINT32 re_get_graph(RE_UINT32 codepoint); +RE_UINT32 re_get_grapheme_base(RE_UINT32 codepoint); +RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 codepoint); +RE_UINT32 re_get_grapheme_extend(RE_UINT32 codepoint); +RE_UINT32 re_get_grapheme_link(RE_UINT32 codepoint); +RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 codepoint); +RE_UINT32 re_get_hex_digit(RE_UINT32 codepoint); +RE_UINT32 re_get_hyphen(RE_UINT32 codepoint); +RE_UINT32 re_get_id_continue(RE_UINT32 codepoint); +RE_UINT32 re_get_ideographic(RE_UINT32 codepoint); +RE_UINT32 re_get_ids_binary_operator(RE_UINT32 codepoint); +RE_UINT32 re_get_id_start(RE_UINT32 codepoint); +RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 codepoint); +RE_UINT32 re_get_indic_positional_category(RE_UINT32 codepoint); +RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 codepoint); +RE_UINT32 re_get_join_control(RE_UINT32 codepoint); +RE_UINT32 re_get_joining_group(RE_UINT32 codepoint); +RE_UINT32 re_get_joining_type(RE_UINT32 codepoint); +RE_UINT32 re_get_line_break(RE_UINT32 codepoint); +RE_UINT32 re_get_logical_order_exception(RE_UINT32 codepoint); +RE_UINT32 re_get_lowercase(RE_UINT32 codepoint); +RE_UINT32 re_get_math(RE_UINT32 codepoint); +RE_UINT32 re_get_nfc_quick_check(RE_UINT32 codepoint); +RE_UINT32 re_get_nfd_quick_check(RE_UINT32 codepoint); +RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 codepoint); +RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 codepoint); +RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 codepoint); +RE_UINT32 re_get_numeric_type(RE_UINT32 codepoint); +RE_UINT32 re_get_numeric_value(RE_UINT32 codepoint); +RE_UINT32 re_get_other_alphabetic(RE_UINT32 codepoint); +RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 codepoint); +RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 codepoint); +RE_UINT32 re_get_other_id_continue(RE_UINT32 codepoint); +RE_UINT32 re_get_other_id_start(RE_UINT32 codepoint); +RE_UINT32 re_get_other_lowercase(RE_UINT32 codepoint); +RE_UINT32 re_get_other_math(RE_UINT32 codepoint); +RE_UINT32 re_get_other_uppercase(RE_UINT32 codepoint); +RE_UINT32 re_get_pattern_syntax(RE_UINT32 codepoint); +RE_UINT32 re_get_pattern_white_space(RE_UINT32 codepoint); +RE_UINT32 re_get_posix_alnum(RE_UINT32 codepoint); +RE_UINT32 re_get_posix_digit(RE_UINT32 codepoint); +RE_UINT32 re_get_posix_punct(RE_UINT32 codepoint); +RE_UINT32 re_get_posix_xdigit(RE_UINT32 codepoint); +RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 codepoint); +RE_UINT32 re_get_print(RE_UINT32 codepoint); +RE_UINT32 re_get_quotation_mark(RE_UINT32 codepoint); +RE_UINT32 re_get_radical(RE_UINT32 codepoint); +RE_UINT32 re_get_regional_indicator(RE_UINT32 codepoint); +RE_UINT32 re_get_script(RE_UINT32 codepoint); +int re_get_script_extensions(RE_UINT32 codepoint, RE_UINT8* scripts); +RE_UINT32 re_get_sentence_break(RE_UINT32 codepoint); +RE_UINT32 re_get_sentence_terminal(RE_UINT32 codepoint); +RE_UINT32 re_get_soft_dotted(RE_UINT32 codepoint); +RE_UINT32 re_get_terminal_punctuation(RE_UINT32 codepoint); +RE_UINT32 re_get_unified_ideograph(RE_UINT32 codepoint); +RE_UINT32 re_get_uppercase(RE_UINT32 codepoint); +RE_UINT32 re_get_variation_selector(RE_UINT32 codepoint); +RE_UINT32 re_get_white_space(RE_UINT32 codepoint); +RE_UINT32 re_get_word(RE_UINT32 codepoint); +RE_UINT32 re_get_word_break(RE_UINT32 codepoint); +RE_UINT32 re_get_xdigit(RE_UINT32 codepoint); +RE_UINT32 re_get_xid_continue(RE_UINT32 codepoint); +RE_UINT32 re_get_xid_start(RE_UINT32 codepoint); +int re_get_all_cases(RE_UINT32 codepoint, RE_UINT32* cases); +RE_UINT32 re_get_simple_case_folding(RE_UINT32 codepoint); +int re_get_full_case_folding(RE_UINT32 codepoint, RE_UINT32* folded); diff --git a/regex_2/regex/regex.py b/regex_2/regex.py similarity index 92% rename from regex_2/regex/regex.py rename to regex_2/regex.py index 67aa73a..81ef0ac 100644 --- a/regex_2/regex/regex.py +++ b/regex_2/regex.py @@ -136,6 +136,7 @@ second character. \g<name> Matches the text matched by the group named name. \G Matches the empty string, but only at the position where the search started. + \h Matches horizontal whitespace. \K Keeps only what follows for the entire match. \L<name> Named list. The list is provided as a keyword argument. \m Matches the empty string, but only at the start of a word. @@ -239,54 +240,54 @@ __all__ = ["compile", "DEFAULT_VERSION", "escape", "findall", "finditer", "T", "TEMPLATE", "U", "UNICODE", "V0", "VERSION0", "V1", "VERSION1", "X", "VERBOSE", "W", "WORD", "error", "Regex", "__version__", "__doc__"] -__version__ = "2.5.64" +__version__ = "2.5.83" # -------------------------------------------------------------------- # Public interface. def match(pattern, string, flags=0, pos=None, endpos=None, partial=False, - concurrent=None, **kwargs): + concurrent=None, ignore_unused=False, **kwargs): """Try to apply the pattern at the start of the string, returning a match object, or None if no match was found.""" - return _compile(pattern, flags, kwargs).match(string, pos, endpos, - concurrent, partial) + return _compile(pattern, flags, ignore_unused, kwargs).match(string, pos, + endpos, concurrent, partial) def fullmatch(pattern, string, flags=0, pos=None, endpos=None, partial=False, - concurrent=None, **kwargs): + concurrent=None, ignore_unused=False, **kwargs): """Try to apply the pattern against all of the string, returning a match object, or None if no match was found.""" - return _compile(pattern, flags, kwargs).fullmatch(string, pos, endpos, - concurrent, partial) + return _compile(pattern, flags, ignore_unused, kwargs).fullmatch(string, + pos, endpos, concurrent, partial) def search(pattern, string, flags=0, pos=None, endpos=None, partial=False, - concurrent=None, **kwargs): + concurrent=None, ignore_unused=False, **kwargs): """Search through string looking for a match to the pattern, returning a match object, or None if no match was found.""" - return _compile(pattern, flags, kwargs).search(string, pos, endpos, - concurrent, partial) + return _compile(pattern, flags, ignore_unused, kwargs).search(string, pos, + endpos, concurrent, partial) def sub(pattern, repl, string, count=0, flags=0, pos=None, endpos=None, - concurrent=None, **kwargs): + concurrent=None, ignore_unused=False, **kwargs): """Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in string by the replacement repl. repl can be either a string or a callable; if a string, backslash escapes in it are processed; if a callable, it's passed the match object and must return a replacement string to be used.""" - return _compile(pattern, flags, kwargs).sub(repl, string, count, pos, - endpos, concurrent) + return _compile(pattern, flags, ignore_unused, kwargs).sub(repl, string, + count, pos, endpos, concurrent) def subf(pattern, format, string, count=0, flags=0, pos=None, endpos=None, - concurrent=None, **kwargs): + concurrent=None, ignore_unused=False, **kwargs): """Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in string by the replacement format. format can be either a string or a callable; if a string, it's treated as a format string; if a callable, it's passed the match object and must return a replacement string to be used.""" - return _compile(pattern, flags, kwargs).subf(format, string, count, pos, - endpos, concurrent) + return _compile(pattern, flags, ignore_unused, kwargs).subf(format, string, + count, pos, endpos, concurrent) def subn(pattern, repl, string, count=0, flags=0, pos=None, endpos=None, - concurrent=None, **kwargs): + concurrent=None, ignore_unused=False, **kwargs): """Return a 2-tuple containing (new_string, number). new_string is the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in the source string by the @@ -294,11 +295,11 @@ def subn(pattern, repl, string, count=0, flags=0, pos=None, endpos=None, can be either a string or a callable; if a string, backslash escapes in it are processed; if a callable, it's passed the match object and must return a replacement string to be used.""" - return _compile(pattern, flags, kwargs).subn(repl, string, count, pos, - endpos, concurrent) + return _compile(pattern, flags, ignore_unused, kwargs).subn(repl, string, + count, pos, endpos, concurrent) def subfn(pattern, format, string, count=0, flags=0, pos=None, endpos=None, - concurrent=None, **kwargs): + concurrent=None, ignore_unused=False, **kwargs): """Return a 2-tuple containing (new_string, number). new_string is the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in the source string by the @@ -306,45 +307,46 @@ def subfn(pattern, format, string, count=0, flags=0, pos=None, endpos=None, can be either a string or a callable; if a string, it's treated as a format string; if a callable, it's passed the match object and must return a replacement string to be used.""" - return _compile(pattern, flags, kwargs).subfn(format, string, count, pos, - endpos, concurrent) + return _compile(pattern, flags, ignore_unused, kwargs).subfn(format, string, + count, pos, endpos, concurrent) def split(pattern, string, maxsplit=0, flags=0, concurrent=None, - **kwargs): + ignore_unused=False, **kwargs): """Split the source string by the occurrences of the pattern, returning a list containing the resulting substrings. If capturing parentheses are used in pattern, then the text of all groups in the pattern are also returned as part of the resulting list. If maxsplit is nonzero, at most maxsplit splits occur, and the remainder of the string is returned as the final element of the list.""" - return _compile(pattern, flags, kwargs).split(string, maxsplit, concurrent) + return _compile(pattern, flags, ignore_unused, kwargs).split(string, + maxsplit, concurrent) def splititer(pattern, string, maxsplit=0, flags=0, concurrent=None, - **kwargs): + ignore_unused=False, **kwargs): "Return an iterator yielding the parts of a split string." - return _compile(pattern, flags, kwargs).splititer(string, maxsplit, - concurrent) + return _compile(pattern, flags, ignore_unused, kwargs).splititer(string, + maxsplit, concurrent) def findall(pattern, string, flags=0, pos=None, endpos=None, overlapped=False, - concurrent=None, **kwargs): + concurrent=None, ignore_unused=False, **kwargs): """Return a list of all matches in the string. The matches may be overlapped if overlapped is True. If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result.""" - return _compile(pattern, flags, kwargs).findall(string, pos, endpos, - overlapped, concurrent) + return _compile(pattern, flags, ignore_unused, kwargs).findall(string, pos, + endpos, overlapped, concurrent) def finditer(pattern, string, flags=0, pos=None, endpos=None, overlapped=False, - partial=False, concurrent=None, **kwargs): + partial=False, concurrent=None, ignore_unused=False, **kwargs): """Return an iterator over all matches in the string. The matches may be overlapped if overlapped is True. For each match, the iterator returns a match object. Empty matches are included in the result.""" - return _compile(pattern, flags, kwargs).finditer(string, pos, endpos, - overlapped, concurrent, partial) + return _compile(pattern, flags, ignore_unused, kwargs).finditer(string, pos, + endpos, overlapped, concurrent, partial) -def compile(pattern, flags=0, **kwargs): +def compile(pattern, flags=0, ignore_unused=False, **kwargs): "Compile a regular expression pattern, returning a pattern object." - return _compile(pattern, flags, kwargs) + return _compile(pattern, flags, ignore_unused, kwargs) def purge(): "Clear the regular expression cache" @@ -353,7 +355,7 @@ def purge(): def template(pattern, flags=0): "Compile a template pattern, returning a pattern object." - return _compile(pattern, flags | TEMPLATE) + return _compile(pattern, flags | TEMPLATE, False, {}) def escape(pattern, special_only=True, literal_spaces=False): """Escape a string for use as a literal in a pattern. If special_only is @@ -420,7 +422,7 @@ _locale_sensitive = {} _MAXCACHE = 500 _MAXREPCACHE = 500 -def _compile(pattern, flags=0, kwargs={}): +def _compile(pattern, flags, ignore_unused, kwargs): "Compiles a regular expression to a PatternObject." global DEFAULT_VERSION @@ -563,6 +565,12 @@ def _compile(pattern, flags=0, kwargs={}): named_list_indexes[index] = items args_needed.add((name, values)) + # Any unused keyword arguments, possibly resulting from a typo? + unused_kwargs = set(kwargs) - set(named_lists) + if unused_kwargs and not ignore_unused: + any_one = next(iter(unused_kwargs)) + raise ValueError('unused keyword argument %r' % any_one) + # Check the features of the groups. _check_group_features(info, parsed) @@ -683,8 +691,8 @@ def _compile_replacement_helper(pattern, template): return compiled # We define Pattern here after all the support objects have been defined. -Pattern = type(_compile('', 0, {})) -Match = type(_compile('', 0).match('')) +Pattern = type(_compile('', 0, False, {})) +Match = type(_compile('', 0, False, {}).match('')) # We'll define an alias for the 'compile' function so that the repr of a # pattern object is eval-able. diff --git a/regex_2/regex/test/__init__.py b/regex_2/regex/test/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/regex_2/regex/test/test_regex.py b/regex_2/test_regex.py similarity index 97% rename from regex_2/regex/test/test_regex.py rename to regex_2/test_regex.py index 8a4aed6..c918ba2 100644 --- a/regex_2/regex/test/test_regex.py +++ b/regex_2/test_regex.py @@ -1,12 +1,12 @@ from __future__ import with_statement -import regex -import string +from test.test_support import run_unittest from weakref import proxy -import unittest import copy import pickle -from test.test_support import run_unittest import re +import regex +import string +import unittest # _AssertRaisesContext is defined here because the class doesn't exist before # Python 2.7. @@ -1773,8 +1773,8 @@ class RegexTests(unittest.TestCase): repr('\a\b\f\n\r\t\v')), (r'[\a][\b][\f][\n][\r][\t][\v]', '\a\b\f\n\r\t\v', '0', repr('\a\b\f\n\r\t\v')), - (r'\c\e\g\h\i\j\k\o\p\q\y\z', 'ceghijkopqyz', '0', - repr('ceghijkopqyz')), + (r'\c\e\g\i\j\k\o\p\q\y\z', 'cegijkopqyz', '0', + repr('cegijkopqyz')), (r'\xff', '\377', '0', repr(chr(255))), # New \x semantics. @@ -4018,103 +4018,142 @@ thing [u'\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466']) # Hg issue 320: Abnormal performance - self.assertEquals(bool(regex.search(r'(?=a)a', 'a')), True) - self.assertEquals(bool(regex.search(r'(?!b)a', 'a')), True) + self.assertEqual(bool(regex.search(r'(?=a)a', 'a')), True) + self.assertEqual(bool(regex.search(r'(?!b)a', 'a')), True) # Hg issue 327: .fullmatch() causes MemoryError - self.assertEquals(regex.fullmatch(r'((\d)*?)*?', '123').span(), (0, 3)) + self.assertEqual(regex.fullmatch(r'((\d)*?)*?', '123').span(), (0, 3)) # Hg issue 329: Wrong group matches when question mark quantifier is used within a look behind - self.assertEquals(regex.search(r'''(?(DEFINE)(?<mydef>(?<wrong>THIS_SHOULD_NOT_MATCHx?)|(?<right>right))).*(?<=(?&mydef).*)''', + self.assertEqual(regex.search(r'''(?(DEFINE)(?<mydef>(?<wrong>THIS_SHOULD_NOT_MATCHx?)|(?<right>right))).*(?<=(?&mydef).*)''', 'x right').capturesdict(), {'mydef': ['right'], 'wrong': [], 'right': ['right']}) + # Hg issue 353: fuzzy changes negative indexes + self.assertEqual(regex.search(r'(?be)(AGTGTTCCCCGCGCCAGCGGGGATAAACCG){s<=5,i<=5,d<=5,s+i+d<=10}', + 'TTCCCCGCGCCAGCGGGGATAAACCG').fuzzy_changes, ([], [], [0, 1, 3, 5])) + + # Git issue 364: Contradictory values in fuzzy_counts and fuzzy_changes + self.assertEqual(regex.match(r'(?:bc){e}', 'c').fuzzy_counts, (1, 0, + 1)) + self.assertEqual(regex.match(r'(?:bc){e}', 'c').fuzzy_changes, ([0], + [], [1])) + self.assertEqual(regex.match(r'(?e)(?:bc){e}', 'c').fuzzy_counts, (0, + 0, 1)) + self.assertEqual(regex.match(r'(?e)(?:bc){e}', 'c').fuzzy_changes, + ([], [], [0])) + self.assertEqual(regex.match(r'(?b)(?:bc){e}', 'c').fuzzy_counts, (0, + 0, 1)) + self.assertEqual(regex.match(r'(?b)(?:bc){e}', 'c').fuzzy_changes, + ([], [], [0])) + + # Git issue 370: Confusions about Fuzzy matching behavior + self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){e}', + '$ 10,112.111.12').fuzzy_counts, (6, 0, 5)) + self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=1}', + '$ 10,112.111.12').fuzzy_counts, (1, 0, 0)) + self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=1,i<=1,d<=1}', + '$ 10,112.111.12').fuzzy_counts, (1, 0, 0)) + self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=3}', + '$ 10,1a2.111.12').fuzzy_counts, (2, 0, 0)) + self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=2}', + '$ 10,1a2.111.12').fuzzy_counts, (2, 0, 0)) + + self.assertEqual(regex.fullmatch(r'(?e)(?:0?,0(?:,0)?){s<=1,d<=1}', + ',0;0').fuzzy_counts, (1, 0, 0)) + self.assertEqual(regex.fullmatch(r'(?e)(?:0??,0(?:,0)?){s<=1,d<=1}', + ',0;0').fuzzy_counts, (1, 0, 0)) + + # Git issue 371: Specifying character set when fuzzy-matching allows characters not in the set + self.assertEqual(regex.search(r"\b(?e)(?:\d{6,20}){i<=5:[\-\\\/]}\b", + "cat dog starting at 00:01132.000. hello world"), None) + def test_fuzzy_ext(self): - self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', 'e')), + self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', 'e')), True) - self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'e')), + self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'e')), True) - self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', '-')), + self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', '-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', '-')), + self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', '-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'ae')), + self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'ae')), True) - self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', 'ae')), True) - self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'a-')), + self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'a-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', 'a-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'ae')), + self.assertEqual(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'ae')), True) - self.assertEquals(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}', 'ae')), True) - self.assertEquals(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'a-')), + self.assertEqual(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'a-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}', 'a-')), False) - self.assertEquals(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'ae')), + self.assertEqual(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'ae')), True) - self.assertEquals(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)', + self.assertEqual(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)', 'ea')), True) - self.assertEquals(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'a-')), + self.assertEqual(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'a-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)', + self.assertEqual(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)', '-a')), False) - self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', u'ts')), True) - self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', u'st')), True) - self.assertEquals(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', u'st')), True) - self.assertEquals(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', u'ts')), True) - self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', u'-s')), False) - self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', u's-')), False) - self.assertEquals(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', u's-')), False) - self.assertEquals(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', u'-s')), False) - self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', u'ssst')), True) - self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', u'ssts')), True) - self.assertEquals(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})', + self.assertEqual(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})', u'stss')), True) - self.assertEquals(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})', + self.assertEqual(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})', u'tsss')), True) - self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', u'ss-s')), False) - self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', u'sss-')), False) - self.assertEquals(bool(regex.fullmatch(ur'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', u'-s')), False) - self.assertEquals(bool(regex.fullmatch(ur'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', u's-')), False) - self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}', u'\N{LATIN SMALL LETTER SHARP S}ts')), True) - self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}', u'\N{LATIN SMALL LETTER SHARP S}st')), True) - self.assertEquals(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(ss)', + self.assertEqual(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(ss)', u'st\N{LATIN SMALL LETTER SHARP S}')), True) - self.assertEquals(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(ss)', + self.assertEqual(bool(regex.fullmatch(ur'(?firu)\1{e<=1:[a-z]}(ss)', u'ts\N{LATIN SMALL LETTER SHARP S}')), True) - self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}', u'\N{LATIN SMALL LETTER SHARP S}-s')), False) - self.assertEquals(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?fiu)(ss)\1{e<=1:[a-z]}', u'\N{LATIN SMALL LETTER SHARP S}s-')), False) - self.assertEquals(bool(regex.fullmatch(ur'(?firu)(ss)\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?firu)(ss)\1{e<=1:[a-z]}', u's-\N{LATIN SMALL LETTER SHARP S}')), False) - self.assertEquals(bool(regex.fullmatch(ur'(?firu)(ss)\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(ur'(?firu)(ss)\1{e<=1:[a-z]}', u'-s\N{LATIN SMALL LETTER SHARP S}')), False) def test_subscripted_captures(self): diff --git a/regex_3/regex/__init__.py b/regex_3/__init__.py similarity index 100% rename from regex_3/regex/__init__.py rename to regex_3/__init__.py diff --git a/regex_3/_regex.c b/regex_3/_regex.c index c720424..58888da 100644 --- a/regex_3/_regex.c +++ b/regex_3/_regex.c @@ -60,11 +60,6 @@ #endif #endif -#if PY_VERSION_HEX < 0x03030000 -typedef unsigned char Py_UCS1; -typedef unsigned short Py_UCS2; - -#endif typedef RE_UINT32 RE_CODE; typedef unsigned char BYTE; @@ -516,6 +511,7 @@ typedef struct RE_State { Py_ssize_t timeout; /* The timeout in clock ticks. */ clock_t start_time; /* The clock time when matching started. */ int partial_side; /* The side that could truncate in a partial match. */ + /* Various flags. */ RE_UINT16 iterations; /* The number of iterations the matching engine has performed since checking for KeyboardInterrupt. */ BOOL is_unicode; /* Whether the string to be matched is Unicode. */ BOOL should_release; /* Whether the buffer should be released. */ @@ -1502,11 +1498,7 @@ static BOOL unicode_at_word_end(RE_State* state, Py_ssize_t text_pos) { * Only a limited number are treated as vowels. */ Py_LOCAL_INLINE(BOOL) is_unicode_vowel(Py_UCS4 ch) { -#if PY_VERSION_HEX >= 0x03030000 switch (Py_UNICODE_TOLOWER(ch)) { -#else - switch (Py_UNICODE_TOLOWER((Py_UNICODE)ch)) { -#endif case 'a': case 0xE0: case 0xE1: case 0xE2: case 'e': case 0xE8: case 0xE9: case 0xEA: case 'i': case 0xEC: case 0xED: case 0xEE: @@ -1854,7 +1846,7 @@ static BOOL unicode_at_grapheme_boundary(RE_State* state, Py_ssize_t text_pos) return FALSE; /* GB8 */ - if ((left_prop == RE_GBREAK_LVT || left_prop == RE_GBREAK_T) && left_prop + if ((left_prop == RE_GBREAK_LVT || left_prop == RE_GBREAK_T) && right_prop == RE_GBREAK_T) return FALSE; @@ -1895,14 +1887,16 @@ static BOOL unicode_at_grapheme_boundary(RE_State* state, Py_ssize_t text_pos) * number of RI characters before the break point. */ /* GB12 and GB13 */ - pos = left_pos; + if (right_prop == RE_GBREAK_REGIONALINDICATOR) { + pos = left_pos; - while (pos >= 0 && re_get_grapheme_cluster_break(char_at(state->text, pos)) - == RE_WBREAK_REGIONALINDICATOR) - --pos; + while (pos >= 0 && re_get_grapheme_cluster_break(char_at(state->text, + pos)) == RE_GBREAK_REGIONALINDICATOR) + --pos; - if ((left_pos - pos) % 2 == 1) - return FALSE; + if ((left_pos - pos) % 2 == 1) + return FALSE; + } /* Otherwise, break everywhere. */ /* GB999 */ @@ -9373,7 +9367,8 @@ Py_LOCAL_INLINE(BOOL) is_repeat_guarded(RE_State* state, size_t index, RE_GuardList* guard_list; /* Is a guard active here? */ - if (!(state->pattern->repeat_info[index].status & guard_type)) + if (!(state->pattern->repeat_info[index].status & guard_type) || + state->is_fuzzy) return FALSE; /* Which guard list? */ @@ -9468,795 +9463,67 @@ Py_LOCAL_INLINE(PyObject*) build_unicode_value(void* buffer, Py_ssize_t start, return result; #else -#if PY_VERSION_HEX >= 0x03030000 Py_ssize_t len; int kind; buffer = (void*)((RE_UINT8*)buffer + start * buffer_charsize); len = end - start; - switch (buffer_charsize) { - case 1: - kind = PyUnicode_1BYTE_KIND; - break; - case 2: - kind = PyUnicode_2BYTE_KIND; - break; - case 4: - kind = PyUnicode_4BYTE_KIND; - break; - default: - kind = PyUnicode_1BYTE_KIND; - break; - } - - return PyUnicode_FromKindAndData(kind, buffer, len); -#else - Py_ssize_t len; - - buffer = (void*)((RE_UINT8*)buffer + start * buffer_charsize); - len = end - start; - - return PyUnicode_FromUnicode(buffer, len); -#endif -#endif -} - -/* Builds a bytestring. Returns NULL if any member is too wide. */ -Py_LOCAL_INLINE(PyObject*) build_bytes_value(void* buffer, Py_ssize_t start, - Py_ssize_t end, Py_ssize_t buffer_charsize) { - Py_ssize_t len; - Py_UCS1* byte_buffer; - Py_ssize_t i; - PyObject* result; - - buffer = (void*)((RE_UINT8*)buffer + start * buffer_charsize); - len = end - start; - - if (buffer_charsize == 1) - return Py_BuildValue("y#", buffer, len); - - byte_buffer = re_alloc((size_t)len); - if (!byte_buffer) - return NULL; - - for (i = 0; i < len; i++) { - Py_UCS2 c = ((Py_UCS2*)buffer)[i]; - if (c > 0xFF) - goto too_wide; - - byte_buffer[i] = (Py_UCS1)c; - } - - result = Py_BuildValue("y#", byte_buffer, len); - - re_dealloc(byte_buffer); - - return result; - -too_wide: - re_dealloc(byte_buffer); - - return NULL; -} - -/* Looks for a string in a string set. */ -Py_LOCAL_INLINE(int) string_set_contains(RE_State* state, PyObject* string_set, - Py_ssize_t first, Py_ssize_t last) { - PyObject* string; - int status; - - if (state->is_unicode) - string = build_unicode_value(state->text, first, last, - state->charsize); - else - string = build_bytes_value(state->text, first, last, state->charsize); - if (!string) - return RE_ERROR_INTERNAL; - - status = PySet_Contains(string_set, string); - Py_DECREF(string); - - return status; -} - -/* Looks for a string in a string set, ignoring case. */ -Py_LOCAL_INLINE(int) string_set_contains_ign(RE_State* state, PyObject* - string_set, void* buffer, Py_ssize_t first, Py_ssize_t last, Py_ssize_t - index, Py_ssize_t buffer_charsize) { - Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); - void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); - RE_EncodingTable* encoding; - RE_LocaleInfo* locale_info; - BOOL (*possible_turkic)(RE_LocaleInfo* locale_info, Py_UCS4 ch); - Py_UCS4 codepoints[4]; - - switch (buffer_charsize) { - case 1: - char_at = bytes1_char_at; - set_char_at = bytes1_set_char_at; - break; - case 2: - char_at = bytes2_char_at; - set_char_at = bytes2_set_char_at; - break; - case 4: - char_at = bytes4_char_at; - set_char_at = bytes4_set_char_at; - break; - default: - char_at = bytes1_char_at; - set_char_at = bytes1_set_char_at; - break; - } - - encoding = state->encoding; - locale_info = state->locale_info; - possible_turkic = encoding->possible_turkic; - - /* Look for a possible Turkic 'I'. */ - while (index < last && !possible_turkic(locale_info, char_at(buffer, - index))) - ++index; - - if (index < last) { - /* Possible Turkic 'I'. */ - int count; - int i; - - /* Try all the alternatives to the 'I'. */ - count = encoding->all_turkic_i(locale_info, char_at(buffer, index), - codepoints); - - for (i = 0; i < count; i++) { - int status; - - set_char_at(buffer, index, codepoints[i]); - - /* Recurse for the remainder of the string. */ - status = string_set_contains_ign(state, string_set, buffer, first, - last, index + 1, buffer_charsize); - if (status != 0) - return status; - } - - return 0; - } else { - /* No Turkic 'I'. */ - PyObject* string; - int status; - - if (state->is_unicode) - string = build_unicode_value(buffer, first, last, buffer_charsize); - else - string = build_bytes_value(buffer, first, last, buffer_charsize); - if (!string) - return RE_ERROR_MEMORY; - - status = PySet_Contains(string_set, string); - Py_DECREF(string); - - return status; - } -} - -/* Creates a partial string set for truncation at the left or right side. */ -Py_LOCAL_INLINE(int) make_partial_string_set(RE_State* state, RE_Node* node) { - PatternObject* pattern; - int partial_side; - PyObject* string_set; - PyObject* partial_set; - PyObject* iter = NULL; - PyObject* item = NULL; - PyObject* slice = NULL; - - pattern = state->pattern; - partial_side = state->partial_side; - if (partial_side != RE_PARTIAL_LEFT && partial_side != RE_PARTIAL_RIGHT) - return RE_ERROR_INTERNAL; - - /* Fetch the full string set. PyList_GET_ITEM borrows a reference. */ - string_set = PyList_GET_ITEM(pattern->named_list_indexes, node->values[0]); - if (!string_set) - return RE_ERROR_INTERNAL; - - /* Gets the list of partial string sets. */ - if (!pattern->partial_named_lists[partial_side]) { - size_t size; - - size = pattern->named_lists_count * sizeof(PyObject*); - pattern->partial_named_lists[partial_side] = re_alloc(size); - if (!pattern->partial_named_lists[partial_side]) - return RE_ERROR_INTERNAL; - - memset(pattern->partial_named_lists[partial_side], 0, size); - } - - /* Get the partial string set. */ - partial_set = pattern->partial_named_lists[partial_side][node->values[0]]; - if (partial_set) - return 1; - - /* Build the partial string set. */ - partial_set = PySet_New(NULL); - if (!partial_set) - return RE_ERROR_INTERNAL; - - iter = PyObject_GetIter(string_set); - if (!iter) - goto error; - - item = PyIter_Next(iter); - - while (item) { - Py_ssize_t len; - Py_ssize_t first; - Py_ssize_t last; - - len = PySequence_Length(item); - if (len == -1) - goto error; - - first = 0; - last = len; - - while (last - first > 1) { - int status; - - /* Shorten the entry. */ - if (partial_side == RE_PARTIAL_LEFT) - ++first; - else - --last; - - slice = PySequence_GetSlice(item, first, last); - if (!slice) - goto error; - - status = PySet_Add(partial_set, slice); - Py_DECREF(slice); - if (status < 0) - goto error; - } - - Py_DECREF(item); - item = PyIter_Next(iter); - } - - if (PyErr_Occurred()) - goto error; - - Py_DECREF(iter); - - pattern->partial_named_lists[partial_side][node->values[0]] = partial_set; - - return 1; - -error: - Py_XDECREF(item); - Py_XDECREF(iter); - Py_DECREF(partial_set); - - return RE_ERROR_INTERNAL; -} - -/* Tries to match a string at the current position with a member of a string - * set, forwards or backwards. - */ -Py_LOCAL_INLINE(int) string_set_match_fwdrev(RE_State* state, RE_Node* node, - BOOL reverse) { - Py_ssize_t min_len; - Py_ssize_t max_len; - Py_ssize_t text_available; - Py_ssize_t slice_available; - int partial_side; - Py_ssize_t len; - Py_ssize_t first; - Py_ssize_t last; - int status; - PyObject* string_set; - - min_len = (Py_ssize_t)node->values[1]; - max_len = (Py_ssize_t)node->values[2]; - - acquire_GIL(state); - - if (reverse) { - text_available = state->text_pos; - slice_available = state->text_pos - state->slice_start; - partial_side = RE_PARTIAL_LEFT; - } else { - text_available = state->text_length - state->text_pos; - slice_available = state->slice_end - state->text_pos; - partial_side = RE_PARTIAL_RIGHT; - } - - /* Get as many characters as we need for the longest possible match. */ - len = min_ssize_t(max_len, slice_available); - - if (reverse) { - first = state->text_pos - len; - last = state->text_pos; - } else { - first = state->text_pos; - last = state->text_pos + len; - } - - /* If we didn't get all of the characters we need, is a partial match - * allowed? - */ - if (len < max_len && len == text_available && state->partial_side == - partial_side) { - if (len == 0) { - /* An empty string is always a possible partial match. */ - status = RE_ERROR_PARTIAL; - goto finished; - } - - /* Make a set of the possible partial matches. */ - status = make_partial_string_set(state, node); - if (status < 0) - goto finished; - - /* Fetch the partial string set. */ - string_set = - state->pattern->partial_named_lists[partial_side][node->values[0]]; - - /* Is the text we have a partial match? */ - status = string_set_contains(state, string_set, first, last); - if (status < 0) - goto finished; - - if (status == 1) { - /* Advance past the match. */ - if (reverse) - state->text_pos -= len; - else - state->text_pos += len; - - status = RE_ERROR_PARTIAL; - goto finished; - } - } - - /* Fetch the string set. PyList_GET_ITEM borrows a reference. */ - string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, - node->values[0]); - if (!string_set) { - status = RE_ERROR_INTERNAL; - goto finished; - } - - /* We've already looked for a partial match (if allowed), but what about a - * complete match? - */ - while (len >= min_len) { - status = string_set_contains(state, string_set, first, last); - - if (status == 1) { - /* Advance past the match. */ - if (reverse) - state->text_pos -= len; - else - state->text_pos += len; - - status = 1; - goto finished; - } - - /* Look for a shorter match. */ - --len; - if (reverse) - ++first; - else - --last; - } - - /* No match. */ - status = 0; - -finished: - release_GIL(state); - - return status; -} - -/* Tries to match a string at the current position with a member of a string - * set, ignoring case, forwards or backwards. - */ -Py_LOCAL_INLINE(int) string_set_match_fld_fwdrev(RE_State* state, RE_Node* - node, BOOL reverse) { - int (*full_case_fold)(RE_LocaleInfo* locale_info, Py_UCS4 ch, Py_UCS4* - folded); - Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); - Py_ssize_t folded_charsize; - void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); - Py_ssize_t min_len; - Py_ssize_t max_len; - Py_ssize_t buf_len; - void* folded; - int status; - BOOL* end_of_fold = NULL; - Py_ssize_t text_available; - Py_ssize_t slice_available; - Py_ssize_t t_pos; - Py_ssize_t f_pos; - int step; - int partial_side; - Py_ssize_t len; - Py_ssize_t consumed; - Py_UCS4 codepoints[RE_MAX_FOLDED]; - Py_ssize_t first; - Py_ssize_t last; - PyObject* string_set; - - full_case_fold = state->encoding->full_case_fold; - char_at = state->char_at; - -#if PY_VERSION_HEX >= 0x03030000 - /* The folded string needs to be at least 2 bytes per character. */ - folded_charsize = max_ssize_t(state->charsize, sizeof(Py_UCS2)); -#else - /* The folded string will have the same width as the original string. */ - folded_charsize = state->charsize; -#endif - - switch (folded_charsize) { - case 1: - set_char_at = bytes1_set_char_at; - break; - case 2: - set_char_at = bytes2_set_char_at; - break; - case 4: - set_char_at = bytes4_set_char_at; - break; - default: - return RE_ERROR_INTERNAL; - } - - min_len = (Py_ssize_t)node->values[1]; - max_len = (Py_ssize_t)node->values[2]; - - acquire_GIL(state); - - /* Allocate a buffer for the folded string. */ - buf_len = max_len + RE_MAX_FOLDED; - folded = re_alloc((size_t)(buf_len * folded_charsize)); - if (!folded) { - status = RE_ERROR_MEMORY; - goto finished; - } - - end_of_fold = re_alloc((size_t)buf_len * sizeof(BOOL)); - if (!end_of_fold) { - status = RE_ERROR_MEMORY; - goto finished; - } - - memset(end_of_fold, 0, (size_t)buf_len * sizeof(BOOL)); - - if (reverse) { - text_available = state->text_pos; - slice_available = state->text_pos - state->slice_start; - t_pos = state->text_pos - 1; - f_pos = buf_len; - step = -1; - partial_side = RE_PARTIAL_LEFT; - } else { - text_available = state->text_length - state->text_pos; - slice_available = state->slice_end - state->text_pos; - t_pos = state->text_pos; - f_pos = 0; - step = 1; - partial_side = RE_PARTIAL_RIGHT; - } - - /* We can stop getting characters as soon as the case-folded string is long - * enough (each codepoint from the text can expand to more than one folded - * codepoint). - */ - len = 0; - end_of_fold[len] = TRUE; - - consumed = 0; - while (len < max_len && consumed < slice_available) { - int count; - int j; - - count = full_case_fold(state->locale_info, char_at(state->text, t_pos), - codepoints); - - if (reverse) - f_pos -= count; - - for (j = 0; j < count; j++) - set_char_at(folded, f_pos + j, codepoints[j]); - - if (!reverse) - f_pos += count; - - len += count; - end_of_fold[len] = TRUE; - ++consumed; - t_pos += step; - } - - if (reverse) { - first = f_pos; - last = buf_len; - } else { - first = 0; - last = f_pos; - } - - /* If we didn't get all of the characters we need, is a partial match - * allowed? - */ - if (len < max_len && len == text_available && state->partial_side == - partial_side) { - if (len == 0) { - /* An empty string is always a possible partial match. */ - status = RE_ERROR_PARTIAL; - goto finished; - } - - /* Make a set of the possible partial matches. */ - status = make_partial_string_set(state, node); - if (status < 0) - goto finished; - - /* Fetch the partial string set. */ - string_set = - state->pattern->partial_named_lists[partial_side][node->values[0]]; - - /* Is the text we have a partial match? */ - status = string_set_contains_ign(state, string_set, folded, first, - last, first, folded_charsize); - if (status < 0) - goto finished; - - if (status == 1) { - /* Advance past the match. */ - if (reverse) - state->text_pos -= consumed; - else - state->text_pos += consumed; - - status = RE_ERROR_PARTIAL; - goto finished; - } - } - - /* Fetch the string set. PyList_GET_ITEM borrows a reference. */ - string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, - node->values[0]); - if (!string_set) { - status = RE_ERROR_INTERNAL; - goto finished; - } - - /* We've already looked for a partial match (if allowed), but what about a - * complete match? - */ - while (len >= min_len) { - if (end_of_fold[len]) { - status = string_set_contains_ign(state, string_set, folded, first, - last, first, folded_charsize); - - if (status == 1) { - /* Advance past the match. */ - if (reverse) - state->text_pos -= consumed; - else - state->text_pos += consumed; - - status = 1; - goto finished; - } - - --consumed; - } - - /* Look for a shorter match. */ - --len; - if (reverse) - ++first; - else - --last; - } - - /* No match. */ - status = 0; - -finished: - re_dealloc(end_of_fold); - re_dealloc(folded); - - release_GIL(state); - - return status; -} - -/* Tries to match a string at the current position with a member of a string - * set, ignoring case, forwards or backwards. - */ -Py_LOCAL_INLINE(int) string_set_match_ign_fwdrev(RE_State* state, RE_Node* - node, BOOL reverse) { - Py_UCS4 (*simple_case_fold)(RE_LocaleInfo* locale_info, Py_UCS4 ch); - Py_UCS4 (*char_at)(void* text, Py_ssize_t pos); - Py_ssize_t folded_charsize; - void (*set_char_at)(void* text, Py_ssize_t pos, Py_UCS4 ch); - Py_ssize_t min_len; - Py_ssize_t max_len; - void* folded; - int status; - Py_ssize_t text_available; - Py_ssize_t slice_available; - Py_ssize_t t_pos; - Py_ssize_t f_pos; - int step; - int partial_side; - Py_ssize_t len; - Py_ssize_t i; - Py_ssize_t first; - Py_ssize_t last; - PyObject* string_set; - - simple_case_fold = state->encoding->simple_case_fold; - char_at = state->char_at; - -#if PY_VERSION_HEX >= 0x03030000 - /* The folded string needs to be at least 2 bytes per character. */ - folded_charsize = max_ssize_t(state->charsize, sizeof(Py_UCS2)); -#else - /* The folded string will have the same width as the original string. */ - folded_charsize = state->charsize; -#endif - - switch (folded_charsize) { + switch (buffer_charsize) { case 1: - set_char_at = bytes1_set_char_at; + kind = PyUnicode_1BYTE_KIND; break; case 2: - set_char_at = bytes2_set_char_at; + kind = PyUnicode_2BYTE_KIND; break; case 4: - set_char_at = bytes4_set_char_at; + kind = PyUnicode_4BYTE_KIND; break; default: - return RE_ERROR_INTERNAL; - } - - min_len = (Py_ssize_t)node->values[1]; - max_len = (Py_ssize_t)node->values[2]; - - acquire_GIL(state); - - /* Allocate a buffer for the folded string. */ - folded = re_alloc((size_t)(max_len * folded_charsize)); - if (!folded) { - status = RE_ERROR_MEMORY; - goto finished; - } - - if (reverse) { - text_available = state->text_pos; - slice_available = state->text_pos - state->slice_start; - t_pos = state->text_pos - 1; - f_pos = max_len - 1; - step = -1; - partial_side = RE_PARTIAL_LEFT; - } else { - text_available = state->text_length - state->text_pos; - slice_available = state->slice_end - state->text_pos; - t_pos = state->text_pos; - f_pos = 0; - step = 1; - partial_side = RE_PARTIAL_RIGHT; - } - - /* Get as many characters as we need for the longest possible match. */ - len = min_ssize_t(max_len, slice_available); - - for (i = 0; i < len; i ++) { - Py_UCS4 ch; - - ch = simple_case_fold(state->locale_info, char_at(state->text, t_pos)); - set_char_at(folded, f_pos, ch); - t_pos += step; - f_pos += step; - } - - if (reverse) { - first = f_pos + 1; - last = max_len; - } else { - first = 0; - last = f_pos; + kind = PyUnicode_1BYTE_KIND; + break; } - /* If we didn't get all of the characters we need, is a partial match - * allowed? - */ - if (len < max_len && len == text_available && state->partial_side == - partial_side) { - if (len == 0) { - /* An empty string is always a possible partial match. */ - status = RE_ERROR_PARTIAL; - goto finished; - } + return PyUnicode_FromKindAndData(kind, buffer, len); +#endif +} - /* Make a set of the possible partial matches. */ - status = make_partial_string_set(state, node); - if (status < 0) - goto finished; +/* Builds a bytestring. Returns NULL if any member is too wide. */ +Py_LOCAL_INLINE(PyObject*) build_bytes_value(void* buffer, Py_ssize_t start, + Py_ssize_t end, Py_ssize_t buffer_charsize) { + Py_ssize_t len; + Py_UCS1* byte_buffer; + Py_ssize_t i; + PyObject* result; - /* Fetch the partial string set. */ - string_set = - state->pattern->partial_named_lists[partial_side][node->values[0]]; + buffer = (void*)((RE_UINT8*)buffer + start * buffer_charsize); + len = end - start; - /* Is the text we have a partial match? */ - status = string_set_contains_ign(state, string_set, folded, first, - last, first, folded_charsize); - if (status < 0) - goto finished; + if (buffer_charsize == 1) + return Py_BuildValue("y#", buffer, len); - if (status == 1) { - /* Advance past the match. */ - if (reverse) - state->text_pos -= len; - else - state->text_pos += len; + byte_buffer = re_alloc((size_t)len); + if (!byte_buffer) + return NULL; - status = RE_ERROR_PARTIAL; - goto finished; - } - } + for (i = 0; i < len; i++) { + Py_UCS2 c = ((Py_UCS2*)buffer)[i]; + if (c > 0xFF) + goto too_wide; - /* Fetch the string set. PyList_GET_ITEM borrows a reference. */ - string_set = PyList_GET_ITEM(state->pattern->named_list_indexes, - node->values[0]); - if (!string_set) { - status = RE_ERROR_INTERNAL; - goto finished; + byte_buffer[i] = (Py_UCS1)c; } - /* We've already looked for a partial match (if allowed), but what about a - * complete match? - */ - while (len >= min_len) { - status = string_set_contains_ign(state, string_set, folded, first, - last, first, folded_charsize); - - if (status == 1) { - /* Advance past the match. */ - if (reverse) - state->text_pos -= len; - else - state->text_pos += len; - - status = 1; - goto finished; - } - - /* Look for a shorter match. */ - --len; - if (reverse) - ++first; - else - --last; - } + result = Py_BuildValue("y#", byte_buffer, len); - /* No match. */ - status = 0; + re_dealloc(byte_buffer); -finished: - re_dealloc(folded); + return result; - release_GIL(state); +too_wide: + re_dealloc(byte_buffer); - return status; + return NULL; } Py_LOCAL_INLINE(size_t) total_errors(size_t* fuzzy_counts) { @@ -10420,16 +9687,25 @@ Py_LOCAL_INLINE(void) unrecord_fuzzy(RE_State* state) { --state->fuzzy_changes.count; } -/* Makes a list of lists of fuzzy changes. */ -Py_LOCAL_INLINE(void) make_fuzzy_changes_list(RE_FuzzyChangesList* +/* Initialises a list of fuzzy changes. */ +Py_LOCAL_INLINE(void) init_fuzzy_changes_list(RE_FuzzyChangesList* changes_list) { changes_list->capacity = 0; changes_list->count = 0; changes_list->items = NULL; } -/* Makes a list of lists of fuzzy changes. */ -Py_LOCAL_INLINE(void) make_best_changes_list(RE_BestChangesList* +/* Finalises a list of fuzzy changes. */ +Py_LOCAL_INLINE(void) fini_fuzzy_changes_list(RE_State* state, + RE_FuzzyChangesList* changes_list) { + safe_dealloc(state, changes_list->items); + changes_list->capacity = 0; + changes_list->count = 0; + changes_list->items = NULL; +} + +/* Initialises a list of lists of fuzzy changes. */ +Py_LOCAL_INLINE(void) init_best_changes_list(RE_BestChangesList* best_changes_list) { best_changes_list->capacity = 0; best_changes_list->count = 0; @@ -10454,11 +9730,14 @@ Py_LOCAL_INLINE(void) clear_best_fuzzy_changes(RE_State* state, best_changes_list->count = 0; } -/* Destroys a list of lists of fuzzy changes. */ -Py_LOCAL_INLINE(void) destroy_best_changes_list(RE_State* state, +/* Finalises a list of lists of fuzzy changes. */ +Py_LOCAL_INLINE(void) fini_best_changes_list(RE_State* state, RE_BestChangesList* best_changes_list) { clear_best_fuzzy_changes(state, best_changes_list); safe_dealloc(state, best_changes_list->lists); + best_changes_list->capacity = 0; + best_changes_list->count = 0; + best_changes_list->lists = NULL; } /* Adds a list of fuzzy changes to a list of best fuzzy changes. */ @@ -10501,20 +9780,6 @@ Py_LOCAL_INLINE(BOOL) add_best_fuzzy_changes(RE_State* state, return TRUE; } -/* Initialises a list of fuzzy changes. */ -Py_LOCAL_INLINE(void) make_changes_list(RE_State* state, RE_FuzzyChangesList* - best_changes_list) { - best_changes_list->capacity = 0; - best_changes_list->count = 0; - best_changes_list->items = NULL; -} - -/* Finitialises a list of fuzzy changes. */ -Py_LOCAL_INLINE(void) destroy_changes_list(RE_State* state, - RE_FuzzyChangesList* best_changes_list) { - safe_dealloc(state, best_changes_list->items); -} - /* Saves a list of fuzzy changes. */ Py_LOCAL_INLINE(BOOL) save_fuzzy_changes(RE_State* state, RE_FuzzyChangesList* best_changes_list) { @@ -10612,6 +9877,13 @@ Py_LOCAL_INLINE(BOOL) fuzzy_ext_match(RE_State* state, RE_Node* fuzzy_node, return pos > state->slice_start && matches_RANGE(state->encoding, state->locale_info, test_node, state->char_at(state->text, pos - 1)) == test_node->match; + case RE_OP_SET_DIFF: + case RE_OP_SET_INTER: + case RE_OP_SET_SYM_DIFF: + case RE_OP_SET_UNION: + return pos < state->slice_end && matches_SET(state->encoding, + state->locale_info, test_node, state->char_at(state->text, pos)) == + test_node->match; } return TRUE; @@ -10703,6 +9975,14 @@ Py_LOCAL_INLINE(BOOL) fuzzy_ext_match_group_fld(RE_State* state, RE_Node* matches_RANGE(state->encoding, state->locale_info, test_node, folded_char_at(state, state->text_pos - 1, folded_pos - 1)) == test_node->match; + case RE_OP_SET_DIFF: + case RE_OP_SET_INTER: + case RE_OP_SET_SYM_DIFF: + case RE_OP_SET_UNION: + return state->text_pos < state->slice_end && + matches_SET(state->encoding, state->locale_info, test_node, + folded_char_at(state, state->text_pos, folded_pos)) == + test_node->match; } return TRUE; @@ -10713,58 +9993,60 @@ Py_LOCAL_INLINE(int) next_fuzzy_match_item(RE_State* state, RE_FuzzyData* data, BOOL is_string, RE_INT8 step) { Py_ssize_t new_pos; - if (this_error_permitted(state, data->fuzzy_type)) { - switch (data->fuzzy_type) { - case RE_FUZZY_DEL: - /* Could a character at text_pos have been deleted? */ - if (step == 0) - return RE_ERROR_FAILURE; + if (!this_error_permitted(state, data->fuzzy_type)) + return RE_ERROR_FAILURE; - if (is_string) - data->new_string_pos += step; - else - data->new_node = data->new_node->next_1.node; - return RE_ERROR_SUCCESS; - case RE_FUZZY_INS: - /* Could the character at text_pos have been inserted? */ - if (!data->permit_insertion) + switch (data->fuzzy_type) { + case RE_FUZZY_DEL: + /* Could a character at text_pos have been deleted? */ + if (step == 0) + return RE_ERROR_FAILURE; + + if (is_string) + data->new_string_pos += step; + else + data->new_node = data->new_node->next_1.node; + return RE_ERROR_SUCCESS; + case RE_FUZZY_INS: + /* Could the character at text_pos have been inserted? */ + if (!data->permit_insertion) + return RE_ERROR_FAILURE; + + if (step == 0) + new_pos = data->new_text_pos + data->step; + else + new_pos = data->new_text_pos + step; + + if (state->slice_start <= new_pos && new_pos <= state->slice_end) { + if (!fuzzy_ext_match(state, state->fuzzy_node, data->new_text_pos)) return RE_ERROR_FAILURE; - if (step == 0) - new_pos = data->new_text_pos + data->step; - else - new_pos = data->new_text_pos + step; - if (state->slice_start <= new_pos && new_pos <= state->slice_end) { - if (!fuzzy_ext_match(state, state->fuzzy_node, - data->new_text_pos)) - return RE_ERROR_FAILURE; + data->new_text_pos = new_pos; + return RE_ERROR_SUCCESS; + } - data->new_text_pos = new_pos; - return RE_ERROR_SUCCESS; - } + return check_fuzzy_partial(state, new_pos); + case RE_FUZZY_SUB: + /* Could the character at text_pos have been substituted? */ + if (step == 0) + return RE_ERROR_FAILURE; - return check_fuzzy_partial(state, new_pos); - case RE_FUZZY_SUB: - /* Could the character at text_pos have been substituted? */ - if (step == 0) + new_pos = data->new_text_pos + step; + if (state->slice_start <= new_pos && new_pos <= state->slice_end) { + if (!fuzzy_ext_match(state, state->fuzzy_node, data->new_text_pos)) return RE_ERROR_FAILURE; - new_pos = data->new_text_pos + step; - if (state->slice_start <= new_pos && new_pos <= state->slice_end) { - if (!fuzzy_ext_match(state, state->fuzzy_node, - data->new_text_pos)) - return RE_ERROR_FAILURE; + data->new_text_pos = new_pos; - data->new_text_pos = new_pos; - if (is_string) - data->new_string_pos += step; - else - data->new_node = data->new_node->next_1.node; - return RE_ERROR_SUCCESS; - } + if (is_string) + data->new_string_pos += step; + else + data->new_node = data->new_node->next_1.node; - return check_fuzzy_partial(state, new_pos); + return RE_ERROR_SUCCESS; } + + return check_fuzzy_partial(state, new_pos); } return RE_ERROR_FAILURE; @@ -10775,11 +10057,14 @@ Py_LOCAL_INLINE(int) fuzzy_match_item(RE_State* state, BOOL search, Py_ssize_t* text_pos, RE_Node** node, RE_INT8 step) { size_t* fuzzy_counts; RE_FuzzyData data; + TRACE(("<<fuzzy_match_item>>\n")) fuzzy_counts = state->fuzzy_counts; - if (!any_error_permitted(state)) + if (!any_error_permitted(state)) { + TRACE((" return RE_ERROR_FAILURE\n")) return RE_ERROR_FAILURE; + } data.new_text_pos = *text_pos; data.new_node = *node; @@ -10813,6 +10098,7 @@ Py_LOCAL_INLINE(int) fuzzy_match_item(RE_State* state, BOOL search, Py_ssize_t* goto found; } + TRACE((" return RE_ERROR_FAILURE\n")) return RE_ERROR_FAILURE; found: @@ -10829,7 +10115,8 @@ found: /* bstack: node step text_pos fuzzy_type op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -10838,6 +10125,9 @@ found: *text_pos = data.new_text_pos; *node = data.new_node; + TRACE((" fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0], + fuzzy_counts[1], fuzzy_counts[2])) + TRACE((" return RE_ERROR_SUCCESS\n")) return RE_ERROR_SUCCESS; } @@ -10849,6 +10139,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_item(RE_State* state, RE_UINT8 op, BOOL RE_FuzzyData data; RE_INT8 step; RE_Node* curr_node; + TRACE(("<<retry_fuzzy_match_item>>\n")) fuzzy_counts = state->fuzzy_counts; @@ -10894,6 +10185,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_item(RE_State* state, RE_UINT8 op, BOOL goto found; } + TRACE((" return RE_ERROR_FAILURE\n")) return RE_ERROR_FAILURE; found: @@ -10910,7 +10202,8 @@ found: /* bstack: node step text_pos fuzzy_type op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -10919,6 +10212,9 @@ found: *text_pos = data.new_text_pos; *node = data.new_node; + TRACE((" fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0], + fuzzy_counts[1], fuzzy_counts[2])) + TRACE((" return RE_ERROR_SUCCESS\n")) return RE_ERROR_SUCCESS; } @@ -11015,11 +10311,14 @@ Py_LOCAL_INLINE(int) fuzzy_match_string(RE_State* state, BOOL search, Py_ssize_t* text_pos, RE_Node* node, Py_ssize_t* string_pos, RE_INT8 step) { size_t* fuzzy_counts; RE_FuzzyData data; + TRACE(("<<fuzzy_match_string>>\n")) fuzzy_counts = state->fuzzy_counts; - if (!any_error_permitted(state)) + if (!any_error_permitted(state)) { + TRACE((" return RE_ERROR_FAILURE\n")) return RE_ERROR_FAILURE; + } data.new_text_pos = *text_pos; data.new_string_pos = *string_pos; @@ -11043,6 +10342,7 @@ Py_LOCAL_INLINE(int) fuzzy_match_string(RE_State* state, BOOL search, goto found; } + TRACE((" return RE_ERROR_FAILURE\n")) return RE_ERROR_FAILURE; found: @@ -11061,7 +10361,8 @@ found: /* bstack: node step string_pos text_pos fuzzy_type op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -11070,6 +10371,9 @@ found: *text_pos = data.new_text_pos; *string_pos = data.new_string_pos; + TRACE((" fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0], + fuzzy_counts[1], fuzzy_counts[2])) + TRACE((" return RE_ERROR_SUCCESS\n")) return RE_ERROR_SUCCESS; } @@ -11081,6 +10385,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_string(RE_State* state, RE_UINT8 op, Py_ssize_t curr_text_pos; Py_ssize_t curr_string_pos; RE_Node* new_node; + TRACE(("<<retry_fuzzy_match_string>>\n")) fuzzy_counts = state->fuzzy_counts; @@ -11122,6 +10427,7 @@ Py_LOCAL_INLINE(int) retry_fuzzy_match_string(RE_State* state, RE_UINT8 op, goto found; } + TRACE((" return RE_ERROR_FAILURE\n")) return RE_ERROR_FAILURE; found: @@ -11138,7 +10444,8 @@ found: if (!push_uint8(state, &state->bstack, op)) return RE_ERROR_MEMORY; - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; /* bstack: node step string_pos text_pos fuzzy_type op */ @@ -11150,6 +10457,9 @@ found: *node = new_node; *string_pos = data.new_string_pos; + TRACE((" fuzzy_counts is (%zd, %zd, %zd)\n", fuzzy_counts[0], + fuzzy_counts[1], fuzzy_counts[2])) + TRACE((" return RE_ERROR_SUCCESS\n")) return RE_ERROR_SUCCESS; } @@ -11267,7 +10577,8 @@ found: * op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -11366,7 +10677,8 @@ found: * op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -11500,7 +10812,8 @@ found: * folded_len text_pos fuzzy_type op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -11605,7 +10918,8 @@ found: * folded_len text_pos fuzzy_type op */ - if (!record_fuzzy(state, data.fuzzy_type, data.new_text_pos - data.step)) + if (!record_fuzzy(state, data.fuzzy_type, data.fuzzy_type == RE_FUZZY_DEL ? + data.new_text_pos : data.new_text_pos - data.step)) return RE_ERROR_MEMORY; ++fuzzy_counts[data.fuzzy_type]; @@ -13056,7 +12370,7 @@ advance: /* The counts are of type size_t, so the format needs to specify * that. */ - TRACE(("min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n", + TRACE((" min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n", node->values[1], node->values[2], rp_data->count)) /* Could the body or tail match? */ @@ -13283,7 +12597,7 @@ advance: /* The counts are of type size_t, so the format needs to specify * that. */ - TRACE(("min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n", + TRACE((" min is %u, max is %u, count is %" PY_FORMAT_SIZE_T "u\n", node->values[1], node->values[2], rp_data->count)) /* Could the body or tail match? */ @@ -13705,6 +13019,11 @@ advance: rp_data->capture_change = state->capture_change; /* Could the body or tail match? */ +#if defined(VERBOSE) + printf(" is_repeat_guarded(..., RE_STATUS_BODY) returns %d\n", + is_repeat_guarded(state, index, state->text_pos, + RE_STATUS_BODY)); +#endif try_body = node->values[2] > 0 && !is_repeat_guarded(state, index, state->text_pos, RE_STATUS_BODY); if (try_body) { @@ -15628,66 +14947,6 @@ advance: node = node->next_1.node; break; } - case RE_OP_STRING_SET: /* Member of a string set. */ - TRACE(("%s\n", re_op_text[node->op])) - - status = string_set_match_fwdrev(state, node, FALSE); - if (status < 0) - return status; - if (status == 0) - goto backtrack; - node = node->next_1.node; - break; - case RE_OP_STRING_SET_FLD: /* Member of a string set, ignoring case. */ - TRACE(("%s\n", re_op_text[node->op])) - - status = string_set_match_fld_fwdrev(state, node, FALSE); - if (status < 0) - return status; - if (status == 0) - goto backtrack; - node = node->next_1.node; - break; - case RE_OP_STRING_SET_FLD_REV: /* Member of a string set, ignoring case. */ - TRACE(("%s\n", re_op_text[node->op])) - - status = string_set_match_fld_fwdrev(state, node, TRUE); - if (status < 0) - return status; - if (status == 0) - goto backtrack; - node = node->next_1.node; - break; - case RE_OP_STRING_SET_IGN: /* Member of a string set, ignoring case. */ - TRACE(("%s\n", re_op_text[node->op])) - - status = string_set_match_ign_fwdrev(state, node, FALSE); - if (status < 0) - return status; - if (status == 0) - goto backtrack; - node = node->next_1.node; - break; - case RE_OP_STRING_SET_IGN_REV: /* Member of a string set, ignoring case. */ - TRACE(("%s\n", re_op_text[node->op])) - - status = string_set_match_ign_fwdrev(state, node, TRUE); - if (status < 0) - return status; - if (status == 0) - goto backtrack; - node = node->next_1.node; - break; - case RE_OP_STRING_SET_REV: /* Member of a string set. */ - TRACE(("%s\n", re_op_text[node->op])) - - status = string_set_match_fwdrev(state, node, TRUE); - if (status < 0) - return status; - if (status == 0) - goto backtrack; - node = node->next_1.node; - break; case RE_OP_SUCCESS: /* Success. */ /* Must the match advance past its start? */ TRACE(("%s\n", re_op_text[node->op])) @@ -18013,8 +17272,17 @@ Py_LOCAL_INLINE(void) restore_fuzzy_counts(RE_State* state, size_t* Py_MEMCPY(state->fuzzy_counts, fuzzy_counts, sizeof(state->fuzzy_counts)); } -/* Makes the list of best matches found so far. */ -Py_LOCAL_INLINE(void) make_best_list(RE_BestList* best_list) { +/* Initialises the list of best matches found so far. */ +Py_LOCAL_INLINE(void) init_best_list(RE_BestList* best_list) { + best_list->capacity = 0; + best_list->count = 0; + best_list->entries = NULL; +} + +/* Finalises the list of best matches found so far. */ +Py_LOCAL_INLINE(void) fini_best_list(RE_State* state, RE_BestList* + best_list) { + safe_dealloc(state, best_list->entries); best_list->capacity = 0; best_list->count = 0; best_list->entries = NULL; @@ -18055,13 +17323,6 @@ Py_LOCAL_INLINE(BOOL) add_to_best_list(RE_State* state, RE_BestList* best_list, return TRUE; } -/* Destroy the list of best matches found so far. */ -Py_LOCAL_INLINE(void) destroy_best_list(RE_State* state, RE_BestList* - best_list) { - if (best_list->entries) - safe_dealloc(state, best_list->entries); -} - /* Performs a match or search from the current text position for a best fuzzy * match. */ @@ -18095,8 +17356,8 @@ Py_LOCAL_INLINE(int) do_best_fuzzy_match(RE_State* state, BOOL search) { must_advance = state->must_advance; found_match = FALSE; - make_best_list(&best_list); - make_best_changes_list(&best_changes_list); + init_best_list(&best_list); + init_best_changes_list(&best_changes_list); /* Search the text for the best match. */ start_pos = state->text_pos; @@ -18189,7 +17450,7 @@ Py_LOCAL_INLINE(int) do_best_fuzzy_match(RE_State* state, BOOL search) { error_limit = RE_MAX_ERRORS; best_groups = NULL; - make_fuzzy_changes_list(&best_fuzzy_changes); + init_fuzzy_changes_list(&best_fuzzy_changes); /* Look again at the best of the matches that we've seen. */ for (i = 0; i < best_list.count; i++) { @@ -18310,27 +17571,29 @@ Py_LOCAL_INLINE(int) do_best_fuzzy_match(RE_State* state, BOOL search) { state->text_pos = entry->match_pos; init_match(state); status = basic_match(state, search); + + list = &best_changes_list.lists[0]; + state->fuzzy_changes.count = list->count; + Py_MEMCPY(state->fuzzy_changes.items, list->items, + (size_t)list->count * sizeof(RE_FuzzyChange)); } + fini_fuzzy_changes_list(state, &best_fuzzy_changes); + state->slice_start = slice_start; state->slice_end = slice_end; - - list = &best_changes_list.lists[0]; - state->fuzzy_changes.count = list->count; - Py_MEMCPY(state->fuzzy_changes.items, list->items, - (size_t)list->count * sizeof(RE_FuzzyChange)); } else state->fuzzy_changes.count = 0; } - destroy_best_list(state, &best_list); - destroy_best_changes_list(state, &best_changes_list); + fini_best_list(state, &best_list); + fini_best_changes_list(state, &best_changes_list); return status; error: - destroy_best_list(state, &best_list); - destroy_best_changes_list(state, &best_changes_list); + fini_best_list(state, &best_list); + fini_best_changes_list(state, &best_changes_list); return RE_ERROR_MEMORY; } @@ -18354,7 +17617,7 @@ Py_LOCAL_INLINE(int) do_enhanced_fuzzy_match(RE_State* state, BOOL search) { pattern = state->pattern; - make_changes_list(state, &best_fuzzy_changes); + init_fuzzy_changes_list(&best_fuzzy_changes); if (state->reverse) available = state->text_pos - state->slice_start; @@ -18490,12 +17753,12 @@ Py_LOCAL_INLINE(int) do_enhanced_fuzzy_match(RE_State* state, BOOL search) { restore_fuzzy_changes(state, &best_fuzzy_changes); } - destroy_changes_list(state, &best_fuzzy_changes); + fini_fuzzy_changes_list(state, &best_fuzzy_changes); return status; error: - destroy_changes_list(state, &best_fuzzy_changes); + fini_fuzzy_changes_list(state, &best_fuzzy_changes); return status; } @@ -18702,18 +17965,12 @@ Py_LOCAL_INLINE(BOOL) get_string(PyObject* string, RE_StringInfo* str_info) { */ if (PyUnicode_Check(string)) { /* Unicode strings don't always support the buffer interface. */ -#if PY_VERSION_HEX >= 0x03030000 if (PyUnicode_READY(string) == -1) return FALSE; str_info->characters = (void*)PyUnicode_DATA(string); str_info->length = PyUnicode_GET_LENGTH(string); str_info->charsize = PyUnicode_KIND(string); -#else - str_info->characters = (void*)PyUnicode_AS_DATA(string); - str_info->length = PyUnicode_GET_SIZE(string); - str_info->charsize = sizeof(Py_UNICODE); -#endif str_info->is_unicode = TRUE; str_info->should_release = FALSE; return TRUE; @@ -19196,7 +18453,7 @@ Py_LOCAL_INLINE(Py_ssize_t) as_string_index(PyObject* obj, Py_ssize_t def) { return value; set_error(RE_ERROR_INDEX, NULL); - return 0; + return -1; } /* Deallocates a MatchObject. */ @@ -19253,21 +18510,12 @@ Py_LOCAL_INLINE(Py_ssize_t) limited_range(Py_ssize_t value, Py_ssize_t lower, Py_LOCAL_INLINE(PyObject*) unicode_slice(PyObject* string, Py_ssize_t start, Py_ssize_t end) { Py_ssize_t length; -#if PY_VERSION_HEX < 0x03030000 - Py_UNICODE* buffer; -#endif - length = PyUnicode_GET_SIZE(string); + length = PyUnicode_GET_LENGTH(string); start = limited_range(start, 0, length); end = limited_range(end, 0, length); -#if PY_VERSION_HEX >= 0x03030000 return PyUnicode_Substring(string, start, end); -#else - buffer = PyUnicode_AsUnicode(string); - - return PyUnicode_FromUnicode(buffer + start, end - start); -#endif } /* Gets a slice from a bytestring. */ @@ -20173,7 +19421,7 @@ Py_LOCAL_INLINE(PyObject*) join_list_info(RE_JoinInfo* join_info) { if (join_info->is_unicode) { /* Concatenate the Unicode strings. */ - joiner = PyUnicode_FromUnicode(NULL, 0); + joiner = PyUnicode_New(0, 0); if (!joiner) { clear_join_list(join_info); return NULL; @@ -20203,7 +19451,7 @@ Py_LOCAL_INLINE(PyObject*) join_list_info(RE_JoinInfo* join_info) { /* There are no items, so return an empty string. */ if (join_info->is_unicode) - return PyUnicode_FromUnicode(NULL, 0); + return PyUnicode_New(0, 0); else return PyBytes_FromString(""); } @@ -20507,14 +19755,8 @@ Py_LOCAL_INLINE(PyObject*) match_get_group_slice(MatchObject* self, PyObject* Py_ssize_t step; Py_ssize_t slice_length; -#if PY_VERSION_HEX >= 0x03020000 if (PySlice_GetIndicesEx(slice, (Py_ssize_t)self->group_count + 1, &start, &end, &step, &slice_length) < 0) -#else - if (PySlice_GetIndicesEx((PySliceObject*)slice, - (Py_ssize_t)self->group_count + 1, &start, &end, &step, &slice_length) < - 0) -#endif return NULL; if (slice_length <= 0) @@ -20759,6 +20001,8 @@ static PyObject* match_lastgroup(PyObject* self_) { PyObject* result; index = Py_BuildValue("n", self->lastgroup); + if (!index) + return NULL; /* PyDict_GetItem returns borrows a reference. */ result = PyDict_GetItem(self->pattern->indexgroup, index); @@ -21718,19 +20962,11 @@ Py_LOCAL_INLINE(Py_ssize_t) index_to_integer(PyObject* item) { /* Is the index a string representation of an integer? */ if (PyUnicode_Check(item)) { PyObject* int_obj; -#if PY_VERSION_HEX < 0x03030000 - Py_UNICODE* characters; - Py_ssize_t length; -#endif #if defined(PYPY_VERSION) && PY_VERSION_HEX < 0x05090000 int_obj = integer_from_unicode(item); -#elif PY_VERSION_HEX >= 0x03030000 - int_obj = PyLong_FromUnicodeObject(item, 0); #else - characters = (Py_UNICODE*)PyUnicode_AS_DATA(item); - length = PyUnicode_GET_SIZE(item); - int_obj = PyLong_FromUnicode(characters, length, 0); + int_obj = PyLong_FromUnicodeObject(item, 0); #endif if (!int_obj) goto error; @@ -25525,12 +24761,6 @@ Py_LOCAL_INLINE(BOOL) section_contains_repeat(RE_CODE** code, RE_CODE* case RE_OP_RANGE_IGN: case RE_OP_RANGE_IGN_REV: case RE_OP_RANGE_REV: - case RE_OP_STRING_SET: - case RE_OP_STRING_SET_FLD: - case RE_OP_STRING_SET_FLD_REV: - case RE_OP_STRING_SET_IGN: - case RE_OP_STRING_SET_IGN_REV: - case RE_OP_STRING_SET_REV: /* codes: opcode, value, value, value. */ *code += 4; break; @@ -25905,37 +25135,6 @@ Py_LOCAL_INLINE(int) build_SET(RE_CompileArgs* args) { return RE_ERROR_SUCCESS; } -/* Builds a STRING_SET node. */ -Py_LOCAL_INLINE(int) build_STRING_SET(RE_CompileArgs* args) { - RE_CODE index; - RE_CODE min_len; - RE_CODE max_len; - RE_Node* node; - - /* codes: opcode, index, min_len, max_len. */ - if (args->code + 3 > args->end_code) - return RE_ERROR_ILLEGAL; - - index = args->code[1]; - min_len = args->code[2]; - max_len = args->code[3]; - node = create_node(args->pattern, (RE_UINT8)args->code[0], 0, 0, 3); - if (!node) - return RE_ERROR_MEMORY; - - node->values[0] = index; - node->values[1] = min_len; - node->values[2] = max_len; - - args->code += 4; - - /* Append the reference. */ - add_node(args->end, node); - args->end = node; - - return RE_ERROR_SUCCESS; -} - /* Builds a SUCCESS node . */ Py_LOCAL_INLINE(int) build_SUCCESS(RE_CompileArgs* args) { RE_Node* node; @@ -26245,17 +25444,6 @@ Py_LOCAL_INLINE(int) build_sequence(RE_CompileArgs* args) { if (!build_STRING(args, FALSE)) return FALSE; break; - case RE_OP_STRING_SET: - case RE_OP_STRING_SET_FLD: - case RE_OP_STRING_SET_FLD_REV: - case RE_OP_STRING_SET_IGN: - case RE_OP_STRING_SET_IGN_REV: - case RE_OP_STRING_SET_REV: - /* A reference to a list. */ - status = build_STRING_SET(args); - if (status != RE_ERROR_SUCCESS) - return status; - break; default: /* We've found an opcode which we don't recognise. We'll leave it * for the caller. @@ -26757,7 +25945,6 @@ static PyObject* fold_case(PyObject* self_, PyObject* args) { else encoding = &unicode_encoding; -#if PY_VERSION_HEX >= 0x03030000 /* Initially assume that the folded string will have the same width as the * original string (usually true). */ @@ -26768,10 +25955,6 @@ static PyObject* fold_case(PyObject* self_, PyObject* args) { */ if (encoding == &unicode_encoding && str_info.charsize == 1) folded_charsize = 2; -#else - /* The folded string will have the same width as the original string. */ - folded_charsize = str_info.charsize; -#endif /* Get the function for writing to the folded string. */ switch (folded_charsize) { @@ -26875,11 +26058,7 @@ static PyObject* get_expand_on_folding(PyObject* self, PyObject* unused) { return NULL; for (i = 0; i < count; i++) { -#if PY_VERSION_HEX >= 0x03030000 Py_UCS4 codepoint; -#else - Py_UNICODE codepoint; -#endif PyObject* item; codepoint = re_expand_on_folding[i]; @@ -27201,5 +26380,3 @@ PyMODINIT_FUNC PyInit__regex(void) { return m; } - -/* vim:ts=4:sw=4:et */ diff --git a/regex_3/_regex.h b/regex_3/_regex.h index f2b7d67..4c7f5fb 100644 --- a/regex_3/_regex.h +++ b/regex_3/_regex.h @@ -98,29 +98,23 @@ #define RE_OP_STRING_IGN 77 #define RE_OP_STRING_IGN_REV 78 #define RE_OP_STRING_REV 79 -#define RE_OP_STRING_SET 80 -#define RE_OP_STRING_SET_FLD 81 -#define RE_OP_STRING_SET_FLD_REV 82 -#define RE_OP_STRING_SET_IGN 83 -#define RE_OP_STRING_SET_IGN_REV 84 -#define RE_OP_STRING_SET_REV 85 -#define RE_OP_FUZZY_EXT 86 -#define RE_OP_BODY_END 87 -#define RE_OP_BODY_START 88 -#define RE_OP_END_ATOMIC 89 -#define RE_OP_END_CONDITIONAL 90 -#define RE_OP_END_FUZZY 91 -#define RE_OP_END_GREEDY_REPEAT 92 -#define RE_OP_END_GROUP 93 -#define RE_OP_END_LAZY_REPEAT 94 -#define RE_OP_END_LOOKAROUND 95 -#define RE_OP_FUZZY_INSERT 96 -#define RE_OP_GREEDY_REPEAT_ONE 97 -#define RE_OP_GROUP_RETURN 98 -#define RE_OP_LAZY_REPEAT_ONE 99 -#define RE_OP_MATCH_BODY 100 -#define RE_OP_MATCH_TAIL 101 -#define RE_OP_START_GROUP 102 +#define RE_OP_FUZZY_EXT 80 +#define RE_OP_BODY_END 81 +#define RE_OP_BODY_START 82 +#define RE_OP_END_ATOMIC 83 +#define RE_OP_END_CONDITIONAL 84 +#define RE_OP_END_FUZZY 85 +#define RE_OP_END_GREEDY_REPEAT 86 +#define RE_OP_END_GROUP 87 +#define RE_OP_END_LAZY_REPEAT 88 +#define RE_OP_END_LOOKAROUND 89 +#define RE_OP_FUZZY_INSERT 90 +#define RE_OP_GREEDY_REPEAT_ONE 91 +#define RE_OP_GROUP_RETURN 92 +#define RE_OP_LAZY_REPEAT_ONE 93 +#define RE_OP_MATCH_BODY 94 +#define RE_OP_MATCH_TAIL 95 +#define RE_OP_START_GROUP 96 char* re_op_text[] = { "RE_OP_FAILURE", @@ -203,12 +197,6 @@ char* re_op_text[] = { "RE_OP_STRING_IGN", "RE_OP_STRING_IGN_REV", "RE_OP_STRING_REV", - "RE_OP_STRING_SET", - "RE_OP_STRING_SET_FLD", - "RE_OP_STRING_SET_FLD_REV", - "RE_OP_STRING_SET_IGN", - "RE_OP_STRING_SET_IGN_REV", - "RE_OP_STRING_SET_REV", "RE_OP_FUZZY_EXT", "RE_OP_BODY_END", "RE_OP_BODY_START", diff --git a/regex_3/regex/_regex_core.py b/regex_3/_regex_core.py similarity index 98% rename from regex_3/regex/_regex_core.py rename to regex_3/_regex_core.py index ab27a7f..19d9d4a 100644 --- a/regex_3/regex/_regex_core.py +++ b/regex_3/_regex_core.py @@ -220,12 +220,6 @@ STRING_FLD_REV STRING_IGN STRING_IGN_REV STRING_REV -STRING_SET -STRING_SET_FLD -STRING_SET_FLD_REV -STRING_SET_IGN -STRING_SET_IGN_REV -STRING_SET_REV FUZZY_EXT """ @@ -2015,6 +2009,9 @@ class Branch(RegexBase): b.fix_groups(pattern, reverse, fuzzy) def optimise(self, info, reverse): + if not self.branches: + return Sequence([]) + # Flatten branches within branches. branches = Branch._flatten_branches(info, reverse, self.branches) @@ -2434,6 +2431,9 @@ class CallGroup(RegexBase): def max_width(self): return UNLIMITED + def __del__(self): + self.info = None + class CallRef(RegexBase): def __init__(self, ref, parsed): self.ref = ref @@ -2603,6 +2603,9 @@ class Conditional(RegexBase): def max_width(self): return max(self.yes_item.max_width(), self.no_item.max_width()) + def __del__(self): + self.info = None + class DefaultBoundary(ZeroWidthBase): _opcode = OP.DEFAULT_BOUNDARY _op_name = "DEFAULT_BOUNDARY" @@ -2997,6 +3000,9 @@ class Group(RegexBase): def get_required_string(self, reverse): return self.subpattern.get_required_string(reverse) + def __del__(self): + self.info = None + class Keep(ZeroWidthBase): _opcode = OP.KEEP _op_name = "KEEP" @@ -3346,6 +3352,9 @@ class RefGroup(RegexBase): def max_width(self): return UNLIMITED + def __del__(self): + self.info = None + class SearchAnchor(ZeroWidthBase): _opcode = OP.SEARCH_ANCHOR _op_name = "SEARCH_ANCHOR" @@ -3665,6 +3674,9 @@ class SetBase(RegexBase): return max(len(folded) for folded in seen) + def __del__(self): + self.info = None + class SetDiff(SetBase): _opcode = {(NOCASE, False): OP.SET_DIFF, (IGNORECASE, False): OP.SET_DIFF_IGN, (FULLCASE, False): OP.SET_DIFF, (FULLIGNORECASE, False): @@ -3902,13 +3914,7 @@ class Literal(String): print("{}LITERAL MATCH {}{}".format(INDENT * indent, display, CASE_TEXT[self.case_flags])) -class StringSet(RegexBase): - _opcode = {(NOCASE, False): OP.STRING_SET, (IGNORECASE, False): - OP.STRING_SET_IGN, (FULLCASE, False): OP.STRING_SET, (FULLIGNORECASE, - False): OP.STRING_SET_FLD, (NOCASE, True): OP.STRING_SET_REV, - (IGNORECASE, True): OP.STRING_SET_IGN_REV, (FULLCASE, True): - OP.STRING_SET_REV, (FULLIGNORECASE, True): OP.STRING_SET_FLD_REV} - +class StringSet(Branch): def __init__(self, info, name, case_flags=NOCASE): self.info = info self.name = name @@ -3920,84 +3926,34 @@ class StringSet(RegexBase): if self.set_key not in info.named_lists_used: info.named_lists_used[self.set_key] = len(info.named_lists_used) - def _compile(self, reverse, fuzzy): index = self.info.named_lists_used[self.set_key] items = self.info.kwargs[self.name] case_flags = self.case_flags - if not items: - return [] - encoding = self.info.flags & _ALL_ENCODINGS fold_flags = encoding | case_flags - if fuzzy: - choices = [self._folded(fold_flags, i) for i in items] + choices = [] - # Sort from longest to shortest. - choices.sort(key=lambda s: (-len(s), s)) + for string in items: + if isinstance(string, str): + string = [ord(c) for c in string] - branches = [] - for string in choices: - branches.append(Sequence([Character(c, case_flags=case_flags) - for c in string])) + choices.append([Character(c, case_flags=case_flags) for c in + string]) - if len(branches) > 1: - branch = Branch(branches) - else: - branch = branches[0] - branch = branch.optimise(self.info, - reverse).pack_characters(self.info) + # Sort from longest to shortest. + choices.sort(key=len, reverse=True) - return branch.compile(reverse, fuzzy) - else: - min_len = min(len(i) for i in items) - max_len = max(len(self._folded(fold_flags, i)) for i in items) - return [(self._opcode[case_flags, reverse], index, min_len, - max_len)] + self.branches = [Sequence(choice) for choice in choices] def dump(self, indent, reverse): print("{}STRING_SET {}{}".format(INDENT * indent, self.name, CASE_TEXT[self.case_flags])) - def _folded(self, fold_flags, item): - if isinstance(item, str): - return [ord(c) for c in _regex.fold_case(fold_flags, item)] - else: - return list(item) - - def _flatten(self, s): - # Flattens the branches. - if isinstance(s, Branch): - for b in s.branches: - self._flatten(b) - elif isinstance(s, Sequence) and s.items: - seq = s.items - - while isinstance(seq[-1], Sequence): - seq[-1 : ] = seq[-1].items - - n = 0 - while n < len(seq) and isinstance(seq[n], Character): - n += 1 - - if n > 1: - seq[ : n] = [String([c.value for c in seq[ : n]], - case_flags=self.case_flags)] - - self._flatten(seq[-1]) - - def max_width(self): - if not self.info.kwargs[self.name]: - return 0 - - if self.case_flags & IGNORECASE: - fold_flags = (self.info.flags & _ALL_ENCODINGS) | self.case_flags - return max(len(_regex.fold_case(fold_flags, i)) for i in - self.info.kwargs[self.name]) - else: - return max(len(i) for i in self.info.kwargs[self.name]) + def __del__(self): + self.info = None class Source: "Scanner for the regular expression source string." @@ -4471,6 +4427,7 @@ CHARACTER_ESCAPES = { CHARSET_ESCAPES = { "d": lookup_property(None, "Digit", True), "D": lookup_property(None, "Digit", False), + "h": lookup_property(None, "Blank", True), "s": lookup_property(None, "Space", True), "S": lookup_property(None, "Space", False), "w": lookup_property(None, "Word", True), diff --git a/regex_3/_regex_unicode.c b/regex_3/_regex_unicode.c index eff2643..aec7fe7 100644 --- a/regex_3/_regex_unicode.c +++ b/regex_3/_regex_unicode.c @@ -1,4 +1,4 @@ -/* For Unicode version 12.1.0 */ +/* For Unicode version 13.0.0 */ #include "_regex_unicode.h" @@ -6,21 +6,20 @@ #define RE_GRAPH_MASK ((1 << RE_PROP_CC) | (1 << RE_PROP_CS) | (1 << RE_PROP_CN)) #define RE_WORD_MASK (RE_PROP_M_MASK | (1 << RE_PROP_ND) | (1 << RE_PROP_PC)) -typedef struct RE_ScriptExt { +typedef struct { RE_UINT8 scripts[RE_MAX_SCX]; } RE_ScriptExt; -typedef struct RE_AllCases { - RE_INT32 diffs[RE_MAX_CASES - 1]; +typedef struct { + RE_UINT32 delta; + RE_UINT16 others[RE_MAX_CASES - 1]; } RE_AllCases; -typedef struct RE_FullCaseFolding { - RE_INT32 diff; - RE_UINT16 codepoints[RE_MAX_FOLDED - 1]; +typedef struct { + RE_UINT16 data[RE_MAX_FOLDED]; } RE_FullCaseFolding; -/* strings. */ - +/* Strings. */ char* re_strings[] = { "-1/2", "0", @@ -393,6 +392,8 @@ char* re_strings[] = { "CHEROKEESUP", "CHEROKEESUPPLEMENT", "CHESSSYMBOLS", + "CHORASMIAN", + "CHRS", "CI", "CIRCLE", "CJ", @@ -411,6 +412,7 @@ char* re_strings[] = { "CJKEXTD", "CJKEXTE", "CJKEXTF", + "CJKEXTG", "CJKRADICALSSUP", "CJKRADICALSSUPPLEMENT", "CJKSTROKES", @@ -423,6 +425,7 @@ char* re_strings[] = { "CJKUNIFIEDIDEOGRAPHSEXTENSIOND", "CJKUNIFIEDIDEOGRAPHSEXTENSIONE", "CJKUNIFIEDIDEOGRAPHSEXTENSIONF", + "CJKUNIFIEDIDEOGRAPHSEXTENSIONG", "CL", "CLOSE", "CLOSEPARENTHESIS", @@ -521,8 +524,10 @@ char* re_strings[] = { "DIACRITICALSEXT", "DIACRITICALSFORSYMBOLS", "DIACRITICALSSUP", + "DIAK", "DIGIT", "DINGBATS", + "DIVESAKURU", "DOGR", "DOGRA", "DOMINO", @@ -544,6 +549,7 @@ char* re_strings[] = { "EBASE", "EBASEGAZ", "EBG", + "ECOMP", "EGYP", "EGYPTIANHIEROGLYPHFORMATCONTROLS", "EGYPTIANHIEROGLYPHS", @@ -552,6 +558,7 @@ char* re_strings[] = { "ELYM", "ELYMAIC", "EM", + "EMOD", "EMODIFIER", "EMOJI", "EMOJICOMPONENT", @@ -570,6 +577,7 @@ char* re_strings[] = { "ENCLOSEDIDEOGRAPHICSUP", "ENCLOSEDIDEOGRAPHICSUPPLEMENT", "ENCLOSINGMARK", + "EPRES", "ES", "ET", "ETHI", @@ -590,6 +598,7 @@ char* re_strings[] = { "EXTENDEDPICTOGRAPHIC", "EXTENDER", "EXTENDNUMLET", + "EXTPICT", "F", "FALSE", "FARSIYEH", @@ -678,6 +687,8 @@ char* re_strings[] = { "HANIFIROHINGYAKINNAYA", "HANIFIROHINGYAPA", "HANO", + "HANR", + "HANREADING", "HANUNOO", "HATR", "HATRAN", @@ -781,12 +792,14 @@ char* re_strings[] = { "KHAPH", "KHAR", "KHAROSHTHI", + "KHITANSMALLSCRIPT", "KHMER", "KHMERSYMBOLS", "KHMR", "KHOJ", "KHOJKI", "KHUDAWADI", + "KITS", "KNDA", "KNOTTEDHEH", "KTHI", @@ -844,6 +857,8 @@ char* re_strings[] = { "LINEFEED", "LINESEPARATOR", "LISU", + "LISUSUP", + "LISUSUPPLEMENT", "LL", "LM", "LO", @@ -1299,6 +1314,7 @@ char* re_strings[] = { "SYMBOL", "SYMBOLSANDPICTOGRAPHSEXTA", "SYMBOLSANDPICTOGRAPHSEXTENDEDA", + "SYMBOLSFORLEGACYCOMPUTING", "SYRC", "SYRIAC", "SYRIACSUP", @@ -1326,6 +1342,8 @@ char* re_strings[] = { "TANG", "TANGUT", "TANGUTCOMPONENTS", + "TANGUTSUP", + "TANGUTSUPPLEMENT", "TAVT", "TAW", "TEHMARBUTA", @@ -1350,6 +1368,7 @@ char* re_strings[] = { "TONEMARK", "TOP", "TOPANDBOTTOM", + "TOPANDBOTTOMANDLEFT", "TOPANDBOTTOMANDRIGHT", "TOPANDLEFT", "TOPANDLEFTANDRIGHT", @@ -1424,6 +1443,8 @@ char* re_strings[] = { "YEHBARREE", "YEHWITHTAIL", "YES", + "YEZI", + "YEZIDI", "YI", "YIII", "YIJING", @@ -1449,1760 +1470,1777 @@ char* re_strings[] = { "ZZZZ", }; -/* strings: 13687 bytes. */ - -/* properties. */ - +/* Properties. */ RE_Property re_properties[] = { - { 591, 0, 0}, - { 588, 0, 0}, - { 271, 1, 1}, - { 270, 1, 1}, - {1185, 2, 2}, - {1183, 2, 2}, - {1186, 3, 2}, - {1187, 3, 2}, - {1384, 4, 3}, - {1378, 4, 3}, - { 617, 5, 4}, - { 589, 5, 4}, - {1193, 6, 5}, - {1182, 6, 5}, - { 900, 7, 6}, - { 189, 8, 6}, - { 188, 8, 6}, - { 828, 9, 6}, - { 827, 9, 6}, - {1350, 10, 6}, - {1349, 10, 6}, - { 314, 11, 6}, - { 316, 12, 6}, - { 371, 12, 6}, - { 363, 13, 6}, - { 457, 13, 6}, - { 365, 14, 6}, - { 459, 14, 6}, - { 364, 15, 6}, - { 458, 15, 6}, - { 361, 16, 6}, - { 455, 16, 6}, - { 362, 17, 6}, - { 456, 17, 6}, - { 694, 18, 6}, - { 690, 18, 6}, - { 684, 19, 6}, - { 683, 19, 6}, - {1393, 20, 6}, - {1392, 20, 6}, - {1391, 21, 6}, - {1390, 21, 6}, - { 484, 22, 6}, - { 492, 22, 6}, - { 618, 23, 6}, - { 626, 23, 6}, - { 616, 24, 6}, - { 620, 24, 6}, - { 619, 25, 6}, - { 627, 25, 6}, - {1380, 26, 6}, - {1388, 26, 6}, - {1231, 26, 6}, - { 263, 27, 6}, - { 261, 27, 6}, - { 730, 28, 6}, - { 728, 28, 6}, - { 477, 29, 6}, - { 681, 30, 6}, - {1147, 31, 6}, - {1144, 31, 6}, - {1311, 32, 6}, - {1310, 32, 6}, - {1071, 33, 6}, - {1050, 33, 6}, - { 667, 34, 6}, - { 666, 34, 6}, - { 221, 35, 6}, - { 177, 35, 6}, - {1064, 36, 6}, - {1030, 36, 6}, - { 686, 37, 6}, - { 685, 37, 6}, - { 494, 38, 6}, - { 493, 38, 6}, - { 566, 39, 6}, - { 563, 39, 6}, - {1070, 40, 6}, - {1049, 40, 6}, - {1076, 41, 6}, - {1078, 41, 6}, - {1003, 42, 6}, - { 980, 42, 6}, - {1066, 43, 6}, - {1035, 43, 6}, - { 692, 44, 6}, - { 691, 44, 6}, - { 695, 45, 6}, - { 693, 45, 6}, - {1149, 46, 6}, - {1346, 47, 6}, - {1342, 47, 6}, - {1065, 48, 6}, - {1032, 48, 6}, - { 486, 49, 6}, - { 485, 49, 6}, - {1222, 50, 6}, - {1188, 50, 6}, - { 826, 51, 6}, - { 825, 51, 6}, - {1068, 52, 6}, - {1037, 52, 6}, - {1067, 53, 6}, - {1036, 53, 6}, - {1194, 54, 6}, - {1240, 54, 6}, - {1355, 55, 6}, - {1371, 55, 6}, - {1090, 56, 6}, - {1091, 56, 6}, - {1089, 57, 6}, - {1088, 57, 6}, - {1129, 58, 6}, - {1095, 58, 6}, - {1150, 59, 6}, - {1155, 59, 6}, - { 650, 60, 7}, - { 678, 60, 7}, - { 262, 61, 8}, - { 251, 61, 8}, - { 308, 62, 9}, - { 320, 62, 9}, - { 483, 63, 10}, - { 510, 63, 10}, - { 517, 64, 11}, - { 515, 64, 11}, - { 732, 65, 12}, - { 726, 65, 12}, - { 733, 66, 13}, - { 734, 66, 13}, - { 818, 67, 14}, - { 793, 67, 14}, - {1023, 68, 15}, - {1016, 68, 15}, - {1024, 69, 16}, - {1027, 69, 16}, - { 265, 70, 6}, - { 264, 70, 6}, - { 699, 71, 17}, - { 707, 71, 17}, - { 701, 72, 18}, - { 708, 72, 18}, - { 531, 73, 19}, - { 535, 74, 19}, - { 533, 75, 19}, - { 534, 76, 19}, - { 532, 77, 19}, - { 565, 78, 19}, - { 990, 79, 20}, - { 989, 79, 20}, - { 988, 80, 21}, - { 987, 80, 21}, - { 994, 81, 20}, - { 993, 81, 20}, - { 992, 82, 21}, - { 991, 82, 21}, - { 192, 83, 6}, - { 187, 83, 6}, - { 200, 84, 6}, - { 269, 85, 6}, - { 615, 86, 6}, - {1130, 87, 6}, - {1383, 88, 6}, - {1389, 89, 6}, - {1121, 90, 6}, - {1120, 91, 6}, - {1122, 92, 6}, - {1123, 93, 6}, -}; - -/* properties: 672 bytes. */ - -/* property values. */ - + { 189, 0, 0}, /* ALPHABETIC */ + { 188, 0, 0}, /* ALPHA */ + { 192, 1, 0}, /* ALPHANUMERIC */ + { 187, 1, 0}, /* ALNUM */ + { 200, 2, 0}, /* ANY */ + { 221, 3, 0}, /* ASCIIHEXDIGIT */ + { 177, 3, 0}, /* AHEX */ + { 262, 4, 1}, /* BIDICLASS */ + { 251, 4, 1}, /* BC */ + { 263, 5, 0}, /* BIDICONTROL */ + { 261, 5, 0}, /* BIDIC */ + { 265, 6, 0}, /* BIDIMIRRORED */ + { 264, 6, 0}, /* BIDIM */ + { 269, 7, 0}, /* BLANK */ + { 271, 8, 2}, /* BLOCK */ + { 270, 8, 2}, /* BLK */ + { 308, 9, 3}, /* CANONICALCOMBININGCLASS */ + { 320, 9, 3}, /* CCC */ + { 314, 10, 0}, /* CASED */ + { 316, 11, 0}, /* CASEIGNORABLE */ + { 373, 11, 0}, /* CI */ + { 361, 12, 0}, /* CHANGESWHENCASEFOLDED */ + { 459, 12, 0}, /* CWCF */ + { 362, 13, 0}, /* CHANGESWHENCASEMAPPED */ + { 460, 13, 0}, /* CWCM */ + { 363, 14, 0}, /* CHANGESWHENLOWERCASED */ + { 461, 14, 0}, /* CWL */ + { 364, 15, 0}, /* CHANGESWHENTITLECASED */ + { 462, 15, 0}, /* CWT */ + { 365, 16, 0}, /* CHANGESWHENUPPERCASED */ + { 463, 16, 0}, /* CWU */ + { 481, 17, 0}, /* DASH */ + { 487, 18, 4}, /* DECOMPOSITIONTYPE */ + { 516, 18, 4}, /* DT */ + { 488, 19, 0}, /* DEFAULTIGNORABLECODEPOINT */ + { 496, 19, 0}, /* DI */ + { 490, 20, 0}, /* DEPRECATED */ + { 489, 20, 0}, /* DEP */ + { 498, 21, 0}, /* DIACRITIC */ + { 497, 21, 0}, /* DIA */ + { 523, 22, 5}, /* EASTASIANWIDTH */ + { 521, 22, 5}, /* EA */ + { 539, 23, 0}, /* EMOJI */ + { 540, 24, 0}, /* EMOJICOMPONENT */ + { 528, 24, 0}, /* ECOMP */ + { 541, 25, 0}, /* EMOJIMODIFIER */ + { 537, 25, 0}, /* EMOD */ + { 542, 26, 0}, /* EMOJIMODIFIERBASE */ + { 525, 26, 0}, /* EBASE */ + { 543, 27, 0}, /* EMOJIPRESENTATION */ + { 556, 27, 0}, /* EPRES */ + { 574, 28, 0}, /* EXTENDEDPICTOGRAPHIC */ + { 577, 28, 0}, /* EXTPICT */ + { 575, 29, 0}, /* EXTENDER */ + { 572, 29, 0}, /* EXT */ + { 601, 30, 6}, /* GENERALCATEGORY */ + { 598, 30, 6}, /* GC */ + { 625, 31, 0}, /* GRAPH */ + { 626, 32, 0}, /* GRAPHEMEBASE */ + { 630, 32, 0}, /* GRBASE */ + { 627, 33, 7}, /* GRAPHEMECLUSTERBREAK */ + { 599, 33, 7}, /* GCB */ + { 628, 34, 0}, /* GRAPHEMEEXTEND */ + { 636, 34, 0}, /* GREXT */ + { 629, 35, 0}, /* GRAPHEMELINK */ + { 637, 35, 0}, /* GRLINK */ + { 660, 36, 8}, /* HANGULSYLLABLETYPE */ + { 690, 36, 8}, /* HST */ + { 679, 37, 0}, /* HEXDIGIT */ + { 678, 37, 0}, /* HEX */ + { 693, 38, 0}, /* HYPHEN */ + { 696, 39, 0}, /* IDCONTINUE */ + { 695, 39, 0}, /* IDC */ + { 698, 40, 0}, /* IDEOGRAPHIC */ + { 697, 40, 0}, /* IDEO */ + { 704, 41, 0}, /* IDSBINARYOPERATOR */ + { 703, 41, 0}, /* IDSB */ + { 706, 42, 0}, /* IDSTART */ + { 702, 42, 0}, /* IDS */ + { 707, 43, 0}, /* IDSTRINARYOPERATOR */ + { 705, 43, 0}, /* IDST */ + { 711, 44, 9}, /* INDICPOSITIONALCATEGORY */ + { 719, 44, 9}, /* INPC */ + { 713, 45, 10}, /* INDICSYLLABICCATEGORY */ + { 720, 45, 10}, /* INSC */ + { 742, 46, 0}, /* JOINCONTROL */ + { 740, 46, 0}, /* JOINC */ + { 744, 47, 11}, /* JOININGGROUP */ + { 738, 47, 11}, /* JG */ + { 745, 48, 12}, /* JOININGTYPE */ + { 746, 48, 12}, /* JT */ + { 832, 49, 13}, /* LINEBREAK */ + { 807, 49, 13}, /* LB */ + { 842, 50, 0}, /* LOGICALORDEREXCEPTION */ + { 841, 50, 0}, /* LOE */ + { 844, 51, 0}, /* LOWERCASE */ + { 843, 51, 0}, /* LOWER */ + { 916, 52, 0}, /* MATH */ + {1004, 53, 14}, /* NFCQUICKCHECK */ + {1003, 53, 14}, /* NFCQC */ + {1006, 54, 15}, /* NFDQUICKCHECK */ + {1005, 54, 15}, /* NFDQC */ + {1008, 55, 14}, /* NFKCQUICKCHECK */ + {1007, 55, 14}, /* NFKCQC */ + {1010, 56, 15}, /* NFKDQUICKCHECK */ + {1009, 56, 15}, /* NFKDQC */ + {1019, 57, 0}, /* NONCHARACTERCODEPOINT */ + { 996, 57, 0}, /* NCHAR */ + {1039, 58, 16}, /* NUMERICTYPE */ + {1032, 58, 16}, /* NT */ + {1040, 59, 17}, /* NUMERICVALUE */ + {1043, 59, 17}, /* NV */ + {1080, 60, 0}, /* OTHERALPHABETIC */ + {1046, 60, 0}, /* OALPHA */ + {1081, 61, 0}, /* OTHERDEFAULTIGNORABLECODEPOINT */ + {1048, 61, 0}, /* ODI */ + {1082, 62, 0}, /* OTHERGRAPHEMEEXTEND */ + {1051, 62, 0}, /* OGREXT */ + {1083, 63, 0}, /* OTHERIDCONTINUE */ + {1052, 63, 0}, /* OIDC */ + {1084, 64, 0}, /* OTHERIDSTART */ + {1053, 64, 0}, /* OIDS */ + {1086, 65, 0}, /* OTHERLOWERCASE */ + {1065, 65, 0}, /* OLOWER */ + {1087, 66, 0}, /* OTHERMATH */ + {1066, 66, 0}, /* OMATH */ + {1092, 67, 0}, /* OTHERUPPERCASE */ + {1094, 67, 0}, /* OUPPER */ + {1105, 68, 0}, /* PATTERNSYNTAX */ + {1104, 68, 0}, /* PATSYN */ + {1106, 69, 0}, /* PATTERNWHITESPACE */ + {1107, 69, 0}, /* PATWS */ + {1136, 70, 0}, /* POSIXALNUM */ + {1137, 71, 0}, /* POSIXDIGIT */ + {1138, 72, 0}, /* POSIXPUNCT */ + {1139, 73, 0}, /* POSIXXDIGIT */ + {1145, 74, 0}, /* PREPENDEDCONCATENATIONMARK */ + {1111, 74, 0}, /* PCM */ + {1146, 75, 0}, /* PRINT */ + {1163, 76, 0}, /* QUOTATIONMARK */ + {1160, 76, 0}, /* QMARK */ + {1165, 77, 0}, /* RADICAL */ + {1166, 78, 0}, /* REGIONALINDICATOR */ + {1171, 78, 0}, /* RI */ + {1201, 79, 18}, /* SCRIPT */ + {1199, 79, 18}, /* SC */ + {1202, 80, 18}, /* SCRIPTEXTENSIONS */ + {1203, 80, 18}, /* SCX */ + {1209, 81, 19}, /* SENTENCEBREAK */ + {1198, 81, 19}, /* SB */ + {1210, 82, 0}, /* SENTENCETERMINAL */ + {1256, 82, 0}, /* STERM */ + {1238, 83, 0}, /* SOFTDOTTED */ + {1204, 83, 0}, /* SD */ + {1330, 84, 0}, /* TERMINALPUNCTUATION */ + {1329, 84, 0}, /* TERM */ + {1366, 85, 0}, /* UNIFIEDIDEOGRAPH */ + {1362, 85, 0}, /* UIDEO */ + {1370, 86, 0}, /* UPPERCASE */ + {1369, 86, 0}, /* UPPER */ + {1375, 87, 0}, /* VARIATIONSELECTOR */ + {1391, 87, 0}, /* VS */ + {1400, 88, 0}, /* WHITESPACE */ + {1408, 88, 0}, /* WSPACE */ + {1247, 88, 0}, /* SPACE */ + {1403, 89, 0}, /* WORD */ + {1404, 90, 20}, /* WORDBREAK */ + {1398, 90, 20}, /* WB */ + {1409, 91, 0}, /* XDIGIT */ + {1411, 92, 0}, /* XIDCONTINUE */ + {1410, 92, 0}, /* XIDC */ + {1413, 93, 0}, /* XIDSTART */ + {1412, 93, 0}, /* XIDS */ +}; + +/* Property values. */ RE_PropertyValue re_property_values[] = { - {1343, 0, 0}, - { 406, 0, 0}, - {1351, 0, 1}, - { 835, 0, 1}, - { 829, 0, 2}, - { 822, 0, 2}, - {1323, 0, 3}, - { 834, 0, 3}, - { 946, 0, 4}, - { 823, 0, 4}, - {1069, 0, 5}, - { 824, 0, 5}, - {1007, 0, 6}, - { 944, 0, 6}, - { 547, 0, 7}, - { 910, 0, 7}, - {1233, 0, 8}, - { 909, 0, 8}, - { 482, 0, 9}, - { 981, 0, 9}, - { 499, 0, 9}, - { 808, 0, 10}, - { 998, 0, 10}, - {1073, 0, 11}, - { 999, 0, 11}, - {1232, 0, 12}, - {1419, 0, 12}, - { 820, 0, 13}, - {1417, 0, 13}, - {1087, 0, 14}, - {1418, 0, 14}, - { 439, 0, 15}, - { 319, 0, 15}, - { 407, 0, 15}, - { 580, 0, 16}, - { 358, 0, 16}, - {1131, 0, 17}, - { 408, 0, 17}, - {1267, 0, 18}, - { 449, 0, 18}, - { 478, 0, 19}, - {1096, 0, 19}, - {1053, 0, 20}, - {1134, 0, 20}, - { 404, 0, 21}, - {1099, 0, 21}, - { 424, 0, 22}, - {1094, 0, 22}, - {1074, 0, 23}, - {1117, 0, 23}, - { 905, 0, 24}, - {1214, 0, 24}, - { 453, 0, 25}, - {1183, 0, 25}, - { 948, 0, 26}, - {1213, 0, 26}, - {1075, 0, 27}, - {1221, 0, 27}, - { 706, 0, 28}, - {1114, 0, 28}, - { 575, 0, 29}, - {1101, 0, 29}, - {1063, 0, 30}, - { 301, 0, 30}, - { 302, 0, 30}, - { 806, 0, 31}, - { 769, 0, 31}, - { 770, 0, 31}, - { 898, 0, 32}, - { 844, 0, 32}, - { 415, 0, 32}, - { 845, 0, 32}, - {1019, 0, 33}, - { 968, 0, 33}, - { 969, 0, 33}, - {1138, 0, 34}, - {1082, 0, 34}, - {1137, 0, 34}, - {1083, 0, 34}, - {1274, 0, 35}, - {1172, 0, 35}, - {1173, 0, 35}, - {1196, 0, 36}, - {1410, 0, 36}, - {1411, 0, 36}, - { 315, 0, 37}, - { 794, 0, 37}, - { 222, 0, 38}, - {1000, 1, 0}, - { 978, 1, 0}, - { 245, 1, 1}, - { 220, 1, 1}, - { 779, 1, 2}, - { 778, 1, 2}, - { 777, 1, 2}, - { 786, 1, 3}, - { 780, 1, 3}, - { 788, 1, 4}, - { 782, 1, 4}, - { 716, 1, 5}, - { 715, 1, 5}, - {1234, 1, 6}, - { 947, 1, 6}, - { 410, 1, 7}, - { 495, 1, 7}, - { 622, 1, 8}, - { 621, 1, 8}, - { 462, 1, 9}, - { 470, 1, 10}, - { 469, 1, 10}, - { 471, 1, 10}, - { 216, 1, 11}, - { 661, 1, 12}, - { 203, 1, 13}, - {1278, 1, 14}, - { 215, 1, 15}, - { 214, 1, 15}, - {1316, 1, 16}, - { 996, 1, 17}, - {1177, 1, 18}, - { 865, 1, 19}, - {1280, 1, 20}, - {1279, 1, 20}, - { 205, 1, 21}, - { 204, 1, 21}, - { 489, 1, 22}, - { 257, 1, 23}, - { 631, 1, 24}, - { 628, 1, 25}, - {1055, 1, 26}, - {1297, 1, 27}, - {1309, 1, 28}, - { 749, 1, 29}, - { 852, 1, 30}, - {1211, 1, 31}, - {1317, 1, 32}, - { 774, 1, 33}, - {1318, 1, 34}, - { 962, 1, 35}, - { 597, 1, 36}, - { 646, 1, 37}, - { 721, 1, 37}, - { 551, 1, 38}, - { 557, 1, 39}, - { 556, 1, 39}, - { 367, 1, 40}, - {1344, 1, 41}, - {1338, 1, 41}, - { 306, 1, 41}, - {1034, 1, 42}, - {1170, 1, 43}, - {1283, 1, 44}, - { 656, 1, 45}, - { 297, 1, 46}, - {1285, 1, 47}, - { 759, 1, 48}, - { 952, 1, 49}, - {1345, 1, 50}, - {1339, 1, 50}, - { 811, 1, 51}, - {1288, 1, 52}, - { 985, 1, 53}, - { 760, 1, 54}, - { 295, 1, 55}, - {1289, 1, 56}, - { 411, 1, 57}, - { 496, 1, 57}, - { 240, 1, 58}, - {1244, 1, 59}, - { 248, 1, 60}, - { 805, 1, 61}, - {1038, 1, 62}, - { 468, 1, 63}, - { 465, 1, 63}, - { 599, 1, 64}, - { 598, 1, 64}, - {1246, 1, 65}, - {1245, 1, 65}, - {1359, 1, 66}, - {1358, 1, 66}, - {1111, 1, 67}, - {1110, 1, 67}, - {1112, 1, 68}, - {1113, 1, 68}, - { 413, 1, 69}, - { 498, 1, 69}, - { 787, 1, 70}, - { 781, 1, 70}, - { 624, 1, 71}, - { 623, 1, 71}, - { 592, 1, 72}, - {1138, 1, 72}, - {1253, 1, 73}, - {1252, 1, 73}, - { 454, 1, 74}, - { 412, 1, 75}, - { 497, 1, 75}, - { 416, 1, 75}, - { 807, 1, 76}, - {1020, 1, 77}, - { 219, 1, 78}, - { 903, 1, 79}, - { 904, 1, 79}, - { 936, 1, 80}, - { 941, 1, 80}, - { 440, 1, 81}, - {1054, 1, 82}, - {1031, 1, 82}, - { 540, 1, 83}, - { 539, 1, 83}, - { 282, 1, 84}, - { 272, 1, 85}, - { 593, 1, 86}, - { 933, 1, 87}, - { 940, 1, 87}, - { 500, 1, 88}, - { 931, 1, 89}, - { 937, 1, 89}, - {1255, 1, 90}, - {1248, 1, 90}, - { 289, 1, 91}, - { 288, 1, 91}, - {1256, 1, 92}, - {1249, 1, 92}, - { 932, 1, 93}, - { 938, 1, 93}, - {1258, 1, 94}, - {1254, 1, 94}, - { 934, 1, 95}, - { 930, 1, 95}, - { 604, 1, 96}, - { 789, 1, 97}, - { 783, 1, 97}, - { 442, 1, 98}, - { 601, 1, 99}, - { 600, 1, 99}, - {1320, 1, 100}, - { 554, 1, 101}, - { 552, 1, 101}, - { 466, 1, 102}, - { 463, 1, 102}, - {1259, 1, 103}, - {1265, 1, 103}, - { 390, 1, 104}, - { 389, 1, 104}, - { 748, 1, 105}, - { 747, 1, 105}, - { 687, 1, 106}, - { 683, 1, 106}, - { 393, 1, 107}, - { 392, 1, 107}, - { 672, 1, 108}, - { 751, 1, 109}, - { 275, 1, 110}, - { 645, 1, 111}, - { 421, 1, 111}, - { 746, 1, 112}, - { 277, 1, 113}, - { 276, 1, 113}, - { 391, 1, 114}, - { 754, 1, 115}, - { 752, 1, 115}, - { 544, 1, 116}, - { 543, 1, 116}, - { 377, 1, 117}, - { 375, 1, 117}, - { 395, 1, 118}, - { 383, 1, 118}, - {1405, 1, 119}, - {1404, 1, 119}, - { 394, 1, 120}, - { 374, 1, 120}, - {1407, 1, 121}, - {1406, 1, 122}, - { 821, 1, 123}, - {1353, 1, 124}, - { 467, 1, 125}, - { 464, 1, 125}, - { 242, 1, 126}, - { 949, 1, 127}, - { 790, 1, 128}, - { 784, 1, 128}, - {1273, 1, 129}, - { 418, 1, 130}, - { 698, 1, 130}, - {1103, 1, 131}, - {1181, 1, 132}, - { 491, 1, 133}, - { 490, 1, 133}, - { 755, 1, 134}, - {1153, 1, 135}, - { 647, 1, 136}, - { 722, 1, 136}, - { 725, 1, 137}, - { 966, 1, 138}, - { 964, 1, 138}, - { 360, 1, 139}, - { 965, 1, 140}, - { 963, 1, 140}, - {1290, 1, 141}, - { 918, 1, 142}, - { 917, 1, 142}, - { 555, 1, 143}, - { 553, 1, 143}, - { 791, 1, 144}, - { 785, 1, 144}, - { 369, 1, 145}, - { 368, 1, 145}, - { 916, 1, 146}, - { 649, 1, 147}, - { 644, 1, 147}, - { 648, 1, 148}, - { 723, 1, 148}, - { 670, 1, 149}, - { 668, 1, 150}, - { 669, 1, 150}, - { 830, 1, 151}, - {1132, 1, 152}, - {1136, 1, 152}, - {1131, 1, 152}, - { 379, 1, 153}, - { 381, 1, 153}, - { 191, 1, 154}, - { 190, 1, 154}, - { 212, 1, 155}, - { 210, 1, 155}, - {1356, 1, 156}, - {1371, 1, 156}, - {1362, 1, 157}, - { 414, 1, 158}, - { 638, 1, 158}, - { 378, 1, 159}, - { 376, 1, 159}, - {1217, 1, 160}, - {1216, 1, 160}, - { 213, 1, 161}, - { 211, 1, 161}, - { 640, 1, 162}, - { 637, 1, 162}, - {1235, 1, 163}, - { 817, 1, 164}, - { 816, 1, 165}, - { 172, 1, 166}, - { 198, 1, 167}, - { 199, 1, 168}, - {1105, 1, 169}, - {1104, 1, 169}, - { 841, 1, 170}, - { 312, 1, 171}, - { 443, 1, 172}, - {1041, 1, 173}, - { 612, 1, 174}, - {1043, 1, 175}, - {1341, 1, 176}, - {1044, 1, 177}, - { 487, 1, 178}, - {1200, 1, 179}, - {1062, 1, 180}, - {1059, 1, 181}, - { 526, 1, 182}, - { 317, 1, 183}, - { 814, 1, 184}, - { 461, 1, 185}, - { 696, 1, 186}, - {1086, 1, 187}, - { 971, 1, 188}, - { 658, 1, 189}, - {1109, 1, 190}, - { 843, 1, 191}, - { 924, 1, 192}, - { 923, 1, 193}, - { 758, 1, 194}, - {1046, 1, 195}, - {1042, 1, 196}, - { 868, 1, 197}, - { 234, 1, 198}, - { 710, 1, 199}, - { 709, 1, 200}, - {1135, 1, 201}, - {1047, 1, 202}, - {1040, 1, 203}, - { 652, 1, 204}, - {1169, 1, 205}, - {1168, 1, 205}, - {1045, 1, 206}, - {1224, 1, 207}, - { 528, 1, 208}, - { 285, 1, 209}, - { 738, 1, 210}, - {1227, 1, 211}, - { 359, 1, 212}, - { 846, 1, 213}, - {1199, 1, 214}, - {1212, 1, 215}, - { 763, 1, 216}, - { 959, 1, 217}, - { 764, 1, 218}, - { 614, 1, 219}, - { 983, 1, 220}, - {1322, 1, 221}, - {1206, 1, 222}, - { 945, 1, 223}, - { 954, 1, 224}, - { 953, 1, 224}, - {1294, 1, 225}, - { 178, 1, 226}, - { 502, 1, 227}, - {1376, 1, 228}, - { 974, 1, 229}, - {1413, 1, 230}, - {1229, 1, 231}, - {1093, 1, 232}, - { 259, 1, 233}, - { 897, 1, 234}, - { 899, 1, 235}, - { 630, 1, 236}, - { 851, 1, 237}, - {1299, 1, 238}, - {1298, 1, 238}, - { 450, 1, 239}, - { 452, 1, 240}, - { 451, 1, 240}, - { 516, 1, 241}, - { 524, 1, 242}, - { 523, 1, 243}, - { 195, 1, 244}, - { 244, 1, 245}, - { 243, 1, 245}, - { 955, 1, 246}, - { 247, 1, 247}, - {1084, 1, 248}, - { 912, 1, 249}, - { 925, 1, 250}, - { 689, 1, 251}, - { 688, 1, 251}, - {1302, 1, 252}, - {1303, 1, 253}, - { 744, 1, 254}, - { 743, 1, 254}, - { 742, 1, 255}, - { 741, 1, 255}, - {1219, 1, 256}, - {1218, 1, 256}, - {1026, 1, 257}, - { 513, 1, 258}, - {1203, 1, 259}, - { 300, 1, 260}, - { 299, 1, 260}, - { 961, 1, 261}, - { 960, 1, 261}, - { 197, 1, 262}, - { 196, 1, 262}, - { 906, 1, 263}, - {1292, 1, 264}, - {1291, 1, 264}, - { 445, 1, 265}, - { 444, 1, 265}, - { 902, 1, 266}, - { 901, 1, 266}, - {1268, 1, 267}, - { 606, 1, 268}, - { 605, 1, 268}, - {1029, 1, 269}, - {1374, 1, 270}, - { 920, 1, 271}, - { 170, 1, 272}, - { 700, 1, 273}, - {1077, 1, 274}, - { 208, 1, 275}, - { 207, 1, 275}, - { 849, 1, 276}, - { 848, 1, 276}, - { 504, 1, 277}, - { 503, 1, 277}, - {1115, 1, 278}, - { 541, 1, 279}, - { 542, 1, 279}, - { 546, 1, 280}, - { 545, 1, 280}, - { 935, 1, 281}, - { 939, 1, 281}, - { 536, 1, 282}, - {1057, 1, 283}, - {1335, 1, 284}, - {1334, 1, 284}, - { 184, 1, 285}, - { 183, 1, 285}, - { 595, 1, 286}, - { 594, 1, 286}, - {1257, 1, 287}, - {1250, 1, 287}, - {1260, 1, 288}, - {1266, 1, 288}, - { 370, 1, 289}, - {1276, 1, 290}, - {1275, 1, 290}, - { 396, 1, 291}, - { 384, 1, 291}, - { 397, 1, 292}, - { 385, 1, 292}, - { 398, 1, 293}, - { 386, 1, 293}, - { 399, 1, 294}, - { 387, 1, 294}, - { 400, 1, 295}, - { 388, 1, 295}, - { 380, 1, 296}, - { 382, 1, 296}, - {1286, 1, 297}, - {1357, 1, 298}, - {1372, 1, 298}, - {1261, 1, 299}, - {1263, 1, 299}, - {1262, 1, 300}, - {1264, 1, 300}, - {1347, 2, 0}, - {1424, 2, 0}, - { 417, 2, 1}, - {1423, 2, 1}, - { 776, 2, 2}, - { 792, 2, 2}, - { 621, 2, 3}, - { 625, 2, 3}, - { 462, 2, 4}, - { 472, 2, 4}, - { 216, 2, 5}, - { 218, 2, 5}, - { 661, 2, 6}, - { 660, 2, 6}, - { 203, 2, 7}, - { 202, 2, 7}, - {1278, 2, 8}, - {1277, 2, 8}, - {1316, 2, 9}, - {1315, 2, 9}, - { 489, 2, 10}, - { 488, 2, 10}, - { 257, 2, 11}, - { 256, 2, 11}, - { 631, 2, 12}, - { 632, 2, 12}, - { 628, 2, 13}, - { 629, 2, 13}, - {1055, 2, 14}, - {1058, 2, 14}, - {1297, 2, 15}, - {1300, 2, 15}, - {1309, 2, 16}, - {1308, 2, 16}, - { 749, 2, 17}, - { 765, 2, 17}, - { 852, 2, 18}, - { 943, 2, 18}, - {1211, 2, 19}, - {1210, 2, 19}, - {1317, 2, 20}, - { 774, 2, 21}, - { 775, 2, 21}, - {1318, 2, 22}, - {1319, 2, 22}, - { 962, 2, 23}, - { 967, 2, 23}, - { 597, 2, 24}, - { 596, 2, 24}, - { 644, 2, 25}, - { 643, 2, 25}, - { 551, 2, 26}, - { 550, 2, 26}, - { 367, 2, 27}, - { 366, 2, 27}, - { 305, 2, 28}, - { 309, 2, 28}, - {1034, 2, 29}, - {1033, 2, 29}, - {1170, 2, 30}, - {1171, 2, 30}, - { 759, 2, 31}, - { 761, 2, 31}, - { 952, 2, 32}, - { 951, 2, 32}, - { 672, 2, 33}, - { 671, 2, 33}, - { 751, 2, 34}, - { 740, 2, 34}, - { 275, 2, 35}, - { 274, 2, 35}, - { 642, 2, 36}, - { 651, 2, 36}, - {1402, 2, 37}, - {1403, 2, 37}, - {1041, 2, 38}, - { 720, 2, 38}, - { 612, 2, 39}, - { 611, 2, 39}, - { 487, 2, 40}, - { 509, 2, 40}, - { 703, 2, 41}, - {1416, 2, 41}, - {1141, 2, 41}, - {1283, 2, 42}, - {1314, 2, 42}, - { 656, 2, 43}, - { 655, 2, 43}, - { 297, 2, 44}, - { 296, 2, 44}, - {1285, 2, 45}, - {1284, 2, 45}, - { 811, 2, 46}, - { 810, 2, 46}, - {1288, 2, 47}, - {1295, 2, 47}, - { 815, 2, 48}, - { 813, 2, 48}, - {1341, 2, 49}, - {1340, 2, 49}, - {1200, 2, 50}, - {1201, 2, 50}, - {1062, 2, 51}, - {1061, 2, 51}, - { 460, 2, 52}, - { 447, 2, 52}, - { 288, 2, 53}, - { 287, 2, 53}, - { 295, 2, 54}, - { 294, 2, 54}, - { 442, 2, 55}, - { 441, 2, 55}, - {1140, 2, 55}, - { 985, 2, 56}, - {1296, 2, 56}, - { 604, 2, 57}, - { 603, 2, 57}, - {1320, 2, 58}, - {1313, 2, 58}, - {1273, 2, 59}, - {1272, 2, 59}, - {1044, 2, 60}, - {1394, 2, 60}, - { 758, 2, 61}, - { 757, 2, 61}, - { 240, 2, 62}, - { 239, 2, 62}, - { 450, 2, 63}, - {1395, 2, 63}, - {1109, 2, 64}, - {1108, 2, 64}, - {1103, 2, 65}, - {1102, 2, 65}, - { 996, 2, 66}, - { 997, 2, 66}, - {1244, 2, 67}, - {1243, 2, 67}, - { 805, 2, 68}, - { 804, 2, 68}, - {1038, 2, 69}, - {1039, 2, 69}, - {1353, 2, 70}, - {1354, 2, 70}, - {1181, 2, 71}, - {1180, 2, 71}, - { 755, 2, 72}, - { 739, 2, 72}, - {1153, 2, 73}, - {1162, 2, 73}, - { 841, 2, 74}, - { 840, 2, 74}, - { 312, 2, 75}, - { 311, 2, 75}, - { 843, 2, 76}, - { 842, 2, 76}, - { 360, 2, 77}, - {1289, 2, 78}, - { 773, 2, 78}, - {1290, 2, 79}, - {1304, 2, 79}, - { 234, 2, 80}, - { 235, 2, 80}, - { 524, 2, 81}, - { 522, 2, 81}, - {1177, 2, 82}, - {1178, 2, 82}, - { 821, 2, 83}, - { 242, 2, 84}, - { 241, 2, 84}, - { 725, 2, 85}, - { 724, 2, 85}, - { 916, 2, 86}, - { 957, 2, 86}, - { 696, 2, 87}, - { 217, 2, 87}, - {1046, 2, 88}, - {1179, 2, 88}, - { 710, 2, 89}, - {1133, 2, 89}, - { 709, 2, 90}, - {1106, 2, 90}, - {1047, 2, 91}, - {1056, 2, 91}, - { 738, 2, 92}, - { 767, 2, 92}, - { 248, 2, 93}, - { 249, 2, 93}, - { 285, 2, 94}, - { 284, 2, 94}, - { 865, 2, 95}, - { 864, 2, 95}, - { 359, 2, 96}, - { 303, 2, 96}, - { 923, 2, 97}, - { 921, 2, 97}, - { 924, 2, 98}, - { 922, 2, 98}, - { 925, 2, 99}, - {1116, 2, 99}, - {1199, 2, 100}, - {1204, 2, 100}, - {1227, 2, 101}, - {1226, 2, 101}, - {1294, 2, 102}, - {1293, 2, 102}, - { 317, 2, 103}, - { 176, 2, 103}, - { 247, 2, 104}, - { 246, 2, 104}, - { 513, 2, 105}, - { 512, 2, 105}, - { 526, 2, 106}, - { 525, 2, 106}, - { 614, 2, 107}, - { 613, 2, 107}, - {1084, 2, 108}, - { 675, 2, 108}, - { 763, 2, 109}, - { 762, 2, 109}, - { 814, 2, 110}, - { 812, 2, 110}, - { 846, 2, 111}, - { 847, 2, 111}, - { 868, 2, 112}, - { 867, 2, 112}, - { 920, 2, 113}, - { 919, 2, 113}, - { 945, 2, 114}, - { 955, 2, 115}, - { 956, 2, 115}, - {1042, 2, 116}, - { 976, 2, 116}, - { 971, 2, 117}, - { 979, 2, 117}, - {1086, 2, 118}, - {1085, 2, 118}, - {1093, 2, 119}, - {1092, 2, 119}, - {1043, 2, 120}, - {1100, 2, 120}, - {1135, 2, 121}, - {1107, 2, 121}, - {1206, 2, 122}, - {1205, 2, 122}, - { 764, 2, 123}, - {1208, 2, 123}, - {1322, 2, 124}, - {1321, 2, 124}, - {1376, 2, 125}, - {1375, 2, 125}, - { 178, 2, 126}, - { 195, 2, 127}, - { 674, 2, 127}, - { 658, 2, 128}, - { 657, 2, 128}, - { 959, 2, 129}, - { 958, 2, 129}, - {1040, 2, 130}, - { 679, 2, 130}, - {1207, 2, 131}, - {1198, 2, 131}, - { 170, 2, 132}, - { 171, 2, 132}, - { 259, 2, 133}, - { 260, 2, 133}, - { 897, 2, 134}, - { 896, 2, 134}, - { 983, 2, 135}, - {1059, 2, 136}, - {1060, 2, 136}, - {1302, 2, 137}, - {1301, 2, 137}, - { 899, 2, 138}, - { 610, 2, 138}, - {1026, 2, 139}, - {1014, 2, 139}, - {1229, 2, 140}, - {1228, 2, 140}, - {1413, 2, 141}, - {1414, 2, 141}, - { 502, 2, 142}, - { 501, 2, 142}, - { 630, 2, 143}, - { 609, 2, 143}, - { 851, 2, 144}, - { 850, 2, 144}, - { 912, 2, 145}, - { 913, 2, 145}, - { 652, 2, 146}, - {1166, 2, 146}, - {1224, 2, 147}, - {1223, 2, 147}, - {1045, 2, 148}, - {1225, 2, 148}, - { 528, 2, 149}, - { 527, 2, 149}, - { 974, 2, 150}, - { 973, 2, 150}, - {1029, 2, 151}, - { 676, 2, 151}, - {1374, 2, 152}, - {1379, 2, 152}, - { 753, 2, 153}, - { 677, 2, 153}, - {1063, 3, 0}, - {1396, 3, 0}, - { 507, 3, 1}, - { 508, 3, 1}, - {1209, 3, 2}, - {1236, 3, 2}, - { 662, 3, 3}, - { 673, 3, 3}, - { 448, 3, 4}, - { 809, 3, 5}, - { 984, 3, 6}, - { 998, 3, 6}, - { 564, 3, 7}, - {1150, 3, 8}, - {1155, 3, 8}, - { 580, 3, 9}, - { 578, 3, 9}, - { 751, 3, 10}, - { 736, 3, 10}, - { 186, 3, 11}, - { 795, 3, 11}, - { 926, 3, 12}, - { 942, 3, 12}, - { 927, 3, 13}, - { 944, 3, 13}, - { 928, 3, 14}, - { 908, 3, 14}, - {1022, 3, 15}, - {1017, 3, 15}, - { 567, 3, 16}, - { 561, 3, 16}, - {1421, 3, 17}, - {1387, 3, 18}, - { 519, 3, 19}, - { 518, 3, 19}, - { 520, 3, 20}, - { 521, 3, 20}, - { 530, 3, 21}, - { 529, 3, 21}, - { 608, 3, 22}, - { 587, 3, 22}, - {1063, 4, 0}, - {1396, 4, 0}, - {1128, 4, 1}, - {1125, 4, 1}, - { 448, 4, 2}, - { 809, 4, 3}, - { 439, 4, 4}, - { 406, 4, 4}, - { 564, 4, 5}, - { 561, 4, 5}, - {1150, 4, 6}, - {1155, 4, 6}, - {1233, 4, 7}, - {1214, 4, 7}, - { 769, 4, 8}, - {1352, 4, 9}, - {1282, 4, 10}, - { 836, 4, 11}, - { 838, 4, 12}, - {1421, 4, 13}, - { 519, 4, 14}, - { 518, 4, 14}, - { 520, 4, 15}, - { 521, 4, 15}, - { 530, 4, 16}, - { 529, 4, 16}, - { 608, 4, 17}, - { 587, 4, 17}, - {1063, 5, 0}, - {1396, 5, 0}, - { 448, 5, 1}, - { 809, 5, 2}, - { 564, 5, 3}, - { 561, 5, 3}, - {1195, 5, 4}, - {1189, 5, 4}, - { 580, 5, 5}, - { 578, 5, 5}, - {1230, 5, 6}, - { 827, 5, 7}, - { 824, 5, 7}, - {1349, 5, 8}, - {1348, 5, 8}, - {1048, 5, 9}, - { 795, 5, 9}, - {1022, 5, 10}, - {1017, 5, 10}, - { 228, 5, 11}, - { 223, 5, 11}, - {1240, 5, 12}, - {1239, 5, 12}, - { 402, 5, 13}, - { 401, 5, 13}, - {1184, 5, 14}, - {1183, 5, 14}, - { 999, 6, 0}, - { 968, 6, 0}, - { 568, 6, 0}, - { 569, 6, 0}, - {1401, 6, 1}, - {1397, 6, 1}, - {1282, 6, 1}, - {1336, 6, 1}, - {1010, 7, 0}, - { 970, 7, 0}, - { 796, 7, 1}, - { 769, 7, 1}, - {1369, 7, 2}, - {1352, 7, 2}, - {1332, 7, 3}, - {1282, 7, 3}, - { 837, 7, 4}, - { 836, 7, 4}, - { 839, 7, 5}, - { 838, 7, 5}, - { 800, 8, 0}, - { 769, 8, 0}, - {1158, 8, 1}, - {1148, 8, 1}, - { 558, 8, 2}, - { 537, 8, 2}, - { 559, 8, 3}, - { 548, 8, 3}, - { 560, 8, 4}, - { 549, 8, 4}, - { 209, 8, 5}, - { 194, 8, 5}, - { 419, 8, 6}, - { 449, 8, 6}, - {1087, 8, 7}, - { 236, 8, 7}, - {1191, 8, 8}, - {1172, 8, 8}, - {1380, 8, 9}, - {1386, 8, 9}, - {1072, 8, 10}, - {1051, 8, 10}, - { 281, 8, 11}, - { 273, 8, 11}, - {1007, 8, 12}, - {1015, 8, 12}, - { 206, 8, 13}, - { 181, 8, 13}, - { 803, 8, 14}, - { 833, 8, 14}, - {1161, 8, 15}, - {1165, 8, 15}, - { 801, 8, 16}, - { 831, 8, 16}, - {1159, 8, 17}, - {1163, 8, 17}, - {1118, 8, 18}, - {1097, 8, 18}, - { 802, 8, 19}, - { 832, 8, 19}, - {1160, 8, 20}, - {1164, 8, 20}, - { 577, 8, 21}, - { 583, 8, 21}, - {1119, 8, 22}, - {1098, 8, 22}, - {1011, 9, 0}, - { 1, 9, 0}, - {1012, 9, 0}, - {1080, 9, 1}, - { 2, 9, 1}, - {1079, 9, 1}, - {1018, 9, 2}, - { 142, 9, 2}, - { 995, 9, 2}, - { 745, 9, 3}, - { 151, 9, 3}, - { 768, 9, 3}, - {1363, 9, 4}, - { 158, 9, 4}, - {1370, 9, 4}, - { 321, 9, 5}, - { 21, 9, 5}, - { 324, 9, 6}, - { 33, 9, 6}, - { 326, 9, 7}, - { 37, 9, 7}, - { 329, 9, 8}, - { 40, 9, 8}, - { 333, 9, 9}, - { 45, 9, 9}, - { 334, 9, 10}, - { 46, 9, 10}, - { 335, 9, 11}, - { 48, 9, 11}, - { 336, 9, 12}, - { 49, 9, 12}, - { 337, 9, 13}, - { 51, 9, 13}, - { 338, 9, 14}, - { 52, 9, 14}, - { 339, 9, 15}, - { 56, 9, 15}, - { 340, 9, 16}, - { 63, 9, 16}, - { 341, 9, 17}, - { 68, 9, 17}, - { 342, 9, 18}, - { 74, 9, 18}, - { 343, 9, 19}, - { 79, 9, 19}, - { 344, 9, 20}, - { 81, 9, 20}, - { 345, 9, 21}, - { 82, 9, 21}, - { 346, 9, 22}, - { 83, 9, 22}, - { 347, 9, 23}, - { 84, 9, 23}, - { 348, 9, 24}, - { 85, 9, 24}, - { 349, 9, 25}, - { 95, 9, 25}, - { 350, 9, 26}, - { 100, 9, 26}, - { 351, 9, 27}, - { 101, 9, 27}, - { 352, 9, 28}, - { 102, 9, 28}, - { 353, 9, 29}, - { 103, 9, 29}, - { 354, 9, 30}, - { 104, 9, 30}, - { 355, 9, 31}, - { 105, 9, 31}, - { 356, 9, 32}, - { 157, 9, 32}, - { 357, 9, 33}, - { 165, 9, 33}, - { 322, 9, 34}, - { 31, 9, 34}, - { 323, 9, 35}, - { 32, 9, 35}, - { 325, 9, 36}, - { 36, 9, 36}, - { 327, 9, 37}, - { 38, 9, 37}, - { 328, 9, 38}, - { 39, 9, 38}, - { 330, 9, 39}, - { 42, 9, 39}, - { 331, 9, 40}, - { 43, 9, 40}, - { 231, 9, 41}, - { 62, 9, 41}, - { 226, 9, 41}, - { 229, 9, 42}, - { 64, 9, 42}, - { 224, 9, 42}, - { 230, 9, 43}, - { 65, 9, 43}, - { 225, 9, 43}, - { 254, 9, 44}, - { 67, 9, 44}, - { 268, 9, 44}, - { 253, 9, 45}, - { 69, 9, 45}, - { 236, 9, 45}, - { 255, 9, 46}, - { 70, 9, 46}, - { 283, 9, 46}, - { 797, 9, 47}, - { 71, 9, 47}, - { 769, 9, 47}, - {1156, 9, 48}, - { 72, 9, 48}, - {1148, 9, 48}, - { 168, 9, 49}, - { 73, 9, 49}, - { 181, 9, 49}, - { 167, 9, 50}, - { 75, 9, 50}, - { 166, 9, 50}, - { 169, 9, 51}, - { 76, 9, 51}, - { 201, 9, 51}, - { 506, 9, 52}, - { 77, 9, 52}, - { 479, 9, 52}, - { 505, 9, 53}, - { 78, 9, 53}, - { 474, 9, 53}, - { 714, 9, 54}, - { 80, 9, 54}, - { 717, 9, 54}, - { 332, 9, 55}, - { 44, 9, 55}, - { 232, 9, 56}, - { 57, 9, 56}, - { 227, 9, 56}, - {1004, 10, 0}, - { 307, 10, 1}, - { 304, 10, 1}, - { 420, 10, 2}, - { 409, 10, 2}, - { 579, 10, 3}, - {1001, 10, 4}, - { 978, 10, 4}, - { 705, 10, 5}, - { 704, 10, 5}, - { 914, 10, 6}, - { 911, 10, 6}, - { 574, 10, 7}, - { 573, 10, 7}, - { 719, 10, 8}, - { 718, 10, 8}, - { 372, 10, 9}, - { 538, 10, 9}, - {1251, 10, 10}, - {1247, 10, 10}, - {1242, 10, 11}, - {1361, 10, 12}, - {1360, 10, 12}, - {1381, 10, 13}, - { 977, 10, 14}, - { 975, 10, 14}, - {1215, 10, 15}, - {1220, 10, 15}, - {1238, 10, 16}, - {1237, 10, 16}, - { 582, 10, 17}, - { 581, 10, 17}, - { 982, 11, 0}, - { 968, 11, 0}, - { 193, 11, 1}, - { 166, 11, 1}, - { 639, 11, 2}, - { 633, 11, 2}, - {1381, 11, 3}, - {1373, 11, 3}, - { 584, 11, 4}, - { 568, 11, 4}, - { 977, 11, 5}, - { 970, 11, 5}, - {1002, 12, 0}, - { 180, 12, 1}, - { 182, 12, 2}, - { 185, 12, 3}, - { 252, 12, 4}, - { 258, 12, 5}, - { 475, 12, 6}, - { 476, 12, 7}, - { 514, 12, 8}, - { 572, 12, 9}, - { 576, 12, 10}, - { 585, 12, 11}, - { 586, 12, 12}, - { 636, 12, 13}, - { 641, 12, 14}, - {1307, 12, 14}, - { 659, 12, 15}, - { 663, 12, 16}, - { 664, 12, 17}, - { 665, 12, 18}, - { 737, 12, 19}, - { 750, 12, 20}, - { 766, 12, 21}, - { 771, 12, 22}, - { 772, 12, 23}, - { 915, 12, 24}, - { 929, 12, 25}, - {1009, 12, 26}, - {1025, 12, 27}, - {1099, 12, 28}, - {1142, 12, 29}, - {1143, 12, 30}, - {1152, 12, 31}, - {1154, 12, 32}, - {1175, 12, 33}, - {1176, 12, 34}, - {1190, 12, 35}, - {1192, 12, 36}, - {1202, 12, 37}, - {1269, 12, 38}, - {1287, 12, 39}, - {1305, 12, 40}, - {1306, 12, 41}, - {1312, 12, 42}, - {1377, 12, 43}, - {1281, 12, 44}, - {1398, 12, 45}, - {1399, 12, 46}, - {1400, 12, 47}, - {1408, 12, 48}, - {1409, 12, 49}, - {1412, 12, 50}, - {1415, 12, 51}, - { 756, 12, 52}, - { 571, 12, 53}, - { 298, 12, 54}, - { 570, 12, 55}, - {1028, 12, 56}, - {1167, 12, 57}, - {1241, 12, 58}, - { 869, 12, 59}, - { 870, 12, 60}, - { 871, 12, 61}, - { 872, 12, 62}, - { 873, 12, 63}, - { 874, 12, 64}, - { 875, 12, 65}, - { 876, 12, 66}, - { 877, 12, 67}, - { 878, 12, 68}, - { 879, 12, 69}, - { 880, 12, 70}, - { 881, 12, 71}, - { 882, 12, 72}, - { 883, 12, 73}, - { 884, 12, 74}, - { 885, 12, 75}, - { 886, 12, 76}, - { 887, 12, 77}, - { 888, 12, 78}, - { 889, 12, 79}, - { 890, 12, 80}, - { 891, 12, 81}, - { 892, 12, 82}, - { 893, 12, 83}, - { 894, 12, 84}, - { 895, 12, 85}, - { 173, 12, 86}, - { 175, 12, 87}, - { 174, 12, 88}, - { 857, 12, 89}, - { 854, 12, 90}, - { 860, 12, 91}, - { 863, 12, 92}, - { 858, 12, 93}, - { 859, 12, 94}, - { 853, 12, 95}, - { 861, 12, 96}, - { 855, 12, 97}, - { 856, 12, 98}, - { 862, 12, 99}, - { 654, 12, 100}, - { 653, 12, 101}, - {1006, 13, 0}, - {1337, 13, 0}, - { 729, 13, 1}, - { 301, 13, 1}, - { 511, 13, 2}, - { 473, 13, 2}, - {1157, 13, 3}, - {1148, 13, 3}, - { 799, 13, 4}, - { 769, 13, 4}, - {1333, 13, 5}, - {1282, 13, 5}, - {1347, 14, 0}, - {1396, 14, 0}, - {1053, 14, 1}, - {1052, 14, 1}, - { 404, 14, 2}, - { 401, 14, 2}, - {1146, 14, 3}, - {1145, 14, 3}, - { 607, 14, 4}, - { 602, 14, 4}, - {1008, 14, 5}, - {1013, 14, 5}, - { 562, 14, 6}, - { 561, 14, 6}, - { 293, 14, 7}, - {1270, 14, 7}, - { 702, 14, 8}, - { 717, 14, 8}, - {1127, 14, 9}, - {1126, 14, 9}, - {1124, 14, 10}, - {1117, 14, 10}, - {1022, 14, 11}, - {1017, 14, 11}, - { 189, 14, 12}, - { 181, 14, 12}, - { 686, 14, 13}, - { 682, 14, 13}, - { 711, 14, 14}, - { 697, 14, 14}, - { 712, 14, 14}, - { 681, 14, 15}, - { 680, 14, 15}, - { 415, 14, 16}, - { 405, 14, 16}, - { 291, 14, 17}, - { 250, 14, 17}, - { 290, 14, 18}, - { 238, 14, 18}, - {1231, 14, 19}, - {1230, 14, 19}, - { 866, 14, 20}, - { 267, 14, 20}, - { 313, 14, 21}, - { 448, 14, 21}, - { 819, 14, 22}, - { 809, 14, 22}, - { 438, 14, 23}, - { 318, 14, 23}, - { 422, 14, 24}, - {1174, 14, 24}, - { 193, 14, 25}, - { 179, 14, 25}, - { 292, 14, 26}, - { 237, 14, 26}, - {1267, 14, 27}, - {1197, 14, 27}, - {1422, 14, 28}, - {1420, 14, 28}, - { 986, 14, 29}, - { 998, 14, 29}, - {1385, 14, 30}, - {1382, 14, 30}, - { 727, 14, 31}, - { 735, 14, 32}, - { 734, 14, 33}, - { 634, 14, 34}, - { 635, 14, 35}, - { 403, 14, 36}, - { 446, 14, 36}, - { 662, 14, 37}, - { 673, 14, 37}, - { 423, 14, 38}, - { 373, 14, 38}, - {1150, 14, 39}, - {1155, 14, 39}, - { 519, 14, 40}, - { 518, 14, 40}, - { 530, 14, 41}, - { 529, 14, 41}, - {1421, 14, 42}, - {1004, 15, 0}, - {1022, 15, 1}, - {1017, 15, 1}, - { 499, 15, 2}, - { 492, 15, 2}, - { 481, 15, 3}, - { 480, 15, 3}, - { 972, 16, 0}, - { 0, 16, 1}, - { 1, 16, 2}, - { 11, 16, 3}, - { 6, 16, 4}, - { 19, 16, 5}, - { 16, 16, 6}, - { 13, 16, 7}, - { 10, 16, 8}, - { 94, 16, 9}, - { 92, 16, 10}, - { 8, 16, 11}, - { 5, 16, 12}, - { 4, 16, 13}, - { 3, 16, 14}, - { 20, 16, 15}, - { 18, 16, 16}, - { 17, 16, 17}, - { 89, 16, 18}, - { 15, 16, 19}, - { 87, 16, 20}, - { 14, 16, 21}, - { 12, 16, 22}, - { 9, 16, 23}, - { 93, 16, 24}, - { 55, 16, 25}, - { 127, 16, 26}, - { 7, 16, 27}, - { 143, 16, 28}, - { 91, 16, 29}, - { 130, 16, 30}, - { 54, 16, 31}, - { 90, 16, 32}, - { 110, 16, 33}, - { 129, 16, 34}, - { 145, 16, 35}, - { 34, 16, 36}, - { 2, 16, 37}, - { 88, 16, 38}, - { 53, 16, 39}, - { 128, 16, 40}, - { 86, 16, 41}, - { 144, 16, 42}, - { 109, 16, 43}, - { 159, 16, 44}, - { 126, 16, 45}, - { 35, 16, 46}, - { 136, 16, 47}, - { 41, 16, 48}, - { 142, 16, 49}, - { 47, 16, 50}, - { 151, 16, 51}, - { 50, 16, 52}, - { 158, 16, 53}, - { 21, 16, 54}, - { 33, 16, 55}, - { 37, 16, 56}, - { 40, 16, 57}, - { 45, 16, 58}, - { 46, 16, 59}, - { 48, 16, 60}, - { 49, 16, 61}, - { 51, 16, 62}, - { 52, 16, 63}, - { 56, 16, 64}, - { 63, 16, 65}, - { 68, 16, 66}, - { 74, 16, 67}, - { 79, 16, 68}, - { 81, 16, 69}, - { 82, 16, 70}, - { 83, 16, 71}, - { 84, 16, 72}, - { 85, 16, 73}, - { 95, 16, 74}, - { 100, 16, 75}, - { 101, 16, 76}, - { 102, 16, 77}, - { 103, 16, 78}, - { 104, 16, 79}, - { 105, 16, 80}, - { 106, 16, 81}, - { 107, 16, 82}, - { 108, 16, 83}, - { 111, 16, 84}, - { 116, 16, 85}, - { 117, 16, 86}, - { 118, 16, 87}, - { 120, 16, 88}, - { 121, 16, 89}, - { 122, 16, 90}, - { 123, 16, 91}, - { 124, 16, 92}, - { 125, 16, 93}, - { 131, 16, 94}, - { 137, 16, 95}, - { 146, 16, 96}, - { 152, 16, 97}, - { 160, 16, 98}, - { 22, 16, 99}, - { 57, 16, 100}, - { 96, 16, 101}, - { 112, 16, 102}, - { 132, 16, 103}, - { 138, 16, 104}, - { 147, 16, 105}, - { 153, 16, 106}, - { 161, 16, 107}, - { 23, 16, 108}, - { 58, 16, 109}, - { 97, 16, 110}, - { 113, 16, 111}, - { 133, 16, 112}, - { 139, 16, 113}, - { 148, 16, 114}, - { 154, 16, 115}, - { 162, 16, 116}, - { 24, 16, 117}, - { 59, 16, 118}, - { 98, 16, 119}, - { 114, 16, 120}, - { 134, 16, 121}, - { 140, 16, 122}, - { 149, 16, 123}, - { 155, 16, 124}, - { 163, 16, 125}, - { 25, 16, 126}, - { 60, 16, 127}, - { 66, 16, 128}, - { 99, 16, 129}, - { 115, 16, 130}, - { 119, 16, 131}, - { 135, 16, 132}, - { 141, 16, 133}, - { 150, 16, 134}, - { 156, 16, 135}, - { 164, 16, 136}, - { 26, 16, 137}, - { 27, 16, 138}, - { 61, 16, 139}, - { 28, 16, 140}, - { 29, 16, 141}, - { 30, 16, 142}, - { 970, 17, 0}, - {1156, 17, 1}, - { 797, 17, 2}, - {1365, 17, 3}, - { 798, 17, 4}, - {1326, 17, 5}, - { 278, 17, 6}, - {1327, 17, 7}, - {1331, 17, 8}, - {1329, 17, 9}, - {1330, 17, 10}, - { 280, 17, 11}, - { 279, 17, 12}, - {1328, 17, 13}, - {1081, 17, 14}, - {1063, 18, 0}, - { 266, 18, 1}, - {1364, 18, 2}, - { 233, 18, 3}, - {1018, 18, 4}, - {1363, 18, 5}, - {1139, 18, 6}, - { 713, 18, 7}, - {1368, 18, 8}, - {1367, 18, 9}, - {1366, 18, 10}, - { 432, 18, 11}, - { 425, 18, 12}, - { 426, 18, 13}, - { 437, 18, 14}, - { 434, 18, 15}, - { 433, 18, 16}, - { 429, 18, 17}, - { 436, 18, 18}, - { 435, 18, 19}, - { 431, 18, 20}, - { 427, 18, 21}, - { 428, 18, 22}, - { 950, 18, 23}, - {1324, 18, 24}, - {1325, 18, 25}, - { 590, 18, 26}, - { 310, 18, 27}, - {1151, 18, 28}, - {1271, 18, 29}, - { 430, 18, 30}, - {1005, 18, 31}, - { 731, 18, 32}, - {1021, 18, 33}, - {1019, 18, 34}, - { 286, 18, 35}, - { 999, 19, 0}, - {1401, 19, 1}, - {1401, 20, 0}, - {1397, 20, 0}, - { 999, 20, 1}, - { 968, 20, 1}, - {1401, 21, 0}, - {1397, 21, 0}, - { 999, 21, 1}, - { 968, 21, 1}, - { 907, 21, 2}, - { 844, 21, 2}, + {1015, 0, 0}, /* NO */ + { 984, 0, 0}, /* N */ + { 578, 0, 0}, /* F */ + { 579, 0, 0}, /* FALSE */ + {1421, 0, 1}, /* YES */ + {1417, 0, 1}, /* Y */ + {1299, 0, 1}, /* T */ + {1356, 0, 1}, /* TRUE */ + { 814, 1, 0}, /* LEFTTORIGHT */ + { 783, 1, 0}, /* L */ + { 281, 1, 1}, /* BOUNDARYNEUTRAL */ + { 273, 1, 1}, /* BN */ + {1207, 1, 2}, /* SEGMENTSEPARATOR */ + {1188, 1, 2}, /* S */ + {1103, 1, 3}, /* PARAGRAPHSEPARATOR */ + { 236, 1, 3}, /* B */ + {1400, 1, 4}, /* WHITESPACE */ + {1406, 1, 4}, /* WS */ + {1088, 1, 5}, /* OTHERNEUTRAL */ + {1067, 1, 5}, /* ON */ + { 569, 1, 6}, /* EUROPEANTERMINATOR */ + { 558, 1, 6}, /* ET */ + { 568, 1, 7}, /* EUROPEANSEPARATOR */ + { 557, 1, 7}, /* ES */ + { 423, 1, 8}, /* COMMONSEPARATOR */ + { 453, 1, 8}, /* CS */ + { 567, 1, 9}, /* EUROPEANNUMBER */ + { 545, 1, 9}, /* EN */ + {1023, 1, 10}, /* NONSPACINGMARK */ + {1031, 1, 10}, /* NSM */ + {1174, 1, 11}, /* RIGHTTOLEFT */ + {1164, 1, 11}, /* R */ + { 209, 1, 12}, /* ARABICNUMBER */ + { 194, 1, 12}, /* AN */ + { 206, 1, 13}, /* ARABICLETTER */ + { 181, 1, 13}, /* AL */ + { 815, 1, 14}, /* LEFTTORIGHTEMBEDDING */ + { 847, 1, 14}, /* LRE */ + {1175, 1, 15}, /* RIGHTTOLEFTEMBEDDING */ + {1179, 1, 15}, /* RLE */ + {1134, 1, 16}, /* POPDIRECTIONALFORMAT */ + {1113, 1, 16}, /* PDF */ + { 817, 1, 17}, /* LEFTTORIGHTOVERRIDE */ + { 849, 1, 17}, /* LRO */ + {1177, 1, 18}, /* RIGHTTOLEFTOVERRIDE */ + {1181, 1, 18}, /* RLO */ + { 816, 1, 19}, /* LEFTTORIGHTISOLATE */ + { 848, 1, 19}, /* LRI */ + {1176, 1, 20}, /* RIGHTTOLEFTISOLATE */ + {1180, 1, 20}, /* RLI */ + { 587, 1, 21}, /* FIRSTSTRONGISOLATE */ + { 593, 1, 21}, /* FSI */ + {1135, 1, 22}, /* POPDIRECTIONALISOLATE */ + {1114, 1, 22}, /* PDI */ + {1016, 2, 0}, /* NOBLOCK */ + { 994, 2, 0}, /* NB */ + { 245, 2, 1}, /* BASICLATIN */ + { 220, 2, 1}, /* ASCII */ + { 793, 2, 2}, /* LATIN1SUPPLEMENT */ + { 792, 2, 2}, /* LATIN1SUP */ + { 791, 2, 2}, /* LATIN1 */ + { 800, 2, 3}, /* LATINEXTENDEDA */ + { 794, 2, 3}, /* LATINEXTA */ + { 802, 2, 4}, /* LATINEXTENDEDB */ + { 796, 2, 4}, /* LATINEXTB */ + { 728, 2, 5}, /* IPAEXTENSIONS */ + { 727, 2, 5}, /* IPAEXT */ + {1250, 2, 6}, /* SPACINGMODIFIERLETTERS */ + { 963, 2, 6}, /* MODIFIERLETTERS */ + { 414, 2, 7}, /* COMBININGDIACRITICALMARKS */ + { 499, 2, 7}, /* DIACRITICALS */ + { 632, 2, 8}, /* GREEKANDCOPTIC */ + { 631, 2, 8}, /* GREEK */ + { 466, 2, 9}, /* CYRILLIC */ + { 474, 2, 10}, /* CYRILLICSUPPLEMENT */ + { 473, 2, 10}, /* CYRILLICSUP */ + { 475, 2, 10}, /* CYRILLICSUPPLEMENTARY */ + { 216, 2, 11}, /* ARMENIAN */ + { 673, 2, 12}, /* HEBREW */ + { 203, 2, 13}, /* ARABIC */ + {1295, 2, 14}, /* SYRIAC */ + { 215, 2, 15}, /* ARABICSUPPLEMENT */ + { 214, 2, 15}, /* ARABICSUP */ + {1335, 2, 16}, /* THAANA */ + {1012, 2, 17}, /* NKO */ + {1193, 2, 18}, /* SAMARITAN */ + { 881, 2, 19}, /* MANDAIC */ + {1297, 2, 20}, /* SYRIACSUPPLEMENT */ + {1296, 2, 20}, /* SYRIACSUP */ + { 205, 2, 21}, /* ARABICEXTENDEDA */ + { 204, 2, 21}, /* ARABICEXTA */ + { 493, 2, 22}, /* DEVANAGARI */ + { 257, 2, 23}, /* BENGALI */ + { 641, 2, 24}, /* GURMUKHI */ + { 638, 2, 25}, /* GUJARATI */ + {1071, 2, 26}, /* ORIYA */ + {1314, 2, 27}, /* TAMIL */ + {1328, 2, 28}, /* TELUGU */ + { 761, 2, 29}, /* KANNADA */ + { 868, 2, 30}, /* MALAYALAM */ + {1227, 2, 31}, /* SINHALA */ + {1336, 2, 32}, /* THAI */ + { 788, 2, 33}, /* LAO */ + {1337, 2, 34}, /* TIBETAN */ + { 978, 2, 35}, /* MYANMAR */ + { 607, 2, 36}, /* GEORGIAN */ + { 656, 2, 37}, /* HANGULJAMO */ + { 733, 2, 37}, /* JAMO */ + { 560, 2, 38}, /* ETHIOPIC */ + { 566, 2, 39}, /* ETHIOPICSUPPLEMENT */ + { 565, 2, 39}, /* ETHIOPICSUP */ + { 367, 2, 40}, /* CHEROKEE */ + {1364, 2, 41}, /* UNIFIEDCANADIANABORIGINALSYLLABICS */ + {1358, 2, 41}, /* UCAS */ + { 306, 2, 41}, /* CANADIANSYLLABICS */ + {1050, 2, 42}, /* OGHAM */ + {1186, 2, 43}, /* RUNIC */ + {1300, 2, 44}, /* TAGALOG */ + { 668, 2, 45}, /* HANUNOO */ + { 297, 2, 46}, /* BUHID */ + {1302, 2, 47}, /* TAGBANWA */ + { 772, 2, 48}, /* KHMER */ + { 968, 2, 49}, /* MONGOLIAN */ + {1365, 2, 50}, /* UNIFIEDCANADIANABORIGINALSYLLABICSEXTENDED */ + {1359, 2, 50}, /* UCASEXT */ + { 825, 2, 51}, /* LIMBU */ + {1305, 2, 52}, /* TAILE */ + {1001, 2, 53}, /* NEWTAILUE */ + { 773, 2, 54}, /* KHMERSYMBOLS */ + { 295, 2, 55}, /* BUGINESE */ + {1306, 2, 56}, /* TAITHAM */ + { 415, 2, 57}, /* COMBININGDIACRITICALMARKSEXTENDED */ + { 500, 2, 57}, /* DIACRITICALSEXT */ + { 240, 2, 58}, /* BALINESE */ + {1260, 2, 59}, /* SUNDANESE */ + { 248, 2, 60}, /* BATAK */ + { 819, 2, 61}, /* LEPCHA */ + {1054, 2, 62}, /* OLCHIKI */ + { 472, 2, 63}, /* CYRILLICEXTENDEDC */ + { 469, 2, 63}, /* CYRILLICEXTC */ + { 609, 2, 64}, /* GEORGIANEXTENDED */ + { 608, 2, 64}, /* GEORGIANEXT */ + {1262, 2, 65}, /* SUNDANESESUPPLEMENT */ + {1261, 2, 65}, /* SUNDANESESUP */ + {1379, 2, 66}, /* VEDICEXTENSIONS */ + {1378, 2, 66}, /* VEDICEXT */ + {1127, 2, 67}, /* PHONETICEXTENSIONS */ + {1126, 2, 67}, /* PHONETICEXT */ + {1128, 2, 68}, /* PHONETICEXTENSIONSSUPPLEMENT */ + {1129, 2, 68}, /* PHONETICEXTSUP */ + { 417, 2, 69}, /* COMBININGDIACRITICALMARKSSUPPLEMENT */ + { 502, 2, 69}, /* DIACRITICALSSUP */ + { 801, 2, 70}, /* LATINEXTENDEDADDITIONAL */ + { 795, 2, 70}, /* LATINEXTADDITIONAL */ + { 634, 2, 71}, /* GREEKEXTENDED */ + { 633, 2, 71}, /* GREEKEXT */ + { 602, 2, 72}, /* GENERALPUNCTUATION */ + {1154, 2, 72}, /* PUNCTUATION */ + {1269, 2, 73}, /* SUPERSCRIPTSANDSUBSCRIPTS */ + {1268, 2, 73}, /* SUPERANDSUB */ + { 458, 2, 74}, /* CURRENCYSYMBOLS */ + { 416, 2, 75}, /* COMBININGDIACRITICALMARKSFORSYMBOLS */ + { 501, 2, 75}, /* DIACRITICALSFORSYMBOLS */ + { 420, 2, 75}, /* COMBININGMARKSFORSYMBOLS */ + { 821, 2, 76}, /* LETTERLIKESYMBOLS */ + {1036, 2, 77}, /* NUMBERFORMS */ + { 219, 2, 78}, /* ARROWS */ + { 919, 2, 79}, /* MATHEMATICALOPERATORS */ + { 920, 2, 79}, /* MATHOPERATORS */ + { 952, 2, 80}, /* MISCELLANEOUSTECHNICAL */ + { 957, 2, 80}, /* MISCTECHNICAL */ + { 444, 2, 81}, /* CONTROLPICTURES */ + {1070, 2, 82}, /* OPTICALCHARACTERRECOGNITION */ + {1047, 2, 82}, /* OCR */ + { 548, 2, 83}, /* ENCLOSEDALPHANUMERICS */ + { 547, 2, 83}, /* ENCLOSEDALPHANUM */ + { 282, 2, 84}, /* BOXDRAWING */ + { 272, 2, 85}, /* BLOCKELEMENTS */ + { 603, 2, 86}, /* GEOMETRICSHAPES */ + { 949, 2, 87}, /* MISCELLANEOUSSYMBOLS */ + { 956, 2, 87}, /* MISCSYMBOLS */ + { 505, 2, 88}, /* DINGBATS */ + { 947, 2, 89}, /* MISCELLANEOUSMATHEMATICALSYMBOLSA */ + { 953, 2, 89}, /* MISCMATHSYMBOLSA */ + {1271, 2, 90}, /* SUPPLEMENTALARROWSA */ + {1264, 2, 90}, /* SUPARROWSA */ + { 289, 2, 91}, /* BRAILLEPATTERNS */ + { 288, 2, 91}, /* BRAILLE */ + {1272, 2, 92}, /* SUPPLEMENTALARROWSB */ + {1265, 2, 92}, /* SUPARROWSB */ + { 948, 2, 93}, /* MISCELLANEOUSMATHEMATICALSYMBOLSB */ + { 954, 2, 93}, /* MISCMATHSYMBOLSB */ + {1274, 2, 94}, /* SUPPLEMENTALMATHEMATICALOPERATORS */ + {1270, 2, 94}, /* SUPMATHOPERATORS */ + { 950, 2, 95}, /* MISCELLANEOUSSYMBOLSANDARROWS */ + { 946, 2, 95}, /* MISCARROWS */ + { 614, 2, 96}, /* GLAGOLITIC */ + { 803, 2, 97}, /* LATINEXTENDEDC */ + { 797, 2, 97}, /* LATINEXTC */ + { 446, 2, 98}, /* COPTIC */ + { 611, 2, 99}, /* GEORGIANSUPPLEMENT */ + { 610, 2, 99}, /* GEORGIANSUP */ + {1339, 2, 100}, /* TIFINAGH */ + { 563, 2, 101}, /* ETHIOPICEXTENDED */ + { 561, 2, 101}, /* ETHIOPICEXT */ + { 470, 2, 102}, /* CYRILLICEXTENDEDA */ + { 467, 2, 102}, /* CYRILLICEXTA */ + {1275, 2, 103}, /* SUPPLEMENTALPUNCTUATION */ + {1281, 2, 103}, /* SUPPUNCTUATION */ + { 393, 2, 104}, /* CJKRADICALSSUPPLEMENT */ + { 392, 2, 104}, /* CJKRADICALSSUP */ + { 760, 2, 105}, /* KANGXIRADICALS */ + { 759, 2, 105}, /* KANGXI */ + { 699, 2, 106}, /* IDEOGRAPHICDESCRIPTIONCHARACTERS */ + { 695, 2, 106}, /* IDC */ + { 396, 2, 107}, /* CJKSYMBOLSANDPUNCTUATION */ + { 395, 2, 107}, /* CJKSYMBOLS */ + { 684, 2, 108}, /* HIRAGANA */ + { 763, 2, 109}, /* KATAKANA */ + { 275, 2, 110}, /* BOPOMOFO */ + { 655, 2, 111}, /* HANGULCOMPATIBILITYJAMO */ + { 425, 2, 111}, /* COMPATJAMO */ + { 758, 2, 112}, /* KANBUN */ + { 277, 2, 113}, /* BOPOMOFOEXTENDED */ + { 276, 2, 113}, /* BOPOMOFOEXT */ + { 394, 2, 114}, /* CJKSTROKES */ + { 766, 2, 115}, /* KATAKANAPHONETICEXTENSIONS */ + { 764, 2, 115}, /* KATAKANAEXT */ + { 552, 2, 116}, /* ENCLOSEDCJKLETTERSANDMONTHS */ + { 551, 2, 116}, /* ENCLOSEDCJK */ + { 379, 2, 117}, /* CJKCOMPATIBILITY */ + { 377, 2, 117}, /* CJKCOMPAT */ + { 398, 2, 118}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONA */ + { 385, 2, 118}, /* CJKEXTA */ + {1427, 2, 119}, /* YIJINGHEXAGRAMSYMBOLS */ + {1426, 2, 119}, /* YIJING */ + { 397, 2, 120}, /* CJKUNIFIEDIDEOGRAPHS */ + { 376, 2, 120}, /* CJK */ + {1429, 2, 121}, /* YISYLLABLES */ + {1428, 2, 122}, /* YIRADICALS */ + { 835, 2, 123}, /* LISU */ + {1373, 2, 124}, /* VAI */ + { 471, 2, 125}, /* CYRILLICEXTENDEDB */ + { 468, 2, 125}, /* CYRILLICEXTB */ + { 242, 2, 126}, /* BAMUM */ + { 965, 2, 127}, /* MODIFIERTONELETTERS */ + { 804, 2, 128}, /* LATINEXTENDEDD */ + { 798, 2, 128}, /* LATINEXTD */ + {1289, 2, 129}, /* SYLOTINAGRI */ + { 422, 2, 130}, /* COMMONINDICNUMBERFORMS */ + { 710, 2, 130}, /* INDICNUMBERFORMS */ + {1119, 2, 131}, /* PHAGSPA */ + {1197, 2, 132}, /* SAURASHTRA */ + { 495, 2, 133}, /* DEVANAGARIEXTENDED */ + { 494, 2, 133}, /* DEVANAGARIEXT */ + { 767, 2, 134}, /* KAYAHLI */ + {1169, 2, 135}, /* REJANG */ + { 657, 2, 136}, /* HANGULJAMOEXTENDEDA */ + { 734, 2, 136}, /* JAMOEXTA */ + { 737, 2, 137}, /* JAVANESE */ + { 982, 2, 138}, /* MYANMAREXTENDEDB */ + { 980, 2, 138}, /* MYANMAREXTB */ + { 360, 2, 139}, /* CHAM */ + { 981, 2, 140}, /* MYANMAREXTENDEDA */ + { 979, 2, 140}, /* MYANMAREXTA */ + {1307, 2, 141}, /* TAIVIET */ + { 934, 2, 142}, /* MEETEIMAYEKEXTENSIONS */ + { 933, 2, 142}, /* MEETEIMAYEKEXT */ + { 564, 2, 143}, /* ETHIOPICEXTENDEDA */ + { 562, 2, 143}, /* ETHIOPICEXTA */ + { 805, 2, 144}, /* LATINEXTENDEDE */ + { 799, 2, 144}, /* LATINEXTE */ + { 369, 2, 145}, /* CHEROKEESUPPLEMENT */ + { 368, 2, 145}, /* CHEROKEESUP */ + { 932, 2, 146}, /* MEETEIMAYEK */ + { 659, 2, 147}, /* HANGULSYLLABLES */ + { 654, 2, 147}, /* HANGUL */ + { 658, 2, 148}, /* HANGULJAMOEXTENDEDB */ + { 735, 2, 148}, /* JAMOEXTB */ + { 682, 2, 149}, /* HIGHSURROGATES */ + { 680, 2, 150}, /* HIGHPRIVATEUSESURROGATES */ + { 681, 2, 150}, /* HIGHPUSURROGATES */ + { 846, 2, 151}, /* LOWSURROGATES */ + {1148, 2, 152}, /* PRIVATEUSEAREA */ + {1152, 2, 152}, /* PUA */ + {1147, 2, 152}, /* PRIVATEUSE */ + { 381, 2, 153}, /* CJKCOMPATIBILITYIDEOGRAPHS */ + { 383, 2, 153}, /* CJKCOMPATIDEOGRAPHS */ + { 191, 2, 154}, /* ALPHABETICPRESENTATIONFORMS */ + { 190, 2, 154}, /* ALPHABETICPF */ + { 212, 2, 155}, /* ARABICPRESENTATIONFORMSA */ + { 210, 2, 155}, /* ARABICPFA */ + {1376, 2, 156}, /* VARIATIONSELECTORS */ + {1391, 2, 156}, /* VS */ + {1382, 2, 157}, /* VERTICALFORMS */ + { 418, 2, 158}, /* COMBININGHALFMARKS */ + { 648, 2, 158}, /* HALFMARKS */ + { 380, 2, 159}, /* CJKCOMPATIBILITYFORMS */ + { 378, 2, 159}, /* CJKCOMPATFORMS */ + {1233, 2, 160}, /* SMALLFORMVARIANTS */ + {1232, 2, 160}, /* SMALLFORMS */ + { 213, 2, 161}, /* ARABICPRESENTATIONFORMSB */ + { 211, 2, 161}, /* ARABICPFB */ + { 650, 2, 162}, /* HALFWIDTHANDFULLWIDTHFORMS */ + { 647, 2, 162}, /* HALFANDFULLFORMS */ + {1251, 2, 163}, /* SPECIALS */ + { 831, 2, 164}, /* LINEARBSYLLABARY */ + { 830, 2, 165}, /* LINEARBIDEOGRAMS */ + { 172, 2, 166}, /* AEGEANNUMBERS */ + { 198, 2, 167}, /* ANCIENTGREEKNUMBERS */ + { 199, 2, 168}, /* ANCIENTSYMBOLS */ + {1121, 2, 169}, /* PHAISTOSDISC */ + {1120, 2, 169}, /* PHAISTOS */ + { 857, 2, 170}, /* LYCIAN */ + { 312, 2, 171}, /* CARIAN */ + { 447, 2, 172}, /* COPTICEPACTNUMBERS */ + {1057, 2, 173}, /* OLDITALIC */ + { 622, 2, 174}, /* GOTHIC */ + {1059, 2, 175}, /* OLDPERMIC */ + {1361, 2, 176}, /* UGARITIC */ + {1060, 2, 177}, /* OLDPERSIAN */ + { 491, 2, 178}, /* DESERET */ + {1216, 2, 179}, /* SHAVIAN */ + {1078, 2, 180}, /* OSMANYA */ + {1075, 2, 181}, /* OSAGE */ + { 533, 2, 182}, /* ELBASAN */ + { 317, 2, 183}, /* CAUCASIANALBANIAN */ + { 828, 2, 184}, /* LINEARA */ + { 465, 2, 185}, /* CYPRIOTSYLLABARY */ + { 708, 2, 186}, /* IMPERIALARAMAIC */ + {1102, 2, 187}, /* PALMYRENE */ + { 987, 2, 188}, /* NABATAEAN */ + { 670, 2, 189}, /* HATRAN */ + {1125, 2, 190}, /* PHOENICIAN */ + { 859, 2, 191}, /* LYDIAN */ + { 940, 2, 192}, /* MEROITICHIEROGLYPHS */ + { 939, 2, 193}, /* MEROITICCURSIVE */ + { 770, 2, 194}, /* KHAROSHTHI */ + {1062, 2, 195}, /* OLDSOUTHARABIAN */ + {1058, 2, 196}, /* OLDNORTHARABIAN */ + { 884, 2, 197}, /* MANICHAEAN */ + { 234, 2, 198}, /* AVESTAN */ + { 722, 2, 199}, /* INSCRIPTIONALPARTHIAN */ + { 721, 2, 200}, /* INSCRIPTIONALPAHLAVI */ + {1151, 2, 201}, /* PSALTERPAHLAVI */ + {1063, 2, 202}, /* OLDTURKIC */ + {1056, 2, 203}, /* OLDHUNGARIAN */ + { 662, 2, 204}, /* HANIFIROHINGYA */ + {1185, 2, 205}, /* RUMINUMERALSYMBOLS */ + {1184, 2, 205}, /* RUMI */ + {1423, 2, 206}, /* YEZIDI */ + {1061, 2, 207}, /* OLDSOGDIAN */ + {1240, 2, 208}, /* SOGDIAN */ + { 371, 2, 209}, /* CHORASMIAN */ + { 535, 2, 210}, /* ELYMAIC */ + { 285, 2, 211}, /* BRAHMI */ + { 750, 2, 212}, /* KAITHI */ + {1243, 2, 213}, /* SORASOMPENG */ + { 359, 2, 214}, /* CHAKMA */ + { 862, 2, 215}, /* MAHAJANI */ + {1215, 2, 216}, /* SHARADA */ + {1228, 2, 217}, /* SINHALAARCHAICNUMBERS */ + { 776, 2, 218}, /* KHOJKI */ + { 975, 2, 219}, /* MULTANI */ + { 777, 2, 220}, /* KHUDAWADI */ + { 624, 2, 221}, /* GRANTHA */ + { 999, 2, 222}, /* NEWA */ + {1341, 2, 223}, /* TIRHUTA */ + {1222, 2, 224}, /* SIDDHAM */ + { 961, 2, 225}, /* MODI */ + { 970, 2, 226}, /* MONGOLIANSUPPLEMENT */ + { 969, 2, 226}, /* MONGOLIANSUP */ + {1311, 2, 227}, /* TAKRI */ + { 178, 2, 228}, /* AHOM */ + { 508, 2, 229}, /* DOGRA */ + {1396, 2, 230}, /* WARANGCITI */ + { 506, 2, 231}, /* DIVESAKURU */ + { 990, 2, 232}, /* NANDINAGARI */ + {1435, 2, 233}, /* ZANABAZARSQUARE */ + {1245, 2, 234}, /* SOYOMBO */ + {1109, 2, 235}, /* PAUCINHAU */ + { 259, 2, 236}, /* BHAIKSUKI */ + { 913, 2, 237}, /* MARCHEN */ + { 915, 2, 238}, /* MASARAMGONDI */ + { 640, 2, 239}, /* GUNJALAGONDI */ + { 867, 2, 240}, /* MAKASAR */ + { 837, 2, 241}, /* LISUSUPPLEMENT */ + { 836, 2, 241}, /* LISUSUP */ + {1316, 2, 242}, /* TAMILSUPPLEMENT */ + {1315, 2, 242}, /* TAMILSUP */ + { 454, 2, 243}, /* CUNEIFORM */ + { 456, 2, 244}, /* CUNEIFORMNUMBERSANDPUNCTUATION */ + { 455, 2, 244}, /* CUNEIFORMNUMBERS */ + { 522, 2, 245}, /* EARLYDYNASTICCUNEIFORM */ + { 531, 2, 246}, /* EGYPTIANHIEROGLYPHS */ + { 530, 2, 247}, /* EGYPTIANHIEROGLYPHFORMATCONTROLS */ + { 195, 2, 248}, /* ANATOLIANHIEROGLYPHS */ + { 244, 2, 249}, /* BAMUMSUPPLEMENT */ + { 243, 2, 249}, /* BAMUMSUP */ + { 971, 2, 250}, /* MRO */ + { 247, 2, 251}, /* BASSAVAH */ + {1100, 2, 252}, /* PAHAWHHMONG */ + { 928, 2, 253}, /* MEDEFAIDRIN */ + { 941, 2, 254}, /* MIAO */ + { 701, 2, 255}, /* IDEOGRAPHICSYMBOLSANDPUNCTUATION */ + { 700, 2, 255}, /* IDEOGRAPHICSYMBOLS */ + {1319, 2, 256}, /* TANGUT */ + {1320, 2, 257}, /* TANGUTCOMPONENTS */ + { 771, 2, 258}, /* KHITANSMALLSCRIPT */ + {1322, 2, 259}, /* TANGUTSUPPLEMENT */ + {1321, 2, 259}, /* TANGUTSUP */ + { 756, 2, 260}, /* KANASUPPLEMENT */ + { 755, 2, 260}, /* KANASUP */ + { 754, 2, 261}, /* KANAEXTENDEDA */ + { 753, 2, 261}, /* KANAEXTA */ + {1235, 2, 262}, /* SMALLKANAEXTENSION */ + {1234, 2, 262}, /* SMALLKANAEXT */ + {1042, 2, 263}, /* NUSHU */ + { 519, 2, 264}, /* DUPLOYAN */ + {1219, 2, 265}, /* SHORTHANDFORMATCONTROLS */ + { 300, 2, 266}, /* BYZANTINEMUSICALSYMBOLS */ + { 299, 2, 266}, /* BYZANTINEMUSIC */ + { 977, 2, 267}, /* MUSICALSYMBOLS */ + { 976, 2, 267}, /* MUSIC */ + { 197, 2, 268}, /* ANCIENTGREEKMUSICALNOTATION */ + { 196, 2, 268}, /* ANCIENTGREEKMUSIC */ + { 922, 2, 269}, /* MAYANNUMERALS */ + {1309, 2, 270}, /* TAIXUANJINGSYMBOLS */ + {1308, 2, 270}, /* TAIXUANJING */ + { 449, 2, 271}, /* COUNTINGRODNUMERALS */ + { 448, 2, 271}, /* COUNTINGROD */ + { 918, 2, 272}, /* MATHEMATICALALPHANUMERICSYMBOLS */ + { 917, 2, 272}, /* MATHALPHANUM */ + {1284, 2, 273}, /* SUTTONSIGNWRITING */ + { 616, 2, 274}, /* GLAGOLITICSUPPLEMENT */ + { 615, 2, 274}, /* GLAGOLITICSUP */ + {1045, 2, 275}, /* NYIAKENGPUACHUEHMONG */ + {1394, 2, 276}, /* WANCHO */ + { 936, 2, 277}, /* MENDEKIKAKUI */ + { 170, 2, 278}, /* ADLAM */ + { 712, 2, 279}, /* INDICSIYAQNUMBERS */ + {1093, 2, 280}, /* OTTOMANSIYAQNUMBERS */ + { 208, 2, 281}, /* ARABICMATHEMATICALALPHABETICSYMBOLS */ + { 207, 2, 281}, /* ARABICMATH */ + { 865, 2, 282}, /* MAHJONGTILES */ + { 864, 2, 282}, /* MAHJONG */ + { 510, 2, 283}, /* DOMINOTILES */ + { 509, 2, 283}, /* DOMINO */ + {1131, 2, 284}, /* PLAYINGCARDS */ + { 549, 2, 285}, /* ENCLOSEDALPHANUMERICSUPPLEMENT */ + { 550, 2, 285}, /* ENCLOSEDALPHANUMSUP */ + { 554, 2, 286}, /* ENCLOSEDIDEOGRAPHICSUPPLEMENT */ + { 553, 2, 286}, /* ENCLOSEDIDEOGRAPHICSUP */ + { 951, 2, 287}, /* MISCELLANEOUSSYMBOLSANDPICTOGRAPHS */ + { 955, 2, 287}, /* MISCPICTOGRAPHS */ + { 544, 2, 288}, /* EMOTICONS */ + {1073, 2, 289}, /* ORNAMENTALDINGBATS */ + {1355, 2, 290}, /* TRANSPORTANDMAPSYMBOLS */ + {1354, 2, 290}, /* TRANSPORTANDMAP */ + { 184, 2, 291}, /* ALCHEMICALSYMBOLS */ + { 183, 2, 291}, /* ALCHEMICAL */ + { 605, 2, 292}, /* GEOMETRICSHAPESEXTENDED */ + { 604, 2, 292}, /* GEOMETRICSHAPESEXT */ + {1273, 2, 293}, /* SUPPLEMENTALARROWSC */ + {1266, 2, 293}, /* SUPARROWSC */ + {1276, 2, 294}, /* SUPPLEMENTALSYMBOLSANDPICTOGRAPHS */ + {1282, 2, 294}, /* SUPSYMBOLSANDPICTOGRAPHS */ + { 370, 2, 295}, /* CHESSSYMBOLS */ + {1292, 2, 296}, /* SYMBOLSANDPICTOGRAPHSEXTENDEDA */ + {1291, 2, 296}, /* SYMBOLSANDPICTOGRAPHSEXTA */ + {1293, 2, 297}, /* SYMBOLSFORLEGACYCOMPUTING */ + { 399, 2, 298}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONB */ + { 386, 2, 298}, /* CJKEXTB */ + { 400, 2, 299}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONC */ + { 387, 2, 299}, /* CJKEXTC */ + { 401, 2, 300}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIOND */ + { 388, 2, 300}, /* CJKEXTD */ + { 402, 2, 301}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONE */ + { 389, 2, 301}, /* CJKEXTE */ + { 403, 2, 302}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONF */ + { 390, 2, 302}, /* CJKEXTF */ + { 382, 2, 303}, /* CJKCOMPATIBILITYIDEOGRAPHSSUPPLEMENT */ + { 384, 2, 303}, /* CJKCOMPATIDEOGRAPHSSUP */ + { 404, 2, 304}, /* CJKUNIFIEDIDEOGRAPHSEXTENSIONG */ + { 391, 2, 304}, /* CJKEXTG */ + {1303, 2, 305}, /* TAGS */ + {1377, 2, 306}, /* VARIATIONSELECTORSSUPPLEMENT */ + {1392, 2, 306}, /* VSSUP */ + {1277, 2, 307}, /* SUPPLEMENTARYPRIVATEUSEAREAA */ + {1279, 2, 307}, /* SUPPUAA */ + {1278, 2, 308}, /* SUPPLEMENTARYPRIVATEUSEAREAB */ + {1280, 2, 308}, /* SUPPUAB */ + {1027, 3, 0}, /* NOTREORDERED */ + { 1, 3, 0}, /* 0 */ + {1028, 3, 0}, /* NR */ + { 167, 3, 1}, /* ABOVE */ + { 75, 3, 1}, /* 230 */ + { 166, 3, 1}, /* A */ + { 169, 3, 2}, /* ABOVERIGHT */ + { 76, 3, 2}, /* 232 */ + { 201, 3, 2}, /* AR */ + { 253, 3, 3}, /* BELOW */ + { 69, 3, 3}, /* 220 */ + { 236, 3, 3}, /* B */ + { 230, 3, 4}, /* ATTACHEDABOVERIGHT */ + { 65, 3, 4}, /* 216 */ + { 225, 3, 4}, /* ATAR */ + { 231, 3, 5}, /* ATTACHEDBELOW */ + { 62, 3, 5}, /* 202 */ + { 226, 3, 5}, /* ATB */ + {1096, 3, 6}, /* OVERLAY */ + { 2, 3, 6}, /* 1 */ + {1095, 3, 6}, /* OV */ + { 726, 3, 7}, /* IOTASUBSCRIPT */ + { 80, 3, 7}, /* 240 */ + { 729, 3, 7}, /* IS */ + { 512, 3, 8}, /* DOUBLEBELOW */ + { 77, 3, 8}, /* 233 */ + { 483, 3, 8}, /* DB */ + { 511, 3, 9}, /* DOUBLEABOVE */ + { 78, 3, 9}, /* 234 */ + { 478, 3, 9}, /* DA */ + { 255, 3, 10}, /* BELOWRIGHT */ + { 70, 3, 10}, /* 222 */ + { 283, 3, 10}, /* BR */ + { 168, 3, 11}, /* ABOVELEFT */ + { 73, 3, 11}, /* 228 */ + { 181, 3, 11}, /* AL */ + { 321, 3, 12}, /* CCC10 */ + { 21, 3, 12}, /* 10 */ + { 324, 3, 13}, /* CCC11 */ + { 33, 3, 13}, /* 11 */ + { 326, 3, 14}, /* CCC12 */ + { 37, 3, 14}, /* 12 */ + { 329, 3, 15}, /* CCC13 */ + { 40, 3, 15}, /* 13 */ + { 333, 3, 16}, /* CCC14 */ + { 45, 3, 16}, /* 14 */ + { 334, 3, 17}, /* CCC15 */ + { 46, 3, 17}, /* 15 */ + { 335, 3, 18}, /* CCC16 */ + { 48, 3, 18}, /* 16 */ + { 336, 3, 19}, /* CCC17 */ + { 49, 3, 19}, /* 17 */ + { 337, 3, 20}, /* CCC18 */ + { 51, 3, 20}, /* 18 */ + { 338, 3, 21}, /* CCC19 */ + { 52, 3, 21}, /* 19 */ + { 339, 3, 22}, /* CCC20 */ + { 56, 3, 22}, /* 20 */ + { 340, 3, 23}, /* CCC21 */ + { 63, 3, 23}, /* 21 */ + { 341, 3, 24}, /* CCC22 */ + { 68, 3, 24}, /* 22 */ + { 342, 3, 25}, /* CCC23 */ + { 74, 3, 25}, /* 23 */ + { 343, 3, 26}, /* CCC24 */ + { 79, 3, 26}, /* 24 */ + { 344, 3, 27}, /* CCC25 */ + { 81, 3, 27}, /* 25 */ + { 349, 3, 28}, /* CCC30 */ + { 95, 3, 28}, /* 30 */ + { 350, 3, 29}, /* CCC31 */ + { 100, 3, 29}, /* 31 */ + { 351, 3, 30}, /* CCC32 */ + { 101, 3, 30}, /* 32 */ + { 346, 3, 31}, /* CCC27 */ + { 83, 3, 31}, /* 27 */ + { 347, 3, 32}, /* CCC28 */ + { 84, 3, 32}, /* 28 */ + { 348, 3, 33}, /* CCC29 */ + { 85, 3, 33}, /* 29 */ + { 352, 3, 34}, /* CCC33 */ + { 102, 3, 34}, /* 33 */ + { 353, 3, 35}, /* CCC34 */ + { 103, 3, 35}, /* 34 */ + { 354, 3, 36}, /* CCC35 */ + { 104, 3, 36}, /* 35 */ + { 355, 3, 37}, /* CCC36 */ + { 105, 3, 37}, /* 36 */ + {1034, 3, 38}, /* NUKTA */ + { 142, 3, 38}, /* 7 */ + {1011, 3, 38}, /* NK */ + {1383, 3, 39}, /* VIRAMA */ + { 158, 3, 39}, /* 9 */ + {1390, 3, 39}, /* VR */ + { 356, 3, 40}, /* CCC84 */ + { 157, 3, 40}, /* 84 */ + { 357, 3, 41}, /* CCC91 */ + { 165, 3, 41}, /* 91 */ + { 322, 3, 42}, /* CCC103 */ + { 31, 3, 42}, /* 103 */ + { 323, 3, 43}, /* CCC107 */ + { 32, 3, 43}, /* 107 */ + { 325, 3, 44}, /* CCC118 */ + { 36, 3, 44}, /* 118 */ + { 327, 3, 45}, /* CCC122 */ + { 38, 3, 45}, /* 122 */ + { 328, 3, 46}, /* CCC129 */ + { 39, 3, 46}, /* 129 */ + { 330, 3, 47}, /* CCC130 */ + { 42, 3, 47}, /* 130 */ + { 331, 3, 48}, /* CCC132 */ + { 43, 3, 48}, /* 132 */ + { 229, 3, 49}, /* ATTACHEDABOVE */ + { 64, 3, 49}, /* 214 */ + { 224, 3, 49}, /* ATA */ + { 254, 3, 50}, /* BELOWLEFT */ + { 67, 3, 50}, /* 218 */ + { 268, 3, 50}, /* BL */ + { 811, 3, 51}, /* LEFT */ + { 71, 3, 51}, /* 224 */ + { 783, 3, 51}, /* L */ + { 757, 3, 52}, /* KANAVOICING */ + { 151, 3, 52}, /* 8 */ + { 782, 3, 52}, /* KV */ + { 345, 3, 53}, /* CCC26 */ + { 82, 3, 53}, /* 26 */ + { 667, 3, 54}, /* HANREADING */ + { 136, 3, 54}, /* 6 */ + { 666, 3, 54}, /* HANR */ + {1172, 3, 55}, /* RIGHT */ + { 72, 3, 55}, /* 226 */ + {1164, 3, 55}, /* R */ + { 332, 3, 56}, /* CCC133 */ + { 44, 3, 56}, /* 133 */ + { 232, 3, 57}, /* ATTACHEDBELOWLEFT */ + { 57, 3, 57}, /* 200 */ + { 227, 3, 57}, /* ATBL */ + {1020, 4, 0}, /* NONE */ + {1017, 4, 1}, /* NOBREAK */ + { 994, 4, 1}, /* NB */ + { 424, 4, 2}, /* COMPAT */ + { 413, 4, 2}, /* COM */ + {1267, 4, 3}, /* SUPER */ + {1263, 4, 3}, /* SUP */ + { 592, 4, 4}, /* FRACTION */ + { 591, 4, 4}, /* FRA */ + { 307, 4, 5}, /* CANONICAL */ + { 304, 4, 5}, /* CAN */ + {1258, 4, 6}, /* SUB */ + { 589, 4, 7}, /* FONT */ + { 374, 4, 8}, /* CIRCLE */ + { 546, 4, 8}, /* ENC */ + {1401, 4, 9}, /* WIDE */ + {1381, 4, 10}, /* VERTICAL */ + {1380, 4, 10}, /* VERT */ + {1254, 4, 11}, /* SQUARE */ + {1253, 4, 11}, /* SQR */ + { 731, 4, 12}, /* ISOLATED */ + { 730, 4, 12}, /* ISO */ + { 584, 4, 13}, /* FINAL */ + { 583, 4, 13}, /* FIN */ + { 717, 4, 14}, /* INITIAL */ + { 716, 4, 14}, /* INIT */ + { 930, 4, 15}, /* MEDIAL */ + { 927, 4, 15}, /* MED */ + {1231, 4, 16}, /* SMALL */ + {1236, 4, 16}, /* SML */ + { 993, 4, 17}, /* NARROW */ + { 991, 4, 17}, /* NAR */ + { 998, 5, 0}, /* NEUTRAL */ + { 984, 5, 0}, /* N */ + { 993, 5, 1}, /* NARROW */ + { 986, 5, 1}, /* NA */ + { 193, 5, 2}, /* AMBIGUOUS */ + { 166, 5, 2}, /* A */ + {1401, 5, 3}, /* WIDE */ + {1393, 5, 3}, /* W */ + { 649, 5, 4}, /* HALFWIDTH */ + { 643, 5, 4}, /* H */ + { 594, 5, 5}, /* FULLWIDTH */ + { 578, 5, 5}, /* F */ + {1363, 6, 0}, /* UNASSIGNED */ + { 410, 6, 0}, /* CN */ + { 443, 6, 1}, /* CONTROL */ + { 319, 6, 1}, /* CC */ + { 411, 6, 1}, /* CNTRL */ + {1248, 6, 2}, /* SPACESEPARATOR */ + {1441, 6, 2}, /* ZS */ + {1090, 6, 3}, /* OTHERPUNCTUATION */ + {1133, 6, 3}, /* PO */ + { 457, 6, 4}, /* CURRENCYSYMBOL */ + {1199, 6, 4}, /* SC */ + {1069, 6, 5}, /* OPENPUNCTUATION */ + {1150, 6, 5}, /* PS */ + { 408, 6, 6}, /* CLOSEPUNCTUATION */ + {1115, 6, 6}, /* PE */ + { 921, 6, 7}, /* MATHSYMBOL */ + {1230, 6, 7}, /* SM */ + { 482, 6, 8}, /* DASHPUNCTUATION */ + {1112, 6, 8}, /* PD */ + { 486, 6, 9}, /* DECIMALNUMBER */ + { 997, 6, 9}, /* ND */ + { 504, 6, 9}, /* DIGIT */ + {1371, 6, 10}, /* UPPERCASELETTER */ + { 851, 6, 10}, /* LU */ + { 964, 6, 11}, /* MODIFIERSYMBOL */ + {1229, 6, 11}, /* SK */ + { 428, 6, 12}, /* CONNECTORPUNCTUATION */ + {1110, 6, 12}, /* PC */ + { 845, 6, 13}, /* LOWERCASELETTER */ + { 838, 6, 13}, /* LL */ + {1091, 6, 14}, /* OTHERSYMBOL */ + {1237, 6, 14}, /* SO */ + {1085, 6, 15}, /* OTHERLETTER */ + { 840, 6, 15}, /* LO */ + { 718, 6, 16}, /* INITIALPUNCTUATION */ + {1130, 6, 16}, /* PI */ + { 590, 6, 17}, /* FORMAT */ + { 358, 6, 17}, /* CF */ + {1089, 6, 18}, /* OTHERNUMBER */ + {1015, 6, 18}, /* NO */ + { 585, 6, 19}, /* FINALPUNCTUATION */ + {1117, 6, 19}, /* PF */ + {1342, 6, 20}, /* TITLECASELETTER */ + { 850, 6, 20}, /* LT */ + { 962, 6, 21}, /* MODIFIERLETTER */ + { 839, 6, 21}, /* LM */ + {1023, 6, 22}, /* NONSPACINGMARK */ + { 960, 6, 22}, /* MN */ + { 555, 6, 23}, /* ENCLOSINGMARK */ + { 926, 6, 23}, /* ME */ + {1249, 6, 24}, /* SPACINGMARK */ + { 925, 6, 24}, /* MC */ + { 822, 6, 25}, /* LETTERNUMBER */ + {1014, 6, 25}, /* NL */ + { 834, 6, 26}, /* LINESEPARATOR */ + {1439, 6, 26}, /* ZL */ + {1103, 6, 27}, /* PARAGRAPHSEPARATOR */ + {1440, 6, 27}, /* ZP */ + {1283, 6, 28}, /* SURROGATE */ + { 453, 6, 28}, /* CS */ + {1147, 6, 29}, /* PRIVATEUSE */ + { 412, 6, 29}, /* CO */ + {1079, 6, 30}, /* OTHER */ + { 301, 6, 30}, /* C */ + { 302, 6, 30}, /* C& */ + { 820, 6, 31}, /* LETTER */ + { 783, 6, 31}, /* L */ + { 784, 6, 31}, /* L& */ + { 914, 6, 32}, /* MARK */ + { 860, 6, 32}, /* M */ + { 419, 6, 32}, /* COMBININGMARK */ + { 861, 6, 32}, /* M& */ + {1035, 6, 33}, /* NUMBER */ + { 984, 6, 33}, /* N */ + { 985, 6, 33}, /* N& */ + {1154, 6, 34}, /* PUNCTUATION */ + {1098, 6, 34}, /* P */ + {1153, 6, 34}, /* PUNCT */ + {1099, 6, 34}, /* P& */ + {1290, 6, 35}, /* SYMBOL */ + {1188, 6, 35}, /* S */ + {1189, 6, 35}, /* S& */ + {1212, 6, 36}, /* SEPARATOR */ + {1432, 6, 36}, /* Z */ + {1433, 6, 36}, /* Z& */ + { 315, 6, 37}, /* CASEDLETTER */ + { 808, 6, 37}, /* LC */ + { 222, 6, 38}, /* ASSIGNED */ + {1079, 7, 0}, /* OTHER */ + {1416, 7, 0}, /* XX */ + { 443, 7, 1}, /* CONTROL */ + { 410, 7, 1}, /* CN */ + { 823, 7, 2}, /* LF */ + { 452, 7, 3}, /* CR */ + { 573, 7, 4}, /* EXTEND */ + { 570, 7, 4}, /* EX */ + {1144, 7, 5}, /* PREPEND */ + {1141, 7, 5}, /* PP */ + {1249, 7, 6}, /* SPACINGMARK */ + {1230, 7, 6}, /* SM */ + { 783, 7, 7}, /* L */ + {1372, 7, 8}, /* V */ + {1299, 7, 9}, /* T */ + {1443, 7, 10}, /* ZWJ */ + { 852, 7, 11}, /* LV */ + { 854, 7, 12}, /* LVT */ + {1166, 7, 13}, /* REGIONALINDICATOR */ + {1171, 7, 13}, /* RI */ + { 525, 7, 14}, /* EBASE */ + { 524, 7, 14}, /* EB */ + { 526, 7, 15}, /* EBASEGAZ */ + { 527, 7, 15}, /* EBG */ + { 538, 7, 16}, /* EMODIFIER */ + { 536, 7, 16}, /* EM */ + { 618, 7, 17}, /* GLUEAFTERZWJ */ + { 597, 7, 17}, /* GAZ */ + {1026, 8, 0}, /* NOTAPPLICABLE */ + { 986, 8, 0}, /* NA */ + { 810, 8, 1}, /* LEADINGJAMO */ + { 783, 8, 1}, /* L */ + {1389, 8, 2}, /* VOWELJAMO */ + {1372, 8, 2}, /* V */ + {1352, 8, 3}, /* TRAILINGJAMO */ + {1299, 8, 3}, /* T */ + { 853, 8, 4}, /* LVSYLLABLE */ + { 852, 8, 4}, /* LV */ + { 855, 8, 5}, /* LVTSYLLABLE */ + { 854, 8, 5}, /* LVT */ + { 986, 9, 0}, /* NA */ + {1345, 9, 1}, /* TOP */ + {1172, 9, 2}, /* RIGHT */ + { 278, 9, 3}, /* BOTTOM */ + { 811, 9, 4}, /* LEFT */ + { 812, 9, 5}, /* LEFTANDRIGHT */ + {1351, 9, 6}, /* TOPANDRIGHT */ + {1349, 9, 7}, /* TOPANDLEFT */ + {1350, 9, 8}, /* TOPANDLEFTANDRIGHT */ + {1346, 9, 9}, /* TOPANDBOTTOM */ + {1385, 9, 10}, /* VISUALORDERLEFT */ + {1347, 9, 11}, /* TOPANDBOTTOMANDLEFT */ + { 280, 9, 12}, /* BOTTOMANDRIGHT */ + {1348, 9, 13}, /* TOPANDBOTTOMANDRIGHT */ + {1097, 9, 14}, /* OVERSTRUCK */ + { 279, 9, 15}, /* BOTTOMANDLEFT */ + {1079, 10, 0}, /* OTHER */ + { 436, 10, 1}, /* CONSONANTPLACEHOLDER */ + {1035, 10, 2}, /* NUMBER */ + {1287, 10, 3}, /* SYLLABLEMODIFIER */ + { 266, 10, 4}, /* BINDU */ + {1384, 10, 5}, /* VISARGA */ + {1388, 10, 6}, /* VOWELINDEPENDENT */ + { 429, 10, 7}, /* CONSONANT */ + {1387, 10, 8}, /* VOWELDEPENDENT */ + {1034, 10, 9}, /* NUKTA */ + { 233, 10, 10}, /* AVAGRAHA */ + {1383, 10, 11}, /* VIRAMA */ + { 310, 10, 12}, /* CANTILLATIONMARK */ + { 430, 10, 13}, /* CONSONANTDEAD */ + { 600, 10, 14}, /* GEMINATIONMARK */ + { 435, 10, 15}, /* CONSONANTMEDIAL */ + { 966, 10, 16}, /* MODIFYINGLETTER */ + { 441, 10, 17}, /* CONSONANTWITHSTACKER */ + {1155, 10, 18}, /* PUREKILLER */ + { 437, 10, 19}, /* CONSONANTPRECEDINGREPHA */ + {1344, 10, 20}, /* TONEMARK */ + { 434, 10, 21}, /* CONSONANTKILLER */ + { 432, 10, 22}, /* CONSONANTHEADLETTER */ + { 439, 10, 23}, /* CONSONANTSUBJOINED */ + { 725, 10, 24}, /* INVISIBLESTACKER */ + {1167, 10, 25}, /* REGISTERSHIFTER */ + { 440, 10, 26}, /* CONSONANTSUCCEEDINGREPHA */ + { 431, 10, 27}, /* CONSONANTFINAL */ + {1386, 10, 28}, /* VOWEL */ + {1343, 10, 29}, /* TONELETTER */ + { 433, 10, 30}, /* CONSONANTINITIALPOSTFIXED */ + {1021, 10, 31}, /* NONJOINER */ + { 743, 10, 32}, /* JOINER */ + { 286, 10, 33}, /* BRAHMIJOININGNUMBER */ + {1037, 10, 34}, /* NUMBERJOINER */ + { 438, 10, 35}, /* CONSONANTPREFIXED */ + {1018, 11, 0}, /* NOJOININGGROUP */ + {1418, 11, 1}, /* YEH */ + { 185, 11, 2}, /* ALEF */ + {1397, 11, 3}, /* WAW */ + { 252, 11, 4}, /* BEH */ + {1325, 11, 5}, /* TEHMARBUTA */ + { 646, 11, 6}, /* HAH */ + { 479, 11, 7}, /* DAL */ + {1168, 11, 8}, /* REH */ + {1206, 11, 9}, /* SEEN */ + {1191, 11, 10}, /* SAD */ + {1304, 11, 11}, /* TAH */ + { 180, 11, 12}, /* AIN */ + { 595, 11, 13}, /* GAF */ + { 580, 11, 14}, /* FARSIYEH */ + { 582, 11, 15}, /* FEH */ + {1158, 11, 16}, /* QAF */ + { 749, 11, 17}, /* KAF */ + { 785, 11, 18}, /* LAM */ + { 931, 11, 19}, /* MEEM */ + {1025, 11, 20}, /* NOON */ + { 675, 11, 21}, /* HEH */ + {1285, 11, 22}, /* SWASHKAF */ + {1044, 11, 23}, /* NYA */ + { 780, 11, 24}, /* KNOTTEDHEH */ + { 676, 11, 25}, /* HEHGOAL */ + { 651, 11, 26}, /* HAMZAONHEHGOAL */ + {1326, 11, 26}, /* TEHMARBUTAGOAL */ + {1420, 11, 27}, /* YEHWITHTAIL */ + {1419, 11, 28}, /* YEHBARREE */ + { 182, 11, 29}, /* ALAPH */ + { 258, 11, 30}, /* BETH */ + { 596, 11, 31}, /* GAMAL */ + { 480, 11, 32}, /* DALATHRISH */ + { 671, 11, 33}, /* HE */ + {1298, 11, 34}, /* SYRIACWAW */ + {1434, 11, 35}, /* ZAIN */ + { 677, 11, 36}, /* HETH */ + {1331, 11, 37}, /* TETH */ + {1430, 11, 38}, /* YUDH */ + {1431, 11, 39}, /* YUDHHE */ + { 762, 11, 40}, /* KAPH */ + { 786, 11, 41}, /* LAMADH */ + { 945, 11, 42}, /* MIM */ + {1041, 11, 43}, /* NUN */ + {1208, 11, 44}, /* SEMKATH */ + { 586, 11, 45}, /* FINALSEMKATH */ + { 520, 11, 46}, /* E */ + {1115, 11, 47}, /* PE */ + {1170, 11, 48}, /* REVERSEDPE */ + {1192, 11, 49}, /* SADHE */ + {1159, 11, 50}, /* QAPH */ + {1218, 11, 51}, /* SHIN */ + {1324, 11, 52}, /* TAW */ + {1437, 11, 53}, /* ZHAIN */ + { 768, 11, 54}, /* KHAPH */ + { 581, 11, 55}, /* FE */ + { 298, 11, 56}, /* BURUSHASKIYEHBARREE */ + { 873, 11, 57}, /* MALAYALAMNGA */ + { 870, 11, 58}, /* MALAYALAMJA */ + { 876, 11, 59}, /* MALAYALAMNYA */ + { 879, 11, 60}, /* MALAYALAMTTA */ + { 874, 11, 61}, /* MALAYALAMNNA */ + { 875, 11, 62}, /* MALAYALAMNNNA */ + { 869, 11, 63}, /* MALAYALAMBHA */ + { 877, 11, 64}, /* MALAYALAMRA */ + { 871, 11, 65}, /* MALAYALAMLLA */ + { 872, 11, 66}, /* MALAYALAMLLLA */ + { 878, 11, 67}, /* MALAYALAMSSA */ + {1183, 11, 68}, /* ROHINGYAYEH */ + {1257, 11, 69}, /* STRAIGHTWAW */ + { 173, 11, 70}, /* AFRICANFEH */ + { 175, 11, 71}, /* AFRICANQAF */ + { 174, 11, 72}, /* AFRICANNOON */ + { 885, 11, 73}, /* MANICHAEANALEPH */ + { 887, 11, 74}, /* MANICHAEANBETH */ + { 891, 11, 75}, /* MANICHAEANGIMEL */ + { 888, 11, 76}, /* MANICHAEANDALETH */ + { 909, 11, 77}, /* MANICHAEANWAW */ + { 911, 11, 78}, /* MANICHAEANZAYIN */ + { 892, 11, 79}, /* MANICHAEANHETH */ + { 906, 11, 80}, /* MANICHAEANTETH */ + { 910, 11, 81}, /* MANICHAEANYODH */ + { 894, 11, 82}, /* MANICHAEANKAPH */ + { 895, 11, 83}, /* MANICHAEANLAMEDH */ + { 889, 11, 84}, /* MANICHAEANDHAMEDH */ + { 907, 11, 85}, /* MANICHAEANTHAMEDH */ + { 896, 11, 86}, /* MANICHAEANMEM */ + { 897, 11, 87}, /* MANICHAEANNUN */ + { 903, 11, 88}, /* MANICHAEANSAMEKH */ + { 886, 11, 89}, /* MANICHAEANAYIN */ + { 899, 11, 90}, /* MANICHAEANPE */ + { 902, 11, 91}, /* MANICHAEANSADHE */ + { 900, 11, 92}, /* MANICHAEANQOPH */ + { 901, 11, 93}, /* MANICHAEANRESH */ + { 904, 11, 94}, /* MANICHAEANTAW */ + { 898, 11, 95}, /* MANICHAEANONE */ + { 890, 11, 96}, /* MANICHAEANFIVE */ + { 905, 11, 97}, /* MANICHAEANTEN */ + { 908, 11, 98}, /* MANICHAEANTWENTY */ + { 893, 11, 99}, /* MANICHAEANHUNDRED */ + { 664, 11, 100}, /* HANIFIROHINGYAPA */ + { 663, 11, 101}, /* HANIFIROHINGYAKINNAYA */ + {1022, 12, 0}, /* NONJOINING */ + {1357, 12, 0}, /* U */ + {1353, 12, 1}, /* TRANSPARENT */ + {1299, 12, 1}, /* T */ + { 517, 12, 2}, /* DUALJOINING */ + { 477, 12, 2}, /* D */ + {1173, 12, 3}, /* RIGHTJOINING */ + {1164, 12, 3}, /* R */ + { 741, 12, 4}, /* JOINCAUSING */ + { 301, 12, 4}, /* C */ + { 813, 12, 5}, /* LEFTJOINING */ + { 783, 12, 5}, /* L */ + {1367, 13, 0}, /* UNKNOWN */ + {1416, 13, 0}, /* XX */ + { 419, 13, 1}, /* COMBININGMARK */ + { 409, 13, 1}, /* CM */ + { 290, 13, 2}, /* BREAKAFTER */ + { 238, 13, 2}, /* BA */ + { 833, 13, 3}, /* LINEFEED */ + { 823, 13, 3}, /* LF */ + { 882, 13, 4}, /* MANDATORYBREAK */ + { 267, 13, 4}, /* BK */ + { 313, 13, 5}, /* CARRIAGERETURN */ + { 452, 13, 5}, /* CR */ + {1247, 13, 6}, /* SPACE */ + {1246, 13, 6}, /* SP */ + { 571, 13, 7}, /* EXCLAMATION */ + { 570, 13, 7}, /* EX */ + {1162, 13, 8}, /* QUOTATION */ + {1161, 13, 8}, /* QU */ + { 189, 13, 9}, /* ALPHABETIC */ + { 181, 13, 9}, /* AL */ + {1143, 13, 10}, /* PREFIXNUMERIC */ + {1142, 13, 10}, /* PR */ + {1140, 13, 11}, /* POSTFIXNUMERIC */ + {1133, 13, 11}, /* PO */ + {1069, 13, 12}, /* OPENPUNCTUATION */ + {1068, 13, 12}, /* OP */ + { 407, 13, 13}, /* CLOSEPARENTHESIS */ + { 450, 13, 13}, /* CP */ + { 714, 13, 14}, /* INFIXNUMERIC */ + { 729, 13, 14}, /* IS */ + { 693, 13, 15}, /* HYPHEN */ + { 692, 13, 15}, /* HY */ + { 293, 13, 16}, /* BREAKSYMBOLS */ + {1286, 13, 16}, /* SY */ + {1038, 13, 17}, /* NUMERIC */ + {1033, 13, 17}, /* NU */ + { 408, 13, 18}, /* CLOSEPUNCTUATION */ + { 405, 13, 18}, /* CL */ + {1002, 13, 19}, /* NEXTLINE */ + {1014, 13, 19}, /* NL */ + { 617, 13, 20}, /* GLUE */ + { 612, 13, 20}, /* GL */ + { 193, 13, 21}, /* AMBIGUOUS */ + { 179, 13, 21}, /* AI */ + { 291, 13, 22}, /* BREAKBEFORE */ + { 250, 13, 22}, /* BB */ + { 674, 13, 23}, /* HEBREWLETTER */ + { 685, 13, 23}, /* HL */ + { 426, 13, 24}, /* COMPLEXCONTEXT */ + {1190, 13, 24}, /* SA */ + { 739, 13, 25}, /* JL */ + { 747, 13, 26}, /* JV */ + { 746, 13, 27}, /* JT */ + {1024, 13, 28}, /* NONSTARTER */ + {1029, 13, 28}, /* NS */ + {1444, 13, 29}, /* ZWSPACE */ + {1442, 13, 29}, /* ZW */ + {1443, 13, 30}, /* ZWJ */ + { 292, 13, 31}, /* BREAKBOTH */ + { 237, 13, 31}, /* B2 */ + { 723, 13, 32}, /* INSEPARABLE */ + { 709, 13, 32}, /* IN */ + { 724, 13, 32}, /* INSEPERABLE */ + {1405, 13, 33}, /* WORDJOINER */ + {1402, 13, 33}, /* WJ */ + { 698, 13, 34}, /* IDEOGRAPHIC */ + { 694, 13, 34}, /* ID */ + { 525, 13, 35}, /* EBASE */ + { 524, 13, 35}, /* EB */ + { 427, 13, 36}, /* CONDITIONALJAPANESESTARTER */ + { 375, 13, 36}, /* CJ */ + { 644, 13, 37}, /* H2 */ + { 645, 13, 38}, /* H3 */ + {1283, 13, 39}, /* SURROGATE */ + {1213, 13, 39}, /* SG */ + { 442, 13, 40}, /* CONTINGENTBREAK */ + { 318, 13, 40}, /* CB */ + {1166, 13, 41}, /* REGIONALINDICATOR */ + {1171, 13, 41}, /* RI */ + { 538, 13, 42}, /* EMODIFIER */ + { 536, 13, 42}, /* EM */ + {1015, 14, 0}, /* NO */ + { 984, 14, 0}, /* N */ + {1421, 14, 1}, /* YES */ + {1417, 14, 1}, /* Y */ + { 923, 14, 2}, /* MAYBE */ + { 860, 14, 2}, /* M */ + {1015, 15, 0}, /* NO */ + { 984, 15, 0}, /* N */ + {1421, 15, 1}, /* YES */ + {1417, 15, 1}, /* Y */ + {1020, 16, 0}, /* NONE */ + { 485, 16, 1}, /* DECIMAL */ + { 484, 16, 1}, /* DE */ + { 504, 16, 2}, /* DIGIT */ + { 496, 16, 2}, /* DI */ + {1038, 16, 3}, /* NUMERIC */ + {1033, 16, 3}, /* NU */ + { 988, 17, 0}, /* NAN */ + { 1, 17, 1}, /* 0 */ + { 2, 17, 2}, /* 1 */ + { 53, 17, 3}, /* 2 */ + { 86, 17, 4}, /* 3 */ + { 109, 17, 5}, /* 4 */ + { 126, 17, 6}, /* 5 */ + { 136, 17, 7}, /* 6 */ + { 142, 17, 8}, /* 7 */ + { 151, 17, 9}, /* 8 */ + { 158, 17, 10}, /* 9 */ + { 12, 17, 11}, /* 1/4 */ + { 7, 17, 12}, /* 1/2 */ + { 90, 17, 13}, /* 3/4 */ + { 5, 17, 14}, /* 1/16 */ + { 18, 17, 15}, /* 1/8 */ + { 87, 17, 16}, /* 3/16 */ + { 48, 17, 17}, /* 16 */ + { 21, 17, 18}, /* 10 */ + { 22, 17, 19}, /* 100 */ + { 23, 17, 20}, /* 1000 */ + { 6, 17, 21}, /* 1/160 */ + { 13, 17, 22}, /* 1/40 */ + { 94, 17, 23}, /* 3/80 */ + { 8, 17, 24}, /* 1/20 */ + { 3, 17, 25}, /* 1/10 */ + { 89, 17, 26}, /* 3/20 */ + { 14, 17, 27}, /* 1/5 */ + { 88, 17, 28}, /* 3/2 */ + { 128, 17, 29}, /* 5/2 */ + { 144, 17, 30}, /* 7/2 */ + { 159, 17, 31}, /* 9/2 */ + { 35, 17, 32}, /* 11/2 */ + { 41, 17, 33}, /* 13/2 */ + { 47, 17, 34}, /* 15/2 */ + { 50, 17, 35}, /* 17/2 */ + { 0, 17, 36}, /* -1/2 */ + { 56, 17, 37}, /* 20 */ + { 95, 17, 38}, /* 30 */ + { 111, 17, 39}, /* 40 */ + { 131, 17, 40}, /* 50 */ + { 137, 17, 41}, /* 60 */ + { 146, 17, 42}, /* 70 */ + { 152, 17, 43}, /* 80 */ + { 160, 17, 44}, /* 90 */ + { 24, 17, 45}, /* 10000 */ + { 49, 17, 46}, /* 17 */ + { 51, 17, 47}, /* 18 */ + { 52, 17, 48}, /* 19 */ + { 17, 17, 49}, /* 1/7 */ + { 20, 17, 50}, /* 1/9 */ + { 9, 17, 51}, /* 1/3 */ + { 54, 17, 52}, /* 2/3 */ + { 55, 17, 53}, /* 2/5 */ + { 91, 17, 54}, /* 3/5 */ + { 110, 17, 55}, /* 4/5 */ + { 15, 17, 56}, /* 1/6 */ + { 129, 17, 57}, /* 5/6 */ + { 93, 17, 58}, /* 3/8 */ + { 130, 17, 59}, /* 5/8 */ + { 145, 17, 60}, /* 7/8 */ + { 33, 17, 61}, /* 11 */ + { 37, 17, 62}, /* 12 */ + { 132, 17, 63}, /* 500 */ + { 133, 17, 64}, /* 5000 */ + { 134, 17, 65}, /* 50000 */ + { 25, 17, 66}, /* 100000 */ + { 40, 17, 67}, /* 13 */ + { 45, 17, 68}, /* 14 */ + { 46, 17, 69}, /* 15 */ + { 63, 17, 70}, /* 21 */ + { 68, 17, 71}, /* 22 */ + { 74, 17, 72}, /* 23 */ + { 79, 17, 73}, /* 24 */ + { 81, 17, 74}, /* 25 */ + { 82, 17, 75}, /* 26 */ + { 83, 17, 76}, /* 27 */ + { 84, 17, 77}, /* 28 */ + { 85, 17, 78}, /* 29 */ + { 100, 17, 79}, /* 31 */ + { 101, 17, 80}, /* 32 */ + { 102, 17, 81}, /* 33 */ + { 103, 17, 82}, /* 34 */ + { 104, 17, 83}, /* 35 */ + { 105, 17, 84}, /* 36 */ + { 106, 17, 85}, /* 37 */ + { 107, 17, 86}, /* 38 */ + { 108, 17, 87}, /* 39 */ + { 116, 17, 88}, /* 41 */ + { 117, 17, 89}, /* 42 */ + { 118, 17, 90}, /* 43 */ + { 120, 17, 91}, /* 44 */ + { 121, 17, 92}, /* 45 */ + { 122, 17, 93}, /* 46 */ + { 123, 17, 94}, /* 47 */ + { 124, 17, 95}, /* 48 */ + { 125, 17, 96}, /* 49 */ + { 28, 17, 97}, /* 100000000 */ + { 30, 17, 98}, /* 1000000000000 */ + { 57, 17, 99}, /* 200 */ + { 96, 17, 100}, /* 300 */ + { 112, 17, 101}, /* 400 */ + { 138, 17, 102}, /* 600 */ + { 147, 17, 103}, /* 700 */ + { 153, 17, 104}, /* 800 */ + { 161, 17, 105}, /* 900 */ + { 58, 17, 106}, /* 2000 */ + { 97, 17, 107}, /* 3000 */ + { 113, 17, 108}, /* 4000 */ + { 139, 17, 109}, /* 6000 */ + { 148, 17, 110}, /* 7000 */ + { 154, 17, 111}, /* 8000 */ + { 162, 17, 112}, /* 9000 */ + { 59, 17, 113}, /* 20000 */ + { 98, 17, 114}, /* 30000 */ + { 114, 17, 115}, /* 40000 */ + { 140, 17, 116}, /* 60000 */ + { 149, 17, 117}, /* 70000 */ + { 155, 17, 118}, /* 80000 */ + { 163, 17, 119}, /* 90000 */ + { 34, 17, 120}, /* 11/12 */ + { 60, 17, 121}, /* 200000 */ + { 99, 17, 122}, /* 300000 */ + { 115, 17, 123}, /* 400000 */ + { 135, 17, 124}, /* 500000 */ + { 141, 17, 125}, /* 600000 */ + { 150, 17, 126}, /* 700000 */ + { 156, 17, 127}, /* 800000 */ + { 164, 17, 128}, /* 900000 */ + { 4, 17, 129}, /* 1/12 */ + { 127, 17, 130}, /* 5/12 */ + { 143, 17, 131}, /* 7/12 */ + { 11, 17, 132}, /* 1/320 */ + { 19, 17, 133}, /* 1/80 */ + { 16, 17, 134}, /* 1/64 */ + { 10, 17, 135}, /* 1/32 */ + { 92, 17, 136}, /* 3/64 */ + { 66, 17, 137}, /* 216000 */ + { 119, 17, 138}, /* 432000 */ + { 26, 17, 139}, /* 1000000 */ + { 29, 17, 140}, /* 10000000000 */ + { 27, 17, 141}, /* 10000000 */ + { 61, 17, 142}, /* 20000000 */ + {1367, 18, 0}, /* UNKNOWN */ + {1446, 18, 0}, /* ZZZZ */ + { 421, 18, 1}, /* COMMON */ + {1445, 18, 1}, /* ZYYY */ + { 790, 18, 2}, /* LATIN */ + { 806, 18, 2}, /* LATN */ + { 275, 18, 3}, /* BOPOMOFO */ + { 274, 18, 3}, /* BOPO */ + { 715, 18, 4}, /* INHERITED */ + {1438, 18, 4}, /* ZINH */ + {1157, 18, 4}, /* QAAI */ + { 631, 18, 5}, /* GREEK */ + { 635, 18, 5}, /* GREK */ + { 446, 18, 6}, /* COPTIC */ + { 445, 18, 6}, /* COPT */ + {1156, 18, 6}, /* QAAC */ + { 466, 18, 7}, /* CYRILLIC */ + { 476, 18, 7}, /* CYRL */ + { 216, 18, 8}, /* ARMENIAN */ + { 218, 18, 8}, /* ARMN */ + { 673, 18, 9}, /* HEBREW */ + { 672, 18, 9}, /* HEBR */ + { 203, 18, 10}, /* ARABIC */ + { 202, 18, 10}, /* ARAB */ + {1295, 18, 11}, /* SYRIAC */ + {1294, 18, 11}, /* SYRC */ + {1335, 18, 12}, /* THAANA */ + {1334, 18, 12}, /* THAA */ + {1012, 18, 13}, /* NKO */ + {1013, 18, 13}, /* NKOO */ + {1193, 18, 14}, /* SAMARITAN */ + {1194, 18, 14}, /* SAMR */ + { 881, 18, 15}, /* MANDAIC */ + { 880, 18, 15}, /* MAND */ + { 493, 18, 16}, /* DEVANAGARI */ + { 492, 18, 16}, /* DEVA */ + { 257, 18, 17}, /* BENGALI */ + { 256, 18, 17}, /* BENG */ + { 641, 18, 18}, /* GURMUKHI */ + { 642, 18, 18}, /* GURU */ + { 638, 18, 19}, /* GUJARATI */ + { 639, 18, 19}, /* GUJR */ + {1071, 18, 20}, /* ORIYA */ + {1074, 18, 20}, /* ORYA */ + {1314, 18, 21}, /* TAMIL */ + {1317, 18, 21}, /* TAML */ + {1328, 18, 22}, /* TELUGU */ + {1327, 18, 22}, /* TELU */ + { 761, 18, 23}, /* KANNADA */ + { 779, 18, 23}, /* KNDA */ + { 868, 18, 24}, /* MALAYALAM */ + { 959, 18, 24}, /* MLYM */ + {1227, 18, 25}, /* SINHALA */ + {1226, 18, 25}, /* SINH */ + {1336, 18, 26}, /* THAI */ + { 788, 18, 27}, /* LAO */ + { 789, 18, 27}, /* LAOO */ + {1337, 18, 28}, /* TIBETAN */ + {1338, 18, 28}, /* TIBT */ + { 978, 18, 29}, /* MYANMAR */ + { 983, 18, 29}, /* MYMR */ + { 607, 18, 30}, /* GEORGIAN */ + { 606, 18, 30}, /* GEOR */ + { 654, 18, 31}, /* HANGUL */ + { 653, 18, 31}, /* HANG */ + { 560, 18, 32}, /* ETHIOPIC */ + { 559, 18, 32}, /* ETHI */ + { 367, 18, 33}, /* CHEROKEE */ + { 366, 18, 33}, /* CHER */ + { 305, 18, 34}, /* CANADIANABORIGINAL */ + { 309, 18, 34}, /* CANS */ + {1050, 18, 35}, /* OGHAM */ + {1049, 18, 35}, /* OGAM */ + {1186, 18, 36}, /* RUNIC */ + {1187, 18, 36}, /* RUNR */ + {1300, 18, 37}, /* TAGALOG */ + {1333, 18, 37}, /* TGLG */ + { 668, 18, 38}, /* HANUNOO */ + { 665, 18, 38}, /* HANO */ + { 297, 18, 39}, /* BUHID */ + { 296, 18, 39}, /* BUHD */ + {1302, 18, 40}, /* TAGBANWA */ + {1301, 18, 40}, /* TAGB */ + { 772, 18, 41}, /* KHMER */ + { 774, 18, 41}, /* KHMR */ + { 968, 18, 42}, /* MONGOLIAN */ + { 967, 18, 42}, /* MONG */ + { 825, 18, 43}, /* LIMBU */ + { 824, 18, 43}, /* LIMB */ + {1305, 18, 44}, /* TAILE */ + {1312, 18, 44}, /* TALE */ + {1001, 18, 45}, /* NEWTAILUE */ + {1313, 18, 45}, /* TALU */ + { 295, 18, 46}, /* BUGINESE */ + { 294, 18, 46}, /* BUGI */ + {1306, 18, 47}, /* TAITHAM */ + { 787, 18, 47}, /* LANA */ + { 240, 18, 48}, /* BALINESE */ + { 239, 18, 48}, /* BALI */ + {1260, 18, 49}, /* SUNDANESE */ + {1259, 18, 49}, /* SUND */ + { 248, 18, 50}, /* BATAK */ + { 249, 18, 50}, /* BATK */ + { 819, 18, 51}, /* LEPCHA */ + { 818, 18, 51}, /* LEPC */ + {1054, 18, 52}, /* OLCHIKI */ + {1055, 18, 52}, /* OLCK */ + { 288, 18, 53}, /* BRAILLE */ + { 287, 18, 53}, /* BRAI */ + { 614, 18, 54}, /* GLAGOLITIC */ + { 613, 18, 54}, /* GLAG */ + {1339, 18, 55}, /* TIFINAGH */ + {1332, 18, 55}, /* TFNG */ + { 652, 18, 56}, /* HAN */ + { 661, 18, 56}, /* HANI */ + { 684, 18, 57}, /* HIRAGANA */ + { 683, 18, 57}, /* HIRA */ + { 763, 18, 58}, /* KATAKANA */ + { 752, 18, 58}, /* KANA */ + {1424, 18, 59}, /* YI */ + {1425, 18, 59}, /* YIII */ + { 835, 18, 60}, /* LISU */ + {1373, 18, 61}, /* VAI */ + {1374, 18, 61}, /* VAII */ + { 242, 18, 62}, /* BAMUM */ + { 241, 18, 62}, /* BAMU */ + {1289, 18, 63}, /* SYLOTINAGRI */ + {1288, 18, 63}, /* SYLO */ + {1119, 18, 64}, /* PHAGSPA */ + {1118, 18, 64}, /* PHAG */ + {1197, 18, 65}, /* SAURASHTRA */ + {1196, 18, 65}, /* SAUR */ + { 767, 18, 66}, /* KAYAHLI */ + { 751, 18, 66}, /* KALI */ + {1169, 18, 67}, /* REJANG */ + {1178, 18, 67}, /* RJNG */ + { 737, 18, 68}, /* JAVANESE */ + { 736, 18, 68}, /* JAVA */ + { 360, 18, 69}, /* CHAM */ + {1307, 18, 70}, /* TAIVIET */ + {1323, 18, 70}, /* TAVT */ + { 932, 18, 71}, /* MEETEIMAYEK */ + { 973, 18, 71}, /* MTEI */ + { 829, 18, 72}, /* LINEARB */ + { 827, 18, 72}, /* LINB */ + { 857, 18, 73}, /* LYCIAN */ + { 856, 18, 73}, /* LYCI */ + { 312, 18, 74}, /* CARIAN */ + { 311, 18, 74}, /* CARI */ + {1057, 18, 75}, /* OLDITALIC */ + { 732, 18, 75}, /* ITAL */ + { 622, 18, 76}, /* GOTHIC */ + { 621, 18, 76}, /* GOTH */ + {1059, 18, 77}, /* OLDPERMIC */ + {1116, 18, 77}, /* PERM */ + {1361, 18, 78}, /* UGARITIC */ + {1360, 18, 78}, /* UGAR */ + {1060, 18, 79}, /* OLDPERSIAN */ + {1414, 18, 79}, /* XPEO */ + { 491, 18, 80}, /* DESERET */ + { 515, 18, 80}, /* DSRT */ + {1216, 18, 81}, /* SHAVIAN */ + {1217, 18, 81}, /* SHAW */ + {1078, 18, 82}, /* OSMANYA */ + {1077, 18, 82}, /* OSMA */ + {1075, 18, 83}, /* OSAGE */ + {1076, 18, 83}, /* OSGE */ + { 533, 18, 84}, /* ELBASAN */ + { 532, 18, 84}, /* ELBA */ + { 317, 18, 85}, /* CAUCASIANALBANIAN */ + { 176, 18, 85}, /* AGHB */ + { 828, 18, 86}, /* LINEARA */ + { 826, 18, 86}, /* LINA */ + { 464, 18, 87}, /* CYPRIOT */ + { 451, 18, 87}, /* CPRT */ + { 708, 18, 88}, /* IMPERIALARAMAIC */ + { 217, 18, 88}, /* ARMI */ + {1102, 18, 89}, /* PALMYRENE */ + {1101, 18, 89}, /* PALM */ + { 987, 18, 90}, /* NABATAEAN */ + { 995, 18, 90}, /* NBAT */ + { 670, 18, 91}, /* HATRAN */ + { 669, 18, 91}, /* HATR */ + {1125, 18, 92}, /* PHOENICIAN */ + {1124, 18, 92}, /* PHNX */ + { 859, 18, 93}, /* LYDIAN */ + { 858, 18, 93}, /* LYDI */ + { 940, 18, 94}, /* MEROITICHIEROGLYPHS */ + { 938, 18, 94}, /* MERO */ + { 939, 18, 95}, /* MEROITICCURSIVE */ + { 937, 18, 95}, /* MERC */ + { 770, 18, 96}, /* KHAROSHTHI */ + { 769, 18, 96}, /* KHAR */ + {1062, 18, 97}, /* OLDSOUTHARABIAN */ + {1195, 18, 97}, /* SARB */ + {1058, 18, 98}, /* OLDNORTHARABIAN */ + { 992, 18, 98}, /* NARB */ + { 884, 18, 99}, /* MANICHAEAN */ + { 883, 18, 99}, /* MANI */ + { 234, 18, 100}, /* AVESTAN */ + { 235, 18, 100}, /* AVST */ + { 722, 18, 101}, /* INSCRIPTIONALPARTHIAN */ + {1149, 18, 101}, /* PRTI */ + { 721, 18, 102}, /* INSCRIPTIONALPAHLAVI */ + {1122, 18, 102}, /* PHLI */ + {1151, 18, 103}, /* PSALTERPAHLAVI */ + {1123, 18, 103}, /* PHLP */ + {1063, 18, 104}, /* OLDTURKIC */ + {1072, 18, 104}, /* ORKH */ + {1056, 18, 105}, /* OLDHUNGARIAN */ + { 691, 18, 105}, /* HUNG */ + { 662, 18, 106}, /* HANIFIROHINGYA */ + {1182, 18, 106}, /* ROHG */ + {1423, 18, 107}, /* YEZIDI */ + {1422, 18, 107}, /* YEZI */ + {1061, 18, 108}, /* OLDSOGDIAN */ + {1241, 18, 108}, /* SOGO */ + {1240, 18, 109}, /* SOGDIAN */ + {1239, 18, 109}, /* SOGD */ + { 371, 18, 110}, /* CHORASMIAN */ + { 372, 18, 110}, /* CHRS */ + { 535, 18, 111}, /* ELYMAIC */ + { 534, 18, 111}, /* ELYM */ + { 285, 18, 112}, /* BRAHMI */ + { 284, 18, 112}, /* BRAH */ + { 750, 18, 113}, /* KAITHI */ + { 781, 18, 113}, /* KTHI */ + {1243, 18, 114}, /* SORASOMPENG */ + {1242, 18, 114}, /* SORA */ + { 359, 18, 115}, /* CHAKMA */ + { 303, 18, 115}, /* CAKM */ + { 862, 18, 116}, /* MAHAJANI */ + { 863, 18, 116}, /* MAHJ */ + {1215, 18, 117}, /* SHARADA */ + {1220, 18, 117}, /* SHRD */ + { 776, 18, 118}, /* KHOJKI */ + { 775, 18, 118}, /* KHOJ */ + { 975, 18, 119}, /* MULTANI */ + { 974, 18, 119}, /* MULT */ + { 777, 18, 120}, /* KHUDAWADI */ + {1224, 18, 120}, /* SIND */ + { 624, 18, 121}, /* GRANTHA */ + { 623, 18, 121}, /* GRAN */ + { 999, 18, 122}, /* NEWA */ + {1341, 18, 123}, /* TIRHUTA */ + {1340, 18, 123}, /* TIRH */ + {1222, 18, 124}, /* SIDDHAM */ + {1221, 18, 124}, /* SIDD */ + { 961, 18, 125}, /* MODI */ + {1311, 18, 126}, /* TAKRI */ + {1310, 18, 126}, /* TAKR */ + { 178, 18, 127}, /* AHOM */ + { 508, 18, 128}, /* DOGRA */ + { 507, 18, 128}, /* DOGR */ + {1396, 18, 129}, /* WARANGCITI */ + {1395, 18, 129}, /* WARA */ + { 506, 18, 130}, /* DIVESAKURU */ + { 503, 18, 130}, /* DIAK */ + { 990, 18, 131}, /* NANDINAGARI */ + { 989, 18, 131}, /* NAND */ + {1435, 18, 132}, /* ZANABAZARSQUARE */ + {1436, 18, 132}, /* ZANB */ + {1245, 18, 133}, /* SOYOMBO */ + {1244, 18, 133}, /* SOYO */ + {1109, 18, 134}, /* PAUCINHAU */ + {1108, 18, 134}, /* PAUC */ + { 259, 18, 135}, /* BHAIKSUKI */ + { 260, 18, 135}, /* BHKS */ + { 913, 18, 136}, /* MARCHEN */ + { 912, 18, 136}, /* MARC */ + { 915, 18, 137}, /* MASARAMGONDI */ + { 620, 18, 137}, /* GONM */ + { 640, 18, 138}, /* GUNJALAGONDI */ + { 619, 18, 138}, /* GONG */ + { 867, 18, 139}, /* MAKASAR */ + { 866, 18, 139}, /* MAKA */ + { 454, 18, 140}, /* CUNEIFORM */ + {1415, 18, 140}, /* XSUX */ + { 531, 18, 141}, /* EGYPTIANHIEROGLYPHS */ + { 529, 18, 141}, /* EGYP */ + { 195, 18, 142}, /* ANATOLIANHIEROGLYPHS */ + { 686, 18, 142}, /* HLUW */ + { 971, 18, 143}, /* MRO */ + { 972, 18, 143}, /* MROO */ + { 247, 18, 144}, /* BASSAVAH */ + { 246, 18, 144}, /* BASS */ + {1100, 18, 145}, /* PAHAWHHMONG */ + { 687, 18, 145}, /* HMNG */ + { 928, 18, 146}, /* MEDEFAIDRIN */ + { 929, 18, 146}, /* MEDF */ + { 941, 18, 147}, /* MIAO */ + {1132, 18, 147}, /* PLRD */ + {1319, 18, 148}, /* TANGUT */ + {1318, 18, 148}, /* TANG */ + {1042, 18, 149}, /* NUSHU */ + {1030, 18, 149}, /* NSHU */ + { 771, 18, 150}, /* KHITANSMALLSCRIPT */ + { 778, 18, 150}, /* KITS */ + { 519, 18, 151}, /* DUPLOYAN */ + { 518, 18, 151}, /* DUPL */ + {1223, 18, 152}, /* SIGNWRITING */ + {1214, 18, 152}, /* SGNW */ + {1045, 18, 153}, /* NYIAKENGPUACHUEHMONG */ + { 688, 18, 153}, /* HMNP */ + {1394, 18, 154}, /* WANCHO */ + {1399, 18, 154}, /* WCHO */ + { 936, 18, 155}, /* MENDEKIKAKUI */ + { 935, 18, 155}, /* MEND */ + { 170, 18, 156}, /* ADLAM */ + { 171, 18, 156}, /* ADLM */ + { 765, 18, 157}, /* KATAKANAORHIRAGANA */ + { 689, 18, 157}, /* HRKT */ + {1079, 19, 0}, /* OTHER */ + {1416, 19, 0}, /* XX */ + {1246, 19, 1}, /* SP */ + { 823, 19, 2}, /* LF */ + { 452, 19, 3}, /* CR */ + {1256, 19, 4}, /* STERM */ + {1255, 19, 4}, /* ST */ + { 406, 19, 5}, /* CLOSE */ + { 405, 19, 5}, /* CL */ + {1200, 19, 6}, /* SCONTINUE */ + {1199, 19, 6}, /* SC */ + { 228, 19, 7}, /* ATERM */ + { 223, 19, 7}, /* AT */ + {1038, 19, 8}, /* NUMERIC */ + {1033, 19, 8}, /* NU */ + {1369, 19, 9}, /* UPPER */ + {1368, 19, 9}, /* UP */ + { 843, 19, 10}, /* LOWER */ + { 840, 19, 10}, /* LO */ + {1211, 19, 11}, /* SEP */ + {1205, 19, 11}, /* SE */ + { 590, 19, 12}, /* FORMAT */ + { 588, 19, 12}, /* FO */ + {1064, 19, 13}, /* OLETTER */ + { 809, 19, 13}, /* LE */ + { 573, 19, 14}, /* EXTEND */ + { 570, 19, 14}, /* EX */ + {1079, 20, 0}, /* OTHER */ + {1416, 20, 0}, /* XX */ + { 823, 20, 1}, /* LF */ + {1000, 20, 2}, /* NEWLINE */ + {1014, 20, 2}, /* NL */ + { 452, 20, 3}, /* CR */ + {1407, 20, 4}, /* WSEGSPACE */ + { 513, 20, 5}, /* DOUBLEQUOTE */ + { 514, 20, 5}, /* DQ */ + {1225, 20, 6}, /* SINGLEQUOTE */ + {1252, 20, 6}, /* SQ */ + { 943, 20, 7}, /* MIDNUM */ + { 960, 20, 7}, /* MN */ + { 944, 20, 8}, /* MIDNUMLET */ + { 924, 20, 8}, /* MB */ + {1038, 20, 9}, /* NUMERIC */ + {1033, 20, 9}, /* NU */ + { 942, 20, 10}, /* MIDLETTER */ + { 958, 20, 10}, /* ML */ + { 186, 20, 11}, /* ALETTER */ + { 809, 20, 11}, /* LE */ + { 576, 20, 12}, /* EXTENDNUMLET */ + { 570, 20, 12}, /* EX */ + { 590, 20, 13}, /* FORMAT */ + { 588, 20, 13}, /* FO */ + { 573, 20, 14}, /* EXTEND */ + { 674, 20, 15}, /* HEBREWLETTER */ + { 685, 20, 15}, /* HL */ + {1443, 20, 16}, /* ZWJ */ + { 763, 20, 17}, /* KATAKANA */ + { 748, 20, 17}, /* KA */ + {1166, 20, 18}, /* REGIONALINDICATOR */ + {1171, 20, 18}, /* RI */ + { 525, 20, 19}, /* EBASE */ + { 524, 20, 19}, /* EB */ + { 526, 20, 20}, /* EBASEGAZ */ + { 527, 20, 20}, /* EBG */ + { 538, 20, 21}, /* EMODIFIER */ + { 536, 20, 21}, /* EM */ + { 618, 20, 22}, /* GLUEAFTERZWJ */ + { 597, 20, 22}, /* GAZ */ }; -/* property values: 6272 bytes. */ - /* Codepoints which expand on full case-folding. */ - RE_UINT16 re_expand_on_folding[] = { 223, 304, 329, 496, 912, 944, 1415, 7830, 7831, 7832, 7833, 7834, 7838, 8016, 8018, 8020, @@ -3216,4231 +3254,9697 @@ RE_UINT16 re_expand_on_folding[] = { 8131, 8132, 8134, 8135, 8140, 8146, 8147, 8150, 8151, 8162, 8163, 8164, 8166, 8167, 8178, 8179, 8180, 8182, 8183, 8188, 64256, 64257, 64258, 64259, - 64260, 64261, 64262, 64275, 64276, 64277, 64278, 64279, + 64260, 64261, 64262, 64275, 64276, 64277, 64278, 64279 }; -/* expand_on_folding: 208 bytes. */ - -/* General_Category. */ - -static RE_UINT8 re_general_category_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 28, - 29, 26, 30, 31, 32, 33, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 34, 35, 35, 35, 35, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 26, 57, 58, 59, 59, 59, 59, 59, 26, 26, 60, 59, 59, 59, 59, 59, - 59, 59, 26, 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 26, 62, 59, 63, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 64, 26, 65, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 66, 67, 59, 59, 59, 59, 68, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 69, 70, 71, 72, 73, 74, 59, 59, - 75, 76, 59, 59, 77, 59, 78, 79, 80, 81, 73, 82, 83, 84, 59, 59, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 85, 26, 26, 26, 26, 26, 26, 26, 86, 87, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 88, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 89, 59, 59, 59, 59, 59, 59, 26, 90, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 91, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 92, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 92, +/* Alphabetic. */ +static RE_UINT8 re_alphabetic_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10, + 10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38, + 10, 10, 10, 10, 10, 39, 10, 10, 40, 10, 41, 42, 43, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 44, 13, 13, 13, 45, 46, 13, + 13, 13, 13, 47, 13, 13, 13, 13, 13, 13, 48, 10, 10, 10, 49, 10, + 13, 13, 13, 13, 50, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; -static RE_UINT16 re_general_category_stage_2[] = { - 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, - 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31, - 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39, - 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13, - 13, 13, 13, 42, 9, 43, 11, 11, 44, 45, 32, 46, 47, 48, 49, 50, - 51, 52, 48, 48, 53, 32, 54, 55, 48, 48, 48, 48, 48, 56, 57, 58, - 59, 60, 48, 32, 61, 48, 48, 48, 48, 48, 62, 63, 64, 48, 65, 66, - 48, 67, 68, 69, 48, 70, 71, 72, 72, 72, 48, 73, 72, 74, 75, 32, - 76, 48, 48, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 83, 84, 91, 92, 93, 94, 95, 96, 97, 84, 98, 99, 100, 88, 101, - 102, 83, 84, 103, 104, 105, 88, 106, 107, 108, 109, 110, 111, 112, 94, 113, - 114, 115, 84, 116, 117, 118, 88, 119, 120, 115, 84, 121, 122, 123, 88, 124, - 125, 115, 48, 126, 127, 128, 88, 129, 130, 131, 48, 132, 133, 134, 94, 135, - 136, 48, 48, 137, 138, 139, 72, 72, 140, 48, 141, 142, 143, 144, 72, 72, - 145, 146, 147, 148, 149, 48, 150, 151, 152, 153, 32, 154, 155, 156, 72, 72, - 48, 48, 157, 158, 159, 160, 161, 162, 163, 164, 9, 9, 165, 11, 11, 166, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 167, 168, 48, 48, 167, 48, 48, 169, 170, 171, 48, 48, - 48, 170, 48, 48, 48, 172, 173, 174, 48, 175, 9, 9, 9, 9, 9, 176, - 177, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 178, 48, 179, 180, 48, 48, 48, 48, 181, 182, - 183, 184, 48, 185, 48, 186, 183, 187, 48, 48, 48, 188, 189, 190, 191, 192, - 193, 191, 48, 48, 194, 48, 48, 195, 196, 48, 197, 48, 48, 48, 48, 198, - 48, 199, 200, 201, 202, 48, 203, 204, 48, 48, 205, 48, 206, 207, 208, 208, - 48, 209, 48, 48, 48, 210, 211, 212, 191, 191, 213, 214, 72, 72, 72, 72, - 215, 48, 48, 216, 217, 159, 218, 219, 220, 48, 221, 64, 48, 48, 222, 223, - 48, 48, 224, 225, 226, 64, 48, 227, 228, 9, 9, 229, 230, 231, 232, 233, - 11, 11, 234, 27, 27, 27, 235, 236, 11, 237, 27, 27, 32, 32, 32, 238, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 239, 13, 13, 13, 13, 13, 13, - 240, 241, 240, 240, 241, 242, 240, 243, 244, 244, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 260, 72, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 270, 271, 272, 273, 208, 274, 275, 208, 276, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 278, 208, 279, 208, 208, 208, 208, 280, 208, 281, 277, 282, 208, 283, 284, 208, - 208, 208, 285, 72, 286, 72, 269, 269, 269, 287, 208, 208, 208, 208, 288, 269, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 289, 290, 208, 208, 291, - 208, 208, 208, 208, 208, 208, 292, 208, 208, 208, 208, 208, 208, 208, 208, 208, - 208, 208, 208, 208, 208, 208, 293, 294, 269, 295, 208, 208, 296, 277, 297, 277, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, - 277, 277, 277, 277, 277, 277, 277, 277, 298, 299, 277, 277, 277, 300, 277, 301, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 208, 208, 208, 277, 302, 208, 208, 303, 208, 304, 208, 208, 208, 208, 208, 208, - 9, 9, 305, 11, 11, 306, 307, 308, 13, 13, 13, 13, 13, 13, 309, 310, - 11, 11, 311, 48, 48, 48, 312, 313, 48, 314, 315, 315, 315, 315, 32, 32, - 316, 317, 318, 319, 320, 72, 72, 72, 208, 321, 208, 208, 208, 208, 208, 322, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, 72, 324, - 325, 326, 327, 328, 136, 48, 48, 48, 48, 329, 177, 48, 48, 48, 48, 330, - 331, 48, 48, 136, 48, 48, 48, 48, 199, 332, 48, 71, 208, 208, 322, 48, - 208, 333, 334, 208, 335, 336, 208, 208, 334, 208, 208, 336, 208, 208, 208, 208, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 198, 208, 208, 208, 208, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 72, - 48, 337, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 150, 208, 208, 208, 285, 48, 48, 227, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 338, 48, 339, 72, 13, 13, 340, 341, 13, 342, 48, 48, 48, 48, 343, 344, - 31, 345, 346, 347, 13, 13, 13, 348, 349, 350, 351, 352, 353, 72, 72, 354, - 355, 48, 356, 357, 48, 48, 48, 358, 359, 48, 48, 360, 361, 191, 32, 362, - 64, 48, 363, 48, 364, 365, 48, 150, 76, 48, 48, 366, 367, 368, 369, 370, - 48, 48, 371, 372, 373, 374, 48, 375, 48, 48, 48, 376, 377, 378, 379, 380, - 381, 382, 315, 11, 11, 383, 384, 11, 11, 11, 11, 11, 48, 48, 385, 191, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 386, 48, 387, 48, 48, 205, - 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, - 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 203, 48, 48, 48, 48, 48, 48, 206, 72, 72, - 390, 391, 392, 393, 394, 48, 48, 48, 48, 48, 48, 395, 396, 397, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 398, 72, 48, 48, 48, 48, 399, 48, 48, 400, 72, 72, 401, - 32, 402, 32, 403, 404, 405, 406, 407, 48, 48, 48, 48, 48, 48, 48, 408, - 409, 2, 3, 4, 5, 410, 411, 412, 48, 413, 48, 199, 414, 415, 416, 417, - 418, 48, 171, 419, 203, 203, 72, 72, 48, 48, 48, 48, 48, 48, 48, 71, - 420, 269, 269, 421, 270, 270, 270, 422, 423, 324, 424, 72, 72, 208, 208, 425, - 72, 72, 72, 72, 72, 72, 72, 72, 48, 150, 48, 48, 48, 100, 426, 427, - 48, 48, 428, 48, 429, 48, 48, 430, 48, 431, 48, 48, 432, 433, 72, 72, - 9, 9, 434, 11, 11, 48, 48, 48, 48, 203, 191, 9, 9, 435, 11, 436, - 48, 48, 400, 48, 48, 48, 437, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 314, 48, 198, 400, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 438, 48, 48, 439, 48, 440, 48, 441, 48, 199, 442, 72, 72, 72, 48, 443, - 48, 444, 48, 445, 72, 72, 72, 72, 48, 48, 48, 446, 269, 447, 269, 269, - 448, 449, 48, 450, 451, 452, 48, 453, 48, 454, 72, 72, 455, 48, 456, 457, - 48, 48, 48, 458, 48, 459, 48, 460, 48, 461, 462, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 195, 72, 72, 72, 9, 9, 9, 463, 11, 11, 11, 464, - 48, 48, 465, 191, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 269, 466, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 454, 467, 48, 62, 468, 72, 72, 72, 72, 72, 72, 72, 72, 48, 314, - 469, 48, 48, 470, 471, 447, 472, 473, 220, 48, 48, 474, 475, 48, 195, 191, - 476, 48, 477, 478, 479, 48, 48, 480, 220, 48, 48, 481, 482, 483, 484, 485, - 48, 97, 486, 487, 72, 72, 72, 72, 488, 489, 490, 48, 48, 491, 492, 191, - 493, 83, 84, 494, 495, 496, 497, 498, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 499, 500, 501, 72, 72, 48, 48, 48, 502, 503, 191, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 48, 48, 504, 505, 506, 507, 72, 72, - 48, 48, 48, 508, 509, 191, 510, 72, 48, 48, 511, 512, 191, 72, 72, 72, - 48, 172, 513, 514, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 486, 515, 72, 72, 72, 72, 72, 72, 9, 9, 11, 11, 147, 516, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 517, 48, 48, 518, 519, 72, - 520, 48, 48, 521, 522, 523, 48, 48, 524, 525, 526, 72, 48, 48, 48, 195, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 84, 48, 504, 527, 528, 147, 174, 529, 48, 530, 531, 532, 72, 72, 72, 72, - 533, 48, 48, 534, 535, 191, 536, 48, 537, 538, 191, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 48, 539, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 269, 540, 541, 542, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 206, 72, 72, 72, 72, 72, 72, - 270, 270, 270, 270, 270, 270, 543, 544, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 386, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 199, 545, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 314, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 195, 48, 199, 368, 72, 72, 72, 72, 72, 72, 48, 203, 546, - 48, 48, 48, 547, 548, 549, 550, 551, 48, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 9, 9, 11, 11, 269, 552, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 553, 554, 555, 555, 556, 557, 72, 72, 72, 72, 558, 72, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 400, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 559, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 199, 72, 72, 72, 559, 560, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 205, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 48, 48, 71, 150, 195, 561, 562, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, - 208, 208, 563, 208, 208, 208, 564, 565, 566, 208, 567, 208, 208, 208, 568, 72, - 208, 208, 208, 208, 569, 72, 72, 72, 72, 72, 72, 72, 72, 72, 269, 570, - 208, 208, 208, 208, 208, 285, 269, 451, 72, 72, 72, 72, 72, 72, 72, 72, - 9, 571, 11, 572, 573, 574, 240, 9, 575, 576, 577, 578, 579, 9, 571, 11, - 580, 581, 11, 582, 583, 584, 585, 9, 586, 11, 9, 571, 11, 572, 573, 11, - 240, 9, 575, 585, 9, 586, 11, 9, 571, 11, 587, 9, 588, 589, 590, 591, - 11, 592, 9, 593, 594, 595, 596, 11, 597, 9, 598, 11, 599, 600, 600, 600, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, - 32, 32, 32, 601, 32, 32, 602, 603, 604, 605, 45, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 606, 607, 608, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 150, 609, 610, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 48, 48, 611, 612, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 613, 614, 72, 72, - 9, 9, 575, 11, 615, 368, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 484, 269, 269, 616, 617, 72, 72, 72, 72, - 484, 269, 618, 619, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 620, 48, 621, 622, 623, 624, 625, 626, 627, 205, 628, 205, 72, 72, 72, 629, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 208, 208, 324, 208, 208, 208, 208, 208, 208, 322, 333, 630, 630, 630, 208, 323, - 174, 208, 208, 208, 208, 208, 631, 208, 208, 208, 631, 72, 72, 72, 632, 208, - 633, 208, 208, 324, 568, 634, 323, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 635, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, 631, 286, - 208, 208, 208, 208, 208, 208, 208, 322, 208, 208, 208, 208, 208, 568, 324, 72, - 324, 208, 208, 208, 636, 175, 208, 208, 636, 208, 637, 72, 72, 72, 72, 72, - 638, 208, 208, 208, 208, 208, 208, 639, 208, 208, 640, 208, 641, 208, 208, 208, - 208, 208, 208, 208, 208, 322, 637, 642, 633, 323, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 314, 72, 72, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 204, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 203, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 643, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 100, 72, - 48, 203, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 644, 72, 645, 645, 645, 645, 645, 645, 72, 72, 72, 72, 72, 72, 72, 72, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 646, +static RE_UINT8 re_alphabetic_table_2[] = { + 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 7, 8, 9, 10, 4, 11, + 4, 4, 4, 4, 12, 4, 4, 4, 4, 13, 14, 4, 15, 16, 17, 18, + 19, 4, 20, 21, 4, 4, 22, 23, 24, 4, 25, 4, 4, 26, 27, 28, + 29, 30, 31, 32, 0, 33, 34, 35, 4, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 48, 52, 53, 54, 55, 56, 0, + 57, 58, 59, 60, 57, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 0, 75, 76, 77, 0, 78, 0, 79, 80, 81, 82, 0, 0, + 4, 83, 24, 4, 84, 4, 85, 86, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 87, 4, 88, 89, 90, 4, 91, 4, 73, 0, 92, 4, 4, 93, + 72, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 94, 1, 4, 4, 95, 96, 97, 97, 98, 4, 99, 100, 0, + 0, 4, 4, 31, 4, 101, 4, 102, 103, 104, 24, 105, 4, 106, 107, 0, + 108, 4, 103, 109, 0, 110, 78, 0, 4, 111, 112, 0, 4, 113, 4, 114, + 4, 115, 116, 117, 118, 65, 0, 119, 4, 4, 4, 4, 4, 4, 0, 120, + 4, 4, 4, 4, 4, 4, 4, 4, 93, 4, 121, 117, 4, 122, 123, 124, + 0, 0, 0, 125, 126, 0, 0, 0, 127, 128, 129, 4, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 130, 4, 107, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 131, 103, 4, 4, 4, 4, 132, 4, 85, 4, 133, 115, 134, 134, 4, + 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 136, 137, 72, 4, 138, 72, 4, 86, 139, 13, 4, 4, 140, 4, 0, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 82, + 4, 4, 4, 4, 30, 0, 24, 117, 4, 4, 4, 4, 4, 4, 4, 4, + 141, 142, 4, 143, 4, 4, 4, 92, 144, 145, 4, 4, 146, 4, 147, 148, + 149, 150, 4, 97, 4, 4, 151, 152, 27, 101, 153, 82, 4, 154, 135, 155, + 4, 115, 156, 157, 4, 103, 158, 159, 160, 161, 86, 162, 4, 4, 4, 32, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 163, 164, 108, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 165, 4, 4, 166, 0, 167, 168, 169, 4, 4, 26, 170, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 117, 24, 4, 171, 4, 150, 172, + 0, 0, 0, 173, 4, 4, 4, 82, 0, 1, 1, 174, 4, 103, 175, 0, + 176, 177, 178, 0, 4, 4, 4, 73, 0, 0, 4, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 4, 180, 0, 4, 25, 101, 73, 117, 4, 181, 0, + 4, 4, 4, 4, 117, 24, 182, 108, 4, 183, 4, 60, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 115, 102, 150, 0, 0, 0, 0, + 184, 185, 102, 115, 103, 0, 0, 186, 102, 166, 0, 0, 4, 187, 0, 0, + 188, 102, 0, 82, 82, 0, 79, 189, 4, 102, 102, 153, 26, 0, 0, 0, + 4, 4, 15, 0, 4, 153, 4, 153, 4, 150, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 190, 0, 0, 82, 191, 192, 0, 0, 24, 189, 115, + 4, 4, 192, 0, 145, 31, 24, 15, 4, 153, 193, 194, 4, 4, 195, 0, + 196, 197, 0, 0, 198, 118, 4, 15, 39, 48, 199, 60, 0, 0, 0, 0, + 4, 4, 200, 201, 4, 4, 202, 0, 0, 0, 0, 0, 4, 203, 204, 0, + 4, 103, 205, 0, 4, 206, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, + 4, 31, 0, 0, 0, 4, 4, 207, 208, 209, 210, 0, 0, 211, 29, 212, + 4, 213, 24, 4, 214, 0, 4, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 215, 216, 78, 217, 171, 218, 0, 0, 219, 220, 221, 222, 223, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, 224, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 166, 0, 0, 0, + 4, 4, 4, 140, 4, 4, 4, 4, 4, 4, 60, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 31, 103, 0, 0, 0, 24, 156, 4, 92, 60, 226, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 227, 4, 228, 0, 0, 229, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 230, + 4, 4, 4, 4, 4, 4, 102, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 103, 0, 231, 193, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 108, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 232, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 33, 4, 234, 235, 236, 4, 237, 238, 239, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 240, 241, 86, 33, 33, 131, 131, 215, 215, 242, 0, + 243, 244, 0, 0, 0, 0, 0, 0, 4, 245, 246, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 247, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 189, 0, 4, 4, 248, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 236, 249, 250, 251, 252, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 162, 162, 107, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 117, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 179, 4, 4, 4, 4, 4, 4, + 117, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 254, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 78, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 32, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_general_category_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, - 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 17, 18, 19, 1, 20, 20, 21, 22, 23, 24, 25, - 26, 27, 15, 2, 28, 29, 27, 30, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 31, 11, 11, 11, 32, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 33, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32, - 32, 32, 32, 32, 11, 34, 34, 16, 34, 32, 32, 11, 34, 11, 16, 11, - 11, 34, 32, 11, 32, 16, 11, 34, 32, 32, 32, 11, 34, 16, 32, 11, - 34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34, - 34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32, - 32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32, - 16, 16, 39, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 41, 41, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, - 40, 40, 42, 41, 41, 41, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, - 43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 42, 32, 44, 45, 16, 10, - 44, 44, 41, 46, 11, 47, 47, 11, 34, 11, 11, 11, 11, 11, 11, 11, - 11, 48, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34, - 16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 49, 34, 32, 34, 11, - 32, 50, 43, 43, 51, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16, - 48, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 47, 52, 2, 2, 2, - 16, 16, 16, 16, 53, 54, 55, 56, 57, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 58, 59, 60, 43, 59, 44, 44, 44, 44, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 62, - 36, 63, 64, 44, 44, 44, 44, 44, 65, 65, 65, 8, 9, 66, 2, 67, - 43, 43, 43, 43, 43, 60, 68, 2, 69, 36, 36, 36, 36, 70, 43, 43, - 7, 7, 7, 7, 7, 2, 2, 36, 71, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 72, 43, 43, 43, 73, 50, 43, 43, 74, 75, 76, 43, 43, 36, - 7, 7, 7, 7, 7, 36, 77, 78, 2, 2, 2, 2, 2, 2, 2, 79, - 70, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 80, 62, 36, - 36, 36, 36, 43, 43, 43, 43, 43, 71, 44, 44, 44, 44, 44, 44, 44, - 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, - 43, 43, 40, 21, 2, 81, 57, 20, 36, 36, 36, 43, 43, 75, 43, 43, - 43, 43, 75, 43, 75, 43, 43, 44, 2, 2, 2, 2, 2, 2, 2, 64, - 36, 36, 36, 36, 70, 43, 44, 64, 36, 36, 36, 36, 36, 61, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 36, 36, 61, 36, 36, 36, 36, 44, - 44, 57, 43, 43, 43, 43, 43, 43, 43, 82, 43, 43, 43, 43, 43, 43, - 43, 83, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 71, 84, - 85, 43, 43, 43, 83, 84, 85, 84, 70, 43, 43, 43, 36, 36, 36, 36, - 36, 43, 2, 7, 7, 7, 7, 7, 86, 36, 36, 36, 36, 36, 36, 36, - 70, 84, 62, 36, 36, 36, 61, 62, 61, 62, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 61, 36, 36, 36, 61, 61, 44, 36, 36, 44, 71, 84, - 85, 43, 80, 87, 88, 87, 85, 61, 44, 44, 44, 87, 44, 44, 36, 62, - 36, 43, 44, 7, 7, 7, 7, 7, 36, 20, 27, 27, 27, 56, 63, 80, - 57, 83, 62, 36, 36, 61, 44, 62, 61, 36, 62, 61, 36, 44, 80, 84, - 85, 80, 44, 57, 80, 57, 43, 44, 57, 44, 44, 44, 62, 36, 61, 61, - 44, 44, 44, 7, 7, 7, 7, 7, 43, 36, 70, 64, 44, 44, 44, 44, - 57, 83, 62, 36, 36, 36, 36, 62, 36, 62, 36, 36, 36, 36, 36, 36, - 61, 36, 62, 36, 36, 44, 71, 84, 85, 43, 43, 57, 83, 87, 85, 44, - 61, 44, 44, 44, 44, 44, 44, 44, 66, 44, 44, 44, 62, 43, 43, 43, - 57, 84, 62, 36, 36, 36, 61, 62, 61, 36, 62, 36, 36, 44, 71, 85, - 85, 43, 80, 87, 88, 87, 85, 44, 44, 44, 44, 83, 44, 44, 36, 62, - 78, 27, 27, 27, 44, 44, 44, 44, 44, 71, 62, 36, 36, 61, 44, 36, - 61, 36, 36, 44, 62, 61, 61, 36, 44, 62, 61, 44, 36, 61, 44, 36, - 36, 36, 36, 36, 36, 44, 44, 84, 83, 88, 44, 84, 88, 84, 85, 44, - 61, 44, 44, 87, 44, 44, 44, 44, 27, 89, 67, 67, 56, 90, 44, 44, - 83, 84, 71, 36, 36, 36, 61, 36, 61, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 44, 62, 43, 83, 84, 88, 43, 80, 43, 43, 44, - 44, 44, 57, 80, 36, 61, 44, 44, 44, 44, 44, 91, 27, 27, 27, 89, - 70, 84, 72, 36, 36, 36, 61, 36, 36, 36, 62, 36, 36, 44, 71, 85, - 84, 84, 88, 83, 88, 84, 43, 44, 44, 44, 87, 88, 44, 44, 44, 61, - 62, 61, 44, 44, 44, 44, 44, 44, 43, 84, 62, 36, 36, 36, 61, 36, - 36, 36, 36, 36, 36, 70, 71, 84, 85, 43, 80, 84, 88, 84, 85, 77, - 44, 44, 36, 92, 27, 27, 27, 93, 27, 27, 27, 27, 89, 36, 36, 36, - 44, 84, 62, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 36, 36, 36, - 36, 62, 36, 36, 36, 36, 62, 44, 36, 36, 36, 61, 44, 80, 44, 87, - 84, 43, 80, 80, 84, 84, 84, 84, 44, 84, 64, 44, 44, 44, 44, 44, - 62, 36, 36, 36, 36, 36, 36, 36, 70, 36, 43, 43, 43, 80, 44, 94, - 36, 36, 36, 75, 43, 43, 43, 60, 7, 7, 7, 7, 7, 2, 44, 44, - 62, 61, 61, 36, 36, 61, 36, 36, 36, 36, 62, 62, 36, 36, 36, 36, - 70, 36, 43, 43, 43, 43, 71, 44, 36, 36, 61, 81, 43, 43, 43, 44, - 7, 7, 7, 7, 7, 44, 36, 36, 77, 67, 2, 2, 2, 2, 2, 2, - 2, 95, 95, 67, 43, 67, 67, 67, 7, 7, 7, 7, 7, 27, 27, 27, - 27, 27, 50, 50, 50, 4, 4, 84, 36, 36, 36, 36, 62, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 61, 44, 57, 43, 43, 43, 43, 43, 43, 83, - 43, 43, 60, 43, 36, 36, 70, 43, 43, 43, 43, 43, 57, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 80, 67, 67, 67, 67, 76, 67, 67, 90, 67, - 2, 2, 95, 67, 21, 64, 44, 44, 36, 36, 36, 36, 36, 92, 85, 43, - 83, 43, 43, 43, 85, 83, 85, 71, 7, 7, 7, 7, 7, 2, 2, 2, - 36, 36, 36, 84, 43, 36, 36, 43, 71, 84, 96, 92, 84, 84, 84, 36, - 70, 43, 71, 36, 36, 36, 36, 36, 36, 83, 85, 83, 84, 84, 85, 92, - 7, 7, 7, 7, 7, 84, 85, 67, 11, 11, 11, 48, 44, 44, 48, 44, - 16, 16, 16, 16, 16, 53, 45, 16, 36, 36, 36, 36, 61, 36, 36, 44, - 36, 36, 36, 61, 61, 36, 36, 44, 61, 36, 36, 44, 36, 36, 36, 61, - 61, 36, 36, 44, 36, 36, 36, 36, 36, 36, 36, 61, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 61, 57, 43, 2, 2, 2, 2, 97, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 98, 44, 67, 67, 67, 67, 67, 44, 44, 44, - 11, 11, 11, 44, 16, 16, 16, 44, 99, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 77, 72, 100, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 101, 102, 44, 36, 36, 36, 36, 36, 63, 2, 103, - 104, 36, 36, 36, 61, 44, 44, 44, 36, 36, 36, 36, 36, 36, 61, 36, - 36, 43, 80, 44, 44, 44, 44, 44, 36, 43, 60, 64, 44, 44, 44, 44, - 36, 43, 44, 44, 44, 44, 44, 44, 61, 43, 44, 44, 44, 44, 44, 44, - 36, 36, 43, 85, 43, 43, 43, 84, 84, 84, 84, 83, 85, 43, 43, 43, - 43, 43, 2, 86, 2, 66, 70, 44, 7, 7, 7, 7, 7, 44, 44, 44, - 27, 27, 27, 27, 27, 44, 44, 44, 2, 2, 2, 105, 2, 59, 43, 68, - 36, 106, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 44, 44, - 36, 36, 70, 71, 36, 36, 36, 36, 36, 36, 36, 36, 70, 61, 44, 44, - 36, 36, 36, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 61, - 43, 83, 84, 85, 83, 84, 44, 44, 84, 83, 84, 84, 85, 43, 44, 44, - 90, 44, 2, 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 44, - 36, 36, 61, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 44, 44, - 36, 36, 36, 36, 36, 44, 44, 44, 7, 7, 7, 7, 7, 98, 44, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 36, 36, 36, 70, 83, 85, 44, 2, - 36, 36, 92, 83, 43, 43, 43, 80, 83, 83, 85, 43, 43, 43, 83, 84, - 84, 85, 43, 43, 43, 43, 80, 57, 2, 2, 2, 86, 2, 2, 2, 44, - 43, 43, 43, 43, 43, 43, 43, 107, 43, 43, 96, 36, 36, 36, 36, 36, - 36, 36, 83, 43, 43, 83, 83, 84, 84, 83, 96, 36, 36, 36, 44, 44, - 95, 67, 67, 67, 67, 50, 43, 43, 43, 43, 67, 67, 67, 67, 90, 44, - 43, 96, 36, 36, 36, 36, 36, 36, 92, 43, 43, 84, 43, 85, 43, 36, - 36, 36, 36, 83, 43, 84, 85, 85, 43, 84, 44, 44, 44, 44, 2, 2, - 36, 36, 84, 84, 84, 84, 43, 43, 43, 43, 84, 43, 44, 91, 2, 2, - 7, 7, 7, 7, 7, 44, 62, 36, 36, 36, 36, 36, 40, 40, 40, 2, - 16, 16, 16, 16, 108, 44, 44, 44, 11, 11, 11, 11, 11, 47, 48, 11, - 2, 2, 2, 2, 44, 44, 44, 44, 43, 60, 43, 43, 43, 43, 43, 43, - 83, 43, 43, 43, 71, 36, 70, 36, 36, 36, 71, 92, 43, 61, 44, 44, - 16, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 45, 16, 16, - 16, 16, 16, 16, 45, 16, 16, 16, 16, 16, 16, 16, 16, 109, 40, 40, - 43, 43, 43, 43, 43, 57, 43, 43, 32, 32, 32, 16, 16, 16, 16, 32, - 16, 16, 16, 16, 11, 11, 11, 11, 16, 16, 16, 44, 11, 11, 11, 44, - 16, 16, 16, 16, 48, 48, 48, 48, 16, 16, 16, 16, 16, 16, 16, 44, - 16, 16, 16, 16, 110, 110, 110, 110, 16, 16, 108, 16, 11, 11, 111, 112, - 41, 16, 108, 16, 11, 11, 111, 41, 16, 16, 44, 16, 11, 11, 113, 41, - 16, 16, 16, 16, 11, 11, 114, 41, 44, 16, 108, 16, 11, 11, 111, 115, - 116, 116, 116, 116, 116, 117, 65, 65, 118, 118, 118, 2, 119, 120, 119, 120, - 2, 2, 2, 2, 121, 65, 65, 122, 2, 2, 2, 2, 123, 124, 2, 125, - 126, 2, 127, 128, 2, 2, 2, 2, 2, 9, 126, 2, 2, 2, 2, 129, - 65, 65, 68, 65, 65, 65, 65, 65, 130, 44, 27, 27, 27, 8, 127, 131, - 27, 27, 27, 27, 27, 8, 127, 102, 40, 40, 40, 40, 40, 40, 81, 44, - 20, 20, 20, 20, 20, 20, 20, 20, 43, 43, 43, 43, 43, 43, 132, 51, - 133, 51, 133, 43, 43, 43, 43, 43, 80, 44, 44, 44, 44, 44, 44, 44, - 67, 134, 67, 135, 67, 34, 11, 16, 11, 32, 135, 67, 49, 11, 11, 67, - 67, 67, 134, 134, 134, 11, 11, 136, 11, 11, 35, 36, 39, 67, 16, 11, - 8, 8, 49, 16, 16, 26, 67, 137, 27, 27, 27, 27, 27, 27, 27, 27, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 138, 139, 103, 140, 67, 44, 44, - 8, 8, 141, 67, 67, 8, 67, 67, 141, 26, 67, 141, 67, 67, 67, 141, - 67, 67, 67, 67, 67, 67, 67, 8, 67, 141, 141, 67, 67, 67, 67, 67, - 67, 67, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 67, 67, 67, 67, 4, 4, 67, 67, 8, 67, 67, 67, 142, 143, 67, 67, - 67, 67, 67, 67, 67, 67, 141, 67, 67, 67, 67, 67, 67, 26, 8, 8, - 8, 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, - 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 44, 44, 44, 44, - 67, 67, 67, 67, 67, 90, 44, 44, 27, 27, 27, 27, 27, 27, 67, 67, - 67, 67, 67, 67, 67, 27, 27, 27, 67, 67, 67, 26, 67, 67, 67, 67, - 26, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, 8, 8, - 67, 67, 67, 67, 67, 67, 67, 26, 67, 67, 67, 67, 4, 4, 4, 4, - 4, 4, 4, 27, 27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, - 8, 8, 127, 144, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, - 8, 127, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 144, 8, 8, 8, - 8, 8, 8, 8, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, - 8, 8, 141, 26, 8, 8, 141, 67, 67, 67, 44, 67, 67, 67, 67, 67, - 67, 67, 67, 44, 67, 67, 67, 67, 11, 11, 11, 11, 11, 11, 11, 47, - 16, 16, 16, 16, 16, 16, 16, 108, 32, 11, 32, 34, 34, 34, 34, 11, - 32, 32, 34, 16, 16, 16, 40, 11, 32, 32, 137, 67, 67, 135, 34, 146, - 43, 32, 44, 44, 91, 2, 97, 2, 16, 16, 16, 147, 44, 44, 147, 44, - 36, 36, 36, 36, 44, 44, 44, 52, 64, 44, 44, 44, 44, 44, 44, 57, - 36, 36, 36, 61, 44, 44, 44, 44, 36, 36, 36, 61, 36, 36, 36, 61, - 2, 119, 119, 2, 123, 124, 119, 2, 2, 2, 2, 6, 2, 105, 119, 2, - 119, 4, 4, 4, 4, 2, 2, 86, 2, 2, 2, 2, 2, 118, 2, 2, - 105, 148, 2, 2, 2, 2, 2, 2, 67, 67, 67, 67, 67, 55, 67, 67, - 67, 67, 44, 44, 44, 44, 44, 44, 67, 67, 67, 44, 44, 44, 44, 44, - 67, 67, 67, 67, 67, 67, 44, 44, 1, 2, 149, 150, 4, 4, 4, 4, - 4, 67, 4, 4, 4, 4, 151, 152, 153, 103, 103, 103, 103, 43, 43, 84, - 154, 40, 40, 67, 103, 155, 63, 67, 36, 36, 36, 61, 57, 156, 157, 69, - 36, 36, 36, 36, 36, 63, 40, 69, 44, 44, 62, 36, 36, 36, 36, 36, - 67, 27, 27, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, - 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27, - 158, 27, 27, 27, 27, 27, 27, 27, 36, 36, 106, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 159, 2, 7, 7, 7, 7, 7, 36, 44, 44, - 32, 32, 32, 32, 32, 32, 32, 70, 51, 160, 43, 43, 43, 43, 43, 86, - 32, 32, 32, 32, 32, 32, 40, 43, 36, 36, 36, 103, 103, 103, 103, 103, - 43, 2, 2, 2, 44, 44, 44, 44, 41, 41, 41, 157, 40, 40, 40, 40, - 41, 32, 32, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, - 45, 16, 16, 16, 34, 34, 34, 32, 32, 32, 32, 32, 42, 161, 34, 35, - 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 11, 11, 32, - 11, 11, 32, 32, 32, 32, 32, 32, 44, 32, 11, 47, 44, 44, 44, 44, - 44, 44, 44, 62, 40, 35, 36, 36, 36, 71, 36, 71, 36, 70, 36, 36, - 36, 92, 85, 83, 67, 67, 44, 44, 27, 27, 27, 67, 162, 44, 44, 44, - 36, 36, 2, 2, 44, 44, 44, 44, 84, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 84, 84, 84, 84, 84, 84, 84, 84, 43, 44, 44, 44, 44, 2, - 43, 36, 36, 36, 2, 72, 72, 70, 36, 36, 36, 43, 43, 43, 43, 2, - 36, 36, 36, 70, 43, 43, 43, 43, 43, 84, 44, 44, 44, 44, 44, 91, - 36, 70, 84, 43, 43, 84, 43, 84, 163, 2, 2, 2, 2, 2, 2, 52, - 7, 7, 7, 7, 7, 44, 44, 2, 36, 36, 70, 69, 36, 36, 36, 36, - 7, 7, 7, 7, 7, 36, 36, 61, 36, 36, 36, 36, 70, 43, 43, 83, - 85, 83, 85, 80, 44, 44, 44, 44, 36, 70, 36, 36, 36, 36, 83, 44, - 7, 7, 7, 7, 7, 44, 2, 2, 69, 36, 36, 77, 67, 92, 83, 36, - 71, 43, 71, 70, 71, 36, 36, 43, 70, 61, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 62, 106, 2, 36, 36, 36, 36, 36, 92, 43, 84, - 2, 106, 164, 80, 44, 44, 44, 44, 62, 36, 36, 61, 62, 36, 36, 61, - 62, 36, 36, 61, 44, 44, 44, 44, 16, 16, 16, 16, 16, 112, 40, 40, - 16, 16, 16, 16, 44, 44, 44, 44, 36, 92, 85, 84, 83, 163, 85, 44, - 36, 36, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 44, 62, 36, 36, - 165, 165, 165, 165, 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, 166, 166, - 16, 16, 16, 108, 44, 44, 44, 44, 44, 147, 16, 16, 44, 44, 62, 71, - 36, 36, 36, 36, 167, 36, 36, 36, 36, 36, 36, 61, 36, 36, 61, 61, - 36, 62, 61, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41, - 41, 44, 44, 44, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 145, 44, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 162, 44, - 2, 2, 2, 168, 128, 44, 44, 44, 6, 169, 170, 145, 145, 145, 145, 145, - 145, 145, 128, 168, 128, 2, 125, 171, 2, 64, 2, 2, 151, 145, 145, 128, - 2, 172, 8, 173, 66, 2, 44, 44, 36, 36, 61, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 61, 79, 91, 2, 3, 2, 4, 5, 6, 2, - 16, 16, 16, 16, 16, 17, 18, 127, 128, 4, 2, 36, 36, 36, 36, 36, - 69, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 40, - 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 61, 44, - 20, 174, 56, 175, 26, 8, 141, 90, 44, 44, 44, 44, 79, 65, 67, 44, - 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 61, 36, 62, - 2, 64, 44, 176, 27, 27, 27, 27, 27, 27, 44, 55, 67, 67, 67, 67, - 103, 103, 140, 27, 89, 67, 67, 67, 67, 67, 67, 67, 67, 27, 67, 90, - 90, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 50, 44, - 177, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 44, 44, - 27, 27, 44, 44, 44, 44, 62, 36, 150, 36, 36, 36, 36, 178, 44, 44, - 36, 36, 36, 43, 43, 80, 44, 44, 36, 36, 36, 36, 36, 36, 36, 91, - 36, 36, 44, 44, 36, 36, 36, 36, 179, 103, 103, 44, 44, 44, 44, 44, - 11, 11, 11, 11, 16, 16, 16, 16, 11, 11, 44, 44, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 44, 44, 36, 36, 44, 44, 44, 44, 44, 91, - 36, 36, 36, 44, 61, 36, 36, 36, 36, 36, 36, 62, 61, 44, 61, 62, - 36, 36, 36, 91, 27, 27, 27, 27, 36, 36, 36, 77, 158, 27, 27, 27, - 44, 44, 44, 176, 27, 27, 27, 27, 36, 61, 36, 44, 44, 176, 27, 27, - 36, 36, 36, 27, 27, 27, 44, 91, 36, 36, 36, 36, 36, 44, 44, 91, - 36, 36, 36, 36, 44, 44, 27, 36, 44, 27, 27, 27, 27, 27, 27, 27, - 70, 43, 57, 80, 44, 44, 43, 43, 36, 36, 62, 36, 62, 36, 36, 36, - 36, 36, 36, 44, 43, 80, 44, 57, 27, 27, 27, 27, 98, 44, 44, 44, - 2, 2, 2, 2, 64, 44, 44, 44, 36, 36, 36, 36, 36, 36, 180, 30, - 36, 36, 36, 36, 36, 36, 180, 27, 36, 36, 36, 36, 78, 36, 36, 36, - 36, 36, 70, 80, 44, 176, 27, 27, 2, 2, 2, 64, 44, 44, 44, 44, - 36, 36, 36, 44, 91, 2, 2, 2, 36, 36, 36, 44, 27, 27, 27, 27, - 36, 61, 44, 44, 27, 27, 27, 27, 36, 44, 44, 44, 91, 2, 64, 44, - 44, 44, 44, 44, 176, 27, 27, 27, 11, 47, 44, 44, 44, 44, 44, 44, - 16, 108, 44, 44, 44, 27, 27, 27, 36, 36, 43, 43, 44, 44, 44, 44, - 27, 27, 27, 27, 27, 27, 27, 98, 27, 27, 27, 93, 44, 44, 44, 44, - 177, 27, 30, 2, 2, 44, 44, 44, 85, 96, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 43, 60, 2, 2, 2, 44, - 27, 27, 27, 7, 7, 7, 7, 7, 44, 44, 44, 44, 44, 44, 44, 57, - 84, 85, 43, 83, 85, 60, 181, 2, 2, 44, 44, 44, 44, 44, 79, 44, - 43, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, 85, 43, - 43, 43, 80, 7, 7, 7, 7, 7, 2, 2, 92, 88, 44, 44, 44, 44, - 36, 70, 2, 61, 44, 44, 44, 44, 36, 92, 84, 43, 43, 43, 43, 83, - 96, 36, 63, 2, 59, 43, 60, 44, 7, 7, 7, 7, 7, 63, 63, 2, - 176, 27, 27, 27, 27, 27, 27, 27, 27, 27, 98, 44, 44, 44, 44, 44, - 36, 36, 36, 36, 36, 36, 84, 85, 43, 84, 83, 43, 2, 2, 2, 80, - 36, 36, 36, 61, 61, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 62, - 36, 36, 36, 36, 63, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 70, - 84, 85, 43, 43, 43, 80, 44, 44, 43, 84, 62, 36, 36, 36, 61, 62, - 61, 36, 62, 36, 36, 57, 71, 84, 83, 84, 88, 87, 88, 87, 84, 44, - 61, 44, 44, 87, 44, 44, 62, 36, 36, 84, 44, 43, 43, 43, 80, 44, - 43, 43, 80, 44, 44, 44, 44, 44, 36, 36, 92, 84, 43, 43, 43, 43, - 84, 43, 83, 71, 36, 63, 2, 2, 7, 7, 7, 7, 7, 91, 91, 71, - 84, 85, 43, 43, 83, 83, 84, 85, 83, 43, 36, 72, 44, 44, 44, 44, - 36, 36, 36, 36, 36, 36, 36, 92, 84, 43, 43, 44, 84, 84, 43, 85, - 60, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 36, 43, 44, - 84, 85, 43, 43, 43, 83, 85, 85, 60, 2, 61, 44, 44, 44, 44, 44, - 2, 2, 2, 2, 2, 2, 64, 44, 36, 36, 36, 36, 36, 70, 85, 84, - 43, 43, 43, 85, 61, 44, 44, 44, 84, 43, 43, 85, 43, 43, 44, 44, - 7, 7, 7, 7, 7, 27, 2, 95, 43, 43, 43, 43, 85, 60, 44, 44, - 27, 98, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 44, 36, 36, 36, - 92, 84, 43, 43, 44, 43, 84, 84, 71, 72, 88, 44, 44, 44, 44, 44, - 70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 83, 70, 43, 60, - 2, 2, 2, 59, 44, 44, 44, 44, 70, 43, 43, 83, 85, 43, 36, 36, - 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 83, 43, 2, 72, 2, - 2, 64, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 85, - 63, 2, 2, 44, 44, 44, 44, 44, 2, 36, 36, 36, 36, 36, 36, 36, - 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 87, 43, 43, 43, - 83, 43, 85, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36, - 70, 43, 43, 80, 44, 80, 43, 57, 43, 43, 43, 70, 44, 44, 44, 44, - 36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 84, 84, 88, - 43, 87, 85, 85, 61, 44, 44, 44, 36, 70, 83, 163, 64, 44, 44, 44, - 27, 27, 89, 67, 67, 67, 56, 20, 162, 67, 67, 67, 67, 67, 67, 67, - 67, 44, 44, 44, 44, 44, 44, 91, 103, 103, 103, 103, 103, 103, 103, 178, - 2, 2, 64, 44, 44, 44, 44, 44, 65, 65, 65, 65, 68, 44, 44, 44, - 43, 43, 60, 44, 44, 44, 44, 44, 43, 43, 43, 60, 2, 2, 67, 67, - 40, 40, 95, 44, 44, 44, 44, 44, 7, 7, 7, 7, 7, 176, 27, 27, - 27, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 62, 36, - 27, 27, 27, 30, 2, 64, 44, 44, 36, 36, 36, 36, 36, 61, 44, 57, - 92, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 44, 44, 44, 57, 43, 74, 40, 40, 40, 40, 40, 40, - 40, 86, 44, 44, 44, 44, 44, 44, 36, 61, 44, 44, 44, 44, 44, 44, - 44, 44, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 44, 50, 60, - 65, 65, 44, 44, 44, 44, 44, 44, 67, 67, 67, 90, 55, 67, 67, 67, - 67, 67, 182, 85, 43, 67, 182, 84, 84, 183, 65, 65, 65, 82, 43, 43, - 43, 76, 50, 43, 43, 43, 67, 67, 67, 67, 67, 67, 67, 43, 43, 67, - 67, 67, 67, 67, 90, 44, 44, 44, 67, 43, 76, 44, 44, 44, 44, 44, - 27, 27, 44, 44, 44, 44, 44, 44, 11, 11, 11, 11, 11, 16, 16, 16, - 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, - 16, 16, 108, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 47, 11, 44, 47, 48, 47, 48, 11, 47, 11, - 11, 11, 11, 16, 16, 147, 147, 16, 16, 16, 147, 16, 16, 16, 16, 16, - 16, 16, 11, 48, 11, 47, 48, 11, 11, 11, 47, 11, 11, 11, 47, 16, - 16, 16, 16, 16, 11, 48, 11, 47, 11, 11, 47, 47, 44, 11, 11, 11, - 47, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11, - 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 44, 11, 11, 11, 11, - 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, - 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, - 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, - 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 44, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 43, 43, 43, 76, 67, 50, 43, 43, - 43, 43, 43, 43, 43, 43, 76, 67, 67, 67, 50, 67, 67, 67, 67, 67, - 67, 67, 76, 21, 2, 2, 44, 44, 44, 44, 44, 44, 44, 57, 43, 43, - 43, 43, 43, 80, 43, 43, 43, 43, 43, 43, 43, 43, 80, 57, 43, 43, - 43, 57, 80, 43, 43, 80, 44, 44, 43, 43, 43, 74, 40, 40, 40, 44, - 7, 7, 7, 7, 7, 44, 44, 77, 36, 36, 36, 36, 36, 36, 43, 43, - 7, 7, 7, 7, 7, 44, 44, 94, 36, 36, 61, 176, 27, 27, 27, 27, - 43, 43, 43, 80, 44, 44, 44, 44, 16, 16, 43, 43, 43, 74, 44, 44, - 27, 27, 27, 27, 27, 27, 158, 27, 184, 27, 98, 44, 44, 44, 44, 44, - 27, 27, 27, 27, 27, 27, 27, 158, 27, 27, 27, 27, 27, 27, 27, 44, - 36, 36, 62, 36, 36, 36, 36, 36, 62, 61, 61, 62, 62, 36, 36, 36, - 36, 61, 36, 36, 62, 62, 44, 44, 44, 61, 44, 62, 62, 62, 62, 36, - 62, 61, 61, 62, 62, 62, 62, 62, 62, 61, 61, 62, 36, 61, 36, 36, - 36, 61, 36, 36, 62, 36, 61, 61, 36, 36, 36, 36, 36, 62, 36, 36, - 62, 36, 62, 36, 36, 62, 36, 36, 8, 44, 44, 44, 44, 44, 44, 44, - 55, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 44, - 44, 44, 44, 67, 67, 67, 67, 67, 67, 90, 44, 44, 44, 44, 44, 44, - 67, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 25, 41, 41, - 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 67, 44, - 67, 67, 67, 67, 67, 67, 55, 67, 67, 55, 67, 90, 44, 67, 67, 67, - 67, 90, 55, 67, 67, 90, 44, 67, 67, 67, 67, 67, 67, 90, 55, 67, - 67, 67, 44, 44, 67, 90, 44, 44, 36, 44, 44, 44, 44, 44, 44, 44, - 79, 44, 44, 44, 44, 44, 44, 44, 65, 65, 65, 65, 65, 65, 65, 65, - 166, 166, 166, 166, 166, 166, 166, 44, +static RE_UINT8 re_alphabetic_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, + 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 32, 0, 0, 0, + 0, 0, 223, 188, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, + 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 0, 0, + 0, 0, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, 0, 0, 255, 7, + 255, 255, 255, 254, 0, 192, 255, 255, 255, 255, 239, 31, 254, 225, 0, 156, + 0, 0, 255, 255, 0, 224, 255, 255, 255, 255, 3, 0, 0, 252, 255, 255, + 255, 7, 48, 4, 255, 255, 255, 252, 255, 31, 0, 0, 255, 255, 255, 1, + 255, 7, 0, 0, 255, 255, 223, 255, 255, 0, 240, 255, 248, 3, 255, 255, + 255, 255, 255, 239, 255, 223, 225, 255, 15, 0, 254, 255, 239, 159, 249, 255, + 255, 253, 197, 227, 159, 89, 128, 176, 15, 0, 3, 16, 238, 135, 249, 255, + 255, 253, 109, 195, 135, 25, 2, 94, 0, 0, 63, 0, 238, 191, 251, 255, + 255, 253, 237, 227, 191, 27, 1, 0, 15, 0, 0, 30, 238, 159, 249, 255, + 159, 25, 192, 176, 15, 0, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, + 199, 29, 129, 0, 239, 223, 253, 255, 255, 253, 255, 227, 223, 29, 96, 7, + 15, 0, 0, 0, 255, 253, 239, 227, 223, 29, 96, 64, 15, 0, 6, 0, + 255, 223, 253, 255, 255, 255, 255, 231, 223, 93, 240, 128, 15, 0, 0, 252, + 238, 255, 127, 252, 255, 255, 251, 47, 127, 128, 95, 255, 0, 0, 12, 0, + 254, 255, 255, 255, 255, 255, 255, 7, 127, 32, 0, 0, 214, 247, 255, 255, + 175, 255, 255, 59, 95, 32, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, + 255, 31, 254, 255, 3, 255, 255, 254, 255, 255, 255, 31, 255, 255, 127, 249, + 255, 255, 0, 60, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, + 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, + 255, 255, 0, 0, 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, + 255, 223, 15, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 207, 255, + 255, 1, 128, 16, 255, 7, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, + 255, 15, 255, 1, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 0, 0, + 255, 255, 255, 15, 254, 255, 31, 0, 128, 0, 0, 128, 255, 255, 239, 255, + 239, 15, 0, 0, 255, 243, 0, 252, 191, 255, 3, 0, 255, 255, 127, 0, + 0, 224, 0, 252, 255, 255, 255, 63, 255, 1, 255, 255, 0, 222, 111, 4, + 128, 255, 31, 0, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, + 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, + 80, 189, 255, 243, 224, 67, 0, 0, 0, 0, 192, 255, 255, 127, 255, 255, + 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, 0, 128, 0, 0, + 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 224, 224, 255, 255, 255, + 255, 127, 0, 0, 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 240, 143, + 0, 0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, 252, 7, 0, 0, + 0, 0, 224, 255, 191, 255, 255, 255, 255, 0, 0, 0, 47, 0, 0, 0, + 0, 0, 252, 232, 255, 255, 7, 0, 255, 255, 247, 255, 255, 255, 0, 124, + 255, 63, 0, 0, 255, 255, 127, 252, 5, 0, 0, 56, 255, 255, 60, 0, + 126, 126, 126, 0, 127, 127, 255, 255, 255, 3, 255, 255, 15, 0, 255, 255, + 127, 248, 255, 255, 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 224, + 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, + 0, 0, 255, 15, 0, 0, 223, 255, 192, 255, 255, 255, 252, 252, 252, 28, + 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 31, 0, + 255, 255, 1, 0, 15, 255, 62, 0, 255, 255, 15, 255, 255, 0, 255, 255, + 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, 255, 255, 255, 192, + 111, 240, 239, 254, 31, 0, 0, 0, 255, 27, 3, 0, 128, 0, 255, 255, + 63, 0, 0, 0, 240, 0, 255, 255, 255, 255, 71, 0, 30, 192, 0, 20, + 255, 255, 251, 255, 255, 255, 159, 64, 127, 189, 255, 191, 159, 25, 129, 224, + 187, 7, 0, 128, 3, 0, 0, 0, 179, 0, 0, 0, 255, 255, 63, 127, + 0, 0, 0, 63, 17, 0, 0, 0, 255, 255, 63, 1, 0, 0, 0, 128, + 127, 242, 111, 255, 255, 255, 191, 153, 7, 0, 0, 0, 255, 252, 255, 255, + 26, 0, 0, 0, 255, 255, 231, 127, 255, 255, 255, 32, 255, 253, 255, 255, + 255, 255, 127, 127, 0, 0, 252, 255, 255, 254, 127, 0, 127, 251, 255, 255, + 255, 255, 127, 180, 203, 0, 0, 0, 191, 253, 255, 255, 255, 127, 123, 1, + 0, 0, 1, 0, 127, 0, 0, 0, 248, 255, 255, 224, 255, 135, 255, 255, + 255, 128, 255, 255, 11, 0, 3, 0, 255, 255, 255, 0, 0, 0, 7, 0, + 255, 7, 255, 31, 255, 1, 255, 67, 255, 255, 255, 223, 100, 222, 255, 235, + 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, + 63, 255, 255, 255, 253, 255, 255, 247, 247, 15, 0, 0, 127, 255, 255, 249, + 219, 7, 0, 0, 255, 31, 128, 63, 0, 64, 0, 0, 255, 15, 0, 0, + 143, 8, 0, 0, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, + 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255 }; -static RE_UINT8 re_general_category_stage_4[] = { - 15, 15, 12, 23, 23, 23, 25, 23, 20, 21, 23, 24, 23, 19, 9, 9, - 24, 24, 24, 23, 23, 1, 1, 1, 1, 20, 23, 21, 26, 22, 26, 2, - 2, 2, 2, 20, 24, 21, 24, 15, 25, 25, 27, 23, 26, 27, 5, 28, - 24, 16, 27, 26, 27, 24, 11, 11, 26, 11, 5, 29, 11, 23, 1, 24, - 1, 2, 2, 24, 2, 1, 2, 5, 5, 5, 1, 3, 3, 2, 5, 2, - 4, 4, 26, 26, 4, 26, 6, 6, 0, 0, 4, 2, 1, 23, 1, 0, - 0, 1, 24, 1, 27, 6, 7, 7, 0, 4, 2, 23, 19, 0, 0, 27, - 27, 25, 0, 6, 19, 6, 23, 6, 6, 23, 5, 0, 0, 5, 5, 23, - 23, 0, 16, 16, 23, 25, 27, 27, 16, 0, 4, 5, 5, 6, 6, 5, - 23, 5, 6, 16, 6, 4, 4, 6, 6, 27, 5, 27, 27, 5, 0, 16, - 6, 0, 4, 0, 16, 6, 6, 8, 8, 8, 8, 6, 23, 4, 0, 8, - 8, 0, 11, 27, 27, 0, 0, 23, 5, 8, 11, 5, 0, 25, 23, 27, - 8, 5, 23, 11, 11, 0, 19, 5, 12, 5, 5, 20, 21, 0, 10, 10, - 10, 5, 19, 23, 5, 4, 7, 0, 2, 0, 2, 4, 3, 3, 3, 26, - 2, 26, 0, 26, 1, 26, 26, 0, 12, 12, 12, 16, 19, 19, 28, 29, - 20, 28, 13, 14, 16, 12, 23, 28, 29, 23, 23, 22, 22, 23, 24, 20, - 21, 23, 23, 12, 11, 4, 21, 4, 6, 7, 7, 6, 1, 27, 27, 1, - 27, 2, 2, 27, 10, 1, 2, 10, 10, 11, 24, 27, 27, 20, 21, 27, - 21, 24, 21, 20, 2, 6, 0, 2, 20, 23, 27, 4, 5, 10, 19, 20, - 21, 21, 27, 10, 19, 4, 10, 4, 6, 26, 26, 4, 27, 11, 4, 23, - 7, 23, 26, 1, 25, 27, 8, 23, 4, 8, 18, 18, 17, 17, 5, 24, - 23, 20, 19, 22, 22, 20, 22, 22, 24, 19, 24, 0, 24, 26, 25, 0, - 0, 11, 6, 11, 10, 0, 23, 10, 5, 11, 23, 16, 27, 8, 8, 16, - 25, 11, -}; +RE_UINT32 re_get_alphabetic(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* General_Category: 13674 bytes. */ - -RE_UINT32 re_get_general_category(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 9; - code = ch ^ (f << 9); - pos = (RE_UINT32)re_general_category_stage_1[f] << 5; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_general_category_stage_2[pos + f] << 3; - f = code >> 1; - code ^= f << 1; - pos = (RE_UINT32)re_general_category_stage_3[pos + f] << 1; - value = re_general_category_stage_4[pos + code]; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* Block. */ + v = re_alphabetic_table_1[field_2]; + v = re_alphabetic_table_2[(v << 5) | field_1]; + v = re_alphabetic_table_3[(v << 2) | field_0]; -static RE_UINT8 re_block_stage_1[] = { + return (v >> offset) & 0x1; +} + +/* Alphanumeric. */ +static RE_UINT8 re_alphanumeric_table_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, - 13, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 16, 17, 18, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, 36, 36, - 36, 39, 36, 36, 36, 36, 36, 36, 36, 36, 40, 41, 42, 42, 42, 42, - 42, 42, 43, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 36, 36, 45, - 36, 36, 36, 36, 46, 47, 48, 36, 49, 36, 50, 51, 52, 53, 54, 36, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 57, 57, 57, 58, 59, 60, - 60, 60, 60, 61, 62, 62, 62, 62, 62, 62, 63, 36, 36, 36, 64, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 65, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, -}; - -static RE_UINT16 re_block_stage_2[] = { - 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, - 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 14, 15, 16, 16, 16, - 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 19, 20, 21, 21, 22, 22, - 23, 23, 24, 25, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, - 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, - 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, - 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, - 41, 41, 41, 41, 41, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 46, 46, 46, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 48, 49, 49, 49, 50, 51, 52, 53, 54, 54, 54, 54, - 55, 55, 55, 55, 55, 56, 57, 57, 58, 58, 59, 60, 61, 61, 61, 62, - 63, 64, 64, 64, 64, 65, 66, 66, 67, 67, 67, 67, 68, 68, 69, 69, - 70, 70, 71, 72, 73, 74, 75, 76, 77, 77, 77, 77, 78, 78, 79, 79, - 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, - 82, 82, 82, 83, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 92, 92, - 93, 93, 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, - 95, 95, 96, 97, 97, 97, 97, 97, 98, 98, 98, 98, 99, 100, 100, 100, - 101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 103, 104, - 105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 107, 107, 107, 107, - 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, - 110, 110, 110, 111, 112, 112, 112, 112, 113, 114, 115, 115, 116, 116, 116, 117, - 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 121, - 122, 122, 123, 123, 123, 124, 124, 124, 125, 126, 127, 127, 128, 129, 130, 131, - 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, - 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 135, 135, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 138, 139, 140, 141, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 143, 143, 143, 144, 144, 144, 145, 146, 146, 146, 146, 146, 146, 146, - 147, 148, 149, 149, 150, 150, 150, 151, 152, 153, 154, 155, 156, 156, 156, 157, - 158, 158, 158, 159, 160, 160, 160, 161, 162, 163, 164, 165, 166, 166, 167, 167, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 170, 170, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 172, 172, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 177, 178, 178, 178, 178, 178, - 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, - 179, 180, 181, 182, 183, 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, 185, - 186, 186, 186, 186, 187, 187, 187, 187, 188, 188, 189, 189, 190, 191, 192, 193, - 26, 26, 26, 26, 194, 195, 195, 196, 197, 198, 199, 200, 201, 202, 202, 26, - 203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 26, 26, 26, 26, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 26, 26, 26, 26, - 214, 214, 215, 216, 217, 218, 26, 219, 220, 221, 26, 26, 222, 223, 223, 223, - 224, 224, 224, 225, 226, 26, 227, 227, 228, 228, 229, 230, 231, 232, 26, 26, - 233, 233, 234, 26, 235, 235, 235, 235, 236, 236, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 237, 26, 26, 26, 26, 238, 239, 240, 241, 26, 26, 26, 242, - 243, 243, 243, 243, 244, 244, 245, 246, 247, 247, 248, 249, 250, 250, 250, 251, - 252, 252, 253, 26, 254, 255, 256, 256, 257, 257, 257, 257, 26, 26, 26, 26, - 258, 258, 258, 258, 259, 259, 259, 26, 26, 26, 26, 26, 260, 260, 260, 260, - 261, 261, 261, 262, 263, 263, 264, 26, 265, 265, 26, 26, 26, 26, 26, 26, - 266, 266, 267, 26, 26, 268, 268, 268, 26, 26, 26, 26, 26, 269, 269, 269, - 270, 270, 271, 272, 272, 273, 274, 274, 26, 26, 26, 26, 26, 26, 26, 26, - 275, 275, 275, 276, 277, 277, 26, 26, 278, 278, 278, 279, 279, 280, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 281, 26, 26, 26, 26, 26, 26, 282, 282, - 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, - 284, 284, 284, 284, 285, 285, 285, 285, 285, 285, 286, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, - 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, - 287, 288, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 289, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 291, 292, 26, 26, 293, 294, 295, 295, 295, 295, 296, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 297, 297, 297, 26, 26, 26, 298, 298, 298, 298, 298, 26, 26, 299, - 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, - 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, - 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, 26, 26, 26, 26, 26, 26, 26, 26, - 302, 302, 302, 302, 302, 302, 302, 302, 303, 304, 305, 306, 307, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 307, 26, 26, 26, 26, 26, 26, 26, 26, - 308, 308, 308, 308, 308, 309, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 310, 310, 310, 310, 310, 310, 310, 310, 311, 311, 311, 311, 311, 311, 311, 311, - 312, 312, 313, 26, 26, 26, 26, 314, 315, 315, 315, 316, 26, 26, 26, 26, - 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, - 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, - 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - 318, 318, 318, 318, 318, 319, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 320, 321, 26, 26, 26, 26, 26, 26, 322, 322, 323, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 324, 324, 26, 26, 26, 26, 26, 26, 26, 26, - 325, 325, 325, 325, 325, 325, 325, 26, 326, 326, 326, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 327, 328, 328, 26, 26, 329, 329, 330, 26, 26, 26, 26, 26, - 331, 331, 331, 331, 331, 331, 331, 331, 26, 26, 26, 26, 26, 26, 26, 26, - 332, 333, 334, 334, 334, 335, 335, 335, 336, 336, 336, 336, 336, 336, 336, 336, - 337, 337, 337, 337, 337, 337, 337, 337, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 339, 339, 340, 341, 342, 342, 342, 342, 343, 343, 343, 343, 344, 344, 344, 344, - 345, 345, 345, 345, 345, 345, 345, 345, 346, 346, 346, 346, 346, 346, 346, 346, - 347, 347, 347, 348, 349, 349, 349, 349, 26, 26, 26, 26, 26, 26, 26, 26, - 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, - 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, - 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, - 350, 350, 350, 350, 350, 350, 350, 26, 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, 352, 352, 352, 352, 352, - 352, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, - 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, - 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, - 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, - 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, - 353, 353, 353, 353, 353, 354, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 356, - 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, - 357, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 358, 358, 358, 358, 26, 26, 26, 26, 359, 359, 359, 359, 359, 359, 359, 360, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, -}; - -static RE_UINT16 re_block_stage_3[] = { - 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, - 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, - 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, - 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, - 18, 18, 18, 18, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, - 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, - 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, - 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, - 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, - 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, - 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, - 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, - 49, 49, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 52, 52, - 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, - 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, - 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 62, 62, - 62, 62, 62, 62, 63, 63, 64, 64, 64, 64, 64, 64, 65, 65, 66, 66, - 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 69, - 70, 70, 70, 70, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 73, 73, - 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, - 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, - 78, 78, 78, 78, 79, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, - 82, 82, 82, 82, 83, 83, 83, 83, 84, 84, 84, 84, 85, 85, 85, 85, - 86, 86, 86, 86, 87, 87, 87, 87, 88, 88, 88, 88, 89, 89, 89, 89, - 89, 89, 90, 90, 91, 91, 91, 91, 92, 92, 92, 92, 93, 93, 93, 93, - 94, 94, 94, 94, 95, 95, 95, 95, 96, 96, 96, 96, 97, 97, 97, 97, - 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, - 101, 101, 101, 101, 102, 102, 102, 102, 103, 103, 103, 103, 104, 104, 104, 104, - 105, 105, 105, 105, 20, 20, 106, 106, 107, 107, 107, 107, 108, 108, 108, 108, - 109, 109, 109, 109, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, - 111, 111, 112, 112, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 115, 115, - 116, 116, 116, 116, 117, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 119, - 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, - 122, 122, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, 125, 125, 125, 125, - 126, 126, 126, 126, 127, 127, 127, 127, 128, 128, 128, 128, 129, 129, 129, 129, - 129, 129, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, 133, 133, 133, 133, - 134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 136, 136, 136, 136, - 137, 137, 137, 137, 138, 138, 138, 138, 139, 139, 139, 139, 140, 140, 140, 140, - 141, 141, 141, 141, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 144, 144, - 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 146, 146, 146, 146, - 147, 147, 147, 147, 147, 147, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149, - 150, 150, 150, 150, 151, 151, 151, 151, 152, 152, 152, 152, 153, 153, 153, 153, - 154, 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, 155, 156, 156, 157, 157, - 158, 158, 159, 159, 159, 159, 160, 160, 160, 160, 161, 161, 161, 161, 161, 161, - 162, 162, 162, 162, 162, 162, 163, 163, 164, 164, 164, 164, 165, 165, 165, 165, - 166, 166, 166, 166, 167, 167, 167, 167, 167, 167, 168, 168, 168, 168, 168, 168, - 168, 168, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 171, 171, 171, 171, - 172, 172, 172, 172, 173, 173, 173, 173, 173, 173, 174, 174, 174, 174, 175, 175, - 175, 175, 175, 175, 176, 176, 176, 176, 177, 177, 177, 177, 178, 178, 178, 178, - 178, 178, 179, 179, 179, 179, 179, 179, 180, 180, 180, 180, 180, 180, 181, 181, - 181, 181, 181, 181, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183, 183, - 183, 183, 20, 20, 184, 184, 184, 184, 185, 185, 185, 185, 186, 186, 186, 186, - 187, 187, 187, 187, 188, 188, 188, 188, 188, 188, 20, 20, 189, 189, 189, 189, - 190, 190, 190, 190, 191, 191, 191, 191, 192, 192, 192, 192, 193, 193, 193, 193, - 194, 194, 194, 194, 195, 195, 195, 195, 196, 196, 196, 196, 197, 197, 197, 197, - 198, 198, 198, 198, 199, 199, 199, 199, 200, 200, 200, 200, 201, 201, 201, 201, - 201, 201, 20, 20, 202, 202, 202, 202, 202, 202, 20, 20, 203, 203, 203, 203, - 204, 204, 204, 204, 205, 205, 205, 205, 206, 206, 206, 206, 206, 206, 207, 207, - 207, 207, 207, 207, 207, 207, 20, 20, 208, 208, 208, 208, 209, 209, 209, 209, - 210, 210, 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, 212, 212, 212, 212, - 212, 212, 213, 213, 213, 213, 213, 213, 214, 214, 214, 214, 215, 215, 215, 215, - 216, 216, 216, 216, 216, 216, 20, 20, 217, 217, 217, 217, 217, 217, 218, 218, - 218, 218, 218, 218, 219, 219, 219, 219, 220, 220, 220, 220, 221, 221, 221, 221, - 222, 222, 222, 222, 223, 223, 223, 223, 224, 224, 224, 224, 225, 225, 225, 225, - 225, 225, 20, 20, 226, 226, 226, 226, 227, 227, 227, 227, 227, 227, 20, 20, - 228, 228, 228, 228, 229, 229, 229, 229, 230, 230, 230, 230, 230, 230, 231, 231, - 231, 231, 231, 231, 231, 231, 20, 20, 232, 232, 232, 232, 233, 233, 233, 233, - 233, 233, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 236, 236, 236, 236, - 236, 236, 20, 20, 237, 237, 237, 237, 238, 238, 238, 238, 239, 239, 239, 239, - 240, 240, 240, 240, 241, 241, 241, 241, 241, 241, 20, 20, 242, 242, 242, 242, - 242, 242, 243, 243, 244, 244, 244, 244, 245, 245, 245, 245, 246, 246, 246, 246, - 246, 246, 20, 20, 20, 20, 247, 247, 247, 247, 247, 247, 248, 248, 248, 248, - 248, 248, 20, 20, 249, 249, 249, 249, 250, 250, 250, 250, 251, 251, 251, 251, - 252, 252, 252, 252, 253, 253, 253, 253, 254, 254, 254, 254, 255, 255, 255, 255, - 255, 255, 256, 256, 256, 256, 256, 256, 256, 256, 257, 257, 257, 257, 257, 257, - 258, 258, 258, 258, 259, 259, 20, 20, 260, 260, 260, 260, 261, 261, 261, 261, - 262, 262, 262, 262, 262, 262, 20, 20, 263, 263, 263, 263, 264, 264, 264, 264, - 265, 265, 265, 265, 266, 266, 266, 266, 267, 267, 267, 267, 267, 267, 20, 20, - 268, 268, 268, 268, 268, 268, 20, 20, 269, 269, 269, 269, 269, 269, 20, 20, - 270, 270, 270, 270, 271, 271, 271, 271, 272, 272, 272, 272, 20, 20, 273, 273, - 273, 273, 273, 273, 274, 274, 274, 274, 274, 274, 20, 20, 275, 275, 275, 275, - 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 278, 278, 278, 278, - 279, 279, 279, 279, 280, 280, 280, 280, 281, 281, 281, 281, 282, 282, 282, 282, - 282, 282, 283, 283, 283, 283, 283, 283, 284, 284, 284, 284, 285, 285, 285, 285, - 286, 286, 286, 286, 287, 287, 287, 287, 288, 288, 288, 288, 289, 289, 289, 289, - 289, 289, 290, 290, 290, 290, 290, 290, 291, 291, 291, 291, 292, 292, 292, 292, - 293, 293, 293, 293, 294, 294, 294, 294, 294, 294, 295, 295, 295, 295, 295, 295, - 295, 295, 20, 20, 296, 296, 296, 296, 297, 297, 297, 297, 298, 298, 298, 298, - 298, 298, 20, 20, 299, 299, 299, 299, 300, 300, 300, 300, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10, + 10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38, + 10, 10, 10, 10, 10, 39, 10, 10, 40, 10, 41, 42, 43, 10, 44, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, 13, 13, 13, 46, 47, 13, + 13, 13, 13, 48, 13, 13, 13, 13, 13, 13, 49, 10, 10, 10, 50, 10, + 13, 13, 13, 13, 51, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; -static RE_UINT16 re_block_stage_4[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, - 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, - 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, - 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, - 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, - 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, - 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, - 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, - 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, - 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, - 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, - 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, - 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, - 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, - 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, - 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, - 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, - 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, - 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, - 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, - 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, - 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, - 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, - 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, - 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, - 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, - 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, - 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, - 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, - 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, - 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, - 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, - 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, - 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, - 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, - 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, - 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, - 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, - 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, - 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, 95, - 96, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, - 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, - 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, - 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103, - 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, - 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, - 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, - 110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 111, 111, - 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113, - 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, - 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, - 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, - 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, - 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, - 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, - 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, - 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129, - 130, 130, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, - 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, - 134, 134, 134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, - 136, 136, 136, 136, 136, 136, 136, 136, 137, 137, 137, 137, 137, 137, 137, 137, - 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 139, 139, 139, 139, 139, 139, - 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 141, 141, 141, - 142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 143, 143, - 144, 144, 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 145, 145, - 146, 146, 146, 146, 146, 146, 146, 146, 147, 147, 147, 147, 147, 147, 147, 147, - 148, 148, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149, 149, 149, 149, 149, - 150, 150, 150, 150, 150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, - 152, 152, 152, 152, 152, 152, 152, 152, 153, 153, 153, 153, 153, 153, 153, 153, - 154, 154, 154, 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, 155, 155, 155, - 156, 156, 156, 156, 156, 156, 156, 156, 157, 157, 157, 157, 157, 157, 157, 157, - 158, 158, 158, 158, 158, 158, 158, 158, 159, 159, 159, 159, 159, 159, 159, 159, - 160, 160, 160, 160, 160, 160, 160, 160, 161, 161, 161, 161, 161, 161, 161, 161, - 162, 162, 162, 162, 162, 162, 162, 162, 163, 163, 163, 163, 163, 163, 163, 163, - 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, 165, 165, 165, 165, - 166, 166, 166, 166, 166, 166, 166, 166, 167, 167, 167, 167, 167, 167, 167, 167, - 168, 168, 168, 168, 168, 168, 168, 168, 169, 169, 169, 169, 169, 169, 169, 169, - 170, 170, 170, 170, 170, 170, 170, 170, 171, 171, 171, 171, 171, 171, 171, 171, - 172, 172, 172, 172, 172, 172, 172, 172, 173, 173, 173, 173, 173, 173, 173, 173, - 174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175, - 176, 176, 176, 176, 176, 176, 176, 176, 177, 177, 177, 177, 177, 177, 177, 177, - 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 179, 179, 179, 179, 179, - 180, 180, 180, 180, 180, 180, 180, 180, 181, 181, 181, 181, 181, 181, 181, 181, - 182, 182, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183, 183, 183, 183, - 184, 184, 184, 184, 184, 184, 184, 184, 185, 185, 185, 185, 185, 185, 185, 185, - 186, 186, 186, 186, 186, 186, 186, 186, 187, 187, 187, 187, 187, 187, 187, 187, - 188, 188, 188, 188, 188, 188, 188, 188, 189, 189, 189, 189, 189, 189, 189, 189, - 190, 190, 190, 190, 190, 190, 190, 190, 191, 191, 191, 191, 191, 191, 191, 191, - 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193, - 194, 194, 194, 194, 194, 194, 194, 194, 195, 195, 195, 195, 195, 195, 195, 195, - 196, 196, 196, 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, 197, 197, 197, - 198, 198, 198, 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, 199, 199, 199, - 200, 200, 200, 200, 200, 200, 200, 200, 201, 201, 201, 201, 201, 201, 201, 201, - 202, 202, 202, 202, 202, 202, 202, 202, 203, 203, 203, 203, 203, 203, 203, 203, - 204, 204, 204, 204, 204, 204, 204, 204, 205, 205, 205, 205, 205, 205, 205, 205, - 206, 206, 206, 206, 206, 206, 206, 206, 207, 207, 207, 207, 207, 207, 207, 207, - 208, 208, 208, 208, 208, 208, 208, 208, 209, 209, 209, 209, 209, 209, 209, 209, - 210, 210, 210, 210, 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, 211, 211, - 212, 212, 212, 212, 212, 212, 212, 212, 213, 213, 213, 213, 213, 213, 213, 213, - 214, 214, 214, 214, 214, 214, 214, 214, 215, 215, 215, 215, 215, 215, 215, 215, - 216, 216, 216, 216, 216, 216, 216, 216, 217, 217, 217, 217, 217, 217, 217, 217, - 218, 218, 218, 218, 218, 218, 218, 218, 219, 219, 219, 219, 219, 219, 219, 219, - 220, 220, 220, 220, 220, 220, 220, 220, 221, 221, 221, 221, 221, 221, 221, 221, - 222, 222, 222, 222, 222, 222, 222, 222, 223, 223, 223, 223, 223, 223, 223, 223, - 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 225, 225, - 226, 226, 226, 226, 226, 226, 226, 226, 227, 227, 227, 227, 227, 227, 227, 227, - 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 229, 229, - 230, 230, 230, 230, 230, 230, 230, 230, 231, 231, 231, 231, 231, 231, 231, 231, - 232, 232, 232, 232, 232, 232, 232, 232, 233, 233, 233, 233, 233, 233, 233, 233, - 234, 234, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 235, 235, 235, 235, - 236, 236, 236, 236, 236, 236, 236, 236, 237, 237, 237, 237, 237, 237, 237, 237, - 238, 238, 238, 238, 238, 238, 238, 238, 239, 239, 239, 239, 239, 239, 239, 239, - 240, 240, 240, 240, 240, 240, 240, 240, 241, 241, 241, 241, 241, 241, 241, 241, - 242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 243, 243, 243, 243, 243, - 244, 244, 244, 244, 244, 244, 244, 244, 245, 245, 245, 245, 245, 245, 245, 245, - 246, 246, 246, 246, 246, 246, 246, 246, 247, 247, 247, 247, 247, 247, 247, 247, - 248, 248, 248, 248, 248, 248, 248, 248, 249, 249, 249, 249, 249, 249, 249, 249, - 250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, 251, 251, 251, - 252, 252, 252, 252, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 253, 253, - 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, - 256, 256, 256, 256, 256, 256, 256, 256, 257, 257, 257, 257, 257, 257, 257, 257, - 258, 258, 258, 258, 258, 258, 258, 258, 259, 259, 259, 259, 259, 259, 259, 259, - 260, 260, 260, 260, 260, 260, 260, 260, 261, 261, 261, 261, 261, 261, 261, 261, - 262, 262, 262, 262, 262, 262, 262, 262, 263, 263, 263, 263, 263, 263, 263, 263, - 264, 264, 264, 264, 264, 264, 264, 264, 265, 265, 265, 265, 265, 265, 265, 265, - 266, 266, 266, 266, 266, 266, 266, 266, 267, 267, 267, 267, 267, 267, 267, 267, - 268, 268, 268, 268, 268, 268, 268, 268, 269, 269, 269, 269, 269, 269, 269, 269, - 270, 270, 270, 270, 270, 270, 270, 270, 271, 271, 271, 271, 271, 271, 271, 271, - 272, 272, 272, 272, 272, 272, 272, 272, 273, 273, 273, 273, 273, 273, 273, 273, - 274, 274, 274, 274, 274, 274, 274, 274, 275, 275, 275, 275, 275, 275, 275, 275, - 276, 276, 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 277, - 278, 278, 278, 278, 278, 278, 278, 278, 279, 279, 279, 279, 279, 279, 279, 279, - 280, 280, 280, 280, 280, 280, 280, 280, 281, 281, 281, 281, 281, 281, 281, 281, - 282, 282, 282, 282, 282, 282, 282, 282, 283, 283, 283, 283, 283, 283, 283, 283, - 284, 284, 284, 284, 284, 284, 284, 284, 285, 285, 285, 285, 285, 285, 285, 285, - 286, 286, 286, 286, 286, 286, 286, 286, 287, 287, 287, 287, 287, 287, 287, 287, - 288, 288, 288, 288, 288, 288, 288, 288, 289, 289, 289, 289, 289, 289, 289, 289, - 290, 290, 290, 290, 290, 290, 290, 290, 291, 291, 291, 291, 291, 291, 291, 291, - 292, 292, 292, 292, 292, 292, 292, 292, 293, 293, 293, 293, 293, 293, 293, 293, - 294, 294, 294, 294, 294, 294, 294, 294, 295, 295, 295, 295, 295, 295, 295, 295, - 296, 296, 296, 296, 296, 296, 296, 296, 297, 297, 297, 297, 297, 297, 297, 297, - 298, 298, 298, 298, 298, 298, 298, 298, 299, 299, 299, 299, 299, 299, 299, 299, - 300, 300, 300, 300, 300, 300, 300, 300, +static RE_UINT16 re_alphanumeric_table_2[] = { + 0, 1, 2, 2, 0, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 6, 7, 0, 0, 8, 9, 10, 11, 5, 12, + 5, 5, 5, 5, 13, 5, 5, 5, 5, 14, 15, 5, 16, 17, 18, 19, + 20, 5, 21, 22, 5, 5, 23, 24, 25, 5, 26, 5, 5, 27, 5, 28, + 29, 30, 31, 32, 0, 33, 34, 35, 5, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 48, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 58, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 0, 76, 77, 78, 0, 79, 80, 81, 82, 83, 84, 0, 0, + 5, 85, 86, 5, 87, 5, 88, 89, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 90, 5, 91, 92, 93, 5, 94, 5, 74, 0, 95, 5, 5, 96, + 73, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 97, 2, 5, 5, 98, 99, 100, 100, 101, 5, 102, 103, 80, + 1, 5, 5, 31, 5, 104, 5, 105, 106, 107, 108, 109, 5, 110, 111, 0, + 112, 5, 106, 113, 111, 114, 79, 0, 5, 115, 116, 0, 5, 117, 5, 118, + 5, 119, 120, 87, 121, 66, 0, 122, 5, 5, 5, 5, 5, 5, 0, 123, + 5, 5, 5, 5, 5, 5, 5, 5, 96, 5, 124, 87, 5, 125, 126, 127, + 0, 0, 0, 128, 129, 0, 0, 0, 130, 131, 132, 5, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 133, 5, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 134, 106, 5, 5, 5, 5, 135, 5, 88, 5, 136, 119, 137, 137, 5, + 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 139, 140, 73, 5, 141, 73, 5, 89, 142, 14, 5, 5, 143, 5, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 84, + 5, 5, 5, 5, 30, 0, 25, 87, 5, 5, 5, 5, 5, 5, 5, 5, + 144, 145, 5, 146, 5, 5, 5, 95, 147, 148, 5, 5, 149, 5, 150, 151, + 152, 153, 5, 100, 5, 5, 154, 155, 5, 104, 156, 84, 5, 157, 158, 106, + 5, 119, 159, 160, 5, 106, 161, 162, 163, 164, 89, 86, 5, 5, 5, 165, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 166, 167, 112, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 168, 5, 5, 169, 0, 170, 171, 172, 5, 5, 27, 173, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 87, 25, 5, 174, 5, 153, 175, + 0, 0, 0, 176, 5, 5, 5, 84, 1, 2, 2, 108, 5, 106, 177, 0, + 178, 179, 180, 0, 5, 5, 5, 74, 0, 0, 5, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 84, 5, 182, 0, 5, 26, 104, 74, 87, 5, 183, 0, + 5, 5, 5, 5, 87, 86, 184, 112, 5, 185, 5, 186, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 119, 105, 153, 0, 0, 0, 0, + 187, 188, 105, 119, 106, 0, 0, 189, 105, 169, 0, 0, 5, 190, 0, 0, + 191, 105, 0, 84, 84, 0, 81, 192, 5, 105, 105, 156, 27, 0, 0, 0, + 5, 5, 16, 0, 5, 156, 5, 156, 5, 193, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 194, 0, 0, 84, 195, 196, 0, 0, 25, 192, 119, + 5, 5, 196, 57, 148, 31, 25, 197, 5, 198, 199, 200, 5, 5, 201, 0, + 202, 203, 0, 0, 204, 121, 5, 197, 39, 48, 205, 186, 0, 0, 0, 0, + 5, 5, 206, 207, 5, 5, 208, 0, 0, 0, 0, 0, 5, 209, 210, 0, + 5, 106, 211, 0, 5, 212, 80, 0, 66, 165, 0, 0, 0, 0, 0, 0, + 5, 31, 0, 0, 0, 5, 5, 213, 214, 215, 216, 0, 0, 217, 29, 218, + 5, 219, 25, 5, 220, 0, 5, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 221, 222, 223, 224, 174, 225, 0, 0, 226, 227, 228, 229, 230, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, 231, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 169, 0, 0, 0, + 5, 5, 5, 143, 5, 5, 5, 5, 5, 5, 186, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 31, 106, 80, 0, 0, 25, 233, 5, 95, 234, 235, 95, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 0, 0, 0, 0, 5, 5, 236, 5, 237, 0, 0, 238, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 239, + 5, 5, 5, 5, 5, 5, 105, 0, 16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 106, 0, 240, 199, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 112, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 241, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 33, 5, 243, 244, 245, 5, 246, 247, 248, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 249, 250, 89, 33, 33, 134, 134, 221, 221, 251, 5, + 252, 253, 0, 0, 0, 0, 0, 0, 5, 254, 255, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 256, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 192, 0, 5, 5, 257, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 245, 258, 259, 260, 261, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 86, 86, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 87, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 181, 5, 5, 5, 5, 5, 5, + 87, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 263, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 79, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 32, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_alphanumeric_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 7, 0, 4, 32, 4, + 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, + 32, 0, 0, 0, 0, 0, 223, 188, 64, 215, 255, 255, 251, 255, 255, 255, + 255, 255, 191, 255, 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, + 255, 1, 0, 0, 0, 0, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, + 0, 0, 255, 7, 255, 255, 255, 254, 255, 195, 255, 255, 255, 255, 239, 31, + 254, 225, 255, 159, 0, 0, 255, 255, 0, 224, 255, 255, 255, 255, 3, 0, + 255, 7, 48, 4, 255, 255, 255, 252, 255, 31, 0, 0, 255, 255, 255, 1, + 255, 7, 0, 0, 255, 255, 223, 255, 255, 0, 240, 255, 248, 3, 255, 255, + 255, 255, 255, 239, 255, 223, 225, 255, 207, 255, 254, 255, 239, 159, 249, 255, + 255, 253, 197, 227, 159, 89, 128, 176, 207, 255, 3, 16, 238, 135, 249, 255, + 255, 253, 109, 195, 135, 25, 2, 94, 192, 255, 63, 0, 238, 191, 251, 255, + 255, 253, 237, 227, 191, 27, 1, 0, 207, 255, 0, 30, 238, 159, 249, 255, + 159, 25, 192, 176, 207, 255, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, + 199, 29, 129, 0, 192, 255, 0, 0, 239, 223, 253, 255, 255, 253, 255, 227, + 223, 29, 96, 7, 207, 255, 0, 0, 255, 253, 239, 227, 223, 29, 96, 64, + 207, 255, 6, 0, 255, 223, 253, 255, 255, 255, 255, 231, 223, 93, 240, 128, + 207, 255, 0, 252, 238, 255, 127, 252, 255, 255, 251, 47, 127, 128, 95, 255, + 192, 255, 12, 0, 254, 255, 255, 255, 255, 255, 255, 7, 127, 32, 255, 3, + 214, 247, 255, 255, 175, 255, 255, 59, 95, 32, 255, 243, 1, 0, 0, 0, + 255, 3, 0, 0, 255, 254, 255, 255, 255, 31, 254, 255, 3, 255, 255, 254, + 255, 255, 255, 31, 255, 255, 127, 249, 255, 3, 255, 255, 255, 255, 255, 63, + 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, + 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 0, 0, + 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, 255, 223, 15, 0, + 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 207, 255, 255, 1, 128, 16, + 255, 7, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, 255, 15, 255, 1, + 192, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 3, + 255, 255, 255, 15, 254, 255, 31, 0, 128, 0, 0, 128, 255, 255, 239, 255, + 239, 15, 255, 3, 255, 243, 255, 255, 191, 255, 3, 0, 255, 255, 127, 0, + 255, 227, 255, 255, 255, 1, 255, 255, 0, 222, 111, 4, 128, 255, 31, 0, + 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, + 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, 80, 189, 255, 243, + 224, 67, 0, 0, 0, 0, 192, 255, 255, 127, 255, 255, 31, 120, 12, 0, + 255, 128, 0, 0, 127, 127, 127, 127, 0, 128, 0, 0, 224, 0, 0, 0, + 254, 3, 62, 31, 255, 255, 127, 224, 224, 255, 255, 255, 255, 127, 0, 0, + 255, 31, 255, 255, 255, 15, 0, 0, 255, 127, 240, 143, 0, 0, 128, 255, + 252, 255, 255, 255, 255, 249, 255, 255, 252, 7, 0, 0, 0, 0, 224, 255, + 191, 255, 255, 255, 255, 0, 0, 0, 47, 0, 255, 3, 0, 0, 252, 232, + 255, 255, 7, 0, 255, 255, 247, 255, 0, 128, 255, 3, 255, 63, 255, 3, + 255, 255, 127, 252, 5, 0, 0, 56, 255, 255, 60, 0, 126, 126, 126, 0, + 127, 127, 255, 255, 255, 7, 255, 3, 15, 0, 255, 255, 127, 248, 255, 255, + 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, + 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 15, + 0, 0, 223, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, + 255, 63, 255, 63, 255, 255, 31, 0, 255, 255, 1, 0, 15, 255, 62, 0, + 255, 255, 15, 255, 255, 0, 255, 255, 15, 0, 0, 0, 63, 253, 255, 255, + 255, 255, 191, 145, 255, 255, 55, 0, 255, 255, 255, 192, 111, 240, 239, 254, + 31, 0, 0, 0, 255, 0, 255, 3, 255, 27, 3, 0, 128, 0, 255, 255, + 63, 0, 0, 0, 255, 1, 255, 3, 255, 255, 199, 255, 240, 0, 255, 255, + 255, 255, 71, 0, 30, 192, 255, 23, 255, 255, 251, 255, 255, 255, 159, 64, + 127, 189, 255, 191, 159, 25, 129, 224, 187, 7, 255, 131, 3, 0, 0, 0, + 179, 0, 255, 3, 255, 255, 63, 127, 0, 0, 0, 63, 17, 0, 255, 3, + 255, 255, 63, 1, 255, 3, 0, 128, 127, 242, 111, 255, 255, 255, 191, 153, + 7, 0, 255, 3, 255, 252, 255, 255, 26, 0, 0, 0, 255, 255, 231, 127, + 255, 255, 255, 32, 255, 253, 255, 255, 255, 255, 127, 127, 1, 0, 255, 3, + 0, 0, 252, 255, 255, 254, 127, 0, 127, 251, 255, 255, 255, 255, 127, 180, + 203, 0, 255, 3, 191, 253, 255, 255, 255, 127, 123, 1, 0, 0, 1, 0, + 127, 0, 0, 0, 255, 63, 0, 0, 15, 0, 255, 3, 248, 255, 255, 224, + 255, 135, 255, 255, 255, 128, 255, 255, 11, 0, 3, 0, 255, 255, 255, 0, + 0, 0, 7, 0, 255, 7, 255, 31, 255, 1, 255, 67, 255, 255, 255, 223, + 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, + 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 247, 207, 255, 255, + 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 128, 63, 255, 67, 0, 0, + 255, 15, 255, 3, 143, 8, 255, 3, 150, 254, 247, 10, 132, 234, 150, 170, + 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255 }; -/* Block: 13160 bytes. */ - -RE_UINT32 re_get_block(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 10; - code = ch ^ (f << 10); - pos = (RE_UINT32)re_block_stage_1[f] << 5; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_block_stage_2[pos + f] << 2; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_block_stage_3[pos + f] << 3; - value = re_block_stage_4[pos + code]; - - return value; -} - -/* Script. */ - -static RE_UINT8 re_script_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 9, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 14, 15, - 16, 17, 18, 19, 20, 14, 21, 14, 22, 14, 14, 14, 14, 23, 24, 24, - 25, 26, 14, 14, 14, 14, 27, 28, 14, 14, 29, 30, 31, 32, 33, 34, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 35, 7, 36, 37, 7, 38, 7, 7, 7, 39, 14, 40, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 41, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -}; +RE_UINT32 re_get_alphanumeric(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_script_stage_2[] = { - 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, - 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, - 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 80, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 82, 83, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 96, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 70, 70, 98, 99, 100, 101, 102, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 97, 113, 114, 115, 116, 117, 118, 97, 119, 119, 120, 97, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 97, 132, 97, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 97, 142, 143, 97, 144, 145, 146, 147, 97, - 148, 149, 97, 150, 151, 152, 97, 97, 153, 154, 155, 156, 97, 157, 97, 158, - 159, 159, 159, 159, 159, 159, 159, 160, 161, 159, 162, 97, 97, 97, 97, 97, - 163, 163, 163, 163, 163, 163, 163, 163, 164, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 165, 165, 165, 165, 166, 97, 97, 97, - 167, 167, 167, 167, 168, 169, 170, 171, 97, 97, 97, 97, 172, 173, 174, 175, - 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 177, - 176, 176, 176, 176, 176, 178, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 179, 180, 181, 182, 182, 183, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 184, 185, 97, 97, 97, 97, 97, 97, - 59, 186, 187, 188, 189, 190, 191, 97, 192, 193, 194, 59, 59, 195, 59, 196, - 197, 197, 197, 197, 197, 198, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 199, 97, 200, 97, 97, 201, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 202, 203, 204, 97, 97, 97, 97, 97, 205, 206, 207, 97, 208, 209, 97, 97, - 210, 211, 212, 213, 214, 97, 59, 59, 59, 59, 59, 59, 59, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 224, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 225, 70, - 226, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 227, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 228, 97, 97, 97, 97, 97, 97, 97, 97, - 70, 70, 70, 70, 229, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 230, 97, 231, 232, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT16 re_script_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, - 0, 0, 0, 0, 0, 4, 0, 4, 2, 2, 5, 2, 2, 2, 5, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 7, 8, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, - 12, 13, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 16, 17, 14, 14, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 20, 21, 21, 21, 22, 20, 21, 21, 21, 21, - 21, 23, 24, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 27, 28, 26, - 29, 30, 31, 32, 31, 31, 31, 31, 33, 34, 35, 31, 31, 31, 36, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 29, 31, 31, 31, 31, - 37, 38, 37, 37, 37, 37, 37, 37, 37, 39, 31, 31, 31, 31, 31, 31, - 40, 40, 40, 40, 40, 40, 41, 26, 42, 42, 42, 42, 42, 42, 42, 43, - 44, 44, 44, 44, 44, 45, 44, 46, 47, 47, 47, 48, 37, 49, 26, 26, - 26, 26, 26, 26, 31, 31, 50, 51, 26, 26, 52, 31, 53, 31, 31, 31, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 54, 56, 54, 54, 54, - 57, 58, 59, 60, 60, 61, 62, 63, 58, 64, 65, 66, 67, 60, 60, 68, - 69, 70, 71, 72, 72, 73, 74, 75, 70, 76, 77, 78, 79, 72, 80, 26, - 81, 82, 83, 84, 84, 85, 86, 87, 82, 88, 89, 26, 90, 84, 91, 92, - 93, 94, 95, 96, 96, 97, 98, 99, 94, 100, 101, 102, 103, 96, 96, 26, - 104, 105, 106, 107, 108, 105, 109, 110, 105, 106, 111, 26, 112, 109, 109, 113, - 114, 115, 116, 114, 114, 116, 114, 117, 115, 118, 119, 120, 121, 114, 122, 114, - 123, 124, 125, 123, 123, 125, 126, 127, 124, 128, 129, 130, 131, 123, 132, 26, - 133, 134, 135, 136, 136, 136, 136, 136, 134, 135, 137, 136, 138, 136, 136, 136, - 139, 140, 141, 142, 140, 140, 143, 144, 141, 145, 146, 140, 147, 140, 148, 26, - 149, 150, 150, 150, 150, 150, 150, 151, 150, 150, 150, 152, 26, 26, 26, 26, - 153, 154, 155, 155, 156, 155, 155, 157, 158, 157, 155, 159, 26, 26, 26, 26, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, 160, 162, 161, 160, - 160, 160, 160, 161, 160, 160, 160, 163, 160, 163, 164, 165, 26, 26, 26, 26, - 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 166, 167, 167, 167, 167, 168, 169, 167, 167, 167, 167, 167, 170, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 174, 173, 172, 172, 172, 172, - 172, 173, 172, 172, 172, 172, 173, 174, 173, 172, 174, 172, 172, 172, 172, 172, - 172, 172, 173, 172, 172, 172, 172, 172, 172, 172, 172, 175, 172, 172, 172, 176, - 172, 172, 172, 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, - 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, - 181, 181, 181, 182, 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 183, 185, - 186, 187, 188, 26, 189, 189, 190, 26, 191, 191, 192, 26, 193, 194, 195, 26, - 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 197, 196, 198, 196, 198, - 199, 200, 201, 202, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 203, - 201, 201, 201, 201, 201, 204, 180, 180, 180, 180, 180, 180, 180, 180, 205, 26, - 206, 206, 206, 207, 206, 208, 206, 208, 209, 206, 210, 210, 210, 211, 212, 26, - 213, 213, 213, 213, 213, 214, 213, 213, 213, 215, 213, 216, 196, 196, 196, 196, - 217, 217, 217, 218, 219, 219, 219, 219, 219, 219, 219, 220, 219, 219, 219, 221, - 219, 222, 219, 222, 219, 223, 9, 224, 26, 26, 26, 26, 26, 26, 26, 26, - 225, 225, 225, 225, 225, 225, 225, 225, 225, 226, 225, 225, 225, 225, 225, 227, - 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 230, 231, - 232, 232, 232, 232, 232, 232, 232, 233, 232, 234, 235, 235, 235, 235, 235, 235, - 18, 236, 167, 167, 167, 167, 167, 237, 228, 26, 238, 9, 239, 240, 241, 242, - 2, 2, 2, 2, 243, 244, 2, 2, 2, 2, 2, 245, 246, 247, 2, 248, - 2, 2, 2, 2, 2, 2, 2, 249, 9, 9, 9, 9, 9, 9, 9, 250, - 14, 14, 251, 251, 14, 14, 14, 14, 251, 251, 14, 252, 14, 14, 14, 251, - 14, 14, 14, 14, 14, 14, 253, 14, 253, 14, 254, 255, 14, 14, 256, 257, - 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 260, 261, - 0, 262, 2, 263, 0, 0, 0, 0, 26, 26, 9, 9, 9, 9, 264, 26, - 0, 0, 0, 0, 265, 266, 4, 0, 0, 267, 0, 0, 2, 2, 2, 2, - 2, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 262, 26, 26, 26, 0, 269, 26, 26, 0, 0, 0, 0, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, - 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 273, 273, 273, 273, 273, 274, 273, 273, 273, 273, 273, 274, 2, 2, 2, 2, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 275, 276, - 167, 167, 167, 167, 168, 169, 277, 277, 277, 277, 277, 277, 277, 278, 279, 278, - 172, 172, 174, 26, 174, 174, 174, 174, 174, 174, 174, 174, 18, 18, 18, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, - 280, 280, 280, 281, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 282, 26, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 26, 26, 26, 0, 284, - 285, 0, 0, 0, 286, 287, 0, 288, 289, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 291, 292, 293, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 295, - 296, 297, 297, 297, 297, 297, 298, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 299, 0, 0, 297, 297, 297, 300, 0, 0, 0, 0, 284, 26, 294, 294, - 171, 171, 171, 299, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 301, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 294, 294, 294, 294, 302, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 0, 0, 0, 0, 0, - 280, 280, 280, 280, 280, 280, 283, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 26, 26, - 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, - 303, 304, 303, 303, 303, 303, 303, 303, 305, 26, 306, 306, 306, 306, 306, 306, - 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, - 307, 307, 307, 307, 307, 308, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 26, - 0, 0, 0, 0, 310, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 311, 2, 2, 2, 2, 2, 2, 312, 26, 26, 26, 26, 26, 313, 2, - 314, 314, 314, 314, 314, 315, 0, 316, 317, 317, 317, 317, 317, 317, 317, 26, - 318, 318, 318, 318, 318, 318, 318, 318, 319, 320, 318, 321, 54, 54, 54, 54, - 322, 322, 322, 322, 322, 323, 324, 324, 324, 324, 325, 326, 171, 171, 171, 327, - 328, 328, 328, 328, 328, 328, 328, 328, 328, 329, 328, 330, 166, 166, 166, 331, - 332, 332, 332, 332, 332, 332, 333, 26, 332, 334, 332, 335, 166, 166, 166, 166, - 336, 336, 336, 336, 336, 336, 336, 336, 337, 26, 26, 338, 339, 339, 340, 26, - 341, 341, 341, 26, 174, 174, 2, 2, 2, 2, 2, 342, 343, 26, 178, 178, - 178, 178, 178, 178, 178, 178, 178, 178, 339, 339, 339, 339, 339, 344, 339, 345, - 171, 171, 171, 171, 346, 26, 171, 171, 299, 347, 171, 171, 171, 171, 171, 346, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 280, 280, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 348, 26, 26, 26, 26, - 349, 26, 350, 351, 25, 25, 352, 353, 354, 25, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 355, 26, 52, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 356, 26, 26, 31, 31, 31, 31, 31, 31, - 31, 31, 357, 31, 31, 31, 31, 31, 31, 26, 26, 26, 26, 26, 31, 51, - 9, 9, 0, 316, 9, 358, 0, 0, 0, 0, 359, 0, 262, 284, 50, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 360, - 361, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, 362, 294, 293, 294, - 294, 294, 294, 363, 171, 171, 171, 299, 364, 364, 364, 365, 262, 262, 26, 366, - 367, 368, 367, 367, 369, 367, 367, 370, 367, 371, 367, 371, 26, 26, 26, 26, - 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 372, - 373, 0, 0, 0, 0, 0, 374, 0, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 257, 0, 284, 375, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 376, - 377, 377, 377, 378, 379, 379, 379, 379, 379, 379, 380, 26, 381, 0, 0, 284, - 382, 382, 382, 382, 383, 384, 385, 385, 385, 386, 387, 387, 387, 387, 387, 388, - 389, 389, 389, 390, 391, 391, 391, 391, 392, 391, 393, 26, 26, 26, 26, 26, - 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 395, 395, 395, 395, 395, 395, - 396, 396, 396, 397, 396, 398, 399, 399, 399, 399, 400, 399, 399, 399, 399, 400, - 401, 401, 401, 401, 401, 26, 402, 402, 402, 402, 402, 402, 403, 404, 26, 26, - 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, - 405, 405, 405, 405, 405, 405, 406, 26, 405, 405, 407, 26, 405, 26, 26, 26, - 408, 409, 410, 410, 410, 410, 411, 412, 413, 413, 414, 413, 415, 415, 415, 415, - 416, 416, 416, 417, 418, 416, 26, 26, 26, 26, 26, 26, 419, 419, 420, 421, - 422, 422, 422, 423, 424, 424, 424, 425, 26, 26, 26, 26, 26, 26, 26, 26, - 426, 426, 426, 426, 427, 427, 427, 428, 427, 427, 429, 427, 427, 427, 427, 427, - 430, 431, 432, 433, 434, 434, 435, 436, 434, 437, 434, 437, 438, 438, 438, 438, - 439, 439, 439, 439, 26, 26, 26, 26, 440, 440, 440, 440, 441, 442, 441, 26, - 443, 443, 443, 443, 443, 443, 444, 445, 446, 446, 447, 446, 448, 448, 449, 448, - 450, 450, 451, 452, 26, 453, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 454, 454, 454, 454, 454, 454, 454, 454, 454, 455, 26, 26, 26, 26, 26, 26, - 456, 456, 456, 456, 456, 456, 457, 26, 456, 456, 456, 456, 456, 456, 457, 458, - 459, 459, 459, 459, 459, 26, 459, 460, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 31, 461, - 462, 462, 462, 462, 462, 26, 463, 463, 463, 463, 463, 464, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 465, 465, 466, 26, - 467, 467, 467, 467, 467, 467, 467, 467, 467, 468, 469, 467, 467, 467, 26, 470, - 471, 471, 471, 471, 471, 471, 471, 471, 472, 473, 474, 474, 474, 475, 474, 476, - 477, 477, 477, 477, 477, 477, 478, 477, 479, 26, 480, 480, 480, 480, 481, 26, - 482, 482, 482, 482, 482, 482, 482, 482, 482, 483, 482, 482, 484, 140, 485, 26, - 486, 486, 487, 486, 486, 486, 486, 488, 26, 26, 26, 26, 26, 26, 26, 26, - 489, 490, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 494, 495, 494, 496, - 497, 498, 499, 500, 500, 501, 502, 503, 498, 504, 505, 506, 507, 508, 508, 26, - 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 510, 26, 26, 26, 26, - 511, 511, 511, 511, 511, 511, 511, 511, 511, 26, 511, 512, 26, 26, 26, 26, - 513, 513, 513, 513, 513, 513, 514, 513, 513, 513, 513, 514, 26, 26, 26, 26, - 515, 515, 515, 515, 515, 515, 515, 515, 516, 26, 515, 517, 201, 518, 26, 26, - 519, 519, 519, 519, 519, 519, 519, 520, 519, 521, 26, 26, 26, 26, 26, 26, - 522, 522, 522, 523, 522, 524, 522, 522, 26, 26, 26, 26, 26, 26, 26, 26, - 525, 525, 525, 525, 525, 525, 525, 526, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 528, 529, - 26, 26, 26, 26, 530, 531, 530, 530, 530, 530, 530, 531, 532, 26, 26, 26, - 533, 533, 533, 533, 533, 533, 533, 533, 533, 26, 534, 534, 534, 534, 534, 534, - 534, 534, 534, 534, 535, 26, 26, 26, 536, 536, 536, 536, 536, 536, 536, 537, - 538, 539, 538, 538, 538, 538, 540, 538, 541, 26, 538, 538, 538, 542, 543, 543, - 543, 543, 544, 543, 543, 545, 546, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 547, 548, 549, 549, 549, 549, 547, 550, 549, 26, 549, 551, 552, 553, 554, 554, - 554, 555, 556, 557, 554, 558, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 559, 559, 559, 560, - 26, 26, 26, 26, 26, 26, 26, 26, 109, 109, 109, 109, 109, 109, 561, 562, - 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, - 563, 563, 563, 564, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 565, 566, 26, - 563, 563, 563, 563, 563, 563, 563, 563, 567, 26, 26, 26, 26, 26, 26, 26, - 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, - 568, 568, 568, 568, 568, 569, 568, 570, 26, 26, 26, 26, 26, 26, 26, 26, - 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, - 571, 571, 571, 571, 571, 571, 571, 571, 572, 26, 26, 26, 26, 26, 26, 26, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 573, 574, 574, 574, 575, 574, 576, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 577, 577, 577, 578, 578, 26, - 579, 579, 579, 579, 579, 579, 579, 579, 580, 26, 579, 581, 581, 579, 579, 582, - 579, 579, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 583, 583, 583, 583, 583, 583, 583, 583, - 583, 583, 583, 584, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 585, 585, 585, 585, 585, 585, 585, 585, 585, 586, 585, 585, 585, 585, 585, 585, - 585, 587, 585, 585, 26, 26, 26, 26, 26, 26, 26, 26, 588, 26, 26, 26, - 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, - 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 26, - 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 26, - 591, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 290, 291, 26, 26, 26, 26, 26, 26, 592, 26, 593, 26, 594, 594, - 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, - 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595, - 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 596, 598, - 596, 599, 596, 600, 284, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 26, - 0, 0, 0, 0, 262, 361, 0, 0, 0, 0, 0, 0, 601, 602, 0, 603, - 604, 605, 0, 0, 0, 606, 0, 0, 0, 0, 0, 0, 0, 607, 26, 26, - 14, 14, 14, 14, 14, 14, 14, 14, 251, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 284, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 26, 0, 0, 0, 607, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0, - 0, 0, 0, 259, 608, 609, 0, 610, 611, 0, 0, 0, 0, 0, 0, 0, - 612, 613, 259, 259, 0, 0, 0, 614, 615, 616, 617, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, 0, 0, - 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, - 618, 619, 26, 620, 621, 618, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 274, 273, 273, 622, 623, 624, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 625, 625, 625, 625, 625, 626, 625, 627, 625, 628, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 629, 629, 629, 629, 629, 629, 629, 630, - 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, 632, 631, 633, 26, 26, 26, 26, 26, - 634, 634, 634, 634, 634, 634, 634, 634, 634, 635, 634, 636, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 361, 0, - 0, 0, 0, 0, 0, 0, 637, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 361, 0, 0, 0, 0, 0, 0, 272, 26, 26, 26, 26, 26, 26, 26, 26, - 638, 31, 31, 31, 639, 640, 641, 642, 643, 644, 639, 645, 639, 641, 641, 646, - 31, 647, 31, 648, 649, 647, 31, 648, 26, 26, 26, 26, 26, 26, 355, 26, - 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 284, 26, 0, 262, 361, 0, 361, 0, 361, 0, 0, 0, 272, 26, - 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, - 0, 0, 0, 0, 0, 637, 26, 26, 26, 26, 26, 26, 650, 0, 0, 0, - 651, 26, 0, 0, 0, 0, 0, 284, 0, 607, 316, 26, 272, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 26, 0, 637, 0, 269, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 0, 284, 26, 26, - 0, 284, 0, 0, 0, 0, 0, 0, 0, 26, 0, 316, 0, 0, 0, 0, - 0, 26, 0, 0, 0, 272, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 614, 616, - 0, 0, 0, 0, 613, 652, 0, 0, 0, 613, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 26, 0, 272, 284, 269, - 269, 26, 272, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 653, 26, 26, 26, 26, 26, - 280, 280, 280, 280, 280, 280, 654, 26, 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 283, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 280, 348, 26, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, - 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 655, 26, 26, 26, - 280, 280, 280, 283, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 656, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 26, 26, -}; + v = re_alphanumeric_table_1[field_2]; + v = re_alphanumeric_table_2[(v << 5) | field_1]; + v = re_alphanumeric_table_3[(v << 2) | field_0]; -static RE_UINT8 re_script_stage_4[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, - 1, 1, 35, 35, 1, 1, 1, 1, 41, 41, 41, 41, 41, 41, 41, 41, - 3, 3, 3, 3, 1, 3, 3, 3, 0, 0, 3, 3, 3, 3, 1, 3, - 0, 0, 0, 0, 3, 1, 3, 1, 3, 3, 3, 0, 3, 0, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, - 3, 3, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 41, 41, 4, - 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 5, 1, 5, 0, 0, 5, 5, 5, - 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 0, 0, 0, 6, - 6, 6, 6, 6, 6, 0, 0, 0, 7, 7, 7, 7, 7, 1, 7, 7, - 7, 7, 7, 7, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 1, 7, 0, 7, 1, 1, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 7, 7, - 41, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 0, 8, 8, 8, 8, 0, 0, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 0, 0, 66, 66, 66, - 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 0, - 82, 82, 82, 82, 82, 82, 82, 0, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 0, 0, 95, 0, 8, 8, 8, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, - 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 1, 7, 7, 7, 7, 7, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 41, 41, 41, 41, 10, 10, 10, - 10, 10, 10, 10, 1, 1, 10, 10, 11, 11, 11, 11, 0, 11, 11, 11, - 11, 11, 11, 11, 11, 0, 0, 11, 11, 0, 0, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, - 11, 0, 11, 0, 0, 0, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, - 11, 0, 0, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 11, - 0, 0, 0, 0, 11, 11, 0, 11, 11, 11, 11, 11, 0, 0, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 0, 0, 12, 12, 12, 0, 12, 12, 12, - 12, 12, 12, 0, 0, 0, 0, 12, 12, 0, 0, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, - 12, 0, 12, 12, 0, 12, 12, 0, 12, 12, 0, 0, 12, 0, 12, 12, - 12, 0, 0, 12, 12, 12, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, - 0, 12, 12, 12, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 0, 0, 13, 13, 13, 0, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, - 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, - 13, 13, 0, 13, 13, 13, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, - 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, - 0, 13, 13, 13, 13, 13, 13, 13, 0, 14, 14, 14, 0, 14, 14, 14, - 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, - 14, 0, 14, 14, 0, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, - 14, 0, 0, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, - 0, 0, 0, 0, 14, 14, 0, 14, 14, 14, 14, 14, 0, 0, 14, 14, - 0, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, - 15, 0, 15, 15, 15, 15, 0, 0, 0, 15, 15, 0, 15, 0, 15, 15, - 0, 0, 0, 15, 15, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 0, 0, 0, 0, 15, 15, 15, 0, 0, 0, 0, 0, 0, 15, - 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, - 16, 0, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 16, 16, 16, - 16, 0, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 16, 16, 0, - 16, 16, 16, 0, 0, 0, 0, 0, 16, 16, 16, 16, 0, 0, 16, 16, - 0, 0, 0, 0, 0, 0, 0, 16, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 0, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 17, - 17, 0, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 17, 17, 0, - 0, 0, 0, 0, 0, 0, 17, 0, 17, 17, 17, 17, 0, 0, 17, 17, - 0, 17, 17, 0, 0, 0, 0, 0, 18, 18, 18, 18, 0, 18, 18, 18, - 18, 18, 18, 18, 18, 0, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 18, 18, 18, 18, - 18, 18, 18, 18, 0, 0, 18, 18, 0, 0, 19, 19, 0, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, - 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 19, 0, 0, 0, 0, 19, - 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, - 0, 0, 19, 19, 19, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 1, - 20, 20, 20, 20, 0, 0, 0, 0, 0, 21, 21, 0, 21, 0, 21, 21, - 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 0, 21, 0, 21, 21, 21, 21, 21, 21, 21, 0, 0, - 21, 21, 21, 21, 21, 0, 21, 0, 21, 21, 0, 0, 21, 21, 21, 21, - 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 0, 0, 0, 22, 22, 22, 22, 22, 0, 22, 22, - 22, 22, 22, 22, 22, 1, 1, 1, 1, 22, 22, 0, 0, 0, 0, 0, - 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 0, 24, 0, 0, 0, 0, 0, 24, 0, 0, - 24, 24, 24, 1, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 0, 0, - 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 0, 0, 26, 26, 26, - 26, 26, 26, 26, 26, 0, 0, 0, 26, 26, 0, 0, 0, 0, 0, 0, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, - 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 0, 0, 0, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 1, 1, 1, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, - 42, 42, 42, 42, 42, 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 1, 1, 0, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 0, 45, 45, 45, 0, 45, 45, 0, 0, 0, 0, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, - 31, 31, 0, 0, 0, 0, 0, 0, 32, 32, 1, 1, 32, 1, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, 0, 0, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, - 46, 46, 46, 46, 0, 0, 0, 0, 46, 0, 0, 0, 46, 46, 46, 46, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, - 47, 47, 47, 47, 47, 0, 0, 0, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 0, 0, 0, 0, 56, 56, 0, 0, 0, 0, 0, 0, - 56, 56, 56, 0, 0, 0, 56, 56, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 0, 0, 54, 54, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 0, 78, 78, 78, 78, 78, 0, 0, 78, - 78, 78, 0, 0, 0, 0, 0, 0, 78, 78, 78, 78, 78, 78, 0, 0, - 41, 41, 41, 41, 41, 41, 41, 0, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 0, 0, 0, 0, 62, 62, 62, 62, 62, 0, 0, 0, - 67, 67, 67, 67, 67, 67, 67, 67, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, 93, 93, - 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 68, 68, 68, 68, 68, - 68, 68, 0, 0, 0, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, - 4, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 0, 0, 24, 24, 24, - 41, 41, 41, 1, 41, 41, 41, 41, 41, 1, 41, 41, 41, 41, 41, 41, - 41, 1, 1, 1, 1, 41, 1, 1, 1, 1, 1, 1, 41, 1, 1, 1, - 41, 41, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 3, 3, - 3, 3, 3, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, - 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, - 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, - 41, 41, 0, 41, 41, 41, 41, 41, 3, 3, 3, 3, 3, 3, 0, 0, - 0, 3, 0, 3, 0, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, - 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, - 0, 0, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, - 1, 1, 1, 1, 41, 41, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, - 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 0, 0, 0, - 41, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, - 2, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, - 53, 53, 53, 53, 53, 53, 53, 53, 1, 1, 1, 1, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 0, 55, 55, 55, 55, 0, 0, 0, 0, - 0, 55, 55, 55, 55, 55, 55, 55, 58, 58, 58, 58, 58, 58, 58, 58, - 0, 0, 0, 0, 0, 0, 0, 58, 58, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 0, 0, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 36, 1, 36, - 1, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 25, 25, - 36, 36, 36, 36, 1, 1, 1, 1, 0, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, - 0, 41, 41, 1, 1, 33, 33, 33, 1, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 1, 1, 34, 34, 34, - 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, - 35, 35, 35, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 1, - 34, 34, 34, 34, 34, 34, 34, 1, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 0, - 83, 83, 83, 83, 83, 83, 83, 83, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 0, 0, 0, 0, 84, 84, 84, 84, 84, 84, 84, 84, - 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, - 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 0, 0, 0, 0, - 1, 1, 0, 0, 0, 0, 0, 0, 65, 65, 65, 65, 65, 65, 65, 65, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, - 0, 0, 0, 0, 0, 0, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 1, 72, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 73, 25, 25, 25, 25, 25, 0, 0, 0, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 1, - 85, 85, 0, 0, 0, 0, 85, 85, 23, 23, 23, 23, 23, 23, 23, 0, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 0, - 77, 77, 77, 77, 77, 77, 0, 0, 77, 77, 0, 0, 77, 77, 77, 77, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, - 0, 0, 0, 79, 79, 79, 79, 79, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 0, 0, 26, 26, 26, 26, 26, 26, 0, - 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, - 86, 86, 86, 86, 86, 86, 0, 0, 86, 86, 0, 0, 0, 0, 0, 0, - 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, - 36, 36, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, - 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 0, 6, 6, 6, 6, 6, 0, 6, 0, - 6, 6, 0, 6, 6, 0, 6, 6, 7, 7, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 1, 1, 0, 0, 7, 7, 7, 7, 7, 7, - 41, 41, 41, 41, 41, 41, 4, 4, 1, 1, 1, 0, 1, 1, 1, 1, - 7, 7, 7, 7, 7, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 34, 34, 34, 34, 34, 34, 34, 34, 1, 1, - 0, 0, 25, 25, 25, 25, 25, 25, 0, 0, 25, 25, 25, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, - 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 0, - 48, 48, 48, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, - 1, 1, 1, 1, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 41, 0, 0, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 0, 0, 0, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 0, 0, 0, 0, 0, 0, 0, 41, 1, 1, 1, 1, 1, 1, 1, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 0, 0, 0, 0, 0, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 0, 49, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 0, 0, 0, 0, 60, 60, 60, 60, 60, 60, 0, 0, - 40, 40, 40, 40, 40, 40, 40, 40, 50, 50, 50, 50, 50, 50, 50, 50, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, - 51, 51, 0, 0, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 0, 0, 0, 0, 106, 106, 106, 106, 106, 106, 106, 106, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 103, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 110, 0, 110, 110, 110, 110, 110, 110, 0, 0, - 52, 52, 52, 52, 52, 52, 0, 0, 52, 0, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 0, 52, - 52, 0, 0, 0, 52, 0, 0, 52, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 0, 87, 118, 118, 118, 118, 118, 118, 118, 118, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 128, 128, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 64, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 76, - 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, - 0, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, - 61, 61, 61, 61, 0, 61, 61, 0, 0, 0, 0, 0, 61, 61, 61, 61, - 61, 61, 61, 61, 0, 61, 61, 61, 0, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 0, 0, - 61, 61, 61, 0, 0, 0, 0, 61, 61, 0, 0, 0, 0, 0, 0, 0, - 88, 88, 88, 88, 88, 88, 88, 88, 116, 116, 116, 116, 116, 116, 116, 116, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 0, - 0, 0, 0, 112, 112, 112, 112, 112, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, - 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 0, 0, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, 0, 0, 0, 0, - 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 0, 0, 0, 0, 0, 0, - 0, 121, 121, 121, 121, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, - 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 0, 0, 0, 0, 0, 0, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, - 0, 0, 130, 130, 130, 130, 130, 130, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, - 148, 148, 148, 148, 148, 148, 148, 148, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 0, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 0, 0, 0, 0, 94, 94, 94, 94, 94, 94, - 0, 0, 0, 0, 0, 0, 0, 94, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 0, 0, 0, 0, 0, 0, 0, - 101, 101, 0, 0, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, - 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, 0, - 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 0, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 0, 129, 129, 129, 129, 129, 129, 129, 0, - 129, 0, 129, 129, 129, 129, 0, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 129, 129, 129, 129, 129, 129, 0, 129, 129, 129, 0, 0, 0, 0, 0, 0, - 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, - 123, 123, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 0, 107, 107, 107, - 107, 107, 107, 107, 107, 0, 0, 107, 107, 0, 0, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 107, 107, 107, 107, - 107, 0, 107, 107, 0, 107, 107, 107, 107, 107, 0, 41, 107, 107, 107, 107, - 107, 0, 0, 107, 107, 107, 0, 0, 107, 0, 0, 0, 0, 0, 0, 107, - 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 0, 0, 107, 107, - 107, 107, 107, 107, 107, 0, 0, 0, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 0, 135, 0, 135, 135, 135, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 122, 122, 122, 122, - 122, 122, 122, 122, 122, 122, 0, 0, 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 0, 0, 0, 114, 114, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 32, 32, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 0, 0, 0, 0, 0, 0, 0, 102, 102, 0, 0, 0, 0, 0, 0, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 126, 126, 126, - 126, 126, 126, 126, 0, 0, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 0, 0, 0, 0, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, - 150, 150, 150, 150, 150, 150, 150, 150, 0, 0, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 0, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 0, 0, 0, 0, 0, 0, 0, - 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, - 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, 0, 0, - 133, 133, 133, 133, 133, 0, 0, 0, 134, 134, 134, 134, 134, 134, 134, 134, - 0, 0, 134, 134, 134, 134, 134, 134, 0, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 0, 138, 138, 138, 138, 138, 138, 138, 0, - 138, 138, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 0, 0, 138, 0, 138, 138, 0, 138, 138, 138, 0, 0, 0, 0, 0, 0, - 143, 143, 143, 143, 143, 143, 0, 143, 143, 0, 143, 143, 143, 143, 143, 143, - 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, - 143, 143, 0, 143, 143, 143, 143, 143, 143, 0, 0, 0, 0, 0, 0, 0, - 143, 143, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 0, 0, 0, 0, 0, 0, 0, 15, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 15, 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 0, 0, 0, 0, 0, 0, 63, 63, 63, 63, 63, 63, 63, 0, - 63, 63, 63, 63, 63, 0, 0, 0, 63, 63, 63, 63, 0, 0, 0, 0, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 0, - 81, 0, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 0, 84, 0, 0, 0, 0, 0, 0, 0, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 0, - 115, 115, 0, 0, 0, 0, 115, 115, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 0, 0, 108, 108, 0, 108, 108, 108, 108, 108, - 0, 0, 0, 0, 0, 108, 108, 108, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 0, 0, 0, 0, 0, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 99, - 137, 139, 1, 1, 0, 0, 0, 0, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 0, 0, 0, 0, 0, 34, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, - 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 0, 0, 0, 0, - 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 0, - 105, 105, 105, 105, 105, 0, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, - 105, 105, 0, 0, 105, 105, 105, 105, 1, 1, 1, 1, 1, 1, 1, 41, - 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 41, 41, 41, 41, - 41, 41, 41, 1, 1, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, - 1, 1, 41, 41, 41, 41, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, - 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, - 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, - 0, 0, 0, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, - 57, 0, 0, 57, 57, 57, 57, 57, 57, 57, 0, 57, 57, 0, 57, 57, - 57, 57, 57, 0, 0, 0, 0, 0, 151, 151, 151, 151, 151, 151, 151, 151, - 151, 151, 151, 151, 151, 0, 0, 0, 151, 151, 151, 151, 151, 151, 0, 0, - 151, 151, 0, 0, 0, 0, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152, - 152, 152, 0, 0, 0, 0, 0, 152, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 0, 0, 113, 113, 113, 113, 113, 113, 113, 113, 0, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 0, 0, 0, 0, - 132, 132, 0, 0, 0, 0, 132, 132, 1, 1, 1, 1, 1, 0, 0, 0, - 7, 7, 7, 7, 0, 7, 7, 7, 0, 7, 7, 0, 7, 0, 0, 7, - 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, - 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, - 0, 7, 0, 7, 0, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, - 0, 7, 7, 7, 7, 0, 7, 0, 7, 7, 0, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 0, 7, 7, 7, - 0, 0, 0, 0, 0, 0, 1, 1, 33, 1, 1, 0, 0, 0, 0, 0, - 1, 1, 1, 0, 0, 0, 1, 1, 36, 36, 36, 36, 36, 36, 36, 0, - 36, 36, 36, 36, 36, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, -}; + return (v >> offset) & 0x1; +} -/* Script: 13928 bytes. */ - -RE_UINT32 re_get_script(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_script_stage_1[f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_script_stage_2[pos + f] << 4; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_script_stage_3[pos + f] << 3; - value = re_script_stage_4[pos + code]; - - return value; +/* Any. */ +RE_UINT32 re_get_any(RE_UINT32 codepoint) { + return 1; } -/* Script_Extensions. */ +/* ASCII_Hex_Digit. */ +RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 codepoint) { + if (0x30 <= codepoint && codepoint <= 0x39) + return 1; + if (0x41 <= codepoint && codepoint <= 0x46) + return 1; + if (0x61 <= codepoint && codepoint <= 0x66) + return 1; + + return 0; +} -static RE_UINT8 re_script_extensions_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 9, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 14, 15, - 16, 17, 18, 19, 20, 14, 21, 14, 22, 14, 14, 14, 14, 23, 24, 24, - 25, 26, 14, 14, 14, 14, 27, 28, 14, 14, 29, 30, 31, 32, 33, 34, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 35, 7, 36, 37, 7, 38, 7, 7, 7, 39, 14, 40, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 41, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -}; - -static RE_UINT8 re_script_extensions_stage_2[] = { - 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, - 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, - 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 80, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 81, - 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 84, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 97, - 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 70, 70, 99, 100, 101, 102, 103, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 98, 114, 115, 116, 117, 118, 119, 98, 120, 120, 121, 98, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 98, 133, 98, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 98, 143, 144, 98, 145, 146, 147, 148, 98, - 149, 150, 98, 151, 152, 153, 98, 98, 154, 155, 156, 157, 98, 158, 98, 159, - 160, 160, 160, 160, 160, 160, 160, 161, 162, 160, 163, 98, 98, 98, 98, 98, - 164, 164, 164, 164, 164, 164, 164, 164, 165, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 98, 166, 166, 166, 166, 167, 98, 98, 98, - 168, 168, 168, 168, 169, 170, 171, 172, 98, 98, 98, 98, 173, 174, 175, 176, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 178, - 177, 177, 177, 177, 177, 179, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 180, 181, 182, 183, 183, 184, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 98, 185, 186, 98, 98, 98, 98, 98, 98, - 59, 187, 188, 189, 190, 191, 192, 98, 193, 194, 195, 59, 59, 196, 59, 197, - 198, 198, 198, 198, 198, 199, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 200, 98, 201, 98, 98, 202, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 203, 204, 205, 98, 98, 98, 98, 98, 206, 207, 208, 98, 209, 210, 98, 98, - 211, 212, 213, 214, 215, 98, 59, 59, 59, 59, 59, 59, 59, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 225, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 226, 70, - 227, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 228, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 229, 98, 98, 98, 98, 98, 98, 98, 98, - 70, 70, 70, 70, 230, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 231, 98, 232, 233, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, -}; - -static RE_UINT16 re_script_extensions_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, - 0, 0, 0, 0, 0, 4, 0, 4, 2, 2, 5, 2, 2, 2, 5, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 7, 8, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 10, 9, 9, 9, 11, 2, 12, 13, - 14, 15, 16, 16, 17, 16, 16, 16, 16, 16, 16, 16, 18, 19, 16, 16, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 22, 23, 23, 23, 24, 22, 23, 23, 23, 23, - 23, 25, 26, 27, 27, 27, 27, 27, 27, 28, 27, 27, 27, 29, 30, 28, - 31, 32, 33, 34, 33, 33, 33, 33, 35, 36, 37, 33, 38, 39, 40, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 41, 31, 33, 33, 33, 33, - 42, 43, 42, 42, 42, 42, 42, 42, 42, 44, 33, 33, 33, 33, 33, 33, - 45, 45, 45, 45, 45, 45, 46, 28, 47, 47, 47, 47, 47, 47, 47, 48, - 49, 49, 49, 49, 49, 50, 49, 51, 52, 52, 52, 53, 42, 54, 28, 28, - 28, 28, 28, 28, 33, 33, 55, 56, 28, 28, 57, 33, 58, 33, 33, 33, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 59, 61, 62, 59, 59, - 63, 64, 65, 66, 66, 67, 68, 69, 64, 70, 71, 72, 73, 74, 66, 75, - 76, 77, 78, 79, 79, 80, 81, 82, 77, 83, 84, 85, 86, 87, 88, 28, - 89, 90, 91, 92, 92, 93, 94, 95, 90, 96, 97, 28, 98, 99, 100, 101, - 102, 103, 104, 105, 105, 106, 107, 108, 103, 109, 110, 111, 112, 105, 105, 28, - 113, 114, 115, 116, 117, 114, 118, 119, 114, 115, 120, 28, 121, 122, 123, 124, - 125, 126, 127, 125, 125, 127, 125, 128, 126, 129, 130, 131, 132, 125, 133, 125, - 134, 135, 136, 134, 134, 136, 137, 138, 135, 139, 140, 141, 142, 143, 144, 28, - 145, 146, 147, 148, 148, 148, 148, 148, 146, 147, 149, 148, 150, 148, 148, 148, - 151, 152, 153, 154, 152, 152, 155, 156, 153, 157, 158, 152, 159, 152, 160, 28, - 161, 162, 162, 162, 162, 162, 162, 163, 162, 162, 162, 164, 28, 28, 28, 28, - 165, 166, 167, 167, 168, 167, 167, 169, 170, 169, 167, 171, 28, 28, 28, 28, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 172, 172, 172, 174, 173, 172, - 172, 172, 172, 173, 172, 172, 172, 175, 172, 175, 176, 177, 28, 28, 28, 28, - 178, 178, 178, 178, 178, 178, 178, 178, 179, 180, 178, 178, 178, 178, 178, 178, - 178, 178, 178, 178, 181, 181, 181, 181, 182, 183, 181, 181, 181, 181, 181, 184, - 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 186, 186, 186, 186, 186, 186, 186, 186, 186, 187, 188, 187, 186, 186, 186, 186, - 186, 187, 186, 186, 186, 186, 187, 188, 187, 186, 188, 186, 186, 186, 186, 186, - 186, 186, 187, 186, 186, 186, 186, 186, 186, 186, 186, 189, 186, 186, 186, 190, - 186, 186, 186, 191, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, - 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, - 195, 195, 195, 196, 197, 197, 197, 197, 197, 197, 197, 197, 197, 198, 197, 199, - 200, 201, 202, 28, 203, 203, 204, 28, 205, 205, 206, 28, 207, 208, 209, 28, - 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 211, 210, 212, 210, 212, - 213, 214, 215, 216, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 217, - 215, 215, 215, 215, 215, 218, 194, 194, 194, 194, 194, 194, 194, 194, 219, 28, - 220, 220, 220, 221, 220, 222, 220, 222, 223, 220, 224, 224, 224, 225, 226, 28, - 227, 227, 227, 227, 227, 228, 227, 227, 227, 229, 227, 230, 210, 210, 210, 210, - 231, 231, 231, 232, 233, 233, 233, 233, 233, 233, 233, 234, 233, 233, 233, 235, - 233, 236, 233, 236, 233, 237, 9, 238, 28, 28, 28, 28, 28, 28, 28, 28, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 240, 239, 239, 239, 239, 239, 241, - 242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 243, 243, 243, 244, 245, - 246, 246, 246, 246, 246, 246, 246, 247, 246, 248, 249, 249, 249, 249, 249, 249, - 20, 250, 181, 181, 181, 181, 181, 251, 242, 28, 252, 253, 254, 255, 256, 257, - 2, 2, 2, 2, 258, 259, 2, 2, 2, 2, 2, 260, 261, 262, 2, 263, - 2, 2, 2, 2, 2, 2, 2, 264, 265, 9, 9, 9, 9, 9, 9, 266, - 16, 16, 267, 267, 16, 16, 16, 16, 267, 267, 16, 268, 16, 16, 16, 267, - 16, 16, 16, 16, 16, 16, 269, 16, 269, 16, 270, 271, 16, 16, 272, 273, - 0, 274, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 276, 0, 277, 278, - 0, 279, 2, 280, 0, 0, 0, 0, 28, 28, 9, 9, 9, 9, 281, 28, - 0, 0, 0, 0, 282, 283, 4, 0, 0, 284, 0, 0, 2, 2, 2, 2, - 2, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 279, 28, 28, 28, 0, 286, 28, 28, 0, 0, 0, 0, - 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, - 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 290, 290, 290, 290, 290, 291, 290, 290, 290, 290, 290, 291, 2, 2, 2, 2, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 292, 293, - 181, 181, 181, 181, 182, 183, 294, 294, 294, 294, 294, 294, 294, 295, 296, 295, - 186, 186, 188, 28, 188, 188, 188, 188, 188, 188, 188, 188, 20, 20, 20, 20, - 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, 28, 28, 28, 28, 28, 28, - 298, 298, 298, 299, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 300, 28, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 301, 28, 28, 28, 0, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 312, 312, 312, 312, 312, 312, - 312, 312, 313, 314, 315, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 317, - 318, 319, 319, 319, 319, 319, 320, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 321, 298, 298, 319, 319, 319, 322, 298, 298, 298, 298, 300, 28, 316, 316, - 185, 185, 185, 321, 298, 298, 298, 298, 298, 0, 0, 0, 185, 185, 185, 323, - 298, 298, 298, 298, 298, 298, 324, 0, 298, 325, 316, 316, 316, 316, 316, 326, - 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 298, 298, 298, 324, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 298, 298, 328, - 298, 298, 298, 298, 298, 298, 301, 28, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 28, 28, - 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, - 329, 330, 329, 329, 329, 329, 329, 329, 331, 28, 332, 332, 332, 332, 332, 332, - 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, - 333, 333, 333, 333, 333, 334, 28, 28, 20, 20, 20, 20, 20, 335, 20, 20, - 20, 20, 20, 20, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 28, - 0, 0, 0, 0, 337, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 338, 2, 2, 2, 2, 2, 2, 339, 28, 28, 28, 28, 28, 340, 2, - 341, 341, 341, 341, 341, 342, 343, 344, 345, 345, 345, 345, 345, 345, 345, 28, - 346, 346, 346, 346, 346, 346, 346, 346, 347, 348, 346, 349, 59, 59, 350, 59, - 351, 351, 351, 351, 351, 352, 353, 353, 353, 353, 354, 355, 185, 185, 185, 356, - 357, 357, 357, 357, 357, 357, 357, 357, 357, 358, 357, 359, 178, 178, 178, 360, - 361, 361, 361, 361, 361, 361, 362, 28, 361, 363, 361, 364, 178, 178, 178, 178, - 365, 365, 365, 365, 365, 365, 365, 365, 366, 28, 28, 367, 368, 368, 369, 28, - 370, 370, 370, 28, 188, 188, 2, 2, 2, 2, 2, 371, 372, 28, 192, 192, - 192, 192, 192, 192, 192, 192, 192, 192, 368, 368, 368, 368, 368, 373, 368, 374, - 185, 185, 185, 185, 375, 28, 185, 185, 321, 376, 185, 185, 185, 185, 185, 375, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 301, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 377, 28, 28, 28, 28, - 378, 28, 379, 380, 27, 27, 381, 382, 383, 27, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 384, 28, 57, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 385, 28, 28, 33, 33, 33, 33, 33, 33, - 33, 33, 386, 33, 33, 33, 33, 33, 33, 28, 28, 28, 28, 28, 387, 388, - 9, 9, 0, 389, 9, 390, 0, 0, 391, 0, 392, 0, 279, 302, 55, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 393, - 394, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, 395, 316, 315, 316, - 316, 316, 316, 396, 185, 185, 185, 321, 397, 397, 397, 398, 279, 279, 28, 399, - 400, 401, 400, 400, 402, 400, 400, 403, 400, 404, 400, 404, 28, 28, 28, 28, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 405, - 406, 407, 407, 407, 407, 407, 408, 409, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 273, 0, 302, 410, 28, 28, 28, 28, 28, 0, 0, 0, 0, 0, 411, - 412, 412, 412, 413, 414, 414, 414, 414, 414, 414, 415, 28, 416, 416, 416, 417, - 418, 418, 418, 418, 419, 420, 421, 421, 421, 422, 423, 423, 423, 423, 423, 424, - 425, 425, 425, 426, 427, 427, 427, 427, 428, 427, 429, 28, 28, 28, 28, 28, - 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 431, 431, 431, 431, 431, 431, - 432, 432, 432, 433, 432, 434, 435, 435, 435, 435, 436, 435, 435, 435, 435, 436, - 437, 437, 437, 437, 437, 28, 438, 438, 438, 438, 438, 438, 439, 440, 28, 28, - 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, - 441, 441, 441, 441, 441, 441, 442, 28, 441, 441, 443, 28, 441, 28, 28, 28, - 444, 445, 446, 446, 446, 446, 447, 448, 449, 449, 450, 449, 451, 451, 451, 451, - 452, 452, 452, 453, 454, 452, 28, 28, 28, 28, 28, 28, 455, 455, 456, 457, - 458, 458, 458, 459, 460, 460, 460, 461, 28, 28, 28, 28, 28, 28, 28, 28, - 462, 462, 462, 462, 463, 463, 463, 464, 463, 463, 465, 463, 463, 463, 463, 463, - 466, 467, 468, 469, 470, 470, 471, 472, 470, 473, 470, 473, 474, 474, 474, 474, - 475, 475, 475, 475, 28, 28, 28, 28, 476, 476, 476, 476, 477, 478, 477, 28, - 479, 479, 479, 479, 479, 479, 480, 481, 482, 482, 483, 482, 484, 484, 485, 484, - 486, 486, 487, 488, 28, 489, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 490, 490, 490, 490, 490, 490, 490, 490, 490, 491, 28, 28, 28, 28, 28, 28, - 492, 492, 492, 492, 492, 492, 493, 28, 492, 492, 492, 492, 492, 492, 493, 494, - 495, 495, 495, 495, 495, 28, 495, 496, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 33, 33, 33, 497, - 498, 498, 498, 498, 498, 28, 499, 499, 499, 499, 499, 500, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 501, 501, 502, 28, - 503, 503, 503, 503, 503, 503, 503, 503, 503, 504, 505, 503, 503, 503, 28, 506, - 507, 507, 507, 507, 507, 507, 507, 507, 508, 509, 510, 510, 510, 511, 510, 512, - 513, 513, 513, 513, 513, 513, 514, 513, 515, 28, 516, 516, 516, 516, 517, 28, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 519, 518, 518, 520, 152, 521, 28, - 522, 522, 523, 522, 522, 522, 522, 524, 28, 28, 28, 28, 28, 28, 28, 28, - 525, 526, 527, 528, 527, 529, 530, 530, 530, 530, 530, 530, 530, 531, 530, 532, - 533, 534, 535, 536, 536, 537, 538, 539, 534, 540, 541, 542, 543, 544, 544, 28, - 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 546, 28, 28, 28, 28, - 547, 547, 547, 547, 547, 547, 547, 547, 547, 28, 547, 548, 28, 28, 28, 28, - 549, 549, 549, 549, 549, 549, 550, 549, 549, 549, 549, 550, 28, 28, 28, 28, - 551, 551, 551, 551, 551, 551, 551, 551, 552, 28, 551, 553, 215, 554, 28, 28, - 555, 555, 555, 555, 555, 555, 555, 556, 555, 557, 28, 28, 28, 28, 28, 28, - 558, 558, 558, 559, 558, 560, 558, 558, 28, 28, 28, 28, 28, 28, 28, 28, - 561, 561, 561, 561, 561, 561, 561, 562, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 564, 565, - 28, 28, 28, 28, 566, 567, 566, 566, 566, 566, 566, 567, 568, 28, 28, 28, - 569, 569, 569, 569, 569, 569, 569, 569, 569, 28, 570, 570, 570, 570, 570, 570, - 570, 570, 570, 570, 571, 28, 28, 28, 572, 572, 572, 572, 572, 572, 572, 573, - 574, 575, 574, 574, 574, 574, 576, 574, 577, 28, 574, 574, 574, 578, 579, 579, - 579, 579, 580, 579, 579, 581, 582, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 583, 584, 585, 585, 585, 585, 583, 586, 585, 28, 585, 587, 588, 589, 590, 590, - 590, 591, 592, 593, 590, 594, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 595, 595, 595, 596, - 28, 28, 28, 28, 28, 28, 28, 28, 118, 118, 597, 118, 118, 118, 598, 599, - 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, - 600, 600, 600, 601, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 602, 603, 28, - 600, 600, 600, 600, 600, 600, 600, 600, 604, 28, 28, 28, 28, 28, 28, 28, - 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, - 605, 605, 605, 605, 605, 606, 605, 607, 28, 28, 28, 28, 28, 28, 28, 28, - 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, - 608, 608, 608, 608, 608, 608, 608, 608, 609, 28, 28, 28, 28, 28, 28, 28, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 610, 611, 611, 611, 612, 611, 613, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 614, 614, 614, 615, 615, 28, - 616, 616, 616, 616, 616, 616, 616, 616, 617, 28, 616, 618, 618, 616, 616, 619, - 616, 616, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 621, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 622, 622, 622, 622, 622, 622, 622, 622, 622, 623, 622, 622, 622, 622, 622, 622, - 622, 624, 622, 622, 28, 28, 28, 28, 28, 28, 28, 28, 625, 28, 28, 28, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 28, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 627, 28, - 628, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, - 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, - 312, 312, 312, 313, 28, 28, 28, 28, 28, 28, 629, 28, 630, 28, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632, - 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 634, 633, 635, - 633, 636, 633, 637, 638, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 28, - 0, 0, 0, 0, 279, 394, 0, 0, 0, 0, 0, 0, 639, 640, 0, 641, - 642, 643, 0, 0, 0, 644, 0, 0, 0, 0, 0, 0, 0, 645, 28, 28, - 16, 16, 16, 16, 16, 16, 16, 16, 267, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 302, 28, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, 28, 298, 298, 646, 645, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 276, 647, 648, 0, 649, 650, 0, 0, 0, 0, 0, 0, 0, - 651, 652, 276, 276, 0, 0, 0, 653, 654, 655, 656, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, - 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, - 657, 658, 28, 659, 660, 657, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 291, 290, 290, 661, 662, 663, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 664, 664, 664, 664, 664, 665, 664, 666, 664, 667, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 668, 668, 668, 668, 668, 668, 668, 669, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 671, 670, 672, 28, 28, 28, 28, 28, - 673, 673, 673, 673, 673, 673, 673, 673, 673, 674, 673, 675, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 394, 0, - 0, 0, 0, 0, 0, 0, 676, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 394, 0, 0, 0, 0, 0, 0, 289, 28, 28, 28, 28, 28, 28, 28, 28, - 677, 33, 33, 33, 678, 679, 680, 681, 682, 683, 678, 684, 678, 680, 680, 685, - 33, 686, 33, 687, 688, 686, 33, 687, 28, 28, 28, 28, 28, 28, 384, 28, - 0, 0, 0, 0, 0, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 302, 28, 0, 279, 394, 0, 394, 0, 394, 0, 0, 0, 289, 28, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 676, 0, 0, - 0, 0, 0, 0, 0, 676, 28, 28, 28, 28, 28, 28, 689, 0, 0, 0, - 690, 28, 0, 0, 0, 0, 0, 302, 0, 645, 377, 28, 289, 28, 28, 28, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 28, 0, 676, 0, 286, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302, 28, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 645, 0, 302, 28, 28, - 0, 302, 0, 0, 0, 0, 0, 0, 0, 28, 0, 389, 0, 0, 0, 0, - 0, 28, 0, 0, 0, 289, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 0, 650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 653, 655, - 0, 0, 0, 0, 652, 691, 0, 0, 0, 652, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302, 28, 0, 289, 302, 286, - 286, 28, 289, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 692, 28, 28, 28, 28, 28, - 298, 298, 298, 298, 298, 298, 693, 28, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 301, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 298, 377, 28, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 694, 28, 28, 28, - 298, 298, 298, 301, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 695, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 28, 28, -}; - -static RE_UINT8 re_script_extensions_stage_4[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, - 1, 1, 35, 35, 1, 1, 1, 1, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 3, 41, 41, 3, 41, 41, 41, 41, 41, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 1, 3, 3, 3, 0, 0, 3, 3, 3, 3, 1, 3, - 0, 0, 0, 0, 3, 1, 3, 1, 3, 3, 3, 0, 3, 0, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, - 3, 3, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 164, 162, 163, 163, 162, - 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 5, 157, 5, 0, 0, 5, 5, 5, - 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 0, 0, 0, 6, - 6, 6, 6, 6, 6, 0, 0, 0, 7, 7, 7, 7, 7, 1, 7, 7, - 7, 7, 7, 7, 185, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 185, 177, 0, 7, 185, 192, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 7, 7, - 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 7, 7, 7, 7, 7, 7, - 155, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 154, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, - 8, 8, 8, 0, 0, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 0, 0, 66, 66, 66, 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 0, 0, 82, 82, 82, 82, 82, 82, 82, 0, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 95, 0, - 8, 8, 8, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 7, 7, - 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, - 7, 7, 1, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 196, 195, 41, 41, 10, 10, 10, 10, 10, 10, 10, 199, 200, 188, 188, - 188, 188, 188, 188, 188, 188, 188, 188, 11, 11, 11, 11, 0, 11, 11, 11, - 11, 11, 11, 11, 11, 0, 0, 11, 11, 0, 0, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, - 11, 0, 11, 0, 0, 0, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, - 11, 0, 0, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 11, - 0, 0, 0, 0, 11, 11, 0, 11, 11, 11, 11, 11, 0, 0, 178, 178, - 178, 178, 178, 178, 178, 178, 178, 178, 11, 11, 11, 11, 11, 11, 11, 0, - 0, 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 12, - 12, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 0, 12, 12, 12, 12, 12, 12, 12, 0, 12, 12, 0, 12, 12, 0, - 12, 12, 0, 0, 12, 0, 12, 12, 12, 0, 0, 12, 12, 12, 0, 0, - 0, 12, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 0, 12, 0, - 0, 0, 0, 0, 0, 0, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 12, 12, 12, 12, 12, 12, 12, 0, 0, 13, 13, 13, 0, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, - 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, - 13, 13, 0, 13, 13, 13, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, - 13, 13, 13, 13, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 13, 13, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, - 0, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, - 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 0, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 0, 14, 14, 14, - 14, 14, 0, 0, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 0, 0, - 0, 0, 0, 0, 0, 0, 14, 14, 0, 0, 0, 0, 14, 14, 0, 14, - 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 15, 15, 0, 15, 15, 15, - 15, 15, 15, 0, 0, 0, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, - 0, 15, 15, 0, 15, 0, 15, 15, 0, 0, 0, 15, 15, 0, 0, 0, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, - 15, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 15, 15, 15, 15, - 15, 15, 15, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 0, 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, - 16, 16, 0, 0, 0, 16, 16, 16, 16, 0, 16, 16, 16, 16, 0, 0, - 0, 0, 0, 0, 0, 16, 16, 0, 16, 16, 16, 0, 0, 0, 0, 0, - 16, 16, 16, 16, 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 16, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, - 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, - 17, 17, 0, 0, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, 0, 0, - 0, 0, 0, 0, 0, 17, 17, 0, 0, 0, 0, 0, 0, 0, 17, 0, - 17, 17, 17, 17, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 0, 17, 17, 0, 0, 0, 0, 0, 18, 18, 18, 18, 0, 18, 18, 18, - 18, 18, 18, 18, 18, 0, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 18, 18, 18, 18, - 18, 18, 18, 18, 0, 0, 18, 18, 0, 0, 19, 19, 0, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, - 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 19, 0, 0, 0, 0, 19, - 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, - 0, 0, 19, 19, 19, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 1, - 20, 20, 20, 20, 0, 0, 0, 0, 0, 21, 21, 0, 21, 0, 21, 21, - 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 0, 21, 0, 21, 21, 21, 21, 21, 21, 21, 0, 0, - 21, 21, 21, 21, 21, 0, 21, 0, 21, 21, 0, 0, 21, 21, 21, 21, - 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 0, 0, 0, 22, 22, 22, 22, 22, 0, 22, 22, - 22, 22, 22, 22, 22, 1, 1, 1, 1, 22, 22, 0, 0, 0, 0, 0, - 23, 23, 23, 23, 23, 23, 23, 23, 179, 179, 179, 179, 179, 179, 179, 179, - 179, 179, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 0, 24, 0, 0, 0, 0, 0, 24, 0, 0, - 24, 24, 24, 169, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 0, 0, - 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 0, 0, 26, 26, 26, - 26, 26, 26, 26, 26, 0, 0, 0, 26, 26, 0, 0, 0, 0, 0, 0, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, - 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 0, 0, 0, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 1, 1, 1, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, - 42, 42, 42, 42, 42, 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 187, 187, 0, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 0, 45, 45, 45, 0, 45, 45, 0, 0, 0, 0, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, - 31, 31, 0, 0, 0, 0, 0, 0, 32, 32, 176, 176, 32, 176, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, 0, 0, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, - 46, 46, 46, 46, 0, 0, 0, 0, 46, 0, 0, 0, 46, 46, 46, 46, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, - 47, 47, 47, 47, 47, 0, 0, 0, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 0, 0, 0, 0, 56, 56, 0, 0, 0, 0, 0, 0, - 56, 56, 56, 0, 0, 0, 56, 56, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 0, 0, 54, 54, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 0, 78, 78, 78, 78, 78, 0, 0, 78, - 78, 78, 0, 0, 0, 0, 0, 0, 78, 78, 78, 78, 78, 78, 0, 0, - 41, 41, 41, 41, 41, 41, 41, 0, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 0, 0, 0, 0, 62, 62, 62, 62, 62, 0, 0, 0, - 67, 67, 67, 67, 67, 67, 67, 67, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, 93, 93, - 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 68, 68, 68, 68, 68, - 68, 68, 0, 0, 0, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, - 4, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 0, 0, 24, 24, 24, - 186, 10, 186, 165, 10, 158, 158, 167, 158, 167, 191, 10, 167, 167, 10, 10, - 167, 158, 10, 10, 10, 10, 10, 10, 10, 166, 158, 10, 10, 158, 10, 10, - 10, 10, 193, 165, 181, 158, 158, 11, 165, 165, 150, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, - 3, 3, 3, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 41, 41, 41, 41, 41, 41, - 41, 41, 0, 41, 41, 41, 41, 41, 3, 3, 3, 3, 3, 3, 0, 0, - 0, 3, 0, 3, 0, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, - 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, - 0, 0, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, - 1, 1, 1, 1, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 175, - 1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 0, - 2, 2, 2, 2, 2, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 2, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 0, 0, 0, 0, - 1, 1, 1, 0, 0, 0, 0, 0, 53, 53, 53, 53, 53, 53, 53, 53, - 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, - 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, - 58, 58, 58, 58, 58, 58, 58, 58, 0, 0, 0, 0, 0, 0, 0, 58, - 58, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 162, 1, 1, 1, 1, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 0, 0, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 190, 190, 189, 1, 36, 36, 36, - 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 1, 189, 190, 190, 190, 190, - 190, 190, 190, 190, 189, 189, 189, 189, 1, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 159, 159, 159, 159, 25, 25, 189, 173, 173, 173, 173, 173, 1, 189, - 36, 36, 36, 36, 183, 183, 36, 36, 0, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, - 0, 173, 173, 173, 173, 33, 33, 33, 173, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 190, 173, 34, 34, 34, - 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, - 35, 35, 35, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 1, - 36, 1, 1, 1, 1, 1, 1, 1, 36, 36, 36, 36, 1, 1, 1, 1, - 34, 34, 34, 34, 34, 34, 34, 36, 1, 1, 1, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 1, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 0, - 83, 83, 83, 83, 83, 83, 83, 83, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 162, - 84, 84, 84, 84, 84, 84, 84, 84, 1, 1, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 0, 0, 0, 0, 198, 198, 198, 197, 197, 197, 194, 194, - 194, 194, 0, 0, 0, 0, 0, 0, 65, 65, 65, 65, 65, 65, 65, 65, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, - 0, 0, 0, 0, 0, 0, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, - 10, 158, 10, 168, 10, 10, 10, 10, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 184, 72, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, - 25, 25, 25, 25, 25, 0, 0, 0, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 0, 160, 85, 85, 0, 0, 0, 0, 85, 85, - 23, 23, 23, 23, 23, 23, 23, 0, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 0, 77, 77, 77, 77, 77, 77, 0, 0, - 77, 77, 0, 0, 77, 77, 77, 77, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, 79, 79, 79, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 0, - 0, 26, 26, 26, 26, 26, 26, 0, 2, 2, 2, 1, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 2, 2, 86, 86, 86, 86, 86, 86, 0, 0, - 86, 86, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 0, 0, 0, 0, - 0, 0, 0, 25, 25, 25, 25, 25, 36, 36, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 5, 5, 5, 5, 5, - 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, - 6, 6, 6, 6, 6, 0, 6, 0, 6, 6, 0, 6, 6, 0, 6, 6, - 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 1, 1, - 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 156, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 156, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, - 41, 41, 41, 41, 41, 41, 4, 4, 1, 1, 1, 1, 1, 189, 189, 1, - 1, 1, 1, 0, 1, 1, 1, 1, 7, 7, 7, 7, 7, 0, 0, 1, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 190, 190, 190, 190, 190, 34, 34, - 34, 34, 34, 34, 34, 34, 173, 173, 0, 0, 25, 25, 25, 25, 25, 25, - 0, 0, 25, 25, 25, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48, 0, 48, - 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 0, 0, 0, 0, 0, - 161, 161, 161, 0, 0, 0, 0, 180, 180, 180, 180, 180, 180, 180, 180, 180, - 180, 180, 180, 180, 0, 0, 0, 161, 161, 161, 161, 161, 161, 161, 161, 161, - 3, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 41, 0, 0, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 0, 0, 0, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 0, 0, 0, 0, 0, 0, 0, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, 0, 0, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 0, 0, 0, 0, 0, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 0, 49, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 0, 0, 0, 0, 60, 60, 60, 60, 60, 60, 0, 0, - 40, 40, 40, 40, 40, 40, 40, 40, 50, 50, 50, 50, 50, 50, 50, 50, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, - 51, 51, 0, 0, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 0, 0, 0, 0, 106, 106, 106, 106, 106, 106, 106, 106, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 103, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 110, 0, 110, 110, 110, 110, 110, 110, 0, 0, - 52, 52, 52, 52, 52, 52, 0, 0, 52, 0, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 0, 52, - 52, 0, 0, 0, 52, 0, 0, 52, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 0, 87, 118, 118, 118, 118, 118, 118, 118, 118, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 128, 128, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 64, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 76, - 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, - 0, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, - 61, 61, 61, 61, 0, 61, 61, 0, 0, 0, 0, 0, 61, 61, 61, 61, - 61, 61, 61, 61, 0, 61, 61, 61, 0, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 0, 0, - 61, 61, 61, 0, 0, 0, 0, 61, 61, 0, 0, 0, 0, 0, 0, 0, - 88, 88, 88, 88, 88, 88, 88, 88, 116, 116, 116, 116, 116, 116, 116, 116, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 0, - 0, 0, 0, 112, 112, 112, 112, 112, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, - 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 0, 0, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, 0, 0, 0, 0, - 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 0, 0, 0, 0, 0, 0, - 0, 121, 121, 121, 121, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, - 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 0, 0, 0, 0, 0, 0, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, - 0, 0, 130, 130, 130, 130, 130, 130, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, - 148, 148, 148, 148, 148, 148, 148, 148, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 0, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 0, 0, 0, 0, 94, 94, 94, 94, 94, 94, - 0, 0, 0, 0, 0, 0, 0, 94, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 0, 0, 0, 0, 0, 0, 0, - 101, 101, 0, 0, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, - 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, 0, - 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 0, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 0, 129, 129, 129, 129, 129, 129, 129, 0, - 129, 0, 129, 129, 129, 129, 0, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 129, 129, 129, 129, 129, 129, 0, 129, 129, 129, 0, 0, 0, 0, 0, 0, - 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, - 123, 123, 0, 0, 0, 0, 0, 0, 107, 170, 107, 170, 0, 107, 107, 107, - 107, 107, 107, 107, 107, 0, 0, 107, 107, 0, 0, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 107, 107, 107, 107, - 107, 0, 107, 107, 0, 107, 107, 107, 107, 107, 0, 170, 170, 107, 107, 107, - 107, 0, 0, 107, 107, 107, 0, 0, 107, 0, 0, 0, 0, 0, 0, 107, - 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 0, 0, 107, 107, - 107, 107, 107, 107, 107, 0, 0, 0, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 0, 135, 0, 135, 135, 135, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 122, 122, 122, 122, - 122, 122, 122, 122, 122, 122, 0, 0, 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 0, 0, 0, 114, 114, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 32, 32, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 0, 0, 0, 0, 0, 0, 0, 102, 102, 0, 0, 0, 0, 0, 0, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 126, 126, 126, - 126, 126, 126, 126, 0, 0, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 0, 0, 0, 0, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, - 150, 150, 150, 150, 150, 150, 150, 150, 0, 0, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 0, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 0, 0, 0, 0, 0, 0, 0, - 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, - 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, 0, 0, - 133, 133, 133, 133, 133, 0, 0, 0, 134, 134, 134, 134, 134, 134, 134, 134, - 0, 0, 134, 134, 134, 134, 134, 134, 0, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 0, 138, 138, 138, 138, 138, 138, 138, 0, - 138, 138, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 0, 0, 138, 0, 138, 138, 0, 138, 138, 138, 0, 0, 0, 0, 0, 0, - 143, 143, 143, 143, 143, 143, 0, 143, 143, 0, 143, 143, 143, 143, 143, 143, - 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, - 143, 143, 0, 143, 143, 143, 143, 143, 143, 0, 0, 0, 0, 0, 0, 0, - 143, 143, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 0, 0, 0, 0, 0, 0, 0, 170, 170, 15, 170, 15, 15, 15, 15, - 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, - 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 0, 0, - 63, 63, 63, 63, 63, 63, 63, 0, 63, 63, 63, 63, 63, 0, 0, 0, - 63, 63, 63, 63, 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 0, 81, 0, 0, 0, 0, 0, 0, 0, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, - 84, 0, 0, 0, 0, 0, 0, 0, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 0, 115, 115, 0, 0, 0, 0, 115, 115, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, - 108, 108, 0, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 108, 108, 108, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 0, 0, 0, 0, 99, - 0, 0, 0, 0, 0, 0, 0, 99, 137, 139, 1, 1, 0, 0, 0, 0, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 0, 0, - 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34, 34, 34, 34, 139, 139, 139, 139, 139, 139, 139, 139, - 139, 139, 139, 139, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, 105, 105, - 105, 105, 105, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 0, 0, 0, - 105, 0, 0, 0, 0, 0, 0, 0, 105, 105, 0, 0, 105, 105, 105, 105, - 105, 105, 105, 105, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 41, - 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 41, 41, 41, 41, - 41, 41, 41, 1, 1, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, - 1, 1, 41, 41, 41, 41, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, - 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, - 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, - 0, 131, 131, 131, 131, 131, 131, 131, 57, 0, 0, 57, 57, 57, 57, 57, - 57, 57, 0, 57, 57, 0, 57, 57, 57, 57, 57, 0, 0, 0, 0, 0, - 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, - 151, 151, 151, 151, 151, 151, 0, 0, 151, 151, 0, 0, 0, 0, 151, 151, - 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 0, 0, 0, 0, 0, 152, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 0, 0, 113, - 113, 113, 113, 113, 113, 113, 113, 0, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 0, 0, 0, 0, 132, 132, 0, 0, 0, 0, 132, 132, - 1, 1, 1, 1, 1, 0, 0, 0, 7, 7, 7, 7, 0, 7, 7, 7, - 0, 7, 7, 0, 7, 0, 0, 7, 0, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 0, 7, 7, 7, 7, 0, 7, 0, 7, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 0, 7, 0, 7, 0, 7, 0, 7, 7, 7, - 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 7, 7, 7, 0, 7, 0, - 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, - 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 1, 1, - 33, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, - 36, 36, 36, 36, 36, 36, 36, 0, 36, 36, 36, 36, 36, 0, 0, 0, - 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -}; - -/* Script_Extensions: 14272 bytes. */ - -static RE_ScriptExt re_scripts_extensions_table[] = { - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 5, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 54, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 4, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 4, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 15, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 13, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 12, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 17, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 11, 59, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 23, 47, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 48, 52, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 17, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 10, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 33, 34, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 23, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 8, 9, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 11, 17, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 42, 43, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 92, 111, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 25, 33, 34, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 25, 33, 34, 35, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 14, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 7, 8, 95, 112, 121, 132, 146, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 11, 14, 16, 17, 107, 124, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 12, 13, 92, 102, 109, 111, 114, 123, 124, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 10, 11, 12, 13, 14, 15, 16, 17, 18, 107, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 2, 10, 11, 12, 13, 14, 15, 16, 17, 18, 100, 107, 124, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 12, 13, 17, 92, 102, 109, 111, 114, 123, 124, 142, 150, 0, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 12, 13, 17, 18, 92, 102, 109, 111, 114, 123, 124, 142, 150, 0, 0, 0, 0, 0, 0, 0}}, - {{ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 59, 102, 107, 111, 123, 124, 138, 142, 143, 150, 0}}, - {{ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 46, 59, 102, 107, 111, 123, 124, 138, 142, 143, 150}} -}; - -int re_get_script_extensions(RE_UINT32 ch, RE_UINT8* scripts) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - RE_UINT8* scr; - int count; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_script_extensions_stage_1[f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_script_extensions_stage_2[pos + f] << 4; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_script_extensions_stage_3[pos + f] << 3; - value = re_script_extensions_stage_4[pos + code]; - - scr = re_scripts_extensions_table[value].scripts; - scripts[0] = scr[0]; - count = 1; - - if (scr[0] != 0) { - while (count < RE_MAX_SCX && scr[count] != 0) { - scripts[count] = scr[count]; - ++count; - } - } - - return count; -} - -/* Word_Break. */ - -static RE_UINT8 re_word_break_stage_1[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 6, 7, 4, 8, - 9, 10, 11, 12, 13, 4, 14, 4, 4, 4, 4, 15, 4, 16, 17, 18, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 19, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static RE_UINT8 re_word_break_stage_2[] = { - 0, 1, 2, 2, 2, 3, 4, 5, 2, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 2, 2, 31, 32, 33, 34, 35, 2, 2, 2, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 2, 50, 2, 2, 51, 52, - 53, 54, 55, 56, 57, 57, 57, 57, 57, 58, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 59, 60, 61, 62, 63, 57, 57, 57, - 64, 65, 66, 67, 57, 68, 69, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 70, 2, 2, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 83, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 84, 85, 2, 2, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 57, 96, 97, 98, 2, 99, 100, 57, 2, 2, 101, 57, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 57, 57, 57, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 57, 122, 123, 57, 124, 125, 126, 127, 57, - 128, 129, 57, 130, 131, 132, 57, 57, 133, 134, 135, 136, 57, 137, 57, 57, - 2, 2, 2, 2, 2, 2, 2, 138, 139, 2, 140, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 2, 2, 2, 2, 2, 2, 2, 2, 141, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 142, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 2, 2, 2, 2, 143, 144, 145, 146, 57, 57, 57, 57, 147, 57, 148, 149, - 150, 57, 151, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 152, 153, 57, 57, 57, 57, 57, 57, - 57, 57, 154, 155, 156, 57, 57, 57, 157, 158, 159, 2, 2, 160, 161, 162, - 57, 57, 57, 57, 163, 164, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 165, 57, 166, 57, 57, 167, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 2, 168, 169, 57, 57, 57, 57, 57, 57, 57, 57, 57, 170, 171, 57, 57, - 57, 57, 172, 173, 57, 57, 57, 174, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 175, 57, 176, 177, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, -}; - -static RE_UINT8 re_word_break_stage_3[] = { - 0, 0, 1, 2, 0, 0, 0, 0, 3, 4, 0, 5, 6, 6, 7, 0, - 8, 9, 9, 9, 9, 9, 10, 11, 8, 9, 9, 9, 9, 9, 10, 0, - 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 0, 15, 13, 0, - 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 10, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 16, 9, 17, 0, 9, 9, 9, 9, 9, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 9, 19, 16, 20, - 0, 21, 10, 19, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, - 23, 18, 24, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, - 9, 9, 9, 9, 9, 10, 25, 26, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 27, 0, 28, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 29, - 30, 29, 0, 0, 31, 31, 31, 31, 31, 31, 32, 33, 34, 35, 0, 0, - 36, 37, 0, 38, 18, 18, 39, 40, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 41, 18, 18, 18, 18, 18, 6, 6, 42, 43, 44, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 45, 18, 46, 18, 47, 48, 24, 6, 6, 49, 50, - 0, 0, 0, 51, 52, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, - 18, 18, 39, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 53, 18, 18, 54, 0, 0, 0, - 6, 6, 49, 9, 9, 9, 9, 9, 9, 9, 41, 18, 18, 55, 56, 57, - 9, 9, 9, 9, 9, 53, 58, 18, 18, 59, 59, 60, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 59, 0, 9, 9, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 19, 9, 55, - 0, 0, 0, 0, 61, 18, 18, 18, 62, 18, 18, 18, 18, 18, 18, 18, - 18, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 53, 63, - 18, 18, 18, 18, 59, 18, 9, 9, 53, 64, 6, 6, 8, 9, 9, 9, - 59, 8, 9, 50, 50, 9, 9, 9, 9, 9, 19, 9, 26, 16, 55, 63, - 18, 65, 65, 66, 0, 61, 0, 22, 53, 64, 6, 6, 55, 0, 0, 67, - 28, 8, 10, 68, 50, 9, 9, 9, 9, 9, 19, 9, 19, 69, 55, 48, - 39, 61, 65, 60, 57, 0, 8, 26, 0, 64, 6, 6, 24, 70, 0, 0, - 28, 8, 9, 22, 22, 9, 9, 9, 9, 9, 19, 9, 19, 8, 55, 63, - 18, 29, 29, 60, 17, 0, 0, 0, 53, 64, 6, 6, 0, 0, 45, 18, - 28, 8, 9, 50, 50, 9, 9, 9, 9, 9, 19, 9, 19, 8, 55, 63, - 18, 65, 65, 60, 0, 71, 0, 22, 53, 64, 6, 6, 72, 0, 0, 0, - 73, 8, 10, 16, 19, 55, 69, 19, 68, 17, 10, 16, 9, 9, 55, 71, - 39, 71, 48, 60, 17, 61, 0, 0, 0, 64, 6, 6, 0, 0, 0, 0, - 18, 44, 9, 19, 19, 9, 9, 9, 9, 9, 19, 9, 9, 9, 55, 45, - 18, 48, 48, 60, 0, 30, 10, 0, 53, 64, 6, 6, 0, 0, 0, 0, - 59, 8, 9, 19, 19, 9, 9, 9, 9, 9, 19, 9, 9, 8, 55, 63, - 18, 48, 48, 60, 0, 30, 0, 13, 53, 64, 6, 6, 69, 0, 0, 0, - 18, 8, 9, 19, 19, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 63, - 18, 48, 48, 66, 0, 41, 0, 68, 53, 64, 6, 6, 0, 0, 16, 9, - 71, 8, 9, 9, 9, 10, 16, 9, 9, 9, 9, 9, 22, 9, 9, 72, - 9, 10, 74, 61, 18, 75, 18, 18, 0, 64, 6, 6, 71, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 18, 39, 0, - 0, 61, 18, 39, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 18, 18, 77, - 0, 0, 18, 60, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 60, 0, 6, 6, 76, 0, 0, 78, 57, 71, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 17, 28, 18, 18, 18, - 18, 48, 9, 59, 18, 18, 28, 18, 18, 18, 18, 18, 18, 18, 18, 77, - 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 18, 18, 18, 18, 39, - 6, 6, 76, 0, 0, 71, 60, 71, 48, 65, 18, 60, 28, 77, 0, 0, - 71, 18, 18, 29, 6, 6, 79, 60, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 22, 0, 72, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 19, 55, 9, 10, 19, 55, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 19, 55, 9, 9, 9, 9, 9, 9, 9, 9, 19, 55, 9, 10, - 19, 55, 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 19, 55, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 10, 28, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 9, 55, - 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 50, 9, 9, 9, 9, - 80, 9, 9, 9, 9, 9, 10, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 16, 9, 9, 17, 0, - 9, 9, 9, 19, 53, 77, 0, 0, 9, 9, 9, 9, 53, 77, 0, 0, - 9, 9, 9, 9, 53, 0, 0, 0, 9, 9, 9, 19, 81, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, - 18, 18, 18, 18, 18, 0, 0, 57, 6, 6, 76, 0, 0, 0, 0, 0, - 0, 0, 61, 82, 6, 6, 76, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 0, - 9, 83, 9, 9, 9, 9, 9, 9, 9, 9, 84, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 10, 18, 18, 18, 0, 18, 18, 18, 0, - 0, 64, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 41, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 28, 18, 39, 18, 18, 18, 18, 18, 18, 18, 65, - 6, 6, 76, 0, 6, 6, 76, 0, 0, 0, 0, 0, 18, 18, 18, 39, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 44, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, - 18, 44, 9, 0, 6, 6, 76, 0, 0, 0, 61, 18, 18, 0, 0, 0, - 85, 9, 9, 9, 9, 9, 9, 9, 59, 18, 18, 24, 6, 6, 49, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 53, 18, 18, 18, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 0, 0, - 6, 6, 76, 8, 6, 6, 49, 9, 9, 9, 9, 9, 9, 9, 9, 55, - 9, 9, 17, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 8, - 0, 0, 0, 0, 39, 18, 18, 18, 18, 18, 44, 52, 9, 47, 66, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 29, 18, - 9, 9, 9, 9, 9, 55, 9, 55, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 55, 9, 55, 9, 9, 25, 25, 9, 9, 9, 9, 9, 9, 9, 55, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 19, 9, 26, - 16, 19, 9, 17, 9, 16, 9, 0, 9, 9, 9, 17, 16, 19, 9, 17, - 86, 87, 87, 88, 0, 0, 89, 0, 0, 90, 91, 92, 0, 0, 0, 11, - 93, 94, 0, 0, 0, 93, 0, 95, 36, 96, 36, 36, 72, 0, 0, 68, - 0, 0, 0, 0, 9, 9, 9, 17, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 77, 0, 0, 0, - 13, 68, 16, 9, 9, 72, 8, 55, 0, 26, 19, 22, 9, 9, 55, 9, - 0, 8, 55, 13, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 68, 41, 24, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 0, 72, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 68, 0, 0, 0, 61, - 9, 9, 9, 9, 9, 10, 0, 0, 9, 10, 9, 10, 9, 10, 9, 10, - 9, 10, 9, 10, 9, 10, 9, 10, 18, 18, 18, 18, 18, 18, 18, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 97, 72, 0, 0, 0, 0, 0, 0, 0, 0, 71, 18, 98, 99, 68, 17, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 100, 101, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 102, - 0, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 10, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 102, 102, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, - 9, 9, 9, 17, 9, 9, 9, 9, 6, 6, 49, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 39, 18, 18, 104, - 9, 9, 9, 9, 9, 9, 9, 53, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 60, 0, 0, 0, - 0, 0, 0, 0, 0, 68, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 16, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 9, 9, - 105, 105, 41, 9, 9, 9, 9, 9, 41, 18, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 24, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, - 18, 60, 0, 0, 6, 6, 76, 0, 18, 18, 18, 18, 24, 9, 68, 106, - 6, 6, 49, 9, 9, 9, 9, 9, 9, 53, 18, 60, 9, 9, 9, 9, - 9, 41, 18, 18, 18, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 17, - 18, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 18, 18, - 77, 0, 0, 68, 6, 6, 76, 0, 0, 57, 0, 0, 6, 6, 76, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 59, 18, 18, 39, 0, 0, - 41, 9, 9, 60, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 61, 60, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 65, 77, 71, - 57, 0, 0, 0, 0, 0, 0, 0, 9, 9, 41, 18, 16, 107, 0, 0, - 8, 10, 8, 10, 8, 10, 0, 0, 9, 10, 9, 10, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 39, 60, 6, 6, 76, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, - 9, 10, 68, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 9, 10, 0, 0, 68, 9, 0, 108, 31, 31, 109, 31, 31, 32, 31, 110, - 111, 109, 31, 31, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 0, 0, 0, - 0, 0, 0, 0, 68, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 16, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, - 18, 18, 18, 18, 112, 94, 0, 0, 18, 18, 18, 18, 11, 93, 0, 0, - 0, 0, 0, 113, 5, 114, 0, 0, 0, 0, 0, 0, 9, 19, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 115, - 0, 116, 0, 5, 6, 6, 7, 0, 8, 9, 9, 9, 9, 9, 10, 11, - 8, 9, 9, 9, 9, 9, 10, 0, 0, 117, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 118, 9, 9, 9, 9, 9, 9, 9, 10, - 16, 9, 16, 9, 16, 9, 16, 17, 0, 0, 0, 0, 0, 0, 119, 0, - 9, 9, 9, 8, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, 10, 22, - 9, 9, 9, 55, 9, 9, 9, 55, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, - 9, 9, 9, 9, 9, 9, 9, 17, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 17, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 8, 9, 9, 9, 9, - 9, 9, 10, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 53, 39, 0, - 9, 9, 9, 9, 9, 9, 9, 55, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 8, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 55, 6, 6, 76, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, 0, - 9, 9, 9, 9, 9, 55, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, - 9, 55, 19, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 17, 50, - 9, 9, 9, 9, 9, 55, 0, 0, 9, 9, 9, 9, 9, 10, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 10, 55, 0, 0, - 9, 9, 9, 9, 9, 55, 0, 0, 9, 9, 9, 9, 9, 9, 55, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 16, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 59, 30, 0, 18, 9, 8, 8, 9, 9, 9, 9, 9, 9, 55, 39, 61, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 17, - 9, 9, 9, 9, 9, 9, 9, 17, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 107, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 0, 0, - 9, 9, 9, 9, 9, 55, 0, 0, 9, 9, 9, 9, 10, 0, 0, 0, - 9, 9, 9, 9, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 0, 0, 6, 6, 76, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 17, 0, 68, 0, 0, 9, 9, 9, 9, - 9, 53, 18, 18, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 10, 0, 0, - 85, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, - 18, 39, 0, 0, 0, 0, 0, 0, 0, 64, 6, 6, 0, 0, 0, 61, - 85, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 39, 14, - 0, 0, 0, 14, 9, 9, 9, 9, 9, 9, 17, 0, 6, 6, 76, 0, - 85, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 18, 18, 120, 6, 6, - 0, 107, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 41, 13, 0, 0, - 85, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 18, 18, - 44, 17, 28, 77, 6, 6, 121, 17, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 18, 18, 18, 0, 74, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 10, 19, 22, 9, 9, 9, 22, 9, 9, 17, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 41, 18, 18, 39, 0, 6, 6, 76, 0, - 18, 8, 9, 50, 50, 9, 9, 9, 9, 9, 19, 9, 19, 8, 23, 63, - 18, 65, 65, 60, 17, 61, 0, 8, 53, 71, 18, 77, 18, 77, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 59, 18, 18, - 18, 85, 10, 0, 6, 6, 76, 73, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, - 18, 22, 0, 0, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 60, 18, 18, - 77, 0, 0, 0, 0, 0, 9, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, - 77, 17, 0, 0, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 18, 18, 17, 0, - 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 28, 18, 18, 18, 0, 6, 6, 76, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 39, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 6, 6, 76, 0, 0, 0, 0, 68, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 16, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 59, 18, 71, 18, 122, 77, 0, 0, 0, 0, 0, 0, - 59, 18, 85, 9, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 58, 39, - 0, 61, 0, 0, 59, 18, 18, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 53, 18, 18, 18, 60, 72, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 0, - 9, 9, 19, 9, 9, 9, 9, 9, 9, 9, 9, 41, 18, 39, 18, 18, - 17, 0, 0, 0, 6, 6, 76, 0, 0, 0, 0, 0, 16, 9, 9, 9, - 9, 9, 9, 9, 71, 18, 18, 18, 18, 18, 28, 18, 18, 39, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 10, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 59, 39, 74, 29, - 18, 58, 0, 0, 6, 6, 76, 0, 9, 22, 19, 9, 9, 9, 9, 9, - 9, 9, 53, 39, 29, 18, 17, 0, 6, 6, 76, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 41, 39, 0, 0, - 9, 9, 9, 9, 9, 9, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 36, 36, 40, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 0, - 9, 9, 9, 9, 9, 9, 9, 10, 6, 6, 76, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 55, 18, 77, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 39, 0, 0, - 9, 0, 0, 0, 6, 6, 76, 0, 68, 9, 9, 9, 9, 9, 0, 8, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 10, 61, 59, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 0, 61, 85, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, - 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, 9, 9, 9, 17, - 9, 9, 17, 0, 9, 9, 55, 30, 36, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 60, 28, 123, 36, 124, 18, - 39, 28, 18, 0, 0, 0, 0, 0, 0, 0, 71, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 71, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 19, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 19, 13, 69, 8, 19, 9, 9, 22, 8, - 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 22, 10, 8, 9, 19, 9, 19, 9, 9, 9, 9, 9, 9, 22, 10, - 9, 26, 16, 9, 19, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 9, 9, 9, 9, 9, 9, - 19, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 10, 9, - 9, 9, 9, 9, 9, 19, 9, 9, 9, 9, 9, 9, 9, 19, 9, 9, - 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, - 9, 9, 19, 9, 9, 9, 9, 9, 9, 9, 19, 9, 9, 9, 9, 9, - 10, 9, 9, 64, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 39, 61, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 77, 0, 57, 0, 0, - 0, 77, 0, 0, 0, 0, 61, 18, 28, 18, 18, 18, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 39, 18, 18, 18, 18, 65, 18, 29, 48, 39, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 18, 85, 9, 55, - 6, 6, 76, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 6, 6, 76, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 17, 0, 0, 18, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 18, 85, 0, 6, 6, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 8, 9, 9, 9, 9, 9, 9, 69, 50, 8, 9, 10, 9, 25, 0, - 13, 68, 25, 8, 69, 50, 25, 25, 69, 50, 10, 9, 10, 9, 8, 26, - 9, 9, 22, 9, 9, 9, 9, 0, 8, 8, 22, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 55, 0, 9, 9, 9, 9, 9, 9, 55, 0, 9, 9, 9, 9, - 9, 9, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 126, 126, 126, 126, 126, 126, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 18, - 14, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, -}; - -static RE_UINT8 re_word_break_stage_4[] = { - 0, 0, 0, 0, 0, 0, 5, 6, 6, 4, 0, 0, 18, 0, 1, 0, - 0, 0, 0, 2, 13, 0, 14, 0, 15, 15, 15, 15, 15, 15, 12, 13, - 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 16, - 0, 6, 0, 0, 0, 0, 11, 0, 0, 9, 0, 0, 0, 11, 0, 12, - 0, 0, 11, 11, 11, 0, 0, 0, 7, 7, 7, 7, 11, 0, 11, 11, - 11, 11, 13, 11, 0, 0, 11, 12, 11, 11, 0, 11, 11, 11, 0, 7, - 7, 7, 11, 11, 0, 11, 0, 11, 11, 0, 11, 0, 11, 13, 0, 0, - 0, 7, 7, 7, 7, 7, 0, 7, 0, 7, 7, 0, 3, 3, 3, 3, - 3, 3, 3, 0, 0, 0, 0, 3, 3, 3, 3, 11, 12, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 0, 0, 13, 13, 0, 0, 7, 7, 7, 0, - 9, 0, 0, 0, 11, 11, 11, 7, 15, 15, 0, 15, 13, 0, 11, 11, - 7, 11, 11, 11, 0, 11, 7, 7, 7, 9, 0, 7, 7, 11, 11, 7, - 7, 0, 7, 7, 15, 15, 11, 11, 11, 0, 0, 11, 0, 0, 0, 9, - 11, 7, 11, 11, 11, 11, 7, 7, 7, 11, 0, 0, 11, 11, 0, 0, - 13, 0, 11, 0, 0, 7, 0, 0, 7, 7, 11, 7, 11, 7, 7, 7, - 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 9, 7, 7, 11, 7, 7, - 0, 0, 15, 15, 7, 0, 0, 7, 7, 7, 11, 0, 11, 0, 7, 0, - 0, 0, 0, 11, 0, 11, 11, 0, 11, 7, 0, 0, 0, 0, 7, 7, - 0, 11, 0, 0, 0, 0, 7, 11, 0, 0, 7, 0, 7, 0, 7, 0, - 15, 15, 0, 0, 7, 0, 0, 0, 0, 7, 0, 7, 15, 15, 7, 7, - 18, 11, 11, 11, 11, 0, 7, 7, 7, 7, 9, 0, 11, 7, 7, 11, - 11, 7, 11, 0, 7, 7, 7, 11, 18, 18, 18, 18, 18, 18, 18, 0, - 7, 17, 9, 9, 14, 14, 0, 0, 14, 0, 0, 12, 6, 6, 9, 9, - 9, 9, 9, 16, 16, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 18, - 9, 0, 9, 9, 18, 0, 0, 0, 0, 10, 10, 10, 10, 10, 0, 0, - 0, 7, 7, 10, 10, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 0, - 7, 7, 0, 11, 11, 11, 7, 11, 0, 11, 11, 7, 11, 7, 7, 0, - 0, 3, 7, 3, 3, 0, 3, 3, 3, 0, 3, 0, 3, 3, 0, 3, - 13, 0, 0, 12, 0, 16, 16, 16, 13, 12, 0, 0, 11, 0, 0, 9, - 0, 0, 0, 14, 0, 0, 10, 10, 10, 10, 7, 7, 0, 9, 9, 9, - 7, 0, 15, 15, 15, 15, 11, 0, 7, 11, 0, 11, 7, 7, 7, 9, - 9, 9, 9, 7, 0, 0, 8, 8, 8, 8, 8, 8, -}; - -/* Word_Break: 7116 bytes. */ - -RE_UINT32 re_get_word_break(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_word_break_stage_1[f] << 5; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_word_break_stage_2[pos + f] << 5; - f = code >> 2; - code ^= f << 2; - pos = (RE_UINT32)re_word_break_stage_3[pos + f] << 2; - value = re_word_break_stage_4[pos + code]; - - return value; -} - -/* Grapheme_Cluster_Break. */ - -static RE_UINT8 re_grapheme_cluster_break_stage_1[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 7, 8, 4, 9, - 10, 11, 4, 12, 4, 4, 13, 4, 4, 4, 4, 14, 4, 15, 16, 17, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 18, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static RE_UINT8 re_grapheme_cluster_break_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 3, 3, - 3, 3, 6, 3, 3, 3, 7, 8, 9, 10, 3, 11, 12, 13, 14, 15, - 16, 17, 3, 18, 19, 20, 21, 22, 23, 24, 23, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 3, 49, 50, 51, 52, 3, 3, 3, 3, 3, 53, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 54, 55, 56, 57, - 58, 3, 59, 3, 60, 3, 3, 3, 61, 62, 63, 3, 64, 65, 66, 67, - 68, 3, 3, 69, 3, 3, 3, 70, 3, 3, 3, 3, 3, 3, 3, 3, - 71, 72, 3, 73, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 74, 3, 75, 3, 76, 3, 3, 3, 3, 3, 3, 3, 3, - 77, 3, 78, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 79, 80, 81, 3, 3, 3, 3, - 82, 3, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 3, 3, 3, 93, - 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, - 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, - 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, - 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, - 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, - 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, - 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, - 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, - 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, - 98, 99, 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, - 100, 94, 95, 96, 97, 98, 99, 100, 94, 95, 96, 97, 98, 99, 101, 102, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 103, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 104, 3, 3, 1, 3, 3, 80, 105, - 3, 3, 3, 3, 3, 3, 3, 106, 3, 3, 3, 107, 3, 108, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 109, 3, 3, 110, 3, 3, 3, 3, - 3, 3, 3, 3, 111, 3, 3, 3, 3, 3, 3, 3, 3, 112, 3, 3, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 3, 3, 122, 34, 123, 3, 3, - 124, 125, 126, 127, 3, 3, 128, 129, 130, 131, 132, 3, 133, 3, 3, 3, - 134, 3, 3, 3, 3, 3, 3, 135, 136, 137, 138, 3, 3, 3, 3, 3, - 139, 3, 140, 3, 141, 142, 143, 3, 3, 3, 3, 144, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 145, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 146, 147, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 148, 149, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 150, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 151, 152, 3, 3, 153, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 154, 155, 156, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 157, 3, 3, 3, 147, 3, 3, 3, 3, 3, 3, 158, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 159, 3, 160, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 161, 3, 3, 3, 3, 3, 3, 3, 162, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 163, 4, 164, 164, 4, 4, 4, 165, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, -}; - -static RE_UINT8 re_grapheme_cluster_break_stage_3[] = { - 0, 1, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, - 0, 0, 0, 0, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, - 6, 7, 2, 2, 2, 2, 2, 2, 2, 2, 8, 5, 5, 5, 5, 9, - 10, 2, 2, 2, 2, 2, 2, 2, 11, 2, 5, 12, 2, 2, 2, 2, - 2, 6, 5, 5, 2, 2, 13, 2, 2, 2, 14, 15, 16, 17, 2, 2, - 2, 18, 19, 2, 2, 2, 5, 5, 5, 20, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 14, 5, 13, 2, 2, 2, 2, 2, 2, 6, 21, 22, - 2, 2, 14, 23, 24, 25, 2, 2, 2, 2, 2, 26, 2, 2, 2, 2, - 2, 2, 6, 5, 27, 5, 5, 5, 28, 2, 2, 2, 2, 2, 2, 29, - 30, 31, 8, 2, 32, 2, 2, 2, 33, 2, 2, 2, 2, 2, 2, 34, - 35, 36, 37, 2, 32, 2, 2, 38, 39, 2, 2, 2, 2, 2, 2, 40, - 41, 42, 19, 2, 2, 2, 43, 2, 44, 45, 2, 2, 32, 2, 2, 46, - 33, 2, 2, 2, 2, 2, 2, 47, 35, 36, 14, 2, 32, 2, 2, 2, - 48, 2, 2, 2, 2, 2, 2, 49, 50, 51, 37, 2, 2, 2, 2, 2, - 52, 2, 2, 2, 2, 2, 2, 14, 53, 17, 54, 2, 32, 2, 2, 2, - 33, 2, 2, 2, 2, 2, 2, 55, 56, 57, 54, 2, 32, 2, 2, 2, - 58, 2, 2, 2, 2, 2, 2, 59, 60, 61, 37, 2, 32, 2, 2, 2, - 62, 2, 2, 2, 2, 2, 2, 2, 2, 63, 64, 65, 2, 2, 62, 2, - 2, 2, 2, 2, 2, 2, 66, 20, 37, 67, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 66, 68, 2, 69, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 7, 2, 2, 70, 71, 2, 2, 2, 2, 2, 2, 8, 72, - 73, 74, 5, 8, 5, 5, 5, 68, 38, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 74, 75, 76, 2, 2, 77, 78, 13, 2, 79, 2, - 80, 22, 2, 22, 2, 2, 2, 2, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 2, 2, 2, 74, 2, 2, 2, 2, - 2, 2, 84, 2, 2, 2, 84, 2, 2, 2, 32, 2, 2, 2, 32, 2, - 2, 2, 2, 2, 2, 2, 85, 86, 87, 30, 21, 22, 2, 2, 2, 2, - 2, 88, 2, 2, 2, 2, 2, 2, 54, 2, 2, 2, 2, 19, 2, 2, - 2, 2, 2, 2, 89, 90, 91, 92, 2, 2, 37, 93, 2, 2, 2, 2, - 2, 2, 94, 67, 95, 96, 97, 16, 2, 2, 2, 2, 2, 2, 5, 67, - 98, 2, 2, 2, 2, 2, 99, 100, 101, 2, 2, 2, 2, 6, 21, 2, - 102, 2, 2, 2, 103, 104, 2, 2, 2, 2, 2, 2, 49, 105, 58, 2, - 2, 2, 2, 2, 106, 107, 108, 2, 2, 2, 109, 5, 75, 110, 111, 7, - 5, 5, 5, 5, 5, 5, 5, 23, 2, 112, 2, 2, 2, 113, 2, 2, - 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 5, 5, 5, 5, 13, 2, - 2, 2, 2, 2, 2, 37, 7, 2, 2, 2, 2, 2, 2, 2, 2, 37, - 2, 2, 2, 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, 46, 2, 2, - 2, 2, 2, 114, 2, 2, 2, 2, 2, 2, 2, 2, 2, 37, 109, 69, - 2, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, - 115, 116, 2, 2, 117, 2, 2, 2, 118, 2, 2, 2, 2, 2, 106, 119, - 120, 2, 2, 2, 5, 5, 7, 37, 2, 2, 2, 2, 14, 69, 2, 2, - 37, 5, 58, 2, 81, 81, 81, 121, 28, 2, 2, 2, 2, 2, 122, 123, - 124, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 2, 2, 125, 126, 2, - 116, 127, 2, 2, 2, 2, 2, 128, 2, 2, 2, 2, 2, 2, 129, 130, - 19, 2, 2, 2, 2, 131, 132, 2, 2, 2, 2, 2, 133, 134, 2, 2, - 135, 136, 136, 137, 136, 136, 136, 135, 136, 136, 137, 136, 136, 136, 135, 136, - 136, 137, 136, 136, 136, 135, 136, 136, 137, 136, 136, 136, 135, 136, 136, 137, - 136, 136, 136, 135, 136, 136, 137, 136, 136, 136, 135, 136, 136, 137, 136, 136, - 136, 135, 136, 136, 137, 136, 136, 136, 136, 135, 136, 136, 138, 2, 82, 82, - 139, 140, 83, 83, 83, 83, 83, 141, 2, 2, 2, 38, 2, 2, 2, 2, - 5, 5, 2, 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 0, 142, - 2, 2, 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 13, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 14, 20, 143, 99, 2, 2, 2, 2, 2, 144, - 2, 2, 2, 2, 54, 2, 2, 2, 2, 2, 2, 2, 99, 2, 2, 2, - 14, 5, 13, 2, 2, 2, 2, 2, 145, 2, 2, 2, 2, 2, 2, 5, - 67, 2, 2, 2, 2, 2, 2, 37, 102, 2, 2, 2, 2, 2, 146, 147, - 2, 148, 2, 2, 2, 2, 2, 2, 20, 2, 2, 2, 37, 149, 68, 2, - 150, 2, 2, 2, 2, 2, 116, 2, 102, 2, 2, 2, 2, 2, 151, 72, - 152, 79, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 153, 154, 38, - 2, 2, 2, 37, 97, 20, 2, 2, 155, 156, 37, 2, 157, 68, 68, 2, - 2, 2, 2, 2, 2, 2, 158, 5, 159, 2, 2, 38, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 160, 161, 162, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 37, 163, 164, 13, 2, 2, 165, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 97, 166, 13, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 167, 168, 2, 2, 2, 2, 74, 169, 21, 2, 2, - 2, 2, 2, 2, 2, 153, 5, 170, 2, 2, 171, 172, 173, 2, 2, 2, - 8, 20, 2, 2, 2, 2, 6, 174, 37, 2, 125, 92, 2, 2, 2, 2, - 175, 176, 72, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 177, 67, 168, - 2, 2, 46, 5, 5, 178, 179, 2, 2, 2, 2, 2, 2, 2, 180, 181, - 182, 2, 2, 2, 2, 2, 2, 2, 2, 183, 184, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 185, 2, 2, 2, 2, 2, 2, 2, 0, 186, - 2, 2, 2, 2, 2, 2, 68, 2, 2, 2, 2, 2, 2, 2, 67, 2, - 2, 37, 187, 119, 119, 119, 119, 119, 119, 37, 20, 2, 2, 2, 2, 2, - 2, 2, 2, 54, 142, 2, 2, 2, 2, 2, 2, 2, 188, 189, 190, 191, - 192, 21, 2, 2, 2, 193, 2, 2, 84, 2, 2, 2, 2, 2, 2, 2, - 5, 5, 5, 5, 5, 5, 67, 6, 5, 5, 5, 5, 5, 68, 22, 2, - 128, 2, 2, 6, 8, 5, 2, 2, 67, 5, 5, 194, 195, 20, 2, 2, - 2, 2, 2, 2, 2, 99, 2, 2, 2, 2, 67, 2, 2, 2, 2, 2, - 99, 20, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 196, 197, 197, 197, - 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 5, 5, 5, 5, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, -}; - -static RE_UINT8 re_grapheme_cluster_break_stage_4[] = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 2, 4, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 4, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, - 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, - 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, - 0, 5, 5, 0, 5, 5, 0, 5, 1, 1, 1, 1, 1, 1, 0, 0, - 5, 5, 5, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 1, 0, 5, - 5, 5, 5, 5, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, - 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 5, 5, 5, 0, 5, 5, 5, 5, 5, 0, 0, - 0, 5, 5, 5, 0, 0, 0, 0, 5, 5, 1, 5, 5, 5, 5, 5, - 5, 5, 5, 7, 0, 0, 0, 0, 0, 0, 5, 7, 5, 0, 7, 7, - 7, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 5, 7, 7, - 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 5, 7, 7, 5, 5, 5, 5, 0, 0, 7, - 7, 0, 0, 7, 7, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 7, 7, 7, 5, 5, 0, 0, 0, 0, 5, - 5, 0, 0, 5, 5, 5, 0, 0, 5, 5, 0, 0, 0, 5, 0, 0, - 7, 5, 5, 5, 5, 5, 0, 5, 5, 7, 0, 7, 7, 5, 0, 0, - 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 0, 5, 5, - 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, - 5, 7, 7, 0, 0, 0, 7, 7, 7, 0, 7, 7, 7, 5, 0, 0, - 5, 7, 7, 7, 5, 0, 0, 0, 5, 7, 7, 7, 7, 0, 5, 5, - 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 0, 7, 5, - 7, 7, 5, 7, 7, 0, 5, 7, 7, 0, 7, 7, 5, 5, 0, 0, - 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 5, 7, - 7, 5, 5, 5, 5, 0, 7, 7, 7, 0, 7, 7, 7, 5, 1, 0, - 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, - 7, 7, 5, 5, 5, 0, 5, 0, 7, 7, 7, 7, 7, 7, 7, 5, - 0, 5, 0, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, - 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 5, 0, 5, 0, 0, 0, 0, 7, 7, - 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 0, 5, 5, - 0, 0, 0, 0, 0, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, - 0, 5, 5, 7, 7, 5, 5, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 5, 5, 0, 0, 0, 0, 5, 5, 0, 5, 5, 5, 5, 0, 0, 0, - 0, 0, 5, 0, 7, 5, 5, 0, 8, 8, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, - 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 7, 5, - 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 5, 7, - 0, 0, 0, 5, 5, 5, 4, 0, 5, 5, 5, 7, 7, 7, 7, 5, - 5, 7, 7, 7, 0, 0, 0, 0, 7, 7, 5, 7, 7, 7, 7, 7, - 7, 5, 5, 5, 0, 0, 0, 0, 5, 7, 7, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 5, 7, 5, 0, 5, 0, 0, 5, 5, 5, - 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 7, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, - 5, 5, 5, 7, 5, 7, 7, 7, 7, 7, 5, 7, 7, 0, 0, 0, - 5, 5, 7, 0, 0, 0, 0, 0, 0, 7, 5, 5, 5, 5, 7, 7, - 5, 5, 7, 5, 5, 5, 0, 0, 5, 5, 7, 7, 7, 5, 7, 5, - 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, - 5, 5, 5, 5, 7, 7, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, - 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 5, 0, 0, 7, - 0, 0, 0, 4, 5, 13, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, - 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 5, 0, - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 7, 7, 5, 5, 7, - 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 5, 5, 0, 0, 8, 8, 8, 8, 8, 0, 0, 0, - 0, 0, 0, 5, 7, 7, 5, 5, 5, 5, 7, 7, 5, 5, 7, 7, - 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 7, - 7, 5, 5, 7, 7, 5, 5, 0, 0, 0, 0, 0, 5, 7, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 5, 0, 5, 5, 5, 0, 0, 5, - 5, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 7, 5, 5, 7, 7, - 0, 0, 0, 0, 0, 7, 5, 0, 0, 0, 0, 7, 7, 5, 7, 7, - 5, 7, 7, 0, 7, 5, 0, 0, 11, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, - 12, 12, 12, 12, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, - 4, 4, 4, 4, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5, 5, 0, - 5, 5, 5, 0, 0, 0, 0, 5, 7, 5, 7, 0, 0, 0, 0, 0, - 7, 7, 7, 5, 5, 5, 5, 7, 7, 5, 5, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 5, 5, 5, 5, 7, 5, 5, 5, - 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 7, 7, 7, 5, 5, - 7, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 5, - 5, 5, 7, 7, 5, 7, 5, 5, 5, 7, 7, 7, 7, 0, 0, 7, - 7, 0, 0, 7, 7, 7, 0, 0, 0, 0, 7, 7, 0, 0, 5, 5, - 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 5, 5, 5, 7, 5, 0, - 5, 7, 7, 5, 5, 5, 5, 5, 5, 7, 5, 7, 7, 5, 7, 5, - 5, 7, 5, 5, 0, 0, 0, 0, 7, 7, 5, 5, 5, 5, 0, 0, - 7, 7, 7, 7, 5, 5, 7, 5, 0, 0, 0, 0, 5, 5, 0, 0, - 5, 5, 5, 7, 7, 5, 7, 5, 0, 0, 0, 5, 7, 5, 7, 7, - 5, 5, 5, 5, 5, 5, 7, 5, 7, 7, 5, 5, 5, 5, 7, 5, - 7, 5, 5, 0, 0, 0, 0, 0, 0, 7, 7, 7, 5, 5, 5, 5, - 0, 0, 5, 5, 7, 7, 7, 7, 5, 0, 0, 0, 7, 0, 0, 0, - 5, 7, 1, 5, 5, 5, 5, 0, 0, 0, 0, 0, 1, 1, 1, 1, - 1, 1, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 7, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 7, 5, 5, 0, - 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 0, 5, 5, 0, 5, - 5, 5, 5, 5, 5, 5, 1, 5, 0, 0, 7, 7, 7, 7, 7, 0, - 5, 5, 0, 7, 7, 5, 7, 5, 0, 0, 0, 5, 5, 7, 7, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, - 0, 0, 0, 0, 0, 5, 7, 5, 5, 5, 0, 0, 0, 7, 5, 5, - 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 5, 5, 5, 0, 0, 5, 5, 5, 5, 0, 0, - 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5, 5, - 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, -}; - -/* Grapheme_Cluster_Break: 4400 bytes. */ - -RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_grapheme_cluster_break_stage_1[f] << 6; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_grapheme_cluster_break_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_grapheme_cluster_break_stage_3[pos + f] << 3; - value = re_grapheme_cluster_break_stage_4[pos + code]; - - return value; -} - -/* Sentence_Break. */ - -static RE_UINT8 re_sentence_break_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 13, 13, 13, 14, - 15, 16, 17, 18, 19, 13, 20, 13, 21, 13, 13, 13, 13, 22, 7, 7, - 23, 24, 13, 13, 13, 13, 25, 26, 13, 13, 27, 28, 29, 30, 31, 13, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 32, 7, 33, 34, 7, 35, 7, 7, 7, 36, 13, 37, +/* Bidi_Class. */ +static RE_UINT8 re_bidi_class_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 17, 18, + 19, 13, 20, 21, 22, 23, 24, 25, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 26, 27, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 28, + 13, 13, 13, 13, 29, 30, 31, 13, 32, 13, 33, 34, 35, 36, 37, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -}; - -static RE_UINT8 re_sentence_break_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 34, 35, 36, 37, 38, 39, 34, 34, 34, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 64, 65, 64, 64, 66, 64, 64, 64, 64, 67, 68, - 64, 64, 64, 69, 64, 64, 64, 64, 70, 71, 72, 73, 74, 64, 64, 64, - 75, 76, 77, 78, 64, 64, 64, 64, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 79, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 80, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 81, 34, 34, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 94, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 34, 34, 95, 96, 97, 98, 34, 34, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 64, 109, 110, 111, 112, 113, 114, 64, 34, 34, 115, 64, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 64, 64, 64, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 64, 136, 137, 64, 138, 139, 140, 141, 64, - 142, 143, 64, 144, 145, 146, 64, 64, 147, 148, 149, 150, 64, 151, 64, 64, - 34, 34, 34, 34, 34, 34, 34, 152, 153, 34, 154, 64, 64, 64, 64, 64, - 34, 34, 34, 34, 34, 34, 34, 34, 155, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 34, 34, 34, 34, 156, 64, 64, 64, - 34, 34, 34, 34, 157, 158, 159, 160, 64, 64, 64, 64, 161, 162, 163, 164, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 165, - 34, 34, 34, 34, 34, 166, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 34, 34, 167, 34, 34, 168, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 169, 170, 64, 64, 64, 64, 64, 64, - 64, 64, 171, 172, 173, 64, 64, 64, 174, 175, 176, 177, 178, 179, 180, 181, - 64, 64, 64, 64, 182, 183, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 184, 64, 185, 64, 64, 186, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 34, 187, 188, 64, 64, 64, 64, 64, 64, 64, 64, 64, 189, 190, 64, 64, - 64, 64, 191, 192, 64, 64, 64, 64, 64, 64, 64, 64, 193, 64, 64, 64, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 194, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 195, 34, - 196, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 197, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 198, 64, 64, 64, 64, 64, 64, 64, 64, - 34, 34, 34, 34, 199, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 200, 64, 201, 202, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, -}; - -static RE_UINT8 re_sentence_break_stage_3[] = { - 0, 0, 1, 2, 0, 0, 0, 0, 3, 4, 5, 6, 7, 7, 8, 9, - 10, 11, 11, 11, 11, 11, 12, 13, 14, 15, 15, 15, 15, 15, 16, 13, - 0, 17, 0, 0, 0, 0, 0, 0, 18, 0, 19, 20, 0, 21, 19, 0, - 11, 11, 11, 11, 11, 22, 11, 23, 15, 15, 15, 15, 15, 24, 15, 15, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, - 26, 26, 27, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 28, 29, - 30, 31, 32, 33, 28, 31, 34, 28, 25, 31, 29, 31, 32, 26, 35, 34, - 36, 28, 31, 26, 26, 26, 26, 27, 25, 25, 25, 25, 30, 31, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 15, 33, 30, - 26, 23, 25, 25, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 37, 15, 15, 15, 15, 15, 15, 15, 15, 38, 36, - 39, 40, 36, 36, 41, 0, 0, 0, 15, 42, 0, 43, 0, 0, 0, 0, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 25, 45, 46, 47, - 0, 48, 22, 49, 32, 11, 11, 11, 50, 11, 11, 15, 15, 15, 15, 15, - 15, 15, 15, 51, 33, 34, 25, 25, 25, 25, 25, 25, 15, 52, 30, 32, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 25, 25, 25, 25, 25, 25, 25, 25, - 53, 44, 54, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 28, 26, 26, 29, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 10, 11, 11, 11, - 11, 11, 11, 11, 11, 22, 55, 56, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 57, 0, 58, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 59, - 60, 59, 0, 0, 36, 36, 36, 36, 36, 36, 61, 62, 36, 0, 0, 0, - 63, 64, 0, 65, 44, 44, 66, 67, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 68, 44, 44, 44, 44, 44, 7, 7, 69, 70, 71, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 72, 44, 73, 44, 74, 75, 76, 7, 7, 77, 78, - 79, 0, 0, 80, 81, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 44, - 44, 44, 66, 82, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 44, 44, 84, 0, 0, 0, - 7, 7, 77, 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 41, 85, 86, - 36, 36, 36, 36, 36, 83, 87, 44, 44, 88, 88, 89, 0, 9, 90, 91, - 36, 36, 36, 36, 36, 36, 88, 0, 36, 36, 61, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 92, 36, 41, - 0, 0, 0, 0, 93, 44, 44, 44, 94, 44, 44, 44, 44, 44, 44, 44, - 44, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 95, - 44, 44, 44, 44, 88, 44, 36, 36, 83, 96, 7, 7, 82, 36, 36, 36, - 88, 82, 36, 78, 78, 36, 36, 36, 36, 36, 92, 36, 43, 40, 41, 95, - 44, 97, 97, 98, 0, 93, 0, 99, 83, 100, 7, 7, 41, 0, 0, 101, - 58, 82, 61, 62, 78, 36, 36, 36, 36, 36, 92, 36, 92, 102, 41, 75, - 66, 93, 97, 89, 86, 0, 82, 43, 0, 100, 7, 7, 76, 103, 0, 0, - 58, 82, 36, 99, 99, 36, 36, 36, 36, 36, 92, 36, 92, 82, 41, 95, - 44, 59, 59, 89, 104, 0, 0, 0, 83, 100, 7, 7, 0, 0, 105, 44, - 58, 82, 36, 78, 78, 36, 36, 36, 36, 36, 92, 36, 92, 82, 41, 95, - 44, 97, 97, 89, 0, 106, 0, 99, 83, 100, 7, 7, 55, 0, 0, 0, - 107, 82, 61, 40, 92, 41, 102, 92, 62, 104, 61, 40, 36, 36, 41, 106, - 66, 106, 75, 89, 104, 93, 0, 0, 0, 100, 7, 7, 0, 0, 0, 0, - 44, 71, 36, 92, 92, 36, 36, 36, 36, 36, 92, 36, 36, 36, 41, 105, - 44, 75, 75, 89, 0, 60, 61, 0, 83, 100, 7, 7, 0, 0, 0, 0, - 88, 82, 36, 92, 92, 36, 36, 36, 36, 36, 92, 36, 36, 82, 41, 95, - 44, 75, 75, 89, 0, 60, 0, 108, 83, 100, 7, 7, 102, 0, 0, 0, - 44, 82, 36, 92, 92, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 95, - 44, 75, 75, 98, 0, 68, 0, 62, 83, 100, 7, 7, 0, 0, 40, 36, - 106, 82, 36, 36, 36, 61, 40, 36, 36, 36, 36, 36, 99, 36, 36, 55, - 36, 61, 109, 93, 44, 110, 44, 44, 0, 100, 7, 7, 106, 0, 0, 0, - 82, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 81, 44, 66, 0, - 36, 68, 44, 66, 7, 7, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 102, 92, 61, 36, 36, 36, 36, 36, 36, 112, 36, 36, 81, 44, 44, 84, - 36, 43, 44, 89, 7, 7, 111, 36, 0, 0, 0, 0, 0, 0, 0, 0, - 104, 0, 0, 0, 0, 0, 89, 0, 7, 7, 111, 0, 0, 113, 114, 115, - 36, 36, 82, 36, 36, 36, 36, 36, 36, 36, 36, 104, 58, 44, 44, 44, - 44, 75, 36, 88, 44, 44, 58, 44, 44, 44, 44, 44, 44, 44, 44, 116, - 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 44, 44, 117, - 7, 7, 118, 0, 36, 83, 76, 83, 95, 74, 44, 76, 88, 71, 36, 36, - 83, 44, 44, 87, 7, 7, 119, 89, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 50, 0, 120, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 92, 41, 36, 61, 92, 41, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 92, 41, 36, 36, 36, 36, 36, 36, 36, 36, 92, 41, 36, 61, - 92, 41, 36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 92, 41, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 61, 58, 121, 9, 122, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 123, 15, 39, - 82, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 124, 36, 36, 36, 36, - 125, 36, 36, 36, 36, 36, 126, 127, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 40, 36, 36, 104, 0, - 36, 36, 36, 92, 83, 116, 0, 0, 36, 36, 36, 36, 83, 128, 0, 0, - 36, 36, 36, 36, 83, 0, 0, 0, 36, 36, 36, 92, 129, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, - 44, 44, 44, 44, 44, 62, 0, 103, 7, 7, 111, 0, 0, 0, 0, 0, - 130, 0, 131, 132, 7, 7, 111, 0, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 104, 0, - 36, 133, 36, 36, 36, 36, 36, 36, 36, 36, 134, 0, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 61, 44, 44, 44, 0, 44, 44, 44, 0, - 0, 96, 7, 7, 36, 36, 36, 36, 36, 36, 36, 41, 36, 104, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 36, 36, 36, 36, - 36, 36, 41, 0, 7, 7, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 68, 44, 0, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 88, 44, 66, 44, 44, 44, 44, 44, 44, 44, 97, - 7, 7, 111, 0, 7, 7, 111, 0, 0, 62, 135, 0, 44, 44, 44, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 44, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, - 44, 71, 36, 0, 7, 7, 118, 136, 0, 0, 93, 44, 44, 0, 0, 0, - 117, 36, 36, 36, 36, 36, 36, 36, 88, 44, 44, 76, 7, 7, 77, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 44, 44, 44, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 44, 44, 9, 122, - 7, 7, 111, 82, 7, 7, 77, 36, 36, 36, 36, 36, 36, 36, 36, 137, - 15, 15, 42, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 82, - 0, 0, 0, 0, 66, 44, 44, 44, 44, 44, 71, 81, 36, 74, 98, 0, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 59, 44, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 34, 15, 27, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 15, 15, 11, 11, 15, 39, 11, 123, 15, 15, 11, 11, 15, 15, 11, 11, - 15, 39, 11, 123, 15, 15, 138, 138, 15, 15, 11, 11, 15, 15, 15, 39, - 15, 15, 11, 11, 15, 15, 11, 11, 15, 15, 11, 11, 15, 139, 11, 140, - 46, 139, 11, 141, 15, 46, 11, 0, 15, 15, 11, 141, 46, 139, 11, 141, - 142, 142, 143, 144, 145, 146, 147, 147, 0, 148, 149, 150, 0, 0, 151, 152, - 0, 153, 152, 0, 0, 0, 0, 154, 63, 155, 63, 63, 21, 0, 0, 156, - 0, 0, 0, 151, 15, 15, 15, 42, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 116, 0, 0, 0, - 48, 157, 158, 159, 23, 120, 10, 123, 0, 160, 49, 161, 11, 38, 162, 33, - 0, 163, 39, 164, 0, 0, 0, 0, 11, 11, 11, 11, 15, 15, 15, 15, - 165, 38, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 11, 11, - 11, 11, 11, 11, 15, 15, 15, 15, 15, 15, 39, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 147, 127, 0, 147, 147, 147, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 151, 0, 0, 0, 0, 0, 0, 0, 167, 147, 147, 0, 0, 0, 0, - 4, 147, 147, 147, 147, 147, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 22, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 24, 31, 168, 26, 32, 25, 29, 15, 33, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 42, 157, 169, 54, 0, 0, 0, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 170, 0, 21, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 62, 0, 0, 0, 93, - 36, 36, 36, 36, 36, 61, 0, 0, 36, 61, 36, 61, 36, 61, 36, 61, - 36, 61, 36, 61, 36, 61, 36, 61, 44, 44, 44, 44, 44, 44, 44, 44, - 147, 147, 147, 5, 0, 0, 0, 5, 147, 147, 5, 171, 0, 0, 0, 122, - 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 173, 82, 147, 147, 5, 147, 147, 174, 82, 36, 83, 44, 82, 41, 36, 104, - 82, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 61, 60, 82, 82, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 36, - 0, 82, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 82, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 61, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 61, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 0, - 36, 36, 36, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 175, - 36, 36, 36, 176, 36, 36, 36, 36, 7, 7, 77, 0, 0, 0, 0, 0, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 177, 66, 44, 44, 178, - 25, 25, 25, 25, 25, 25, 25, 179, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 180, 9, 0, 0, - 0, 0, 0, 0, 0, 62, 36, 36, 181, 25, 25, 25, 27, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 15, 15, 26, 30, - 25, 25, 182, 183, 25, 27, 25, 25, 25, 25, 31, 23, 11, 25, 25, 25, - 181, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 184, 36, - 185, 185, 68, 36, 36, 36, 36, 36, 68, 44, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 136, 0, 0, - 76, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, - 44, 89, 0, 136, 7, 7, 111, 0, 44, 44, 44, 44, 76, 36, 62, 186, - 7, 7, 77, 36, 36, 36, 36, 36, 36, 83, 44, 180, 36, 36, 36, 36, - 36, 68, 44, 44, 44, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 104, - 44, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 44, - 116, 0, 152, 62, 7, 7, 111, 0, 36, 81, 36, 36, 7, 7, 77, 61, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 88, 44, 44, 66, 0, 0, - 68, 36, 36, 89, 7, 7, 111, 187, 36, 36, 36, 36, 36, 61, 188, 76, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 95, 74, 71, 83, - 134, 0, 0, 0, 0, 0, 62, 41, 36, 36, 68, 44, 189, 190, 0, 0, - 82, 61, 82, 61, 82, 61, 0, 0, 36, 61, 36, 61, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 24, 15, 15, 15, 0, 0, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 191, 89, 7, 7, 111, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 36, 36, 36, 36, - 36, 61, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 24, 0, 0, 192, 15, 0, 193, 36, 36, 92, 36, 36, 61, 36, 43, - 99, 92, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, 0, - 0, 0, 0, 0, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 194, - 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 40, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 0, - 44, 44, 44, 44, 195, 4, 127, 0, 44, 44, 44, 44, 196, 174, 147, 147, - 147, 197, 127, 0, 6, 198, 199, 200, 145, 0, 0, 0, 36, 92, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 201, - 90, 0, 5, 6, 7, 7, 8, 9, 10, 11, 11, 11, 11, 11, 12, 13, - 14, 15, 15, 15, 15, 15, 16, 202, 203, 204, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 83, 36, 36, 36, 36, 36, 36, 36, 61, - 40, 36, 40, 36, 40, 36, 40, 104, 0, 0, 0, 0, 0, 0, 205, 0, - 36, 36, 36, 82, 36, 36, 36, 36, 36, 61, 36, 36, 36, 36, 61, 99, - 36, 36, 36, 41, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 104, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, - 36, 36, 36, 36, 36, 36, 36, 104, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 104, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 82, 36, 36, 36, 36, - 36, 36, 61, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 66, 0, - 36, 36, 36, 36, 36, 36, 36, 41, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 0, 36, 36, 82, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 41, 7, 7, 111, 0, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 0, 0, - 36, 36, 36, 36, 36, 41, 0, 0, 36, 36, 0, 0, 0, 0, 0, 0, - 36, 41, 92, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 99, 104, 78, - 36, 36, 36, 36, 36, 41, 0, 0, 36, 36, 36, 36, 36, 61, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 61, 41, 0, 0, - 36, 36, 36, 36, 36, 41, 0, 0, 36, 36, 36, 36, 36, 36, 41, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 40, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 88, 60, 0, 44, 36, 82, 82, 36, 36, 36, 36, 36, 36, 41, 66, 93, - 0, 0, 0, 0, 0, 136, 0, 0, 36, 36, 36, 36, 36, 36, 36, 104, - 36, 36, 36, 36, 36, 36, 36, 104, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 82, 36, 36, 36, 36, 36, 36, 190, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, - 36, 36, 36, 36, 36, 41, 0, 0, 36, 36, 36, 36, 61, 0, 0, 0, - 36, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 22, 0, 0, 0, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 0, 0, 7, 7, 111, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 104, 0, 62, 0, 0, 36, 36, 36, 36, - 36, 83, 44, 44, 116, 187, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 61, 0, 0, - 117, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, - 44, 191, 122, 0, 0, 0, 0, 0, 0, 100, 7, 7, 0, 0, 0, 93, - 117, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 66, 206, - 152, 0, 0, 20, 36, 36, 36, 36, 36, 36, 104, 0, 7, 7, 111, 0, - 117, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 44, 207, 7, 7, - 187, 190, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 68, 108, 0, 0, - 117, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 44, - 71, 208, 58, 209, 7, 7, 210, 176, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 99, 36, 36, 36, 36, 36, 36, 44, 44, 44, 211, 212, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 61, 92, 99, 36, 36, 36, 99, 36, 36, 213, 0, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 66, 0, 7, 7, 111, 0, - 44, 82, 36, 78, 78, 36, 36, 36, 36, 36, 92, 36, 92, 82, 214, 95, - 44, 97, 97, 89, 104, 93, 0, 82, 83, 106, 44, 116, 44, 116, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 88, 44, 44, - 44, 117, 215, 122, 7, 7, 111, 107, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 44, - 44, 99, 0, 0, 7, 7, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 89, 44, 44, - 216, 0, 187, 135, 135, 135, 36, 89, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 44, - 128, 104, 0, 0, 7, 7, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 44, 44, 104, 0, - 7, 7, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 61, 58, 44, 44, 44, 0, 7, 7, 111, 79, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 44, 66, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, - 15, 15, 15, 15, 15, 15, 15, 15, 7, 7, 111, 0, 0, 0, 0, 62, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 40, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 88, 44, 106, 44, 217, 116, 0, 0, 0, 0, 0, 0, - 88, 44, 117, 36, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 87, 66, - 136, 93, 0, 0, 88, 44, 44, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 83, 44, 44, 44, 180, 218, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 104, 0, - 36, 36, 92, 36, 36, 36, 36, 36, 36, 36, 36, 68, 44, 66, 44, 44, - 208, 0, 0, 0, 7, 7, 111, 0, 0, 0, 0, 0, 40, 36, 36, 36, - 36, 36, 36, 36, 106, 44, 44, 44, 44, 44, 58, 44, 44, 66, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 61, 99, 36, 36, 36, 36, 36, 36, 36, 36, 36, 88, 66, 109, 59, - 44, 87, 0, 0, 7, 7, 111, 0, 36, 99, 92, 36, 36, 36, 36, 36, - 36, 36, 83, 66, 59, 44, 104, 0, 7, 7, 111, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 68, 191, 122, 0, - 36, 36, 36, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 63, 63, 219, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, + 39, 40, 40, 40, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38 +}; + +static RE_UINT16 re_bidi_class_table_2[] = { + 0, 1, 2, 3, 4, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 8, 9, 10, 11, 11, 11, 12, 13, 7, 7, 14, + 7, 7, 7, 7, 15, 7, 7, 7, 7, 7, 7, 7, 16, 17, 18, 19, + 20, 21, 22, 23, 21, 21, 24, 25, 26, 27, 28, 21, 21, 29, 19, 30, + 31, 32, 33, 34, 19, 21, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 42, 46, 47, 45, 42, 48, 49, 41, 50, 51, 40, 52, 7, 53, 54, + 55, 56, 57, 58, 41, 42, 59, 40, 60, 61, 43, 40, 41, 7, 62, 7, + 7, 63, 64, 7, 7, 65, 66, 7, 67, 68, 7, 69, 70, 71, 72, 7, + 7, 73, 74, 75, 76, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 77, 7, 78, 7, 7, 7, + 79, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 80, 7, 7, 7, 81, 81, 82, 82, 7, 83, 84, 78, + 85, 7, 7, 7, 86, 87, 7, 7, 7, 88, 89, 7, 7, 7, 90, 91, + 92, 7, 93, 94, 7, 95, 96, 7, 97, 98, 52, 99, 60, 100, 7, 101, + 7, 102, 7, 7, 7, 7, 103, 104, 7, 7, 7, 7, 7, 7, 11, 105, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 7, 120, 91, 91, 91, + 121, 91, 91, 91, 91, 91, 91, 91, 91, 122, 7, 123, 124, 91, 91, 91, + 91, 125, 126, 91, 127, 7, 7, 128, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 129, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 7, 7, 7, 7, 7, 7, 7, 7, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 130, 131, 91, 91, 91, + 7, 7, 7, 7, 7, 7, 7, 132, 7, 7, 7, 133, 7, 7, 7, 11, + 91, 91, 134, 7, 135, 91, 91, 136, 91, 91, 91, 91, 91, 91, 122, 137, + 138, 139, 7, 7, 140, 79, 7, 141, 7, 7, 7, 7, 7, 7, 91, 142, + 143, 7, 144, 145, 7, 146, 147, 7, 7, 7, 7, 148, 7, 7, 90, 149, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 91, 91, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 144, 91, 125, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 150, 7, 7, 151, 56, 7, 7, 152, 91, 153, 7, 7, 154, 7, 7, 7, + 155, 156, 7, 157, 7, 7, 158, 159, 7, 160, 161, 7, 37, 162, 7, 163, + 7, 164, 165, 42, 7, 166, 41, 167, 7, 7, 7, 168, 7, 7, 7, 169, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 170, 171, 172, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 173, 21, 21, 21, 21, 174, 175, + 176, 177, 178, 179, 21, 21, 21, 180, 181, 2, 2, 182, 7, 7, 7, 183, + 7, 7, 7, 7, 7, 7, 7, 7, 184, 7, 91, 91, 185, 79, 7, 186, + 7, 7, 7, 7, 7, 7, 7, 187, 7, 7, 7, 188, 7, 7, 7, 7, + 19, 19, 19, 19, 19, 19, 19, 19, 189, 19, 19, 19, 19, 19, 19, 19, + 190, 191, 19, 19, 19, 19, 19, 192, 19, 193, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 21, 194, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 195, 19, 196, 19, 19, 19, 172, 29, 34, 19, 19, 19, 19, + 41, 197, 198, 199, 60, 200, 7, 7, 37, 201, 7, 202, 60, 203, 204, 7, + 7, 205, 7, 7, 7, 7, 133, 206, 60, 61, 96, 207, 7, 7, 7, 7, + 7, 197, 208, 7, 7, 209, 210, 7, 7, 7, 7, 7, 7, 211, 212, 7, + 7, 213, 96, 214, 7, 215, 7, 7, 77, 216, 7, 7, 7, 7, 7, 7, + 7, 217, 7, 7, 7, 7, 7, 7, 7, 218, 219, 7, 7, 7, 220, 96, + 221, 222, 223, 7, 224, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 225, 7, 7, 226, 227, 7, 7, 7, 228, 229, 7, 230, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 231, 7, 7, 7, 7, 7, 7, 232, 233, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 234, 7, 235, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 236, 7, 237, 7, 7, 238, + 7, 7, 7, 7, 239, 240, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 241, 242, 243, 7, 7, + 91, 91, 244, 7, 7, 7, 7, 7, 91, 91, 245, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 141, 7, 246, 7, 247, 7, 248, 7, 249, 250, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 11, 251, 11, 252, 253, 254, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 255, 256, 7, 7, 7, 7, 7, 7, 7, 235, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 257, 7, 7, 7, 7, 7, 7, 7, 7, + 19, 19, 19, 19, 19, 19, 258, 19, 19, 19, 259, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 172, 21, 21, 19, 19, 21, 21, 34, 19, 19, 19, 19, 19, + 21, 21, 21, 21, 21, 21, 21, 260, 19, 19, 19, 19, 19, 19, 19, 19, + 91, 261, 91, 91, 136, 262, 263, 122, 264, 247, 7, 265, 7, 266, 7, 7, + 7, 7, 7, 182, 7, 7, 7, 7, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 267, 185, 91, 91, 91, 136, 91, 91, 268, 269, + 261, 91, 270, 91, 271, 272, 7, 7, 91, 91, 91, 273, 91, 91, 129, 91, + 91, 91, 136, 274, 275, 276, 277, 7, 91, 91, 91, 91, 278, 91, 126, 279, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 280, + 281, 281, 281, 281, 281, 281, 281, 281, 11, 11, 11, 11, 11, 11, 11, 282, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281 +}; + +static RE_UINT8 re_bidi_class_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 4, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 2, + 4, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 7, 8, 7, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 1, + 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 8, 5, 6, 6, 6, 6, 5, 5, 5, 5, 0, 5, 5, 1, 5, 5, + 6, 6, 9, 9, 5, 0, 5, 5, 5, 9, 0, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 5, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 6, + 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 10, + 11, 10, 10, 11, 10, 10, 11, 10, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 12, 12, 12, 12, 12, 12, 5, 5, 13, 6, 6, 13, 8, 13, 5, 5, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 6, 12, 12, 13, 13, 13, + 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 12, 5, 10, + 10, 10, 10, 10, 10, 13, 13, 10, 10, 5, 10, 10, 10, 10, 13, 13, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 11, 11, 5, 5, 5, 5, 11, 11, 11, 10, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 11, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 11, 10, 10, 10, 11, 10, 10, 10, 10, 10, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 11, 11, 11, 11, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 12, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 10, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 10, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, + 0, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 10, 0, + 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 0, 0, 0, 0, 10, 10, 0, 0, 10, 10, 10, 0, 0, + 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 0, 10, 10, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, + 0, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 5, 5, 5, 5, 5, 6, 5, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, + 10, 0, 0, 0, 0, 0, 10, 10, 10, 0, 10, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 10, 0, 10, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 10, 10, 10, 10, 10, 0, 10, 10, 0, 0, 0, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, + 10, 0, 10, 10, 10, 10, 10, 10, 0, 10, 10, 0, 0, 10, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 10, 10, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 6, 0, 10, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10, 10, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, 0, + 5, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 10, 10, 10, 10, 10, 10, 10, 0, + 10, 0, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 10, 0, 0, 10, 10, 0, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 10, 10, 0, 0, 0, 10, 0, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 0, 11, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 4, 3, 14, 15, 16, 17, 18, 8, + 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, + 1, 1, 1, 1, 1, 1, 19, 20, 21, 22, 1, 1, 1, 1, 1, 1, + 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 7, 7, 5, 5, 5, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 5, 5, 5, 5, 0, 5, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, + 5, 5, 5, 5, 0, 5, 0, 5, 0, 5, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 7, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, + 4, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, + 5, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 10, 10, 10, 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 10, 0, 5, 5, 5, 5, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 10, 10, 10, 10, 0, 0, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 0, + 0, 10, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 10, 10, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, 10, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 10, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 7, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 5, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 13, 13, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 8, 5, 8, 0, 5, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, + 5, 5, 7, 7, 5, 5, 5, 0, 5, 6, 6, 5, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, + 0, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 7, 8, 7, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 5, 5, 5, 6, 6, 0, 5, 5, 5, 5, 5, 5, 5, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 1, 1, + 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, + 11, 10, 10, 10, 11, 10, 10, 11, 11, 11, 11, 11, 10, 10, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 11, 11, 11, 11, 10, + 11, 11, 11, 11, 11, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 5, 5, 5, 5, 5, 5, + 13, 13, 13, 13, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 10, 10, 0, 0, 10, 0, 10, 10, 0, 0, 0, 0, 0, 0, 10, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, 0, 10, + 10, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 10, 10, 0, 10, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 0, 10, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 10, 0, 0, + 10, 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 10, 0, + 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 10, 10, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, + 10, 0, 10, 10, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 0, 0, 0, 10, 0, 10, 10, 0, 10, + 10, 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 0, 0, 0, 10, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, + 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 10, 10, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 0, 10, 10, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 5, 5, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +RE_UINT32 re_get_bidi_class(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_bidi_class_table_1[field_2]; + v = re_bidi_class_table_2[(v << 5) | field_1]; + v = re_bidi_class_table_3[(v << 5) | field_0]; + + return v; +} + +/* Bidi_Control. */ +RE_UINT32 re_get_bidi_control(RE_UINT32 codepoint) { + if (codepoint == 0x061C) + return 1; + if (0x200E <= codepoint && codepoint <= 0x200F) + return 1; + if (0x202A <= codepoint && codepoint <= 0x202E) + return 1; + if (0x2066 <= codepoint && codepoint <= 0x2069) + return 1; + + return 0; +} + +/* Bidi_Mirrored. */ +static RE_UINT8 re_bidi_mirrored_table_1[] = { + 0, 1, 1, 2, 1, 3, 1, 1, 4, 5, 6, 7, 8, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +static RE_UINT8 re_bidi_mirrored_table_2[] = { + 0, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 7, 8, 9, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 22, 23, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 0, 0, 0, 0, 0, 0, 0, 36, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 41, 0, 0, 0, 0, 1, 2, 42, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, 47, 0, 48, 0 +}; + +static RE_UINT8 re_bidi_mirrored_table_3[] = { + 0, 0, 0, 0, 0, 3, 0, 80, 0, 0, 0, 40, 0, 8, 0, 8, + 0, 0, 0, 60, 0, 0, 0, 24, 0, 0, 0, 6, 96, 0, 0, 0, + 0, 0, 0, 96, 0, 96, 0, 0, 1, 0, 0, 0, 30, 63, 98, 188, + 87, 248, 15, 250, 255, 31, 60, 128, 245, 207, 255, 255, 255, 159, 7, 1, + 204, 255, 255, 193, 0, 62, 195, 255, 255, 63, 255, 255, 0, 15, 0, 0, + 3, 6, 0, 0, 0, 255, 63, 0, 121, 59, 120, 112, 252, 255, 0, 0, + 248, 255, 255, 249, 253, 255, 0, 1, 63, 194, 55, 31, 58, 3, 240, 51, + 0, 252, 255, 223, 83, 122, 48, 112, 0, 0, 128, 1, 48, 188, 25, 254, + 255, 255, 255, 255, 207, 191, 255, 255, 255, 255, 127, 80, 124, 112, 136, 47, + 0, 0, 0, 64, 60, 54, 0, 48, 255, 3, 0, 0, 0, 255, 243, 15, + 0, 0, 0, 126, 48, 0, 0, 0, 0, 0, 0, 168, 13, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 32, 0, 0, 128, 0, 0, 0, 2, 0, 0, + 8, 0, 0, 0 +}; + +RE_UINT32 re_get_bidi_mirrored(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_bidi_mirrored_table_1[field_2]; + v = re_bidi_mirrored_table_2[(v << 5) | field_1]; + v = re_bidi_mirrored_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Blank. */ +RE_UINT32 re_get_blank(RE_UINT32 codepoint) { + if (codepoint == 0x09) + return 1; + if (codepoint == 0x20) + return 1; + if (codepoint == 0xA0) + return 1; + if (codepoint == 0x1680) + return 1; + if (0x2000 <= codepoint && codepoint <= 0x200A) + return 1; + if (codepoint == 0x202F) + return 1; + if (codepoint == 0x205F) + return 1; + if (codepoint == 0x3000) + return 1; + + return 0; +} + +/* Block. */ +static RE_UINT8 re_block_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 16, 17, 18, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, 36, 36, + 36, 39, 36, 36, 36, 36, 36, 36, 36, 36, 40, 41, 42, 42, 42, 42, + 42, 42, 43, 44, 36, 36, 36, 36, 36, 36, 36, 36, 45, 36, 36, 46, + 36, 36, 36, 36, 47, 48, 49, 36, 50, 36, 51, 52, 53, 54, 55, 36, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 58, 58, 58, 59, 60, 61, + 61, 61, 61, 62, 63, 63, 63, 63, 63, 63, 64, 36, 36, 36, 65, 36, + 66, 66, 66, 66, 67, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 68, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70 +}; + +static RE_UINT16 re_block_table_2[] = { + 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 10, 10, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 14, 15, 16, 16, 16, + 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 19, 20, 21, 21, 22, 22, + 23, 23, 24, 25, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, + 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, + 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, + 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, + 41, 41, 41, 41, 41, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 46, 46, 46, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 48, 49, 49, 49, 50, 51, 52, 53, 54, 54, 54, 54, + 55, 55, 55, 55, 55, 56, 57, 57, 58, 58, 59, 60, 61, 61, 61, 62, + 63, 64, 64, 64, 64, 65, 66, 66, 67, 67, 67, 67, 68, 68, 69, 69, + 70, 70, 71, 72, 73, 74, 75, 76, 77, 77, 77, 77, 78, 78, 79, 79, + 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, + 82, 82, 82, 83, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 92, 92, + 93, 93, 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, + 95, 95, 96, 97, 97, 97, 97, 97, 98, 98, 98, 98, 99, 100, 100, 100, + 101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 103, 104, + 105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 107, 107, 107, 107, + 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, + 110, 110, 110, 111, 112, 112, 112, 112, 113, 114, 115, 115, 116, 116, 116, 117, + 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 121, + 122, 122, 123, 123, 123, 124, 124, 124, 125, 126, 127, 127, 128, 129, 130, 131, + 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 135, 135, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 138, 139, 140, 141, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 143, 143, 143, 144, 144, 144, 145, 146, 146, 146, 146, 146, 146, 146, + 147, 148, 149, 149, 150, 150, 150, 151, 152, 153, 154, 155, 156, 156, 156, 157, + 158, 158, 158, 159, 160, 160, 160, 161, 162, 163, 164, 165, 166, 166, 167, 167, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 170, 170, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 172, 172, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 177, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 179, 180, 181, 182, 183, 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, 185, + 186, 186, 186, 186, 187, 187, 187, 187, 188, 188, 189, 189, 190, 191, 192, 193, + 26, 26, 26, 26, 194, 195, 195, 196, 197, 198, 199, 200, 201, 202, 202, 26, + 203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 26, 26, 26, 26, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 26, 26, 26, 26, + 214, 214, 215, 216, 217, 218, 26, 219, 220, 221, 26, 26, 222, 223, 223, 223, + 224, 224, 224, 225, 226, 26, 227, 227, 228, 228, 229, 230, 231, 232, 26, 26, + 233, 233, 234, 26, 235, 235, 235, 235, 236, 236, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 237, 238, 238, 26, 26, 239, 240, 241, 242, 26, 243, 244, 245, + 246, 246, 246, 246, 247, 247, 248, 249, 250, 250, 251, 252, 253, 253, 253, 254, + 255, 255, 256, 26, 257, 258, 259, 259, 260, 260, 260, 260, 26, 26, 26, 26, + 261, 261, 261, 261, 262, 262, 262, 26, 26, 26, 26, 26, 263, 263, 263, 263, + 264, 264, 264, 265, 266, 266, 267, 26, 268, 268, 26, 26, 26, 26, 26, 26, + 269, 269, 270, 26, 26, 271, 271, 271, 272, 272, 272, 26, 26, 273, 273, 273, + 274, 274, 275, 276, 276, 277, 278, 278, 26, 26, 26, 26, 26, 26, 26, 26, + 279, 279, 279, 280, 281, 281, 26, 26, 282, 282, 282, 283, 283, 284, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 285, 26, 26, 26, 26, 26, 286, 287, 287, + 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, + 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, + 289, 289, 289, 289, 290, 290, 290, 290, 290, 290, 291, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, + 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, + 292, 293, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 296, 297, 26, 26, 298, 299, 300, 300, 300, 300, 301, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 302, 302, 302, 26, 26, 26, 303, 303, 303, 303, 303, 26, 26, 304, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, 308, 308, 308, 308, 309, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 310, 310, 310, 310, 310, 310, 310, 310, 311, 312, 313, 314, 315, 315, 315, 315, + 315, 315, 315, 315, 315, 315, 315, 315, 26, 26, 26, 26, 26, 26, 26, 26, + 316, 316, 316, 316, 316, 317, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 318, 318, 318, 318, 318, 318, 318, 318, 319, 319, 319, 319, 319, 319, 319, 319, + 320, 320, 321, 26, 26, 26, 26, 322, 323, 323, 323, 324, 26, 26, 26, 26, + 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, + 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, + 326, 326, 326, 326, 326, 327, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 328, 329, 26, 26, 26, 26, 26, 26, 330, 330, 331, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 332, 332, 26, 26, 26, 26, 26, 26, 26, 26, + 333, 333, 333, 333, 333, 333, 333, 26, 334, 334, 334, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 335, 336, 336, 26, 26, 337, 337, 338, 26, 26, 26, 26, 26, + 339, 339, 339, 339, 339, 339, 339, 339, 26, 26, 26, 26, 26, 26, 26, 26, + 340, 341, 342, 342, 342, 343, 343, 343, 344, 344, 344, 344, 344, 344, 344, 344, + 345, 345, 345, 345, 345, 345, 345, 345, 346, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, + 347, 347, 348, 349, 350, 350, 350, 350, 351, 351, 351, 351, 352, 352, 352, 352, + 353, 353, 353, 353, 353, 353, 353, 353, 354, 354, 354, 354, 354, 354, 354, 354, + 355, 355, 355, 356, 357, 357, 357, 357, 358, 358, 358, 358, 358, 358, 358, 358, + 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 26, 360, 360, 360, 360, 360, 360, 360, 360, + 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, + 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, + 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, + 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 361, 361, 361, 361, 361, 361, + 361, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 363, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 365, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, + 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, + 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, + 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 368, 26, 26, 26, 26, 26, + 369, 369, 369, 369, 26, 26, 26, 26, 370, 370, 370, 370, 370, 370, 370, 371, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, + 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, + 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, + 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373 +}; + +static RE_UINT16 re_block_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 104, 0, - 36, 36, 36, 36, 36, 36, 36, 61, 7, 7, 111, 136, 0, 0, 0, 0, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, + 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, + 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, + 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, + 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, + 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, + 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, + 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, + 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, + 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, + 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, + 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, + 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, + 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, + 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, + 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, + 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, + 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, + 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, + 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, + 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, + 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, + 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, + 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, + 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, + 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, + 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, + 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, + 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, + 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, + 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, + 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, + 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, + 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, + 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, + 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, + 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, + 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, + 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, + 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, + 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, + 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, + 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, + 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, + 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, + 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, + 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, + 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, + 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, + 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308 +}; + +RE_UINT32 re_get_block(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_block_table_1[field_2]; + v = re_block_table_2[(v << 5) | field_1]; + v = re_block_table_3[(v << 5) | field_0]; + + return v; +} + +/* Canonical_Combining_Class. */ +static RE_UINT8 re_canonical_combining_class_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 15, + 16, 9, 17, 18, 19, 20, 21, 22, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, + 9, 9, 9, 9, 26, 9, 9, 9, 27, 9, 28, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 +}; + +static RE_UINT8 re_canonical_combining_class_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, + 9, 0, 10, 11, 0, 0, 12, 13, 14, 15, 16, 0, 0, 0, 0, 17, + 18, 19, 20, 0, 0, 0, 21, 22, 0, 23, 24, 0, 0, 23, 25, 26, + 0, 23, 25, 0, 0, 23, 25, 0, 0, 23, 25, 0, 0, 0, 25, 0, + 0, 0, 27, 0, 0, 23, 25, 0, 0, 28, 25, 0, 0, 0, 29, 0, + 0, 30, 31, 0, 0, 32, 33, 0, 34, 35, 0, 36, 37, 0, 38, 0, + 0, 39, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 0, 0, 0, 0, 43, 0, + 0, 0, 0, 0, 0, 44, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, + 46, 0, 0, 47, 0, 48, 49, 0, 0, 50, 51, 52, 0, 53, 0, 54, + 0, 55, 0, 0, 0, 0, 56, 57, 0, 0, 0, 0, 0, 0, 58, 59, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 65, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 67, 68, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, + 70, 71, 0, 0, 0, 0, 51, 72, 0, 73, 74, 0, 0, 75, 76, 0, + 0, 0, 0, 0, 0, 77, 78, 79, 0, 0, 0, 0, 0, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, + 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 83, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 84, 85, 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, + 0, 0, 70, 63, 0, 90, 0, 0, 91, 92, 0, 75, 0, 0, 93, 0, + 0, 94, 0, 0, 0, 0, 0, 95, 0, 96, 25, 97, 0, 0, 0, 0, + 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 63, 100, 0, + 0, 63, 0, 0, 0, 101, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, + 0, 90, 0, 0, 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, 0, 76, + 0, 42, 105, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 107, 0, 108, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 109, 0, 110, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, + 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 114, 115, 0, 0, + 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 117, 118, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 121, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_canonical_combining_class_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 3, 3, 3, 3, 2, 4, 3, 3, 3, 3, + 3, 5, 5, 3, 3, 3, 3, 5, 5, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 6, 6, 6, 6, 6, 3, 3, 3, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 7, 1, 3, 3, 3, 1, 1, 1, 3, 3, 0, + 1, 1, 1, 3, 3, 3, 3, 1, 2, 3, 3, 1, 8, 9, 9, 8, + 9, 9, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 1, 1, 1, 1, 3, 1, 1, 1, 10, 3, 1, 1, 1, 1, + 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, 3, 1, 1, 10, 11, 1, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 0, 25, + 0, 26, 27, 0, 1, 3, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 28, 29, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 28, 29, + 30, 34, 35, 1, 1, 3, 3, 1, 1, 1, 1, 1, 3, 1, 1, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, + 1, 1, 1, 3, 1, 0, 0, 1, 1, 0, 3, 1, 1, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 3, 1, 1, 3, 1, 1, 3, 3, 3, 1, 3, 3, 1, 3, 1, + 1, 1, 3, 1, 3, 1, 3, 1, 3, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 3, 1, 1, 3, 1, 1, 3, 1, 1, 1, 3, 3, 3, + 31, 32, 33, 1, 1, 1, 3, 1, 1, 3, 3, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, + 0, 1, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, + 0, 0, 0, 0, 0, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 43, 43, 43, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 46, 47, 0, 48, 0, 0, 0, 0, 0, 47, 47, 47, 47, 0, 0, + 47, 0, 1, 1, 39, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 38, 0, 39, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 1, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, + 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, 3, 0, 3, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 6, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, + 1, 0, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 9, 49, 3, + 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 11, 11, 3, 0, 1, 8, 3, 1, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 6, 6, 1, 1, 1, 1, 6, 6, 6, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 6, 6, 1, 3, 1, 6, 6, 3, 3, 3, 3, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 11, 2, 10, 51, 51, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 3, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, + 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 3, 0, 0, 0, 0, 39, + 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 3, 1, 1, 1, 3, 1, 3, 3, 3, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 38, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 39, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 38, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 39, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 39, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 39, 38, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 39, 0, + 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 0, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 4, 4, 6, 6, 6, 0, 0, 0, 55, 4, 4, + 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 0, 0, 1, 1, 1, 1, 1, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 38, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +RE_UINT32 re_get_canonical_combining_class(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_canonical_combining_class_table_1[field_2]; + v = re_canonical_combining_class_table_2[(v << 5) | field_1]; + v = re_canonical_combining_class_table_3[(v << 5) | field_0]; + + return v; +} + +/* Cased. */ +static RE_UINT8 re_cased_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 17, 2, 18, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_cased_table_2[] = { + 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 5, 6, 4, + 4, 4, 4, 4, 7, 8, 9, 10, 0, 0, 11, 12, 13, 14, 4, 15, + 4, 4, 4, 4, 16, 4, 4, 4, 4, 17, 18, 4, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 20, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 22, + 0, 0, 0, 0, 23, 21, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 22, 4, 24, 25, 4, 26, 27, 28, + 0, 0, 0, 29, 30, 0, 0, 0, 31, 32, 33, 4, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 35, 4, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 37, 38, 4, 4, 4, 4, 39, 4, 40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 41, 25, 0, 0, 0, 0, 42, 4, 4, 43, 4, 44, 45, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 5, 23, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 4, 4, 48, 0, 0, 46, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 51, 4, 51, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 52, 4, 53, 54, 55, 4, 56, 57, 58, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 59, 60, 5, 52, 52, 37, 37, 61, 61, 62, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 63, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 64, 64, 36, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_cased_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, + 255, 255, 255, 255, 255, 255, 255, 247, 240, 255, 255, 255, 255, 255, 239, 255, + 255, 255, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, + 0, 0, 207, 188, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, + 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 0, 255, 1, 0, 0, + 191, 32, 255, 255, 255, 255, 255, 231, 255, 255, 63, 63, 255, 1, 255, 255, + 63, 63, 255, 170, 255, 255, 255, 63, 255, 255, 223, 95, 220, 31, 207, 15, + 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, + 80, 189, 31, 242, 224, 67, 0, 0, 24, 0, 0, 0, 0, 0, 192, 255, + 255, 3, 0, 0, 255, 127, 255, 255, 255, 255, 255, 127, 31, 120, 12, 0, + 191, 32, 0, 0, 255, 63, 0, 0, 252, 255, 255, 255, 255, 120, 255, 255, + 252, 7, 0, 0, 0, 0, 96, 7, 0, 0, 255, 255, 127, 0, 248, 0, + 255, 255, 0, 0, 255, 255, 15, 255, 255, 255, 255, 15, 255, 255, 7, 0, + 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, + 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, + 253, 255, 255, 247, 255, 253, 255, 255, 247, 15, 0, 0, 15, 0, 0, 0, + 255, 3, 255, 255 +}; + +RE_UINT32 re_get_cased(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_cased_table_1[field_2]; + v = re_cased_table_2[(v << 5) | field_1]; + v = re_cased_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Case_Ignorable. */ +static RE_UINT8 re_case_ignorable_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 14, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 16, + 17, 9, 18, 19, 20, 21, 22, 23, 9, 9, 9, 9, 9, 24, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, 26, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 27, + 9, 9, 9, 9, 28, 9, 29, 9, 30, 9, 31, 9, 32, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 33, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 +}; + +static RE_UINT8 re_case_ignorable_table_2[] = { + 0, 1, 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 6, 6, 6, 6, 6, 7, 8, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 11, 12, 13, 14, + 15, 0, 16, 17, 0, 0, 18, 19, 20, 5, 21, 0, 0, 22, 0, 23, + 24, 25, 26, 0, 0, 0, 27, 6, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 33, 37, 38, 36, 33, 39, 40, 32, 41, 42, 43, 44, 0, 45, 0, + 46, 47, 48, 43, 32, 41, 49, 43, 50, 51, 34, 43, 32, 0, 52, 0, + 0, 53, 54, 0, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 62, 0, + 0, 63, 64, 65, 66, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 68, 69, 69, 0, 70, 71, 0, + 72, 0, 73, 0, 74, 75, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, + 77, 0, 78, 79, 0, 80, 3, 0, 81, 82, 44, 83, 50, 84, 0, 85, + 0, 86, 0, 87, 0, 0, 88, 89, 0, 90, 6, 91, 92, 6, 6, 93, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, + 97, 98, 0, 99, 100, 0, 5, 101, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 102, 0, 0, 0, 103, 0, 0, 0, 104, 0, 0, 0, 6, + 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 107, 0, 0, 108, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, + 111, 0, 0, 112, 113, 0, 0, 114, 6, 50, 0, 17, 115, 0, 0, 57, + 116, 117, 0, 0, 0, 0, 118, 119, 0, 120, 121, 0, 28, 122, 105, 74, + 0, 123, 124, 125, 0, 126, 127, 128, 0, 0, 92, 129, 0, 0, 0, 130, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 131, 50, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132, 133, 134, 0, 0, 0, 0, 135, 1, 2, 3, 17, 47, 0, 0, 136, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 138, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 139, 140, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 32, 143, 144, 135, 50, 145, 146, 0, 28, 147, 0, 148, 50, 149, 150, 0, + 0, 151, 0, 0, 0, 0, 135, 152, 50, 51, 3, 153, 0, 0, 0, 0, + 0, 143, 154, 0, 0, 155, 156, 0, 0, 0, 0, 0, 0, 157, 158, 0, + 0, 159, 3, 0, 0, 160, 0, 0, 67, 161, 0, 0, 0, 0, 0, 0, + 0, 162, 0, 0, 0, 0, 0, 0, 0, 163, 73, 0, 0, 0, 164, 3, + 165, 166, 167, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 169, 0, 0, 131, 170, 0, 0, 0, 171, 172, 0, 173, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 0, 177, 81, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 0, 178, 0, 0, 179, + 0, 0, 0, 0, 180, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 182, 183, 0, 0, + 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 185, 6, 186, 187, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 189, 190, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, 193, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, + 32, 6, 6, 6, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 133, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_case_ignorable_table_3[] = { + 0, 0, 0, 0, 128, 64, 0, 4, 0, 0, 0, 64, 1, 0, 0, 0, + 0, 161, 144, 1, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 48, 4, + 176, 0, 0, 0, 248, 3, 0, 0, 0, 0, 0, 130, 0, 0, 254, 255, + 255, 255, 255, 191, 182, 0, 0, 0, 0, 0, 16, 0, 63, 0, 255, 23, + 1, 248, 255, 255, 0, 0, 1, 0, 0, 0, 192, 191, 255, 61, 0, 0, + 0, 128, 2, 0, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 63, 36, + 0, 0, 192, 255, 255, 63, 0, 0, 0, 0, 0, 14, 0, 0, 248, 255, + 7, 0, 0, 0, 0, 0, 0, 20, 254, 33, 254, 0, 12, 0, 2, 0, + 2, 0, 0, 0, 0, 0, 0, 16, 30, 32, 0, 0, 12, 0, 0, 64, + 6, 0, 0, 0, 134, 57, 2, 0, 0, 0, 35, 0, 190, 33, 0, 0, + 12, 0, 0, 252, 0, 0, 0, 144, 30, 32, 96, 0, 12, 0, 0, 0, + 4, 0, 0, 0, 1, 32, 0, 0, 17, 0, 0, 0, 0, 0, 0, 192, + 193, 61, 96, 0, 64, 48, 0, 0, 3, 0, 0, 0, 0, 0, 0, 24, + 0, 4, 92, 0, 0, 0, 242, 7, 192, 127, 0, 0, 0, 0, 242, 31, + 64, 63, 0, 0, 0, 0, 0, 3, 0, 0, 160, 2, 0, 0, 254, 127, + 223, 224, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 0, 224, 253, 102, + 0, 0, 0, 195, 1, 0, 30, 0, 100, 32, 0, 32, 0, 0, 0, 224, + 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 176, 63, 64, 254, 143, 32, + 0, 120, 0, 0, 8, 0, 0, 0, 96, 0, 0, 0, 0, 2, 0, 0, + 135, 1, 4, 14, 0, 0, 128, 9, 0, 0, 64, 127, 229, 31, 248, 159, + 128, 0, 255, 255, 15, 0, 0, 0, 0, 0, 208, 23, 0, 248, 15, 0, + 60, 59, 0, 0, 64, 163, 3, 0, 0, 240, 207, 0, 0, 0, 0, 63, + 0, 0, 247, 255, 253, 33, 16, 3, 0, 240, 255, 255, 255, 7, 0, 1, + 0, 0, 0, 248, 255, 255, 255, 251, 0, 0, 0, 160, 3, 224, 0, 224, + 0, 224, 0, 96, 0, 248, 0, 3, 144, 124, 0, 0, 223, 255, 2, 128, + 0, 0, 255, 31, 255, 255, 1, 0, 0, 0, 0, 48, 0, 128, 3, 0, + 0, 128, 0, 128, 0, 128, 0, 0, 32, 0, 0, 0, 0, 60, 62, 8, + 0, 0, 0, 126, 0, 0, 0, 112, 0, 0, 32, 0, 0, 16, 0, 0, + 0, 128, 247, 191, 0, 0, 0, 240, 0, 0, 3, 0, 0, 7, 0, 0, + 68, 8, 0, 0, 96, 16, 0, 0, 48, 0, 0, 0, 255, 255, 3, 128, + 192, 63, 0, 0, 128, 255, 3, 0, 0, 0, 200, 51, 0, 126, 102, 0, + 8, 16, 0, 0, 0, 0, 1, 16, 0, 0, 157, 193, 2, 0, 0, 32, + 0, 48, 88, 0, 0, 14, 0, 0, 32, 33, 0, 0, 0, 0, 252, 255, + 255, 255, 8, 0, 255, 255, 0, 0, 0, 0, 36, 0, 0, 0, 0, 128, + 8, 0, 0, 14, 0, 0, 0, 32, 0, 0, 192, 7, 110, 240, 0, 0, + 0, 0, 0, 135, 240, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 255, + 127, 0, 0, 0, 0, 0, 120, 38, 0, 32, 0, 0, 128, 239, 31, 0, + 0, 0, 8, 0, 0, 0, 192, 127, 0, 158, 0, 0, 0, 128, 211, 64, + 248, 7, 0, 0, 192, 31, 31, 0, 92, 0, 0, 64, 0, 0, 248, 133, + 13, 0, 0, 0, 0, 0, 60, 176, 1, 0, 0, 48, 0, 0, 248, 167, + 0, 40, 191, 0, 188, 15, 0, 0, 0, 128, 255, 6, 0, 0, 0, 88, + 0, 0, 240, 12, 254, 7, 0, 0, 0, 0, 248, 121, 128, 0, 126, 14, + 0, 252, 127, 3, 0, 0, 127, 191, 255, 252, 109, 0, 0, 0, 126, 180, + 191, 0, 0, 0, 0, 0, 163, 0, 0, 0, 24, 0, 0, 0, 255, 1, + 0, 0, 31, 0, 0, 0, 127, 0, 0, 128, 255, 255, 27, 0, 0, 0, + 0, 0, 0, 96, 128, 3, 248, 255, 231, 15, 0, 0, 0, 60, 0, 0, + 28, 0, 0, 0, 255, 255, 127, 248, 255, 31, 32, 0, 16, 0, 0, 248, + 254, 255, 0, 0, 127, 255, 255, 249, 219, 7, 0, 0, 0, 0, 255, 63, + 0, 240, 0, 0, 240, 15, 0, 0 +}; + +RE_UINT32 re_get_case_ignorable(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_case_ignorable_table_1[field_2]; + v = re_case_ignorable_table_2[(v << 5) | field_1]; + v = re_case_ignorable_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Changes_When_Casefolded. */ +static RE_UINT8 re_changes_when_casefolded_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_changes_when_casefolded_table_2[] = { + 0, 0, 1, 0, 0, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, + 4, 12, 13, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, + 20, 21, 0, 4, 22, 4, 23, 4, 4, 24, 25, 0, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, + 0, 0, 0, 0, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 31, 4, 4, 4, 32, 33, 34, 35, 20, 36, 37, 38, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 21, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 41, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 42, 0, 43, 4, 4, 4, 44, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 45, 46, 0, 0, 0, 0, 47, 4, 48, 49, 50, 51, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 20, 20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 20, 54, 0, 0, 0, 52, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 20, 57, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_changes_when_casefolded_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 255, 255, 127, 255, + 85, 85, 85, 85, 85, 85, 85, 170, 170, 86, 85, 85, 85, 85, 85, 171, + 214, 206, 219, 177, 213, 210, 174, 17, 176, 173, 170, 74, 85, 85, 214, 85, + 85, 85, 5, 108, 122, 85, 0, 0, 32, 0, 0, 0, 0, 0, 69, 128, + 64, 215, 254, 255, 251, 15, 0, 0, 4, 128, 99, 85, 85, 85, 179, 230, + 255, 255, 255, 255, 255, 255, 0, 0, 1, 84, 85, 85, 171, 42, 85, 85, + 85, 85, 254, 255, 255, 255, 127, 0, 128, 0, 0, 0, 191, 32, 0, 0, + 0, 0, 0, 63, 255, 1, 255, 255, 255, 255, 255, 231, 85, 85, 21, 76, + 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, 0, 255, 0, 0, + 255, 255, 156, 31, 156, 31, 0, 15, 0, 31, 156, 31, 64, 12, 4, 0, + 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, + 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 5, 84, 85, 84, 85, + 85, 85, 0, 106, 85, 40, 69, 85, 85, 125, 95, 85, 244, 2, 0, 0, + 0, 0, 255, 255, 127, 0, 248, 0, 255, 0, 0, 0, 255, 255, 15, 0, + 255, 255, 7, 0, 3, 0, 0, 0 +}; + +RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_changes_when_casefolded_table_1[field_2]; + v = re_changes_when_casefolded_table_2[(v << 5) | field_1]; + v = re_changes_when_casefolded_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Changes_When_Casemapped. */ +static RE_UINT8 re_changes_when_casemapped_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_changes_when_casemapped_table_2[] = { + 0, 0, 1, 1, 0, 2, 3, 3, 4, 5, 4, 4, 6, 7, 8, 4, + 4, 9, 10, 11, 12, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, 18, + 4, 4, 4, 4, 19, 4, 4, 4, 4, 20, 21, 22, 23, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 24, 25, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 26, + 0, 0, 0, 0, 27, 25, 0, 0, 0, 0, 0, 28, 29, 0, 0, 0, + 4, 4, 4, 4, 30, 4, 4, 4, 26, 4, 31, 32, 4, 33, 34, 35, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 29, 4, 37, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 38, 4, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 40, 41, 42, 4, 4, 4, 43, 4, 44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 45, 46, 0, 0, 0, 0, 47, 4, 48, 49, 40, 50, 51, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 4, 4, 55, 0, 0, 53, 56, 46, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 57, 4, 57, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 58, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_changes_when_casemapped_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 255, 255, 127, 255, + 255, 255, 255, 255, 255, 255, 255, 254, 255, 223, 255, 247, 255, 243, 255, 179, + 240, 255, 255, 255, 253, 255, 15, 252, 255, 255, 223, 26, 107, 159, 38, 32, + 141, 31, 4, 96, 32, 0, 0, 0, 0, 0, 207, 184, 64, 215, 255, 255, + 251, 255, 255, 255, 255, 255, 227, 255, 255, 255, 191, 239, 3, 252, 255, 255, + 255, 255, 254, 255, 255, 255, 127, 0, 254, 255, 255, 255, 255, 0, 0, 0, + 191, 32, 255, 255, 255, 255, 255, 231, 255, 255, 63, 63, 255, 1, 255, 255, + 0, 0, 0, 34, 0, 64, 0, 0, 255, 255, 255, 79, 63, 63, 255, 170, + 255, 255, 255, 63, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, + 64, 12, 4, 0, 24, 0, 0, 0, 0, 0, 192, 255, 255, 3, 0, 0, + 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 109, 192, 15, 120, 12, 0, + 191, 32, 0, 0, 255, 63, 0, 0, 255, 255, 255, 15, 252, 255, 252, 255, + 255, 255, 0, 254, 255, 56, 223, 255, 252, 7, 0, 0, 0, 0, 96, 0, + 0, 0, 8, 0, 0, 0, 255, 255, 127, 0, 248, 0, 255, 255, 0, 0, + 255, 255, 15, 255, 255, 255, 7, 0, 15, 0, 0, 0 +}; + +RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_changes_when_casemapped_table_1[field_2]; + v = re_changes_when_casemapped_table_2[(v << 5) | field_1]; + v = re_changes_when_casemapped_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Changes_When_Lowercased. */ +static RE_UINT8 re_changes_when_lowercased_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, + 2, 10, 2, 11, 2, 2, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 14, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_changes_when_lowercased_table_2[] = { + 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, + 3, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, + 18, 19, 0, 3, 20, 3, 21, 3, 3, 22, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 25, + 0, 0, 0, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 28, 3, 3, 3, 29, 30, 31, 32, 30, 33, 34, 35, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 19, 37, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 38, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 39, 0, 40, 3, 3, 3, 41, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 42, 43, 0, 0, 0, 0, 44, 3, 45, 46, 47, 48, 49, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 18, 50, 0, 0, 0, 26, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 18, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 53, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_changes_when_lowercased_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 255, 255, 127, 127, 85, 85, 85, 85, + 85, 85, 85, 170, 170, 84, 85, 85, 85, 85, 85, 43, 214, 206, 219, 177, + 213, 210, 174, 17, 176, 173, 170, 74, 85, 85, 214, 85, 85, 85, 5, 108, + 122, 85, 0, 0, 0, 0, 69, 128, 64, 215, 254, 255, 251, 15, 0, 0, + 0, 128, 0, 85, 85, 85, 144, 230, 255, 255, 255, 255, 255, 255, 0, 0, + 1, 84, 85, 85, 171, 42, 85, 85, 85, 85, 254, 255, 255, 255, 127, 0, + 191, 32, 0, 0, 255, 255, 63, 0, 0, 0, 255, 255, 255, 255, 255, 231, + 85, 85, 21, 64, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, + 0, 255, 0, 0, 0, 255, 0, 31, 0, 31, 0, 15, 0, 31, 0, 31, + 64, 12, 4, 0, 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, + 157, 234, 37, 192, 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 5, + 84, 85, 84, 85, 85, 85, 0, 106, 85, 40, 69, 85, 85, 125, 95, 85, + 244, 2, 0, 0, 0, 0, 32, 0, 255, 0, 0, 0, 255, 255, 15, 0, + 255, 255, 7, 0, 3, 0, 0, 0 +}; + +RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_changes_when_lowercased_table_1[field_2]; + v = re_changes_when_lowercased_table_2[(v << 5) | field_1]; + v = re_changes_when_lowercased_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Changes_When_Titlecased. */ +static RE_UINT8 re_changes_when_titlecased_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_changes_when_titlecased_table_2[] = { + 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 5, 13, 14, 15, 16, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, + 0, 23, 24, 5, 25, 5, 26, 5, 5, 27, 0, 28, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, + 5, 5, 5, 5, 34, 5, 5, 5, 35, 36, 37, 38, 36, 39, 40, 41, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 23, 42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 43, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 23, 44, 45, 5, 5, 5, 46, 24, 47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 48, 49, 0, 0, 0, 0, 50, 5, 51, 52, 53, 54, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 23, 24, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 58, 59, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_changes_when_titlecased_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 0, 0, 0, 128, + 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 84, 85, 171, 170, 170, + 170, 170, 170, 212, 41, 17, 36, 70, 42, 33, 81, 162, 208, 86, 85, 181, + 170, 170, 43, 170, 168, 170, 10, 144, 133, 170, 223, 26, 107, 159, 38, 32, + 141, 31, 4, 96, 32, 0, 0, 0, 0, 0, 138, 56, 0, 0, 1, 0, + 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 47, 9, 0, 0, 255, 255, + 255, 255, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 170, 0, 0, + 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 63, 255, 1, 0, 0, + 0, 0, 0, 34, 0, 64, 0, 0, 170, 170, 234, 15, 255, 0, 63, 0, + 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, 255, 0, 223, 64, + 220, 0, 207, 0, 255, 0, 220, 0, 16, 0, 0, 0, 255, 3, 0, 0, + 255, 255, 255, 127, 98, 21, 72, 0, 10, 80, 8, 0, 191, 32, 0, 0, + 170, 42, 0, 0, 170, 170, 170, 10, 168, 170, 168, 170, 170, 170, 0, 148, + 170, 16, 154, 170, 170, 2, 160, 170, 8, 5, 0, 0, 0, 0, 64, 0, + 0, 0, 8, 0, 127, 0, 248, 0, 0, 255, 255, 255, 255, 255, 0, 0, + 0, 0, 0, 255, 255, 255, 255, 15, 255, 255, 7, 0, 252, 255, 255, 255, + 15, 0, 0, 0 +}; + +RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_changes_when_titlecased_table_1[field_2]; + v = re_changes_when_titlecased_table_2[(v << 5) | field_1]; + v = re_changes_when_titlecased_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Changes_When_Uppercased. */ +static RE_UINT8 re_changes_when_uppercased_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_changes_when_uppercased_table_2[] = { + 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 5, 13, 14, 15, 16, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, + 0, 23, 24, 5, 25, 5, 26, 5, 5, 27, 0, 28, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 30, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 33, 34, 0, 0, 0, + 5, 5, 5, 5, 35, 5, 5, 5, 36, 37, 38, 39, 24, 40, 41, 42, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 23, 43, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 44, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 23, 45, 46, 5, 5, 5, 47, 24, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 49, 50, 0, 0, 0, 0, 51, 5, 52, 53, 54, 55, 56, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 23, 24, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 59, 60, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_changes_when_uppercased_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 0, 0, 0, 128, + 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 84, 85, 171, 170, 170, + 170, 170, 170, 212, 41, 17, 36, 70, 42, 33, 81, 162, 96, 91, 85, 181, + 170, 170, 45, 170, 168, 170, 10, 144, 133, 170, 223, 26, 107, 159, 38, 32, + 141, 31, 4, 96, 32, 0, 0, 0, 0, 0, 138, 56, 0, 0, 1, 0, + 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 47, 9, 0, 0, 255, 255, + 255, 255, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 170, 0, 0, + 254, 255, 255, 255, 255, 0, 0, 0, 255, 255, 255, 231, 0, 0, 0, 63, + 255, 1, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 170, 170, 234, 15, + 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, + 255, 255, 223, 80, 220, 16, 207, 0, 255, 0, 220, 16, 16, 0, 0, 0, + 255, 3, 0, 0, 255, 255, 255, 127, 98, 21, 72, 0, 10, 80, 8, 0, + 191, 32, 0, 0, 170, 42, 0, 0, 170, 170, 170, 10, 168, 170, 168, 170, + 170, 170, 0, 148, 170, 16, 154, 170, 170, 2, 160, 170, 8, 5, 0, 0, + 0, 0, 64, 0, 0, 0, 8, 0, 127, 0, 248, 0, 0, 255, 255, 255, + 255, 255, 0, 0, 0, 0, 0, 255, 255, 255, 255, 15, 255, 255, 7, 0, + 252, 255, 255, 255, 15, 0, 0, 0 +}; + +RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_changes_when_uppercased_table_1[field_2]; + v = re_changes_when_uppercased_table_2[(v << 5) | field_1]; + v = re_changes_when_uppercased_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Dash. */ +static RE_UINT8 re_dash_table_1[] = { + 0, 1, 2, 2, 2, 3, 4, 2, 5, 2, 2, 6, 7, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, + 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_dash_table_2[] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 16, 17, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_dash_table_3[] = { + 0, 0, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 0, 0, 64, + 1, 0, 0, 0, 64, 0, 0, 0, 0, 0, 63, 0, 0, 0, 8, 0, + 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 4, 0, 0, 0, 128, 4, + 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 6, 0, + 0, 0, 0, 1, 8, 0, 0, 0 +}; + +RE_UINT32 re_get_dash(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_dash_table_1[field_2]; + v = re_dash_table_2[(v << 5) | field_1]; + v = re_dash_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Decomposition_Type. */ +static RE_UINT8 re_decomposition_type_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 14, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 16, 5, 5, 5, 5, 5, 5, 5, 5, 17, 18, + 5, 5, 5, 5, 19, 20, 21, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 22, 23, 5, 5, 5, 5, 5, 24, 25, 5, 26, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 +}; + +static RE_UINT8 re_decomposition_type_table_2[] = { + 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, + 11, 12, 0, 0, 0, 13, 14, 15, 0, 0, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 29, 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 34, 0, + 0, 35, 36, 0, 0, 0, 0, 0, 0, 0, 37, 0, 38, 0, 39, 0, + 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 39, 0, 0, 0, 42, 0, + 0, 43, 0, 0, 0, 43, 44, 0, 45, 0, 46, 47, 48, 49, 0, 0, + 0, 50, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 57, 58, 59, 0, 0, + 60, 60, 60, 60, 61, 60, 60, 62, 63, 60, 64, 65, 60, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 0, 0, 75, 76, 77, 78, 79, 80, 81, 0, + 82, 83, 84, 85, 86, 87, 0, 88, 0, 89, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 90, 78, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 94, 0, 0, 95, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, + 0, 0, 0, 0, 99, 0, 0, 43, 78, 78, 78, 78, 78, 78, 100, 0, + 101, 102, 103, 104, 105, 103, 104, 106, 0, 107, 78, 78, 108, 0, 0, 0, + 109, 78, 110, 111, 92, 92, 112, 113, 114, 114, 115, 116, 114, 114, 114, 117, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 120, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, 0, 0, 0, 0, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 123, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 60, 60, 60, 60, 60, 60, 60, 60, + 124, 125, 60, 126, 60, 60, 62, 0, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 135, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163, + 0, 0, 0, 0, 164, 165, 0, 0, 0, 166, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 172, 0, 173, 174, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 175, 175, 176, 175, 177, 178, 179, 175, 180, 181, 182, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 183, 175, 175, 175, 175, 175, 175, 175, 175, 184, 175, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 185, 186, 187, 188, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_decomposition_type_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 2, + 0, 0, 3, 3, 2, 2, 0, 0, 2, 3, 3, 0, 4, 4, 4, 0, + 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 0, 2, 2, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 2, + 2, 0, 0, 5, 5, 5, 5, 5, 5, 2, 0, 0, 5, 5, 5, 5, + 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, + 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 2, 2, 2, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, + 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, + 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 2, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 2, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, + 2, 2, 2, 5, 5, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 0, 0, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, + 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 5, 5, 0, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 5, 5, 2, 5, 2, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, 0, 0, + 5, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 0, 5, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, + 2, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 2, 0, + 5, 5, 2, 2, 2, 2, 2, 1, 2, 2, 2, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 0, 7, 2, 0, 0, 7, 7, 7, 7, 7, 0, 0, + 3, 2, 3, 0, 7, 0, 5, 0, 7, 0, 5, 5, 7, 7, 0, 7, + 7, 7, 0, 7, 7, 2, 2, 2, 2, 7, 0, 2, 7, 7, 7, 7, + 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 0, 2, 2, 0, 2, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 0, 5, 0, 0, 5, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 5, 5, 0, 0, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 0, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, 0, + 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, + 5, 0, 5, 0, 0, 5, 0, 5, 0, 5, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 5, 5, 0, 5, 5, 0, 5, 5, 0, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 2, 2, 0, 5, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 5, 5, 5, 5, 0, 0, 0, 5, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 0, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 5, 0, 5, 0, 0, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 5, 0, 5, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 0, + 5, 5, 0, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, + 12, 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, + 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, + 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, + 14, 15, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, + 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, + 12, 13, 14, 15, 12, 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, + 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 13, 14, 15, 12, 13, 12, 13, 12, 13, 12, 12, 13, + 12, 13, 12, 13, 12, 13, 14, 15, 14, 15, 12, 13, 12, 13, 12, 13, + 12, 13, 12, 13, 12, 13, 12, 13, 14, 12, 13, 14, 12, 13, 14, 15, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, + 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 13, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 13, 14, 14, 14, 14, 14, 14, 13, 14, 13, 13, 14, 14, 13, 13, + 14, 14, 13, 14, 13, 14, 13, 13, 14, 13, 13, 14, 13, 14, 13, 13, + 14, 13, 14, 14, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 13, 13, + 13, 13, 13, 14, 13, 13, 14, 13, 14, 14, 14, 13, 14, 14, 14, 14, + 0, 0, 14, 14, 14, 14, 13, 13, 14, 13, 13, 13, 13, 14, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 14, 14, 13, 13, 14, 13, 14, 13, 13, 13, 13, 13, + 13, 13, 13, 14, 14, 14, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 0, 10, 10, 2, 2, 2, 2, 2, 2, 2, + 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 16, 0, 0, 0, 0, + 12, 15, 12, 0, 12, 0, 12, 15, 12, 15, 12, 15, 12, 15, 12, 15, + 12, 12, 13, 12, 13, 12, 13, 12, 13, 12, 13, 14, 15, 12, 13, 12, + 13, 14, 15, 12, 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, + 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 12, 13, 12, 13, 12, + 13, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, + 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, + 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, + 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 12, + 13, 12, 13, 14, 15, 12, 13, 12, 13, 12, 13, 12, 13, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, + 0, 0, 17, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 17, 17, 17, + 0, 0, 17, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 17, 17, 17, 17, 17, 17, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, + 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, + 0, 0, 7, 0, 0, 7, 7, 0, 0, 7, 7, 7, 7, 0, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 7, 7, + 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 0, 0, 7, 7, 7, + 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 0, + 7, 7, 7, 7, 7, 0, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, + 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 7, 7, 0, 7, 0, 0, 7, 0, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 0, 7, 7, 7, 7, 0, 7, 0, 7, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 7, 0, 7, 0, 7, 0, 7, 7, 7, + 0, 7, 7, 0, 7, 0, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, + 0, 7, 7, 0, 7, 0, 0, 7, 7, 7, 7, 0, 7, 7, 7, 7, + 7, 7, 7, 0, 7, 7, 7, 7, 0, 7, 7, 7, 7, 0, 7, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, + 0, 7, 7, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0 +}; + +RE_UINT32 re_get_decomposition_type(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_decomposition_type_table_1[field_2]; + v = re_decomposition_type_table_2[(v << 5) | field_1]; + v = re_decomposition_type_table_3[(v << 5) | field_0]; + + return v; +} + +/* Default_Ignorable_Code_Point. */ +static RE_UINT8 re_default_ignorable_code_point_table_1[] = { + 0, 1, 2, 2, 3, 4, 5, 2, 6, 2, 2, 2, 7, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, + 2, 2, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 11, 11, 11, 11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_default_ignorable_code_point_table_2[] = { + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 12, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 +}; + +static RE_UINT8 re_default_ignorable_code_point_table_3[] = { + 0, 0, 0, 0, 0, 32, 0, 0, 0, 128, 0, 0, 0, 0, 0, 16, + 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 48, 0, 0, 120, 0, 0, + 0, 248, 0, 0, 0, 124, 0, 0, 255, 255, 0, 0, 16, 0, 0, 0, + 0, 0, 255, 1, 15, 0, 0, 0, 0, 0, 248, 7, 255, 255, 255, 255 +}; + +RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_default_ignorable_code_point_table_1[field_2]; + v = re_default_ignorable_code_point_table_2[(v << 5) | field_1]; + v = re_default_ignorable_code_point_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Deprecated. */ +RE_UINT32 re_get_deprecated(RE_UINT32 codepoint) { + if (codepoint == 0x0149) + return 1; + if (codepoint == 0x0673) + return 1; + if (codepoint == 0x0F77) + return 1; + if (codepoint == 0x0F79) + return 1; + if (0x17A3 <= codepoint && codepoint <= 0x17A4) + return 1; + if (0x206A <= codepoint && codepoint <= 0x206F) + return 1; + if (0x2329 <= codepoint && codepoint <= 0x232A) + return 1; + if (codepoint == 0x0E0001) + return 1; + + return 0; +} + +/* Diacritic. */ +static RE_UINT8 re_diacritic_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 9, 10, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, 12, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 14, + 15, 8, 16, 17, 18, 19, 20, 21, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 22, 23, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 24, 8, 8, 8, 25, 8, 26, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 +}; + +static RE_UINT8 re_diacritic_table_2[] = { + 0, 0, 1, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 5, 5, 5, 5, 6, 7, 8, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 11, 12, 13, 0, + 0, 0, 14, 0, 0, 0, 15, 16, 0, 4, 17, 0, 0, 18, 0, 19, + 20, 0, 0, 0, 0, 0, 0, 21, 0, 22, 23, 24, 0, 22, 25, 0, + 0, 22, 25, 0, 0, 22, 25, 26, 0, 22, 27, 0, 0, 0, 25, 0, + 0, 0, 25, 0, 0, 22, 25, 0, 0, 28, 25, 0, 0, 0, 29, 0, + 0, 0, 30, 0, 0, 31, 32, 0, 20, 33, 0, 0, 34, 0, 35, 0, + 0, 36, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 41, 0, 42, 0, 0, 0, 43, 44, 45, 0, 46, 0, 0, + 0, 47, 0, 48, 0, 0, 4, 49, 0, 50, 5, 17, 0, 0, 51, 52, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 58, 0, 0, 59, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 60, 61, 0, 0, 62, 5, 63, 0, 0, 64, 0, 0, 20, + 0, 0, 0, 0, 0, 0, 44, 65, 0, 66, 67, 0, 0, 67, 2, 68, + 0, 0, 0, 69, 0, 15, 70, 71, 0, 0, 72, 73, 0, 0, 0, 74, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 75, 0, 0, 0, 0, 0, 0, 0, 1, 2, 76, 77, 0, 0, 78, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 81, 0, 0, 0, 82, 0, 67, 0, 0, 83, 0, + 0, 84, 0, 0, 0, 0, 0, 85, 0, 22, 25, 86, 0, 0, 0, 0, + 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 15, 2, 0, + 0, 15, 0, 0, 0, 47, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, + 0, 81, 0, 0, 0, 0, 0, 0, 0, 90, 78, 0, 0, 0, 0, 2, + 0, 43, 91, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 93, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 94, 0, 95, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 62, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 98, 99, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 101, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_diacritic_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 129, 144, 1, + 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 224, 7, 0, 48, 4, + 48, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 2, 0, 0, 254, 255, + 251, 255, 255, 191, 22, 0, 0, 0, 0, 248, 135, 1, 0, 0, 0, 128, + 97, 28, 0, 0, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 63, 0, + 0, 0, 0, 3, 248, 255, 255, 127, 0, 0, 0, 16, 0, 32, 30, 0, + 0, 0, 2, 0, 0, 32, 0, 0, 0, 0, 0, 224, 0, 32, 32, 0, + 0, 0, 0, 24, 0, 4, 0, 0, 128, 95, 0, 0, 0, 0, 0, 4, + 0, 31, 0, 0, 0, 0, 160, 194, 220, 0, 0, 0, 64, 0, 0, 0, + 0, 0, 128, 6, 24, 62, 0, 0, 128, 191, 0, 12, 0, 254, 15, 32, + 0, 0, 0, 14, 0, 0, 224, 159, 0, 0, 255, 63, 0, 0, 16, 0, + 16, 0, 0, 0, 0, 248, 15, 0, 0, 12, 0, 0, 0, 0, 192, 0, + 0, 0, 0, 63, 255, 33, 144, 3, 0, 240, 255, 255, 240, 255, 0, 0, + 0, 0, 224, 227, 0, 0, 0, 160, 3, 224, 0, 224, 0, 224, 0, 96, + 0, 128, 3, 0, 0, 128, 0, 0, 0, 252, 0, 0, 0, 0, 0, 30, + 0, 128, 0, 176, 0, 0, 0, 48, 0, 0, 3, 0, 3, 0, 0, 0, + 0, 7, 0, 0, 255, 255, 3, 0, 0, 120, 0, 0, 0, 0, 8, 0, + 32, 0, 0, 0, 0, 0, 0, 56, 7, 0, 0, 0, 0, 0, 64, 0, + 0, 0, 0, 248, 0, 14, 0, 0, 0, 48, 0, 0, 255, 255, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 192, 8, 0, 0, 0, 96, 0, 0, 0, + 252, 0, 0, 0, 0, 0, 0, 6, 0, 0, 24, 0, 1, 28, 0, 0, + 0, 0, 96, 0, 0, 6, 0, 0, 192, 31, 31, 0, 68, 0, 0, 0, + 12, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 96, 128, 0, 0, 0, + 52, 0, 0, 0, 0, 0, 128, 0, 0, 0, 31, 0, 0, 0, 127, 0, + 0, 128, 255, 255, 128, 227, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, + 0, 240, 0, 0, 112, 7, 0, 0 +}; + +RE_UINT32 re_get_diacritic(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_diacritic_table_1[field_2]; + v = re_diacritic_table_2[(v << 5) | field_1]; + v = re_diacritic_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* East_Asian_Width. */ +static RE_UINT8 re_east_asian_width_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 2, 4, 5, 6, 7, 8, 9, 9, 9, + 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 12, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 13, 2, 2, 14, 14, 14, 14, 14, 14, 15, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 9, 9, 9, 9, + 9, 18, 9, 19, 2, 2, 2, 2, 2, 2, 2, 2, 20, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, 22, 23, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 24, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 24, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 26, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 26 +}; + +static RE_UINT8 re_east_asian_width_table_2[] = { + 0, 1, 1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 0, 0, 10, 0, + 0, 0, 11, 12, 0, 0, 13, 0, 14, 14, 14, 15, 16, 17, 18, 0, + 19, 14, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 23, 0, 24, 25, 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 0, 0, 41, 42, 0, 0, 0, 0, 0, 43, + 0, 0, 0, 14, 14, 14, 14, 44, 14, 14, 45, 46, 47, 48, 49, 50, + 51, 0, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 67, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 21, 21, 69, 21, 21, 21, 21, 21, 21, 70, 71, + 72, 73, 74, 21, 75, 21, 21, 21, 76, 77, 21, 21, 78, 21, 21, 79, + 73, 21, 80, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 81, 21, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 84, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 85, 86, 87, 88, 0, 0, 0, 0, 89, 90, 90, 91, 92, 93, 94, 95, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 97, + 21, 21, 21, 21, 21, 21, 70, 0, 98, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 73, 0, 99, 100, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 101, 0, 0, 0, 0, 0, 0, 0, 0, + 102, 0, 0, 0, 0, 0, 103, 0, 104, 105, 14, 106, 107, 108, 0, 0, + 109, 101, 110, 111, 0, 0, 0, 0, 21, 112, 21, 113, 69, 21, 114, 115, + 21, 73, 116, 21, 21, 21, 21, 117, 21, 118, 119, 120, 121, 102, 0, 122, + 21, 21, 123, 0, 21, 21, 124, 125, 0, 0, 0, 0, 0, 0, 0, 126, + 0, 0, 0, 0, 0, 0, 0, 0, 127, 128, 129, 130, 21, 21, 131, 21, + 0, 0, 0, 132, 133, 134, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 118, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 136 +}; + +static RE_UINT8 re_east_asian_width_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 2, 1, 1, 2, 1, 1, 2, 2, 0, 2, 0, 1, 2, 2, 1, + 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, + 2, 2, 0, 0, 0, 0, 2, 0, 2, 2, 2, 0, 2, 2, 0, 0, + 2, 0, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 2, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, + 2, 2, 2, 0, 2, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 2, 0, 2, 2, 2, 0, 2, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, + 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 2, + 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2, + 2, 0, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 0, + 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, + 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, + 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 2, 2, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, + 0, 0, 0, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 0, 2, 2, + 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, + 2, 0, 2, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 2, + 0, 0, 0, 0, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, + 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 2, 0, 0, 0, 0, 2, 2, 3, 2, 2, 2, 2, 2, + 2, 2, 3, 3, 2, 3, 2, 2, 2, 2, 3, 2, 2, 3, 2, 2, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, + 0, 0, 0, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 3, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, + 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4, + 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 0, 4, 4, 4, 4, 4, 4, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 3, 3, 3, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0 +}; + +RE_UINT32 re_get_east_asian_width(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_east_asian_width_table_1[field_2]; + v = re_east_asian_width_table_2[(v << 5) | field_1]; + v = re_east_asian_width_table_3[(v << 5) | field_0]; + + return v; +} + +/* Emoji. */ +static RE_UINT8 re_emoji_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +static RE_UINT8 re_emoji_table_2[] = { + 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 6, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, 10, 11, + 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32, 0, 0, 0, 0, 0, + 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 36, 37, 0, 0, 38, + 39, 40, 41, 0, 0, 0, 0, 0, 42, 43, 42, 42, 44, 42, 42, 45, + 42, 42, 42, 42, 42, 42, 42, 46, 42, 47, 48, 49, 50, 51, 52, 53, + 42, 42, 54, 0, 42, 42, 55, 56, 0, 0, 0, 0, 0, 0, 0, 57, + 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, 42, 42, 62, 42, + 0, 0, 0, 63, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_emoji_table_3[] = { + 0, 0, 0, 0, 8, 4, 255, 3, 0, 66, 0, 0, 0, 0, 0, 16, + 0, 2, 0, 0, 4, 0, 0, 2, 0, 0, 240, 3, 0, 6, 0, 0, + 0, 0, 0, 12, 0, 1, 0, 0, 0, 128, 0, 0, 0, 254, 15, 7, + 4, 0, 0, 0, 0, 12, 64, 0, 1, 0, 0, 0, 0, 0, 0, 120, + 31, 64, 50, 33, 77, 196, 0, 7, 5, 255, 15, 128, 105, 1, 0, 200, + 0, 0, 252, 26, 131, 12, 3, 96, 48, 193, 26, 0, 0, 6, 191, 39, + 36, 191, 84, 32, 2, 1, 24, 0, 144, 80, 184, 0, 24, 0, 0, 0, + 0, 0, 224, 0, 2, 0, 1, 128, 0, 0, 48, 0, 224, 0, 0, 24, + 0, 0, 33, 0, 0, 0, 1, 32, 0, 0, 128, 2, 16, 0, 0, 0, + 0, 0, 3, 192, 0, 64, 254, 7, 192, 255, 255, 255, 6, 0, 0, 4, + 0, 128, 252, 7, 0, 0, 3, 0, 255, 255, 255, 255, 243, 255, 255, 255, + 255, 255, 207, 206, 255, 255, 185, 255, 255, 255, 255, 191, 255, 255, 255, 63, + 0, 126, 255, 255, 255, 128, 249, 7, 128, 60, 97, 0, 48, 1, 6, 16, + 28, 0, 14, 112, 10, 129, 8, 252, 255, 255, 0, 0, 63, 248, 231, 0, + 63, 26, 249, 31, 255, 15, 0, 0, 0, 240, 255, 255, 255, 255, 255, 247, + 191, 255, 255, 255, 255, 255, 255, 253, 255, 239, 255, 255, 0, 0, 31, 7, + 127, 0, 255, 255, 255, 1, 127, 0, 7, 0, 127, 0 +}; + +RE_UINT32 re_get_emoji(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_emoji_table_1[field_2]; + v = re_emoji_table_2[(v << 5) | field_1]; + v = re_emoji_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Emoji_Component. */ +static RE_UINT8 re_emoji_component_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 5, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +static RE_UINT8 re_emoji_component_table_2[] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_emoji_component_table_3[] = { + 0, 0, 0, 0, 8, 4, 255, 3, 0, 32, 0, 0, 8, 0, 0, 0, + 0, 128, 0, 0, 192, 255, 255, 255, 0, 0, 0, 248, 0, 0, 15, 0, + 255, 255, 255, 255 +}; + +RE_UINT32 re_get_emoji_component(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_emoji_component_table_1[field_2]; + v = re_emoji_component_table_2[(v << 5) | field_1]; + v = re_emoji_component_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Emoji_Modifier. */ +RE_UINT32 re_get_emoji_modifier(RE_UINT32 codepoint) { + if (0x01F3FB <= codepoint && codepoint <= 0x01F3FF) + return 1; + + return 0; +} + +/* Emoji_Modifier_Base. */ +static RE_UINT8 re_emoji_modifier_base_table_1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_emoji_modifier_base_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, + 0, 0, 6, 7, 8, 9, 0, 0, 0, 0, 0, 10, 11, 0, 0, 0, + 0, 0, 12, 0, 0, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 17, 0, 18, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_emoji_modifier_base_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 2, 0, 60, 0, 0, + 32, 0, 0, 0, 156, 28, 0, 0, 204, 255, 1, 0, 192, 255, 255, 17, + 238, 128, 2, 0, 0, 4, 0, 0, 0, 0, 48, 4, 0, 0, 97, 0, + 224, 248, 0, 0, 8, 0, 112, 0, 1, 16, 0, 0, 0, 144, 0, 255, + 64, 0, 255, 115, 0, 0, 128, 0, 0, 0, 96, 11, 0, 224, 254, 63 +}; + +RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_emoji_modifier_base_table_1[field_2]; + v = re_emoji_modifier_base_table_2[(v << 5) | field_1]; + v = re_emoji_modifier_base_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Emoji_Presentation. */ +static RE_UINT8 re_emoji_presentation_table_1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_emoji_presentation_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 4, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 14, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 17, 0, 0, 0, 0, 0, + 18, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 20, 0, 0, 21, + 22, 23, 24, 0, 0, 0, 0, 0, 25, 26, 25, 27, 28, 25, 29, 30, + 25, 31, 32, 25, 25, 25, 25, 33, 25, 34, 35, 36, 37, 18, 0, 38, + 25, 25, 39, 0, 25, 25, 40, 41, 0, 0, 0, 0, 0, 0, 0, 42, + 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 25, 25, 47, 25, + 0, 0, 0, 48, 49, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_emoji_presentation_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 12, 0, 30, 9, 0, 0, 0, 0, 96, + 0, 0, 48, 0, 0, 255, 15, 0, 0, 0, 0, 128, 0, 0, 8, 0, + 2, 12, 0, 96, 48, 64, 16, 0, 0, 4, 44, 36, 32, 12, 0, 0, + 0, 1, 0, 0, 0, 80, 184, 0, 0, 0, 224, 0, 0, 0, 1, 128, + 0, 0, 0, 24, 0, 0, 33, 0, 16, 0, 0, 0, 0, 128, 0, 0, + 0, 64, 254, 7, 192, 255, 255, 255, 2, 0, 0, 4, 0, 128, 124, 7, + 0, 0, 3, 0, 255, 255, 255, 255, 1, 224, 191, 255, 255, 255, 255, 223, + 255, 255, 15, 0, 255, 135, 15, 0, 255, 255, 17, 255, 255, 255, 255, 127, + 253, 255, 255, 255, 255, 255, 255, 159, 255, 255, 255, 63, 0, 120, 255, 255, + 255, 0, 0, 4, 0, 0, 96, 0, 0, 0, 0, 248, 255, 255, 0, 0, + 63, 16, 231, 0, 0, 24, 240, 31, 255, 15, 0, 0, 0, 240, 255, 255, + 255, 255, 255, 247, 191, 255, 255, 255, 255, 255, 255, 253, 255, 239, 255, 255, + 0, 0, 31, 7, 127, 0, 255, 255, 255, 1, 127, 0, 7, 0, 127, 0 +}; + +RE_UINT32 re_get_emoji_presentation(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_emoji_presentation_table_1[field_2]; + v = re_emoji_presentation_table_2[(v << 5) | field_1]; + v = re_emoji_presentation_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Extended_Pictographic. */ +static RE_UINT8 re_extended_pictographic_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 9, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +static RE_UINT8 re_extended_pictographic_table_2[] = { + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 0, 0, 0, 0, 0, 0, 4, 0, 0, 5, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 8, 0, 9, 10, + 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 12, 13, 14, + 15, 16, 16, 16, 17, 16, 16, 16, 18, 19, 20, 21, 22, 23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 26, 0, 0, 0, 0, 0, + 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 29, 9, 0, 30, 31, 32, 16, 33, + 34, 35, 36, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 37, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 38, 39, 16, 16, 16, 16, 16, + 16, 16, 40, 0, 16, 16, 16, 16, 0, 0, 0, 41, 0, 0, 42, 16, + 43, 0, 44, 0, 45, 46, 16, 16, 47, 48, 49, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 38 +}; + +static RE_UINT8 re_extended_pictographic_table_3[] = { + 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 16, 0, 2, 0, 0, + 4, 0, 0, 2, 0, 0, 240, 3, 0, 6, 0, 0, 0, 0, 0, 12, + 0, 1, 0, 0, 0, 128, 0, 0, 0, 254, 15, 7, 4, 0, 0, 0, + 0, 12, 64, 0, 1, 0, 0, 0, 0, 0, 0, 120, 191, 255, 247, 255, + 255, 255, 255, 255, 63, 0, 255, 255, 63, 255, 87, 32, 2, 1, 24, 0, + 144, 80, 184, 0, 248, 0, 0, 0, 0, 0, 224, 0, 2, 0, 1, 128, + 0, 0, 48, 0, 224, 0, 0, 24, 0, 0, 33, 0, 0, 0, 1, 32, + 0, 0, 128, 2, 0, 224, 0, 0, 0, 240, 3, 192, 0, 64, 254, 7, + 0, 224, 255, 255, 63, 0, 0, 0, 254, 255, 0, 4, 0, 128, 252, 247, + 0, 254, 255, 255, 255, 255, 255, 7, 255, 255, 255, 63, 192, 255, 255, 255, + 255, 255, 0, 0, 0, 0, 240, 255, 0, 0, 224, 255, 0, 240, 0, 0, + 0, 255, 0, 252, 0, 255, 0, 0, 0, 192, 255, 255, 0, 240, 255, 255, + 255, 255, 255, 247, 191, 255, 255, 255 +}; + +RE_UINT32 re_get_extended_pictographic(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_extended_pictographic_table_1[field_2]; + v = re_extended_pictographic_table_2[(v << 5) | field_1]; + v = re_extended_pictographic_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Extender. */ +static RE_UINT8 re_extender_table_1[] = { + 0, 1, 2, 3, 4, 4, 5, 6, 4, 4, 4, 4, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 8, 9, 10, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, + 4, 4, 4, 4, 12, 13, 14, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 15, 16, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 17, 4, 18, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 +}; + +static RE_UINT8 re_extender_table_2[] = { + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 13, 0, 0, 14, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 6, + 0, 0, 0, 18, 0, 0, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_extender_table_3[] = { + 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 3, 0, 1, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 32, 0, 64, 0, 0, 0, 0, 4, 0, 0, + 8, 0, 0, 0, 128, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 8, + 32, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 96, 0, 0, 0, 112, + 0, 16, 0, 0, 0, 128, 0, 0, 0, 0, 1, 0, 0, 0, 0, 32, + 0, 0, 24, 0, 192, 1, 0, 0, 0, 0, 0, 1, 12, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 48, 112, 0, 0, 0 +}; + +RE_UINT32 re_get_extender(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_extender_table_1[field_2]; + v = re_extender_table_2[(v << 5) | field_1]; + v = re_extender_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* General_Category. */ +static RE_UINT8 re_general_category_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 19, 20, 20, 21, 21, 21, 21, 21, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 13, 35, 34, 34, + 34, 36, 34, 34, 34, 34, 34, 34, 34, 34, 37, 38, 13, 13, 13, 13, + 13, 39, 13, 40, 34, 34, 34, 34, 34, 34, 34, 34, 41, 34, 34, 42, + 34, 34, 34, 34, 43, 44, 45, 34, 46, 34, 47, 48, 49, 50, 51, 34, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 52, 13, 13, 13, 53, 54, 13, + 13, 13, 13, 55, 13, 13, 13, 13, 13, 13, 56, 34, 34, 34, 57, 34, + 13, 13, 13, 13, 58, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 59, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 60, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 60 +}; + +static RE_UINT16 re_general_category_table_2[] = { + 0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 7, 15, 16, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 25, 26, 27, + 28, 29, 17, 7, 30, 7, 31, 7, 7, 32, 33, 17, 34, 35, 36, 37, + 38, 39, 40, 41, 39, 39, 42, 43, 44, 45, 46, 39, 39, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 54, 101, 102, 103, 54, 104, 105, 106, 107, 108, 109, 110, 54, + 39, 111, 112, 113, 114, 28, 115, 116, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 117, 39, 118, 119, 120, 39, 121, 39, 122, 123, 124, 28, 28, 125, + 126, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 127, 128, 39, 39, 129, 130, 131, 132, 133, 39, 134, 135, 136, + 137, 39, 138, 139, 140, 141, 39, 142, 143, 144, 145, 146, 39, 147, 148, 149, + 150, 39, 151, 152, 153, 154, 155, 54, 156, 157, 158, 159, 160, 161, 39, 162, + 39, 163, 164, 165, 166, 167, 168, 169, 17, 170, 171, 172, 173, 171, 22, 174, + 7, 7, 7, 7, 175, 7, 7, 7, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 200, 200, 200, 200, 200, 200, 200, 201, 202, 149, 203, 204, 205, 206, 207, + 149, 208, 209, 210, 211, 149, 149, 212, 149, 149, 149, 149, 149, 213, 214, 215, + 149, 149, 149, 216, 149, 149, 149, 149, 149, 149, 149, 217, 218, 149, 219, 220, + 149, 149, 149, 149, 149, 149, 149, 149, 200, 200, 200, 200, 221, 200, 222, 223, + 200, 200, 200, 200, 200, 200, 200, 200, 149, 224, 225, 226, 227, 149, 149, 149, + 28, 228, 229, 230, 7, 7, 7, 231, 17, 232, 39, 233, 234, 235, 235, 22, + 236, 237, 238, 54, 239, 149, 149, 240, 149, 149, 149, 149, 149, 149, 241, 242, + 243, 244, 98, 39, 245, 126, 39, 246, 247, 248, 39, 39, 249, 39, 149, 250, + 251, 252, 253, 149, 252, 254, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 149, 149, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 255, + 256, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 257, 149, 258, 165, 39, 39, 39, 39, 39, 39, 39, 39, + 259, 260, 7, 261, 262, 39, 39, 263, 264, 265, 7, 266, 267, 268, 269, 270, + 271, 272, 39, 273, 274, 275, 276, 277, 48, 278, 279, 255, 58, 280, 281, 282, + 39, 283, 284, 285, 39, 286, 287, 288, 289, 290, 291, 292, 17, 17, 39, 293, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 294, 295, 296, + 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, + 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 299, 39, 39, 300, 54, 301, 302, 303, 39, 39, 304, 305, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 306, 307, 39, 308, 39, 309, 310, + 311, 312, 313, 314, 39, 39, 39, 315, 316, 2, 317, 318, 319, 143, 320, 321, + 322, 323, 324, 54, 39, 39, 39, 325, 326, 327, 195, 328, 329, 330, 331, 332, + 54, 54, 54, 54, 255, 39, 333, 334, 39, 335, 336, 337, 338, 39, 339, 54, + 28, 340, 341, 39, 342, 343, 344, 345, 39, 346, 39, 347, 54, 54, 54, 54, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 234, 142, 309, 54, 54, 54, 54, + 348, 349, 350, 351, 143, 352, 54, 353, 354, 355, 54, 54, 39, 356, 357, 210, + 358, 359, 360, 361, 362, 54, 363, 364, 39, 365, 366, 367, 368, 369, 54, 54, + 39, 39, 370, 54, 28, 371, 17, 372, 39, 373, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 374, 39, 375, 54, 54, 362, 376, 377, 54, 54, 307, 378, 234, + 379, 380, 381, 382, 160, 383, 384, 385, 386, 387, 388, 389, 160, 390, 391, 392, + 393, 394, 54, 54, 395, 396, 397, 398, 399, 400, 401, 402, 54, 54, 54, 54, + 39, 403, 404, 405, 39, 406, 407, 54, 54, 54, 54, 54, 39, 408, 409, 54, + 39, 410, 411, 412, 39, 413, 414, 54, 122, 415, 54, 54, 54, 54, 54, 54, + 39, 416, 54, 54, 54, 28, 17, 417, 418, 419, 420, 54, 54, 421, 422, 423, + 424, 425, 426, 39, 427, 428, 39, 139, 54, 54, 54, 54, 54, 54, 54, 54, + 429, 430, 431, 432, 433, 434, 54, 54, 435, 436, 437, 438, 439, 414, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 440, 54, 54, 54, 54, 54, 441, 442, 443, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 300, 54, 54, 54, + 195, 195, 195, 444, 39, 39, 39, 39, 39, 39, 445, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 446, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 447, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 139, 143, 448, 54, 54, 307, 449, 39, 450, 451, 452, 453, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 28, 17, 454, 54, 54, 54, 39, 39, 455, 456, 457, 54, 54, 458, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 459, + 39, 39, 39, 39, 39, 39, 142, 54, 370, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 39, 39, 39, 39, 39, 39, 39, 143, 54, 460, 461, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 296, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 39, 39, 462, 463, 464, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 149, 149, 149, 149, 149, 149, 149, 241, 149, 465, 149, 466, 467, 468, 149, 469, + 149, 149, 470, 54, 54, 54, 54, 471, 149, 149, 472, 473, 54, 54, 54, 54, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 474, 475, 487, + 477, 488, 489, 490, 481, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 22, 502, 22, 503, 504, 505, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 506, 507, 54, 54, 54, 54, 54, 54, 39, 508, 509, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 39, 510, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 39, 39, 39, 39, 39, 511, 54, 28, 512, 513, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 514, 210, 515, 54, 54, 516, 517, 54, 54, 54, 54, 54, 54, + 518, 519, 520, 521, 522, 523, 54, 524, 54, 54, 54, 54, 54, 54, 54, 54, + 149, 525, 149, 149, 240, 526, 527, 241, 528, 149, 149, 149, 149, 529, 54, 530, + 531, 532, 533, 534, 54, 54, 54, 54, 149, 149, 149, 149, 149, 149, 149, 535, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 536, 537, 149, 149, 149, 240, 149, 149, 538, 539, + 525, 149, 540, 149, 541, 542, 54, 54, 149, 149, 149, 543, 149, 149, 544, 149, + 149, 149, 240, 545, 546, 547, 548, 54, 149, 149, 149, 149, 549, 149, 209, 550, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 342, 54, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 551, 39, 39, 39, 39, 39, 39, + 342, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 552, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 553, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 342, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 53, 54, 54, 54, 54, 54, + 554, 555, 555, 555, 54, 54, 54, 54, 22, 22, 22, 22, 22, 22, 22, 556, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 557 +}; + +static RE_UINT8 re_general_category_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 3, 3, 4, 3, 3, 3, 5, 6, 3, 7, 3, 8, 3, 3, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 7, 7, 7, 3, + 3, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 3, 6, 11, 12, + 11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 7, 6, 7, 1, + 2, 3, 4, 4, 4, 4, 14, 3, 11, 14, 15, 16, 7, 17, 14, 11, + 14, 7, 18, 18, 11, 13, 3, 3, 11, 18, 15, 19, 18, 18, 18, 3, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 7, 10, 10, 10, 10, 10, 10, 10, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 7, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 13, 10, 13, 10, 13, 10, 13, 10, + 13, 10, 13, 10, 13, 10, 13, 10, 13, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 10, 13, 10, 13, 10, 13, 13, + 13, 10, 10, 13, 10, 13, 10, 10, 13, 10, 10, 10, 13, 13, 10, 10, + 10, 10, 13, 10, 10, 13, 10, 10, 10, 13, 13, 13, 10, 10, 13, 10, + 10, 13, 10, 13, 10, 13, 10, 10, 13, 10, 13, 13, 10, 13, 10, 10, + 13, 10, 10, 10, 13, 10, 13, 10, 10, 13, 13, 15, 10, 13, 13, 13, + 15, 15, 15, 15, 10, 20, 13, 10, 20, 13, 10, 20, 13, 10, 13, 10, + 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 13, 10, 20, 13, 10, 13, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 13, 13, 13, 13, 13, 13, 10, 10, 13, 10, 10, 13, + 13, 10, 13, 10, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 15, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 11, 11, 11, 11, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 21, 21, 21, 21, 21, 11, 11, 11, 11, 11, 11, 11, 21, 11, 21, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 10, 13, 10, 13, 21, 11, 10, 13, 0, 0, 21, 13, 13, 13, 3, 10, + 0, 0, 0, 0, 11, 11, 10, 3, 10, 10, 10, 0, 10, 0, 10, 10, + 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, + 13, 13, 10, 10, 10, 13, 13, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 13, 13, 13, 13, 10, 13, 7, 10, 13, 10, 10, 13, 13, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 13, 14, 22, 22, 22, 22, 22, 23, 23, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 21, 3, 3, 3, 3, 3, 3, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 3, 8, 0, 0, 14, 14, 4, + 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 8, 22, + 3, 22, 22, 3, 22, 22, 3, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, + 15, 15, 15, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 7, 7, 7, 3, 3, 4, 3, 3, 14, 14, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 3, 17, 0, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 15, 15, + 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 3, 15, 22, 22, 22, 22, 22, 22, 22, 17, 14, 22, + 22, 22, 22, 22, 22, 21, 21, 22, 22, 14, 22, 22, 22, 22, 15, 15, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 14, 14, 15, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 17, + 15, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 21, 21, 14, 3, 3, 3, 21, 0, 0, 22, 4, 4, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 21, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 21, 22, 22, 22, 21, 22, 22, 22, 22, 22, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 0, 0, 3, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 17, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 24, 22, 15, 24, 24, + 24, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 24, 22, 24, 24, + 15, 22, 22, 22, 22, 22, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 22, 22, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 3, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 22, 24, 24, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, + 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 0, 0, 0, 15, 15, 15, 15, 0, 0, 22, 15, 24, 24, + 24, 22, 22, 22, 22, 0, 0, 24, 24, 0, 0, 24, 24, 22, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 15, 15, 0, 15, + 15, 15, 22, 22, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 15, 15, 4, 4, 18, 18, 18, 18, 18, 18, 14, 4, 15, 3, 22, 0, + 0, 22, 22, 24, 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, + 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 15, 0, 15, 15, 0, 15, 15, 0, 0, 22, 0, 24, 24, + 24, 22, 22, 0, 0, 0, 0, 22, 22, 0, 0, 22, 22, 22, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 22, 22, 15, 15, 15, 22, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 22, 24, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, + 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, 22, 15, 24, 24, + 24, 22, 22, 22, 22, 22, 0, 22, 22, 24, 0, 24, 24, 22, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 22, 22, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 3, 4, 0, 0, 0, 0, 0, 0, 0, 15, 22, 22, 22, 22, 22, 22, + 0, 22, 24, 24, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, + 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, 22, 15, 24, 22, + 24, 22, 22, 22, 22, 0, 0, 24, 24, 0, 0, 24, 24, 22, 0, 0, + 0, 0, 0, 0, 0, 22, 22, 24, 0, 0, 0, 0, 15, 15, 0, 15, + 15, 15, 22, 22, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 14, 15, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 15, 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, + 15, 0, 15, 15, 15, 15, 0, 0, 0, 15, 15, 0, 15, 0, 15, 15, + 0, 0, 0, 15, 15, 0, 0, 0, 15, 15, 15, 0, 0, 0, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 24, 24, + 22, 24, 24, 0, 0, 0, 24, 24, 24, 0, 24, 24, 24, 22, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 18, 18, 18, 14, 14, 14, 14, 14, 14, 4, 14, 0, 0, 0, 0, 0, + 22, 24, 24, 24, 22, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, + 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 22, 22, + 22, 24, 24, 24, 24, 0, 22, 22, 22, 0, 22, 22, 22, 22, 0, 0, + 0, 0, 0, 0, 0, 22, 22, 0, 15, 15, 15, 0, 0, 0, 0, 0, + 15, 15, 22, 22, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 3, 18, 18, 18, 18, 18, 18, 18, 14, + 15, 22, 24, 24, 3, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, + 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, 22, 15, 24, 22, + 24, 24, 24, 24, 24, 0, 22, 24, 24, 0, 24, 24, 22, 22, 0, 0, + 0, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 15, 15, 22, 22, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 22, 24, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, + 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 15, 24, 24, + 24, 22, 22, 22, 22, 0, 24, 24, 24, 0, 24, 24, 24, 22, 15, 14, + 0, 0, 0, 0, 15, 15, 15, 24, 18, 18, 18, 18, 18, 18, 18, 15, + 15, 15, 22, 22, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 15, 15, 15, 15, 15, 15, + 0, 22, 24, 24, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 22, 0, 0, 0, 0, 24, + 24, 24, 22, 22, 22, 0, 22, 0, 24, 24, 24, 24, 24, 24, 24, 24, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 24, 24, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 22, 15, 15, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, 4, + 15, 15, 15, 15, 15, 15, 21, 22, 22, 22, 22, 22, 22, 22, 22, 3, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 0, 0, 0, 0, + 0, 15, 15, 0, 15, 0, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 0, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 22, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 15, 0, 0, + 15, 15, 15, 15, 15, 0, 21, 0, 22, 22, 22, 22, 22, 22, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 15, 15, 15, 15, + 15, 14, 14, 14, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 14, 3, 14, 14, 14, 22, 22, 14, 14, 14, 14, 14, 14, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 14, 22, 14, 22, 14, 22, 5, 6, 5, 6, 24, 24, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, + 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24, + 22, 22, 22, 22, 22, 3, 22, 22, 15, 15, 15, 15, 15, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 14, 14, + 14, 14, 14, 14, 14, 14, 22, 14, 14, 14, 14, 14, 14, 0, 14, 14, + 3, 3, 3, 3, 3, 14, 14, 14, 14, 3, 3, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 22, 22, 22, + 22, 24, 22, 22, 22, 22, 22, 22, 24, 22, 22, 24, 24, 22, 22, 15, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, + 15, 15, 15, 15, 15, 15, 24, 24, 22, 22, 15, 15, 15, 15, 22, 22, + 22, 15, 24, 24, 24, 15, 15, 24, 24, 24, 24, 24, 24, 24, 15, 15, + 15, 22, 22, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 22, 24, 24, 22, 22, 24, 24, 24, 24, 24, 24, 22, 15, 24, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 24, 24, 24, 22, 14, 14, + 10, 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, 0, 0, 10, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 3, 21, 13, 13, 13, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 0, + 15, 0, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 22, 22, 22, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 0, 0, 13, 13, 13, 13, 13, 13, 0, 0, + 8, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 3, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 5, 6, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 3, 3, 25, 25, + 25, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, + 15, 15, 22, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 22, 22, 22, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, + 15, 0, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 22, 22, 24, 22, 22, 22, 22, 22, 22, 22, 24, 24, + 24, 24, 24, 24, 24, 24, 22, 24, 24, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 3, 3, 3, 21, 3, 3, 3, 4, 15, 22, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 8, 3, 3, 3, 3, 22, 22, 22, 17, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 15, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 22, 22, 22, 24, 24, 24, 24, 22, 22, 24, 24, 24, 0, 0, 0, 0, + 24, 24, 22, 24, 24, 24, 24, 24, 24, 22, 22, 22, 0, 0, 0, 0, + 14, 0, 0, 0, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 0, 0, 0, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 22, 22, 24, 24, 22, 0, 0, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 24, 22, 24, 22, 22, 22, 22, 22, 22, 22, 0, + 22, 24, 22, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, + 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 22, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 21, 3, 3, 3, 3, 3, 3, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 22, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 22, 24, 22, 22, 22, 22, 22, 24, 22, 24, 24, 24, + 24, 24, 22, 24, 24, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, + 3, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 22, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 24, 22, 22, 22, 22, 24, 24, 22, 22, 24, 22, 22, 22, 15, 15, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 22, 24, 22, 22, 24, 24, 24, 22, 24, 22, + 22, 22, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, + 15, 15, 15, 15, 24, 24, 24, 24, 24, 24, 24, 24, 22, 22, 22, 22, + 22, 22, 22, 22, 24, 24, 22, 22, 0, 0, 0, 3, 3, 3, 3, 3, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 15, 15, 15, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 21, 21, 21, 21, 21, 21, 3, 3, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 3, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 24, 22, 22, 22, 22, 22, 22, 22, 15, 15, 15, 15, 22, 15, 15, + 15, 15, 15, 15, 22, 15, 15, 24, 22, 22, 15, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 21, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, 21, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 0, 0, 10, 10, 10, 10, 10, 10, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 0, 0, 10, 10, 10, 10, 10, 10, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 10, 0, 10, 0, 10, 0, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 20, 20, 20, 20, 20, 20, 20, 20, + 13, 13, 13, 13, 13, 13, 13, 13, 20, 20, 20, 20, 20, 20, 20, 20, + 13, 13, 13, 13, 13, 13, 13, 13, 20, 20, 20, 20, 20, 20, 20, 20, + 13, 13, 13, 13, 13, 0, 13, 13, 10, 10, 10, 10, 20, 11, 13, 11, + 11, 11, 13, 13, 13, 0, 13, 13, 10, 10, 10, 10, 20, 11, 11, 11, + 13, 13, 13, 13, 0, 0, 13, 13, 10, 10, 10, 10, 0, 11, 11, 11, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 11, 11, 11, + 0, 0, 13, 13, 13, 0, 13, 13, 10, 10, 10, 10, 20, 11, 11, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17, 17, + 8, 8, 8, 8, 8, 8, 3, 3, 16, 19, 5, 16, 16, 19, 5, 16, + 3, 3, 3, 3, 3, 3, 3, 3, 26, 27, 17, 17, 17, 17, 17, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 16, 19, 3, 3, 3, 3, 12, + 12, 3, 3, 3, 7, 5, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 7, 3, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, + 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 18, 21, 0, 0, 18, 18, 18, 18, 18, 18, 7, 7, 7, 5, 6, 21, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 7, 7, 7, 5, 6, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, + 23, 22, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 10, 14, 14, 14, 14, 10, 14, 14, 13, 10, 10, 10, 13, 13, + 10, 10, 10, 13, 14, 10, 14, 14, 7, 10, 10, 10, 10, 10, 14, 14, + 14, 14, 14, 14, 10, 14, 10, 14, 10, 14, 10, 10, 10, 10, 14, 13, + 10, 10, 10, 10, 13, 15, 15, 15, 15, 13, 14, 14, 13, 13, 10, 10, + 7, 7, 7, 7, 7, 10, 13, 13, 13, 13, 14, 7, 14, 14, 13, 14, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 10, 13, 25, 25, 25, 25, 18, 14, 14, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 7, 7, 14, 14, 14, 14, + 7, 14, 14, 7, 14, 14, 7, 14, 14, 14, 14, 14, 14, 14, 7, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, + 14, 14, 7, 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 14, 14, 14, 14, 14, 14, 14, 14, 5, 6, 5, 6, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 7, 7, 14, 14, 14, 14, 14, 14, 14, 5, 6, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, + 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 5, 6, 5, 6, 5, 6, 5, 6, + 5, 6, 5, 6, 5, 6, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 7, 7, 7, 7, 7, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 6, 5, 6, 5, 6, 5, 6, 5, 6, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 5, 6, 5, 6, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 6, 7, 7, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 14, 14, 7, 7, 7, 7, 7, 7, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, + 10, 13, 10, 10, 10, 13, 13, 10, 13, 10, 13, 10, 13, 10, 10, 10, + 10, 13, 10, 13, 13, 10, 13, 13, 13, 13, 13, 13, 21, 21, 10, 10, + 10, 13, 10, 13, 13, 14, 14, 14, 14, 14, 14, 10, 13, 10, 13, 22, + 22, 22, 10, 13, 0, 0, 0, 0, 0, 3, 3, 3, 3, 18, 3, 3, + 13, 13, 13, 13, 13, 13, 0, 13, 0, 0, 0, 0, 0, 13, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 21, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, + 3, 3, 16, 19, 16, 19, 3, 3, 3, 16, 19, 3, 16, 19, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 8, 3, 3, 8, 3, 16, 19, 3, 3, + 16, 19, 5, 6, 5, 6, 5, 6, 5, 6, 3, 3, 3, 3, 3, 21, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, + 8, 3, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 14, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 2, 3, 3, 3, 14, 21, 15, 25, 5, 6, 5, 6, 5, 6, 5, 6, + 5, 6, 14, 14, 5, 6, 5, 6, 5, 6, 5, 6, 8, 5, 6, 6, + 14, 25, 25, 25, 25, 25, 25, 25, 25, 25, 22, 22, 22, 22, 24, 24, + 8, 21, 21, 21, 21, 21, 14, 14, 25, 25, 25, 21, 15, 3, 14, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 22, 22, 11, 11, 21, 21, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 21, 21, 21, 15, + 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 14, 14, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, + 14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 21, 3, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 15, 22, + 23, 23, 23, 3, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 3, 21, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 21, 21, 22, 22, + 15, 15, 15, 15, 15, 15, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 22, 22, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 11, 11, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 13, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 21, 13, 13, 13, 13, 13, 13, 13, 13, 10, 13, 10, 13, 10, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 21, 11, 11, 10, 13, 10, 13, 15, + 10, 13, 10, 13, 13, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 10, 10, 10, 10, 13, + 10, 10, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, + 0, 0, 10, 13, 10, 10, 10, 10, 13, 10, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 13, 15, 21, 21, 13, 15, 15, 15, 15, 15, + 15, 15, 22, 15, 15, 15, 22, 15, 15, 15, 15, 22, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 24, 24, 22, 22, 24, 14, 14, 14, 14, 22, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 14, 14, 4, 14, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 15, 15, 15, 15, 15, 15, 3, 3, 3, 15, 3, 15, 15, 22, + 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 22, 24, 24, 22, 22, 22, 22, 24, 24, 22, 22, 24, 24, + 24, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 3, 3, + 15, 15, 15, 15, 15, 22, 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 15, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 24, + 24, 22, 22, 24, 24, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 22, 15, 15, 15, 15, 15, 15, 15, 15, 22, 24, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 3, 3, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 21, 15, 15, 15, 15, 15, 15, 14, 14, 14, 15, 24, 22, 24, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 22, 15, 22, 22, 22, 15, 15, 22, 22, 15, 15, 15, 15, 15, 22, 22, + 15, 22, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 21, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 22, 22, 24, 24, + 3, 3, 15, 21, 21, 24, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 0, + 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 11, 21, 21, 21, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 11, 11, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 15, 15, 15, 24, 24, 22, 24, 24, 22, 24, 24, 3, 24, 22, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 15, 22, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 15, 0, + 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 6, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 4, 14, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 3, 3, 3, 3, 3, 3, 3, 5, 6, 3, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 3, 8, 8, 12, 12, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 6, 5, 6, 5, 6, 3, 3, 5, 6, 3, 3, 3, 3, 12, 12, 12, + 3, 3, 3, 0, 3, 3, 3, 3, 8, 5, 6, 5, 6, 5, 6, 3, + 3, 3, 7, 8, 7, 7, 7, 0, 3, 4, 3, 3, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 17, + 0, 3, 3, 3, 4, 3, 3, 3, 5, 6, 3, 7, 3, 8, 3, 3, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 7, 7, 7, 3, + 11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 7, 6, 7, 5, + 6, 3, 5, 6, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 21, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 21, 21, + 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, + 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 0, 0, 0, + 4, 4, 7, 11, 14, 4, 4, 0, 14, 7, 7, 7, 7, 14, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 14, 14, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, + 3, 3, 3, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 14, 14, 14, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, + 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 25, 15, 15, 15, 15, 15, 15, 15, 15, 25, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 3, + 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 3, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 0, 0, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 0, 0, 15, 0, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 3, 18, 18, 18, 18, 18, 18, 18, 18, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 14, 14, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 0, 15, 15, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 18, 18, 18, 18, 18, 18, 0, 0, 0, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 18, 18, 15, 15, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 15, 22, 22, 22, 0, 22, 22, 0, 0, 0, 0, 0, 22, 22, 22, 22, + 15, 15, 15, 15, 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 0, 22, 22, 22, 0, 0, 0, 0, 22, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, 18, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, 18, 18, + 15, 15, 15, 15, 15, 15, 15, 15, 14, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 22, 22, 0, 0, 0, 0, 18, 18, 18, 18, 18, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, + 15, 15, 15, 15, 22, 22, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 22, 22, 8, 0, 0, + 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 18, 18, 18, 18, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 22, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 3, 3, 3, 3, 3, 3, 3, 0, 0, + 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 24, 24, 24, 22, 22, 22, 22, 24, 24, 22, 22, 3, 3, 17, 3, 3, + 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 24, 22, 22, 22, + 22, 22, 22, 22, 22, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 3, 3, 3, 3, 15, 24, 24, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 22, 3, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24, + 24, 15, 15, 15, 15, 3, 3, 3, 3, 22, 22, 22, 22, 3, 24, 22, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 3, 15, 3, 3, 3, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 24, 22, + 22, 22, 24, 24, 22, 24, 22, 22, 3, 3, 3, 3, 3, 3, 22, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 15, 15, 15, 15, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, + 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 22, 22, 24, 24, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, + 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 0, 22, 22, 15, 24, 24, + 22, 24, 24, 24, 24, 0, 0, 24, 24, 0, 0, 24, 24, 24, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 15, 15, 15, + 15, 15, 24, 24, 0, 0, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, + 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, + 24, 24, 22, 22, 22, 24, 22, 15, 15, 15, 15, 3, 3, 3, 3, 3, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 0, 3, 22, 15, + 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 24, 24, 24, 22, 22, 22, 22, 22, 22, 24, 22, 24, 24, 24, 24, 22, + 22, 24, 22, 22, 15, 15, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, + 24, 24, 22, 22, 22, 22, 0, 0, 24, 24, 24, 24, 22, 22, 24, 22, + 22, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 15, 15, 15, 15, 22, 22, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 22, 24, 22, + 22, 3, 3, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 24, 22, 24, 24, + 22, 22, 22, 22, 22, 22, 24, 22, 15, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 22, 22, 22, 22, 24, 22, 22, 22, 22, 22, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 3, 3, 3, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 24, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 24, 22, 22, 3, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 0, 0, 15, 15, 15, 15, + 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 24, 24, 24, 24, 24, 24, 0, 24, 24, 0, 0, 22, 22, 24, 22, 15, + 24, 15, 24, 22, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 24, 24, 24, 22, 22, 22, 22, 0, 0, 22, 22, 24, 24, 24, 24, + 22, 15, 3, 15, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 22, 22, 22, 22, 22, 22, 24, 15, 22, 22, 22, 22, 3, + 3, 3, 3, 3, 3, 3, 3, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 22, 22, 22, 22, 22, 22, 24, 24, 22, 22, 22, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 24, 22, 22, 3, 3, 3, 15, 3, 3, + 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, + 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, 24, 22, + 15, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, + 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 0, 24, 22, 22, 22, 22, 22, 22, + 22, 24, 22, 22, 24, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 22, 22, 22, 22, 22, 22, 0, 0, 0, 22, 0, 22, 22, 0, 22, + 22, 22, 22, 22, 22, 22, 15, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 24, 24, 24, 24, 0, + 22, 22, 0, 24, 24, 22, 24, 22, 15, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 22, 22, 24, 24, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 4, 4, 4, + 4, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, + 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 22, 22, 22, 22, 22, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 22, 22, 22, 22, 22, 22, 22, 3, 3, 3, 3, 3, 14, 14, 14, 14, + 21, 21, 21, 21, 3, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 18, 18, 18, 18, 18, + 18, 18, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 3, 3, 3, 3, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 22, + 15, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 22, + 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 3, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 14, 22, 22, 3, + 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 24, 24, 22, 22, 22, 14, 14, 14, 24, 24, 24, + 24, 24, 24, 17, 17, 17, 17, 17, 17, 17, 17, 22, 22, 22, 22, 22, + 22, 22, 22, 14, 14, 22, 22, 22, 22, 22, 22, 22, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22, 22, 22, 22, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 22, 22, 22, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, + 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 0, 10, 10, + 0, 0, 10, 0, 0, 10, 10, 0, 0, 10, 10, 10, 10, 0, 10, 10, + 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 0, 13, 0, 13, 13, 13, + 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 10, 10, 0, 10, 10, 10, 10, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 0, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 0, 10, 10, 10, 10, 0, + 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, 10, 10, 10, 10, 10, 10, + 10, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 13, 13, 13, 13, + 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 7, 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 7, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, + 13, 13, 13, 13, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 13, 13, 13, 13, 13, 13, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 7, 13, 13, 13, 13, 13, 13, 10, 13, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 14, 14, 14, 14, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 14, 14, 14, + 14, 14, 14, 14, 14, 22, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 22, 14, 14, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 22, 22, + 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 22, 22, 22, 22, 22, + 22, 22, 0, 22, 22, 0, 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 15, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 22, 22, 22, 22, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 4, + 15, 15, 15, 15, 15, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 22, 22, 22, 22, 22, 22, 22, 21, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 18, 18, 18, + 4, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, + 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 0, 15, 15, 0, 15, 0, 0, 15, 0, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 0, 15, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, 0, 15, 0, 15, 0, 15, 0, 15, 15, 15, + 0, 15, 15, 0, 15, 0, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, + 0, 15, 15, 0, 15, 0, 0, 15, 15, 15, 15, 0, 15, 15, 15, 15, + 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, + 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, 0 +}; + +RE_UINT32 re_get_general_category(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_general_category_table_1[field_2]; + v = re_general_category_table_2[(v << 5) | field_1]; + v = re_general_category_table_3[(v << 5) | field_0]; + + return v; +} + +/* Graph. */ +static RE_UINT8 re_graph_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 14, 13, 15, 16, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 17, 18, 18, 13, 13, 13, 13, 13, 13, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 18, 18, 13, 31, 18, 18, + 18, 32, 18, 18, 18, 18, 18, 18, 18, 18, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 18, 18, 18, 18, 18, 18, 18, 18, 37, 18, 18, 38, + 18, 18, 18, 18, 39, 40, 41, 18, 42, 18, 43, 44, 45, 46, 47, 18, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 48, 13, 13, 13, 49, 50, 13, + 13, 13, 13, 51, 13, 13, 13, 13, 13, 13, 52, 18, 18, 18, 53, 18, + 13, 13, 13, 13, 54, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56 +}; + +static RE_UINT16 re_graph_table_2[] = { + 0, 1, 2, 3, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 5, 6, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 8, 2, 9, 2, 10, 11, + 12, 2, 2, 2, 2, 2, 2, 2, 13, 2, 14, 2, 2, 15, 2, 16, + 2, 17, 18, 19, 0, 20, 21, 2, 2, 2, 2, 2, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 31, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 41, 45, 46, 47, 41, 2, 48, 49, 50, 51, 52, 53, + 1, 54, 55, 0, 56, 57, 58, 0, 2, 2, 59, 60, 61, 12, 62, 0, + 2, 2, 2, 2, 2, 2, 63, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 64, 2, 65, 66, 67, 2, 68, 2, 16, 69, 70, 2, 2, 71, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 72, 2, 2, 73, 74, 75, 76, 77, 2, 2, 78, 79, + 80, 2, 2, 73, 2, 81, 2, 82, 3, 83, 84, 85, 2, 86, 87, 2, + 88, 2, 3, 89, 79, 90, 91, 0, 2, 2, 86, 69, 2, 2, 2, 92, + 2, 93, 94, 2, 95, 16, 10, 96, 2, 2, 2, 2, 2, 2, 2, 97, + 2, 2, 2, 2, 2, 2, 2, 2, 71, 2, 98, 78, 2, 20, 99, 100, + 101, 102, 3, 103, 104, 2, 105, 106, 2, 2, 2, 2, 86, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 107, 19, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 108, 109, 2, 2, 2, + 2, 110, 3, 2, 2, 2, 2, 111, 2, 63, 2, 112, 75, 113, 113, 2, + 2, 2, 114, 0, 97, 2, 2, 76, 2, 2, 2, 2, 2, 2, 82, 115, + 1, 2, 1, 2, 8, 2, 2, 2, 116, 7, 2, 2, 110, 2, 2, 117, + 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 69, + 2, 2, 2, 2, 118, 2, 119, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 120, 2, 2, 2, 2, 2, 121, 2, 2, 2, 2, 2, 2, 122, 123, + 2, 124, 2, 121, 2, 2, 125, 2, 2, 2, 126, 69, 2, 2, 127, 3, + 2, 75, 128, 2, 2, 2, 129, 75, 130, 131, 2, 86, 2, 2, 2, 132, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 117, 133, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 90, 2, 2, 70, 0, 134, 135, 136, 2, 2, 2, 137, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 105, 2, 138, 2, 139, 140, + 70, 2, 141, 142, 2, 2, 2, 89, 1, 2, 2, 2, 2, 3, 143, 144, + 145, 146, 147, 0, 2, 2, 2, 96, 148, 149, 2, 2, 104, 91, 105, 78, + 0, 0, 0, 0, 69, 2, 106, 55, 2, 150, 81, 96, 151, 2, 152, 0, + 2, 2, 2, 2, 78, 153, 154, 55, 2, 10, 2, 155, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 75, 82, 139, 0, 0, 0, 0, + 156, 157, 109, 2, 3, 158, 0, 159, 160, 161, 0, 0, 2, 162, 138, 2, + 163, 164, 165, 2, 2, 0, 2, 166, 2, 167, 168, 169, 170, 171, 0, 0, + 2, 2, 172, 0, 2, 114, 2, 173, 2, 174, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 2, 175, 0, 0, 2, 10, 70, 0, 0, 105, 120, 75, + 2, 2, 176, 177, 2, 2, 178, 179, 2, 20, 10, 75, 2, 2, 2, 180, + 181, 3, 0, 0, 182, 153, 2, 183, 22, 184, 185, 186, 0, 0, 0, 0, + 2, 2, 187, 188, 2, 2, 174, 0, 0, 0, 0, 0, 2, 168, 78, 0, + 2, 2, 189, 190, 2, 73, 191, 0, 16, 86, 0, 0, 0, 0, 0, 0, + 2, 55, 0, 0, 0, 2, 2, 192, 193, 194, 195, 0, 0, 196, 4, 197, + 2, 2, 10, 2, 2, 198, 2, 73, 0, 0, 0, 0, 0, 0, 0, 0, + 199, 200, 201, 118, 138, 202, 0, 0, 203, 204, 174, 205, 206, 191, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 207, 2, 208, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 70, 0, 0, 0, + 2, 2, 2, 209, 2, 2, 2, 2, 2, 2, 210, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 73, 3, 212, 0, 0, 105, 213, 2, 2, 214, 215, 216, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 96, 0, 0, 0, 2, 2, 217, 2, 218, 0, 0, 219, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 121, + 2, 2, 2, 2, 2, 2, 82, 0, 172, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 220, 221, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 222, 223, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 82, 2, 224, 2, 2, 2, 2, 2, 172, + 2, 2, 225, 0, 0, 0, 0, 76, 2, 2, 75, 73, 0, 0, 0, 0, + 2, 2, 20, 2, 12, 226, 227, 2, 228, 229, 230, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 231, 2, 2, 2, 2, 2, 2, 2, 2, 232, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 233, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 235, 236, 0, 0, 0, 0, 0, 0, 2, 237, 212, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 161, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 238, 0, 2, 2, 239, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 2, 241, 0, 0, 1, 78, 0, 0, 0, 0, 0, 0, + 227, 242, 243, 244, 245, 246, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 86, 2, 2, 76, 248, 249, 82, 2, 2, 2, 2, 2, 250, 0, 251, + 252, 55, 253, 225, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 121, 254, 2, 2, 2, 76, 2, 2, 73, 120, + 86, 2, 174, 2, 10, 255, 0, 0, 2, 2, 2, 256, 2, 2, 145, 2, + 2, 2, 76, 257, 119, 258, 259, 0, 2, 2, 2, 2, 141, 2, 19, 260, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 78, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 241, 2, 2, 2, 2, 2, 2, + 78, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 261, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 91, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 19, 0, 0, 0, 0, 0, + 262, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 216, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 78 +}; + +static RE_UINT8 re_graph_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, + 255, 255, 255, 252, 240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 254, 255, + 255, 255, 127, 254, 255, 231, 254, 255, 255, 0, 255, 255, 255, 135, 31, 0, + 255, 255, 255, 223, 255, 191, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, + 255, 255, 255, 231, 255, 63, 255, 127, 255, 255, 255, 79, 255, 7, 0, 0, + 255, 255, 223, 255, 255, 0, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243, + 159, 121, 128, 176, 207, 255, 255, 127, 238, 135, 249, 255, 255, 253, 109, 211, + 135, 57, 2, 94, 192, 255, 127, 0, 238, 191, 251, 255, 255, 253, 237, 243, + 191, 59, 1, 0, 207, 255, 3, 254, 238, 159, 249, 255, 159, 57, 224, 176, + 207, 255, 255, 0, 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, + 192, 255, 255, 7, 255, 223, 253, 255, 255, 253, 255, 227, 223, 61, 96, 7, + 207, 255, 128, 255, 255, 253, 239, 243, 223, 61, 96, 64, 207, 255, 6, 0, + 223, 253, 240, 255, 207, 255, 255, 255, 238, 255, 127, 252, 255, 255, 251, 47, + 127, 132, 95, 255, 192, 255, 28, 0, 255, 255, 255, 135, 255, 255, 255, 15, + 214, 247, 255, 255, 175, 255, 255, 63, 95, 63, 255, 243, 255, 254, 255, 255, + 255, 31, 254, 255, 255, 255, 255, 254, 255, 223, 255, 7, 191, 32, 255, 255, + 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, + 255, 255, 61, 255, 255, 255, 255, 31, 255, 255, 255, 3, 255, 255, 63, 63, + 254, 255, 255, 31, 255, 255, 255, 1, 255, 223, 31, 0, 255, 255, 127, 0, + 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 255, 63, 255, 3, 255, 3, + 255, 127, 255, 3, 255, 7, 255, 255, 255, 255, 63, 0, 255, 15, 255, 15, + 241, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 199, + 255, 255, 255, 207, 255, 255, 255, 159, 255, 63, 255, 255, 1, 0, 0, 0, + 255, 255, 15, 240, 255, 255, 255, 248, 255, 227, 255, 255, 255, 1, 255, 255, + 255, 255, 255, 7, 255, 255, 255, 251, 63, 63, 255, 170, 223, 255, 207, 239, + 255, 255, 220, 127, 0, 248, 255, 255, 255, 124, 255, 255, 223, 255, 243, 255, + 255, 127, 255, 31, 0, 0, 255, 255, 255, 255, 1, 0, 127, 0, 0, 0, + 255, 255, 207, 255, 255, 255, 191, 255, 255, 127, 255, 255, 255, 255, 15, 254, + 255, 128, 1, 128, 127, 127, 127, 127, 255, 255, 7, 0, 0, 0, 255, 15, + 224, 255, 255, 255, 15, 0, 255, 255, 255, 31, 255, 255, 127, 0, 255, 255, + 255, 15, 0, 0, 255, 255, 255, 0, 252, 7, 0, 0, 0, 0, 224, 255, + 255, 31, 255, 3, 63, 192, 255, 3, 255, 255, 15, 128, 255, 191, 255, 195, + 255, 63, 255, 243, 7, 0, 0, 248, 126, 126, 126, 0, 127, 127, 255, 255, + 255, 63, 255, 3, 127, 248, 255, 255, 127, 0, 248, 224, 255, 255, 127, 95, + 219, 255, 255, 255, 3, 0, 248, 255, 255, 255, 252, 255, 255, 0, 0, 0, + 0, 0, 255, 63, 255, 255, 247, 255, 127, 15, 223, 255, 252, 252, 252, 28, + 127, 127, 0, 62, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, + 135, 255, 255, 255, 255, 255, 143, 255, 15, 224, 255, 255, 255, 255, 255, 191, + 15, 255, 63, 0, 255, 3, 255, 255, 255, 255, 15, 255, 15, 128, 0, 0, + 63, 253, 255, 255, 255, 255, 191, 145, 128, 255, 0, 0, 255, 255, 55, 248, + 255, 255, 255, 143, 255, 255, 255, 131, 255, 255, 255, 240, 111, 240, 239, 254, + 255, 255, 63, 135, 255, 1, 255, 1, 127, 248, 127, 0, 255, 255, 63, 254, + 255, 255, 63, 255, 255, 255, 7, 255, 255, 255, 3, 30, 0, 254, 0, 0, + 255, 1, 0, 0, 255, 255, 7, 252, 255, 0, 255, 3, 255, 59, 3, 0, + 255, 63, 252, 255, 255, 255, 0, 128, 3, 32, 255, 255, 255, 1, 255, 3, + 254, 255, 31, 0, 255, 255, 251, 255, 127, 189, 255, 191, 255, 7, 255, 3, + 255, 253, 237, 251, 159, 57, 129, 224, 207, 31, 31, 0, 255, 255, 255, 239, + 3, 0, 0, 0, 31, 0, 255, 3, 255, 31, 0, 0, 255, 3, 0, 0, + 255, 255, 7, 128, 127, 242, 111, 255, 255, 255, 191, 249, 127, 0, 255, 3, + 255, 252, 255, 255, 31, 0, 0, 0, 7, 0, 0, 0, 255, 253, 255, 255, + 255, 255, 127, 255, 63, 0, 255, 255, 255, 254, 127, 0, 127, 251, 255, 255, + 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251, 1, 0, 0, 1, 0, + 255, 255, 3, 128, 255, 127, 31, 0, 15, 0, 0, 0, 255, 127, 255, 1, + 255, 195, 0, 0, 255, 63, 63, 0, 63, 0, 255, 251, 251, 255, 255, 224, + 255, 255, 0, 0, 255, 135, 255, 255, 255, 128, 255, 255, 31, 0, 3, 0, + 0, 0, 7, 0, 240, 0, 255, 255, 255, 7, 255, 31, 255, 1, 255, 243, + 127, 254, 255, 255, 63, 0, 0, 0, 100, 222, 255, 235, 239, 255, 255, 255, + 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, + 255, 207, 255, 255, 255, 15, 0, 248, 254, 255, 0, 0, 127, 255, 255, 249, + 219, 7, 0, 0, 255, 31, 255, 63, 159, 255, 127, 0, 255, 15, 255, 195, + 0, 0, 254, 255, 255, 255, 31, 0, 150, 254, 247, 10, 132, 234, 150, 170, + 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 0, 0, 3, 0, + 255, 127, 254, 255, 254, 255, 254, 255, 255, 63, 0, 0, 192, 255, 255, 255, + 7, 0, 255, 255, 255, 1, 3, 0, 255, 31, 255, 31, 255, 63, 3, 0, + 255, 255, 255, 253, 255, 63, 31, 7, 255, 1, 127, 0, 7, 0, 127, 0, + 0, 0, 255, 3, 3, 0, 255, 255, 2, 0, 0, 0 +}; + +RE_UINT32 re_get_graph(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_graph_table_1[field_2]; + v = re_graph_table_2[(v << 5) | field_1]; + v = re_graph_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Grapheme_Base. */ +static RE_UINT8 re_grapheme_base_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 14, 13, 15, 16, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 18, 18, 13, 31, 18, 18, + 18, 32, 18, 18, 18, 18, 18, 18, 18, 18, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 18, 18, 18, 18, 18, 18, 18, 18, 37, 18, 18, 38, + 18, 18, 18, 18, 39, 40, 41, 18, 42, 18, 43, 44, 45, 46, 47, 18, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 48, 13, 13, 13, 49, 50, 13, + 13, 13, 13, 51, 13, 13, 13, 13, 13, 13, 52, 18, 18, 18, 53, 18, + 13, 13, 13, 13, 54, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18 +}; + +static RE_UINT16 re_grapheme_base_table_2[] = { + 0, 1, 1, 2, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 4, 5, 6, 1, 1, + 1, 1, 1, 1, 7, 1, 1, 1, 1, 8, 9, 1, 10, 11, 12, 13, + 14, 1, 15, 8, 1, 1, 16, 17, 18, 19, 20, 1, 1, 21, 1, 22, + 23, 24, 25, 15, 0, 26, 27, 0, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 0, 71, 72, 73, 0, 74, 75, 76, 77, 78, 79, 80, 0, + 1, 81, 82, 83, 84, 1, 85, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 86, 1, 87, 88, 89, 1, 90, 1, 91, 92, 93, 1, 1, 94, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 92, 1, 1, 95, 96, 97, 98, 99, 1, 100, 101, 102, + 103, 1, 1, 95, 104, 105, 1, 106, 2, 107, 108, 109, 1, 110, 111, 1, + 112, 1, 113, 114, 102, 115, 0, 0, 116, 117, 118, 119, 120, 121, 1, 122, + 1, 123, 124, 1, 125, 126, 127, 128, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 94, 1, 129, 130, 1, 26, 131, 132, + 133, 134, 1, 135, 136, 1, 0, 0, 1, 1, 1, 1, 110, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 137, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 138, 139, 1, 1, 1, + 1, 140, 2, 1, 1, 1, 1, 141, 1, 85, 1, 142, 143, 144, 144, 0, + 1, 1, 145, 0, 146, 1, 1, 147, 1, 1, 1, 1, 1, 1, 106, 148, + 1, 149, 68, 1, 150, 1, 1, 1, 151, 8, 1, 1, 140, 1, 1, 152, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 92, + 1, 1, 1, 1, 153, 1, 154, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 155, 1, 156, 130, 1, 1, 157, 1, 1, 1, 1, 1, 1, 158, 159, + 160, 161, 1, 162, 1, 1, 163, 164, 1, 165, 166, 92, 28, 167, 168, 169, + 1, 170, 171, 172, 1, 173, 174, 175, 176, 177, 1, 110, 1, 1, 1, 178, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 152, 179, 180, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 181, 1, 1, 93, 0, 182, 183, 184, 1, 1, 1, 185, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 186, 1, 187, 1, 27, 188, + 189, 186, 190, 191, 1, 1, 1, 92, 68, 1, 1, 1, 130, 2, 192, 193, + 194, 195, 196, 0, 1, 1, 1, 91, 197, 198, 1, 1, 136, 199, 186, 92, + 0, 0, 0, 0, 92, 1, 200, 201, 1, 202, 133, 106, 203, 1, 204, 0, + 1, 1, 1, 1, 130, 149, 205, 180, 1, 206, 1, 207, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 143, 106, 27, 0, 0, 0, 0, + 208, 209, 139, 1, 2, 210, 0, 211, 212, 213, 0, 0, 1, 214, 187, 1, + 215, 106, 216, 1, 1, 0, 1, 217, 1, 218, 219, 220, 221, 222, 0, 0, + 1, 1, 223, 0, 1, 145, 1, 224, 1, 225, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 1, 226, 0, 0, 1, 206, 227, 0, 0, 186, 155, 143, + 228, 162, 229, 19, 120, 230, 231, 232, 28, 233, 206, 234, 120, 235, 236, 237, + 238, 239, 0, 0, 240, 149, 2, 241, 44, 242, 243, 244, 0, 0, 0, 0, + 1, 162, 245, 246, 1, 247, 248, 0, 0, 0, 0, 0, 1, 249, 201, 0, + 1, 250, 251, 252, 1, 253, 254, 0, 91, 255, 0, 0, 0, 0, 0, 0, + 1, 256, 0, 0, 0, 1, 1, 257, 258, 259, 260, 0, 0, 261, 262, 263, + 264, 265, 266, 1, 267, 268, 1, 95, 0, 0, 0, 0, 0, 0, 0, 0, + 269, 270, 271, 153, 19, 272, 0, 0, 273, 200, 274, 275, 276, 254, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 278, 1, 279, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 93, 0, 0, 0, + 1, 1, 1, 280, 1, 1, 1, 1, 1, 1, 244, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 95, 2, 282, 0, 0, 186, 283, 1, 284, 285, 286, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 91, 0, 0, 0, 1, 1, 133, 1, 287, 0, 0, 288, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 162, + 1, 1, 1, 1, 1, 1, 106, 0, 223, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 289, 290, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 180, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 291, 292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 106, 1, 293, 1, 294, 295, 296, 1, 223, + 1, 1, 297, 0, 0, 0, 0, 147, 1, 1, 143, 95, 0, 0, 0, 0, + 1, 1, 26, 1, 298, 299, 300, 1, 301, 302, 303, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 304, 1, 1, 1, 1, 1, 1, 1, 1, 305, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 306, 0, 307, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 309, 282, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 310, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 311, 0, 1, 1, 312, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 313, 1, 314, 0, 0, 68, 130, 0, 0, 0, 0, 0, 0, + 300, 315, 316, 317, 318, 319, 0, 320, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 110, 1, 1, 147, 321, 322, 106, 1, 1, 1, 1, 1, 115, 0, 323, + 324, 180, 325, 326, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 162, 327, 1, 1, 1, 147, 1, 1, 95, 155, + 110, 1, 328, 1, 206, 329, 0, 0, 1, 1, 1, 330, 1, 1, 194, 1, + 1, 1, 147, 331, 154, 332, 333, 0, 1, 1, 1, 1, 190, 1, 15, 189, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 130, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 314, 1, 1, 1, 1, 1, 1, + 130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 231, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 199, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 15, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_grapheme_base_table_3[] = { + 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 223, 255, 255, + 0, 0, 255, 252, 240, 215, 255, 255, 251, 255, 255, 255, 7, 252, 255, 255, + 255, 255, 254, 255, 255, 255, 127, 254, 255, 231, 0, 0, 0, 0, 0, 64, + 73, 0, 255, 255, 255, 135, 31, 0, 192, 255, 0, 200, 255, 7, 0, 0, + 255, 255, 63, 64, 96, 194, 255, 255, 255, 63, 253, 255, 255, 255, 0, 0, + 0, 224, 255, 255, 63, 0, 2, 0, 255, 7, 240, 199, 255, 255, 63, 4, + 16, 1, 255, 127, 255, 255, 255, 65, 255, 255, 223, 255, 255, 0, 0, 0, + 248, 255, 255, 255, 255, 255, 255, 235, 1, 222, 1, 255, 243, 255, 255, 255, + 237, 159, 249, 255, 255, 253, 197, 163, 129, 89, 0, 176, 195, 255, 255, 63, + 232, 135, 249, 255, 255, 253, 109, 195, 1, 0, 0, 94, 192, 255, 92, 0, + 232, 191, 251, 255, 255, 253, 237, 227, 1, 26, 1, 0, 195, 255, 3, 2, + 236, 159, 249, 255, 255, 253, 237, 35, 129, 25, 0, 176, 195, 255, 255, 0, + 232, 199, 61, 214, 24, 199, 255, 131, 198, 29, 1, 0, 192, 255, 255, 7, + 238, 223, 253, 255, 255, 253, 255, 35, 30, 0, 0, 7, 195, 255, 128, 255, + 253, 223, 253, 255, 255, 253, 239, 99, 155, 13, 0, 64, 195, 255, 6, 0, + 252, 223, 253, 255, 255, 255, 255, 167, 193, 221, 112, 255, 195, 255, 255, 255, + 236, 255, 127, 252, 255, 255, 251, 47, 127, 0, 3, 127, 192, 255, 28, 0, + 254, 255, 255, 255, 255, 255, 13, 128, 127, 128, 255, 15, 214, 247, 255, 255, + 175, 255, 13, 32, 95, 0, 255, 243, 255, 255, 255, 252, 255, 255, 95, 253, + 255, 254, 255, 255, 255, 31, 0, 128, 32, 31, 0, 0, 0, 0, 0, 192, + 191, 223, 255, 7, 255, 31, 2, 153, 255, 255, 255, 60, 254, 255, 225, 255, + 155, 223, 255, 223, 191, 32, 255, 255, 255, 61, 127, 61, 255, 61, 255, 255, + 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 7, + 255, 255, 255, 31, 255, 255, 255, 3, 255, 255, 63, 63, 255, 255, 255, 1, + 255, 223, 3, 0, 255, 255, 99, 0, 255, 255, 3, 0, 255, 223, 1, 0, + 255, 255, 79, 192, 191, 1, 240, 31, 255, 3, 255, 3, 255, 7, 255, 3, + 159, 255, 255, 255, 255, 5, 255, 255, 255, 255, 63, 0, 120, 14, 251, 1, + 241, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 199, + 255, 255, 127, 198, 255, 255, 191, 0, 26, 224, 7, 0, 255, 63, 0, 0, + 240, 255, 255, 255, 255, 255, 15, 232, 251, 15, 255, 255, 255, 7, 240, 31, + 252, 255, 255, 255, 195, 196, 255, 255, 191, 92, 12, 240, 255, 15, 48, 248, + 255, 227, 255, 255, 255, 1, 255, 255, 255, 255, 255, 231, 255, 0, 8, 0, + 2, 222, 239, 4, 63, 63, 255, 170, 255, 255, 255, 63, 223, 255, 207, 239, + 255, 255, 220, 127, 255, 7, 255, 255, 255, 128, 255, 255, 0, 0, 243, 255, + 255, 127, 255, 31, 127, 0, 0, 0, 255, 255, 207, 255, 255, 255, 191, 255, + 255, 127, 255, 255, 255, 127, 12, 254, 255, 128, 1, 0, 255, 255, 127, 0, + 127, 127, 127, 127, 255, 255, 7, 0, 255, 255, 255, 251, 255, 255, 15, 0, + 0, 0, 255, 15, 255, 3, 255, 255, 255, 255, 127, 248, 224, 255, 255, 255, + 15, 0, 255, 255, 255, 31, 255, 255, 127, 0, 255, 255, 255, 15, 0, 0, + 255, 127, 8, 192, 255, 255, 252, 0, 252, 7, 0, 0, 0, 0, 224, 255, + 187, 247, 255, 255, 159, 15, 255, 3, 255, 255, 255, 0, 15, 192, 255, 3, + 0, 0, 252, 127, 63, 192, 255, 255, 127, 0, 12, 128, 255, 255, 55, 204, + 255, 191, 255, 195, 223, 255, 255, 127, 255, 129, 25, 0, 247, 47, 255, 243, + 255, 255, 255, 239, 255, 255, 98, 62, 5, 0, 0, 248, 255, 207, 63, 0, + 126, 126, 126, 0, 127, 127, 255, 255, 223, 30, 255, 3, 127, 248, 255, 255, + 255, 255, 255, 15, 255, 63, 255, 255, 127, 0, 248, 160, 255, 255, 127, 95, + 219, 255, 255, 255, 3, 0, 248, 255, 0, 0, 255, 255, 255, 255, 252, 255, + 0, 0, 255, 63, 0, 0, 255, 3, 255, 255, 247, 255, 127, 15, 223, 255, + 252, 252, 252, 28, 127, 127, 0, 48, 255, 239, 255, 255, 127, 255, 255, 183, + 255, 63, 255, 63, 135, 255, 255, 255, 255, 255, 143, 255, 1, 0, 0, 0, + 255, 255, 1, 0, 254, 255, 255, 15, 15, 224, 255, 255, 255, 255, 255, 191, + 15, 255, 63, 0, 255, 255, 15, 255, 255, 0, 255, 255, 15, 128, 0, 0, + 63, 253, 255, 255, 255, 255, 191, 145, 128, 255, 0, 0, 255, 255, 55, 248, + 255, 255, 255, 143, 255, 255, 255, 131, 255, 255, 255, 240, 1, 0, 239, 254, + 255, 1, 255, 1, 31, 248, 127, 0, 255, 255, 63, 254, 255, 255, 63, 255, + 255, 255, 7, 255, 255, 255, 3, 30, 0, 254, 0, 0, 255, 1, 0, 0, + 255, 255, 7, 252, 15, 0, 255, 3, 255, 35, 3, 0, 63, 0, 254, 3, + 253, 255, 255, 255, 128, 63, 252, 255, 255, 255, 135, 217, 3, 0, 255, 255, + 255, 1, 255, 3, 127, 16, 192, 255, 255, 255, 119, 0, 255, 255, 63, 128, + 255, 97, 255, 255, 254, 255, 31, 0, 255, 255, 251, 255, 255, 127, 44, 63, + 127, 189, 255, 191, 7, 0, 255, 3, 255, 253, 237, 163, 158, 57, 1, 224, + 15, 0, 0, 0, 163, 255, 255, 175, 3, 0, 0, 0, 255, 255, 6, 90, + 242, 0, 255, 3, 255, 127, 3, 79, 255, 255, 7, 88, 30, 0, 255, 3, + 255, 31, 0, 0, 255, 215, 64, 1, 255, 3, 0, 0, 67, 0, 255, 255, + 255, 127, 0, 9, 255, 255, 7, 128, 127, 242, 111, 255, 255, 255, 190, 161, + 119, 0, 255, 3, 255, 252, 255, 255, 255, 255, 15, 240, 30, 0, 0, 0, + 1, 248, 255, 255, 255, 255, 7, 134, 127, 0, 129, 241, 255, 3, 128, 252, + 7, 0, 0, 0, 255, 253, 255, 255, 255, 255, 0, 64, 63, 0, 255, 255, + 0, 2, 18, 0, 127, 251, 255, 255, 64, 0, 255, 3, 191, 253, 255, 255, + 255, 127, 88, 1, 255, 255, 231, 1, 0, 0, 1, 0, 255, 255, 3, 128, + 255, 127, 31, 0, 255, 127, 0, 0, 255, 195, 0, 0, 255, 63, 32, 0, + 255, 255, 128, 255, 63, 0, 255, 251, 251, 255, 255, 224, 255, 0, 248, 255, + 15, 0, 3, 0, 0, 0, 7, 0, 240, 0, 255, 255, 255, 7, 255, 31, + 255, 1, 255, 147, 127, 254, 255, 255, 95, 60, 0, 0, 24, 240, 255, 255, + 255, 195, 255, 255, 35, 0, 0, 0, 255, 255, 255, 223, 100, 222, 255, 235, + 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, + 63, 255, 255, 255, 255, 207, 255, 255, 0, 0, 128, 7, 0, 224, 223, 255, + 239, 15, 0, 0, 255, 31, 128, 63, 255, 15, 255, 131, 159, 255, 0, 0, + 15, 8, 255, 195, 0, 0, 254, 255, 255, 255, 31, 0, 150, 254, 247, 10, + 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, + 0, 0, 3, 0, 255, 127, 254, 255, 254, 255, 254, 255, 192, 255, 255, 255, + 7, 0, 255, 255, 255, 1, 3, 0, 63, 0, 0, 0, 255, 31, 255, 31, + 255, 0, 255, 3, 255, 63, 3, 0, 255, 255, 255, 253, 255, 63, 31, 7, + 255, 1, 127, 0, 7, 0, 127, 0 +}; + +RE_UINT32 re_get_grapheme_base(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_grapheme_base_table_1[field_2]; + v = re_grapheme_base_table_2[(v << 5) | field_1]; + v = re_grapheme_base_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Grapheme_Cluster_Break. */ +static RE_UINT8 re_grapheme_cluster_break_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 14, 15, 16, 21, 9, 9, 9, 9, 9, 9, 9, 9, 22, 23, + 24, 9, 25, 26, 27, 28, 29, 30, 9, 9, 9, 9, 9, 31, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 32, 33, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, + 9, 9, 9, 9, 35, 9, 36, 9, 37, 9, 38, 9, 39, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 40, 41, 41, 41, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 +}; + +static RE_UINT8 re_grapheme_cluster_break_table_2[] = { + 0, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 6, 1, 1, 1, 1, + 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 8, 9, 10, 1, + 11, 1, 12, 13, 1, 1, 14, 15, 16, 17, 18, 1, 1, 19, 1, 20, + 21, 22, 23, 1, 1, 1, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 34, 35, 38, 39, 30, 40, 41, 29, 42, 43, 44, 1, + 45, 46, 47, 29, 30, 48, 49, 29, 50, 51, 52, 29, 30, 1, 53, 54, + 1, 55, 56, 1, 1, 57, 58, 1, 59, 60, 1, 61, 62, 63, 64, 1, + 1, 65, 66, 67, 68, 1, 1, 1, 69, 69, 69, 70, 70, 71, 72, 72, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 73, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 74, 74, 75, 75, 1, 76, 77, 1, + 78, 1, 1, 1, 79, 80, 1, 1, 1, 81, 1, 1, 1, 1, 1, 1, + 82, 1, 83, 84, 1, 17, 85, 1, 86, 87, 88, 89, 90, 91, 1, 92, + 1, 93, 1, 1, 1, 1, 94, 95, 1, 1, 1, 1, 1, 1, 5, 96, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 97, 98, 1, 99, 1, 1, 17, 100, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 101, 1, 1, 1, 102, 1, 1, 1, 5, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 103, 1, 1, 104, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 105, 46, 1, 1, 106, 1, 1, 1, 1, 1, 1, 1, 1, + 107, 108, 1, 1, 109, 110, 111, 112, 1, 113, 114, 115, 26, 116, 117, 118, + 1, 119, 120, 121, 1, 122, 123, 124, 1, 1, 1, 1, 1, 1, 1, 125, + 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, + 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, + 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, + 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, + 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, + 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, + 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, + 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, + 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, + 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, + 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, + 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, + 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, + 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, + 131, 132, 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 132, + 126, 127, 128, 129, 130, 131, 132, 126, 127, 128, 129, 130, 131, 133, 134, 135, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 136, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 6, 6, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 46, 1, 1, 137, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 138, + 1, 1, 1, 1, 1, 1, 1, 85, 1, 1, 1, 139, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 140, 141, 1, 1, 1, 1, 1, 79, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 142, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 143, 1, 1, 1, 1, 19, 1, 1, 1, 1, 1, + 144, 145, 146, 102, 90, 147, 148, 1, 149, 150, 151, 152, 90, 153, 154, 1, + 1, 155, 1, 1, 1, 1, 102, 156, 50, 51, 157, 158, 1, 1, 1, 1, + 1, 159, 160, 1, 1, 161, 162, 1, 1, 1, 1, 1, 1, 163, 164, 1, + 1, 165, 85, 1, 1, 166, 1, 1, 73, 167, 1, 1, 1, 1, 1, 1, + 1, 168, 1, 1, 1, 1, 1, 1, 1, 169, 170, 1, 1, 1, 171, 172, + 173, 174, 175, 1, 176, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 177, 1, 1, 178, 179, 1, 1, 1, 180, 181, 1, 182, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 183, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 184, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 185, 1, 186, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 187, 188, 189, 1, 1, 190, + 1, 1, 1, 1, 191, 192, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 193, 194, 195, 1, 1, + 1, 1, 196, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 5, 197, 5, 198, 199, 200, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 201, 202, 1, 1, 1, 1, 1, 1, 1, 186, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 203, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 186, 1, 1, 1, 204, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 205, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 206, + 3, 5, 5, 5, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 207, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 +}; + +static RE_UINT8 re_grapheme_cluster_break_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, + 0, 4, 4, 0, 4, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 5, 0, 4, + 4, 4, 4, 4, 4, 0, 0, 4, 4, 0, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 0, 4, 4, 4, 0, 4, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 4, 0, 6, 6, + 6, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 4, 6, 6, + 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 6, + 6, 4, 4, 4, 4, 0, 0, 6, 6, 0, 0, 6, 6, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 6, 6, + 6, 4, 4, 0, 0, 0, 0, 4, 4, 0, 0, 4, 4, 4, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 4, 4, 4, 4, 4, 0, 4, 4, 6, 0, 6, 6, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, + 6, 4, 4, 4, 4, 0, 0, 6, 6, 0, 0, 6, 6, 4, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, + 4, 6, 6, 0, 0, 0, 6, 6, 6, 0, 6, 6, 6, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 6, 6, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, + 4, 6, 6, 6, 6, 0, 4, 4, 4, 0, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 6, 4, + 6, 6, 4, 6, 6, 0, 4, 6, 6, 0, 6, 6, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 6, + 6, 4, 4, 4, 4, 0, 6, 6, 6, 0, 6, 6, 6, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, + 6, 6, 4, 4, 4, 0, 4, 0, 6, 6, 6, 6, 6, 6, 6, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 6, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 4, 0, 4, 0, 0, 0, 0, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, + 4, 4, 4, 4, 4, 0, 4, 4, 0, 0, 0, 0, 0, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, + 4, 6, 4, 4, 4, 4, 4, 4, 0, 4, 4, 6, 6, 4, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 6, 4, 4, 0, 0, 0, 0, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 6, 4, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 6, 6, + 6, 6, 6, 6, 6, 6, 4, 6, 6, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 6, 6, 6, 6, 4, 4, 6, 6, 6, 0, 0, 0, 0, + 6, 6, 4, 6, 6, 6, 6, 6, 6, 4, 4, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 4, 6, 6, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 4, 6, 4, 4, 4, 4, 4, 4, 4, 0, + 4, 0, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, + 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 6, 4, 6, 6, 6, + 6, 6, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 4, 4, 4, 4, 6, 6, 4, 4, 6, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 6, 4, 4, 6, 6, 6, 4, 6, 4, + 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, + 4, 4, 4, 4, 6, 6, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 6, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 6, 4, 4, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 10, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 6, 4, 4, 6, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 6, 6, 4, 4, 4, 4, 6, 6, 4, 4, 6, 6, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 6, + 6, 4, 4, 6, 6, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 4, 4, 4, 0, 0, 4, 4, 0, 0, 0, 0, 0, 4, 4, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4, 4, 6, 6, + 0, 0, 0, 0, 0, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 6, 4, 6, 6, 4, 6, 6, 0, 6, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 0, 4, 4, 0, 0, 0, 0, 0, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 4, 4, 4, 4, 6, 6, 4, 4, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 6, 4, 4, 4, + 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, + 6, 0, 5, 5, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 6, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 4, + 4, 4, 6, 6, 4, 6, 4, 4, 0, 0, 0, 0, 0, 0, 4, 0, + 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 6, 6, 6, 6, 0, 0, 6, 6, 0, 0, 6, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 6, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, + 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, + 6, 6, 4, 4, 4, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 6, 6, 4, 4, 4, 4, 4, 4, 6, 4, 6, 6, 4, 6, 4, + 4, 6, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 6, 6, 4, 4, 4, 4, 0, 0, 6, 6, 6, 6, 4, 4, 6, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 4, 6, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 4, 6, 6, + 4, 4, 4, 4, 4, 4, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 6, 6, 6, 6, 6, 0, 6, 6, 0, 0, 4, 4, 6, 4, 5, + 6, 5, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 6, 6, 4, 4, 4, 4, 0, 0, 4, 4, 6, 6, 6, 6, + 4, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 4, 4, 4, 4, 4, 6, 5, 4, 4, 4, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 4, 4, 6, 6, 4, 4, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 6, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 0, 6, 4, 4, 4, 4, 4, 4, + 4, 6, 4, 4, 6, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 4, 0, 4, 4, 0, 4, + 4, 4, 4, 4, 4, 4, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 0, + 4, 4, 0, 6, 6, 4, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 4, + 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 6, 4, 4, 4, 0, 0, 0, 6, 4, 4, + 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, + 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, + 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, + 4, 4, 0, 4, 4, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_grapheme_cluster_break_table_1[field_2]; + v = re_grapheme_cluster_break_table_2[(v << 5) | field_1]; + v = re_grapheme_cluster_break_table_3[(v << 5) | field_0]; + + return v; +} + +/* Grapheme_Extend. */ +static RE_UINT8 re_grapheme_extend_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 15, + 16, 9, 17, 18, 19, 20, 21, 22, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, + 9, 9, 9, 9, 26, 9, 27, 9, 28, 9, 29, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 30, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 +}; + +static RE_UINT8 re_grapheme_extend_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0, + 7, 0, 8, 9, 0, 0, 10, 11, 12, 13, 14, 0, 0, 15, 0, 16, + 17, 18, 19, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 30, 31, 34, 35, 26, 36, 37, 25, 38, 39, 40, 0, + 41, 42, 43, 25, 26, 44, 45, 25, 46, 47, 28, 25, 26, 0, 48, 0, + 0, 49, 50, 0, 0, 51, 52, 0, 53, 54, 0, 55, 56, 57, 58, 0, + 0, 59, 60, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 65, 65, 0, 66, 67, 0, + 68, 0, 0, 0, 69, 70, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, + 72, 0, 73, 74, 0, 13, 75, 0, 76, 77, 38, 78, 46, 79, 0, 80, + 0, 81, 0, 0, 0, 0, 82, 83, 0, 0, 0, 0, 0, 0, 1, 84, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 85, 0, 0, 0, 0, 0, 13, 86, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 89, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 91, 42, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, + 93, 94, 0, 0, 0, 0, 95, 96, 0, 97, 98, 0, 22, 99, 0, 100, + 0, 101, 102, 31, 0, 103, 26, 104, 0, 0, 0, 0, 0, 0, 0, 105, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, + 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 107, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 108, 109, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 111, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, + 26, 112, 113, 88, 46, 114, 0, 0, 22, 115, 0, 116, 46, 117, 118, 0, + 0, 119, 0, 0, 0, 0, 88, 120, 46, 47, 121, 122, 0, 0, 0, 0, + 0, 112, 123, 0, 0, 124, 125, 0, 0, 0, 0, 0, 0, 126, 127, 0, + 0, 128, 75, 0, 0, 129, 0, 0, 63, 130, 0, 0, 0, 0, 0, 0, + 0, 131, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 0, 134, 75, + 135, 136, 137, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 139, 0, 0, 140, 141, 0, 0, 0, 142, 143, 0, 144, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 146, 0, 147, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 0, 149, 0, 0, 150, + 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 153, 154, 0, 0, + 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 156, 1, 157, 158, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 160, 161, 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 163, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_grapheme_extend_table_3[] = { + 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 0, 248, 3, 0, 0, + 0, 0, 254, 255, 255, 255, 255, 191, 182, 0, 0, 0, 0, 0, 255, 7, + 0, 248, 255, 255, 0, 0, 1, 0, 0, 0, 192, 159, 159, 61, 0, 0, + 0, 0, 2, 0, 0, 0, 255, 255, 255, 7, 0, 0, 192, 255, 1, 0, + 0, 248, 15, 32, 0, 0, 192, 251, 239, 62, 0, 0, 0, 0, 0, 14, + 0, 0, 248, 255, 251, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 20, + 254, 33, 254, 0, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 80, + 30, 32, 128, 0, 12, 0, 0, 64, 6, 0, 0, 0, 0, 0, 0, 16, + 134, 57, 2, 0, 0, 0, 35, 0, 190, 33, 0, 0, 12, 0, 0, 252, + 0, 0, 0, 208, 30, 32, 224, 0, 4, 0, 0, 0, 0, 0, 0, 64, + 1, 32, 128, 0, 17, 0, 0, 0, 0, 0, 0, 192, 193, 61, 96, 0, + 0, 0, 0, 144, 68, 48, 96, 0, 3, 0, 0, 0, 0, 0, 0, 88, + 0, 132, 92, 128, 0, 0, 242, 7, 128, 127, 0, 0, 0, 0, 242, 31, + 0, 63, 0, 0, 0, 0, 0, 3, 0, 0, 160, 2, 0, 0, 254, 127, + 223, 224, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 0, 224, 253, 102, + 0, 0, 0, 195, 1, 0, 30, 0, 100, 32, 0, 32, 0, 0, 0, 224, + 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 176, 63, 64, 254, 15, 32, + 0, 56, 0, 0, 96, 0, 0, 0, 0, 2, 0, 0, 135, 1, 4, 14, + 0, 0, 128, 9, 0, 0, 64, 127, 229, 31, 248, 159, 1, 0, 0, 0, + 15, 0, 0, 0, 0, 0, 240, 23, 0, 248, 15, 0, 60, 59, 0, 0, + 64, 163, 3, 0, 0, 240, 207, 0, 0, 0, 247, 255, 253, 33, 16, 3, + 255, 255, 255, 251, 0, 16, 0, 0, 255, 255, 1, 0, 0, 128, 3, 0, + 0, 0, 0, 128, 0, 252, 0, 0, 0, 0, 0, 6, 0, 128, 247, 63, + 0, 0, 3, 0, 68, 8, 0, 0, 96, 16, 0, 0, 48, 0, 0, 0, + 255, 255, 3, 128, 192, 63, 0, 0, 128, 255, 3, 0, 0, 0, 200, 51, + 32, 0, 0, 0, 0, 126, 102, 0, 8, 16, 0, 0, 0, 0, 157, 193, + 0, 48, 64, 0, 32, 33, 0, 0, 0, 0, 0, 32, 0, 0, 192, 7, + 110, 240, 0, 0, 0, 0, 0, 135, 240, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 255, 127, 0, 0, 0, 0, 0, 120, 6, 128, 239, 31, 0, + 0, 0, 8, 0, 0, 0, 192, 127, 0, 158, 0, 0, 0, 128, 211, 64, + 248, 7, 0, 0, 1, 0, 128, 0, 192, 31, 31, 0, 92, 0, 0, 64, + 0, 0, 249, 165, 13, 0, 0, 0, 0, 128, 60, 176, 1, 0, 0, 48, + 0, 0, 248, 167, 0, 40, 191, 0, 188, 15, 0, 0, 0, 128, 255, 6, + 0, 0, 1, 88, 8, 0, 0, 0, 0, 0, 240, 12, 254, 7, 0, 0, + 0, 0, 248, 121, 128, 0, 126, 14, 0, 252, 127, 3, 0, 0, 127, 191, + 0, 0, 252, 255, 255, 252, 109, 0, 0, 0, 126, 180, 191, 0, 0, 0, + 0, 0, 163, 0, 0, 0, 24, 0, 0, 0, 31, 0, 0, 0, 127, 0, + 0, 128, 0, 0, 0, 128, 7, 0, 16, 0, 0, 0, 0, 0, 0, 96, + 160, 195, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, + 255, 255, 127, 248, 255, 31, 32, 0, 16, 0, 0, 248, 254, 255, 0, 0, + 127, 255, 255, 249, 219, 7, 0, 0, 0, 240, 0, 0, 240, 7, 0, 0 +}; + +RE_UINT32 re_get_grapheme_extend(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_grapheme_extend_table_1[field_2]; + v = re_grapheme_extend_table_2[(v << 5) | field_1]; + v = re_grapheme_extend_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Grapheme_Link. */ +static RE_UINT8 re_grapheme_link_table_1[] = { + 0, 0, 1, 2, 3, 4, 5, 0, 0, 0, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 9, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_grapheme_link_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 2, 1, 0, 0, 0, 3, 0, + 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, + 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 5, 0, 0, 10, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 14, 0, 0, 0, 0, 5, 0, 0, 0, 15, 0, 0, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 12, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 9, 0, + 0, 19, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 12, 0, 0, + 0, 12, 0, 0, 0, 16, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, + 0, 17, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 9, + 0, 7, 23, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_grapheme_link_table_3[] = { + 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 24, 0, 4, 0, 0, + 0, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 6, 0, 0, 16, 0, + 0, 0, 4, 0, 1, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 0, + 0, 0, 0, 128, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 8, 0, + 0, 0, 64, 0, 0, 0, 0, 2, 0, 0, 24, 0, 0, 0, 32, 0, + 4, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 96, 128, 0, 0, 0, + 48, 0, 0, 0, 0, 0, 128, 0 +}; + +RE_UINT32 re_get_grapheme_link(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_grapheme_link_table_1[field_2]; + v = re_grapheme_link_table_2[(v << 5) | field_1]; + v = re_grapheme_link_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Hangul_Syllable_Type. */ +static RE_UINT8 re_hangul_syllable_type_table_1[] = { + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, + 8, 9, 3, 4, 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_hangul_syllable_type_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, + 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, + 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, + 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, + 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, + 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, + 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, + 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, + 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, + 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, + 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, + 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, + 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, + 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, + 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, + 6, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 13, 14, 15 +}; + +static RE_UINT8 re_hangul_syllable_type_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 +}; + +RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_hangul_syllable_type_table_1[field_2]; + v = re_hangul_syllable_type_table_2[(v << 5) | field_1]; + v = re_hangul_syllable_type_table_3[(v << 5) | field_0]; + + return v; +} + +/* Hex_Digit. */ +RE_UINT32 re_get_hex_digit(RE_UINT32 codepoint) { + if (0x30 <= codepoint && codepoint <= 0x39) + return 1; + if (0x41 <= codepoint && codepoint <= 0x46) + return 1; + if (0x61 <= codepoint && codepoint <= 0x66) + return 1; + if (0xFF10 <= codepoint && codepoint <= 0xFF19) + return 1; + if (0xFF21 <= codepoint && codepoint <= 0xFF26) + return 1; + if (0xFF41 <= codepoint && codepoint <= 0xFF46) + return 1; + + return 0; +} + +/* Hyphen. */ +static RE_UINT8 re_hyphen_table_1[] = { + 0, 1, 2, 2, 2, 2, 3, 2, 4, 2, 2, 5, 6, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_hyphen_table_2[] = { + 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0 +}; + +static RE_UINT8 re_hyphen_table_3[] = { + 0, 0, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 64, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 128, 0, 0, 0, 0, 8, 8, 0, 0, 0, + 32, 0, 0, 0 +}; + +RE_UINT32 re_get_hyphen(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_hyphen_table_1[field_2]; + v = re_hyphen_table_2[(v << 5) | field_1]; + v = re_hyphen_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* ID_Continue. */ +static RE_UINT8 re_id_continue_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 12, 12, + 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 17, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 9, 9, 12, 30, 9, 9, + 9, 31, 9, 9, 9, 9, 9, 9, 9, 9, 32, 33, 12, 12, 12, 12, + 12, 34, 12, 35, 9, 9, 9, 9, 9, 9, 9, 9, 36, 9, 9, 37, + 9, 9, 9, 9, 38, 39, 40, 9, 41, 9, 42, 43, 9, 9, 44, 9, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 45, 12, 12, 12, 46, 47, 12, + 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 49, 9, 9, 9, 50, 9, + 12, 12, 12, 12, 51, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 52, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 +}; + +static RE_UINT16 re_id_continue_table_2[] = { + 0, 1, 2, 3, 0, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 7, 8, 6, 6, 6, 9, 10, 11, 6, 12, + 6, 6, 6, 6, 13, 6, 6, 6, 6, 14, 15, 6, 16, 17, 18, 19, + 20, 6, 6, 21, 6, 6, 22, 23, 24, 6, 25, 6, 6, 26, 6, 27, + 6, 28, 29, 30, 0, 31, 32, 11, 6, 6, 6, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 43, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 53, 6, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 0, 70, 71, 72, 0, 73, 74, 75, 76, 77, 78, 79, 0, + 6, 6, 80, 6, 81, 6, 82, 83, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 84, 6, 85, 86, 87, 6, 88, 6, 89, 90, 91, 6, 6, 92, + 67, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 93, 3, 6, 6, 94, 95, 96, 97, 98, 6, 6, 99, 100, + 101, 6, 6, 102, 6, 103, 6, 104, 105, 106, 107, 108, 6, 109, 110, 0, + 29, 6, 105, 111, 112, 113, 114, 0, 6, 6, 115, 116, 6, 6, 6, 97, + 6, 117, 118, 81, 119, 89, 120, 68, 6, 6, 6, 6, 6, 6, 6, 121, + 6, 6, 6, 6, 6, 6, 6, 6, 92, 6, 122, 81, 6, 123, 124, 125, + 0, 126, 127, 128, 129, 0, 129, 130, 131, 132, 133, 6, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 41, 44, 209, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 191, 122, 0, - 36, 122, 0, 0, 7, 7, 111, 0, 62, 36, 36, 36, 36, 36, 0, 82, - 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 11, 11, 11, 11, 11, 11, 11, 15, 15, 15, 15, 15, 15, 15, 15, - 0, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 135, 105, 6, 6, 6, 6, 136, 6, 82, 6, 137, 138, 139, 139, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 61, 93, 88, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 0, 93, 117, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 61, 0, 0, 0, 0, 36, 0, 0, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 0, 36, 36, 36, 104, - 36, 36, 104, 0, 36, 36, 41, 220, 63, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 89, 58, 221, 63, 222, 44, - 66, 58, 44, 0, 0, 0, 0, 0, 0, 0, 106, 89, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 106, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 11, 11, 11, 11, 11, 159, 15, 15, 15, 15, 15, 15, 11, 11, 11, - 11, 11, 11, 159, 15, 139, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, - 159, 15, 15, 15, 15, 15, 15, 49, 48, 223, 10, 49, 11, 159, 170, 14, - 15, 14, 15, 15, 11, 11, 11, 11, 11, 11, 159, 15, 15, 15, 15, 15, - 15, 50, 22, 10, 11, 49, 11, 224, 15, 15, 15, 15, 15, 15, 50, 22, - 11, 160, 166, 11, 224, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, - 11, 159, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, 159, 15, - 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, 159, 15, 15, 15, 15, - 15, 15, 11, 11, 11, 11, 11, 11, 159, 15, 15, 15, 15, 15, 15, 11, - 11, 11, 11, 11, 11, 159, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, - 11, 11, 159, 15, 15, 15, 15, 15, 15, 39, 11, 11, 11, 11, 11, 11, - 224, 15, 15, 15, 15, 15, 24, 15, 33, 11, 11, 11, 11, 11, 22, 15, - 15, 15, 15, 15, 15, 139, 15, 11, 11, 11, 11, 11, 11, 224, 15, 15, - 15, 15, 15, 24, 15, 33, 11, 11, 11, 11, 11, 22, 15, 15, 15, 15, - 15, 15, 139, 15, 11, 11, 11, 11, 11, 11, 224, 15, 15, 15, 15, 15, - 24, 15, 27, 100, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 66, 93, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 116, 0, 86, 0, 0, - 0, 116, 122, 0, 0, 0, 93, 44, 58, 44, 44, 44, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 44, 66, 44, 44, 44, 44, 97, 44, 59, 75, 66, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 104, 44, 117, 36, 41, - 7, 7, 111, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 7, 7, 111, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 104, 0, 0, 44, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 11, 11, 11, 11, 11, 11, 11, 159, 15, 15, 15, 15, 15, 15, 15, - 15, 44, 117, 0, 7, 7, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 82, 36, 36, 36, 36, 36, 36, 102, 78, 82, 36, 61, 36, 112, 0, - 108, 62, 112, 82, 102, 78, 112, 112, 102, 78, 61, 36, 61, 36, 82, 43, - 36, 36, 99, 36, 36, 36, 36, 0, 82, 82, 99, 36, 36, 36, 36, 0, + 140, 141, 67, 6, 142, 67, 6, 83, 143, 14, 6, 6, 144, 6, 0, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 78, + 6, 6, 6, 6, 145, 0, 24, 81, 6, 6, 6, 6, 6, 6, 6, 6, + 146, 147, 6, 148, 6, 6, 6, 26, 149, 150, 6, 6, 151, 6, 152, 153, + 6, 154, 6, 97, 6, 6, 155, 156, 6, 157, 97, 78, 6, 6, 158, 105, + 6, 138, 159, 160, 6, 6, 161, 162, 163, 164, 83, 80, 6, 6, 6, 165, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 166, 167, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 157, 6, 6, 168, 0, 169, 170, 171, 6, 6, 26, 172, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 81, 24, 6, 173, 6, 174, 175, + 91, 176, 177, 178, 6, 6, 6, 78, 1, 2, 3, 107, 6, 105, 179, 0, + 180, 181, 182, 0, 6, 6, 6, 68, 0, 0, 6, 96, 0, 0, 0, 183, + 0, 0, 0, 0, 78, 6, 184, 114, 6, 185, 103, 68, 81, 6, 186, 0, + 6, 6, 6, 6, 81, 80, 187, 29, 6, 188, 6, 189, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 138, 104, 174, 0, 0, 0, 0, + 190, 191, 104, 138, 105, 0, 0, 192, 104, 168, 0, 0, 6, 193, 0, 0, + 194, 195, 0, 78, 78, 0, 75, 196, 6, 104, 104, 197, 26, 0, 0, 0, + 6, 6, 134, 0, 6, 197, 6, 197, 6, 198, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 199, 0, 0, 78, 200, 184, 0, 0, 24, 201, 138, + 6, 6, 196, 202, 6, 68, 24, 203, 6, 31, 204, 205, 6, 6, 206, 0, + 207, 208, 0, 0, 209, 119, 6, 210, 34, 211, 212, 213, 0, 0, 0, 0, + 6, 6, 214, 215, 6, 6, 216, 0, 0, 0, 0, 0, 6, 217, 218, 0, + 6, 6, 219, 0, 6, 102, 100, 0, 89, 115, 0, 0, 0, 0, 0, 0, + 6, 68, 0, 0, 0, 6, 6, 220, 221, 222, 223, 0, 0, 224, 225, 226, + 6, 105, 200, 6, 227, 0, 6, 102, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 5, 229, 230, 173, 231, 0, 0, 232, 233, 198, 234, 235, 100, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 236, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 168, 0, 0, 0, + 6, 6, 6, 144, 6, 6, 6, 6, 6, 6, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, - 11, 11, 123, 0, 11, 11, 11, 11, 11, 11, 123, 0, 11, 11, 11, 11, - 11, 11, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 102, 105, 100, 0, 0, 24, 108, 6, 138, 223, 237, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 127, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 104, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 41, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, 0, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 104, 0, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 41, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 6, 0, 0, 0, 0, 6, 6, 238, 6, 239, 0, 0, 240, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 117, + 6, 6, 6, 6, 6, 6, 104, 0, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 105, 0, 241, 204, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 242, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 0, 0, + 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 31, 6, 248, 249, 250, 6, 251, 252, 253, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 254, 255, 83, 31, 31, 135, 135, 228, 228, 256, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 257, 6, 258, 259, 260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 261, 262, 0, 0, 0, 0, 0, 0, 6, 263, 264, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 168, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 265, 0, 6, 6, 115, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 250, 266, 267, 268, 269, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 81, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 96, 6, 6, 6, 6, 6, 6, + 81, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 271, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 114, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 91, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_id_continue_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 135, 254, 255, 255, 7, + 0, 4, 160, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, + 31, 80, 0, 0, 255, 255, 223, 188, 192, 215, 255, 255, 251, 255, 255, 255, + 255, 255, 191, 255, 251, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, + 255, 1, 254, 255, 255, 255, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, + 0, 0, 255, 7, 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159, + 0, 0, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 63, 36, + 255, 63, 0, 0, 255, 255, 255, 15, 255, 7, 0, 0, 255, 255, 223, 255, + 255, 0, 248, 255, 207, 255, 254, 255, 239, 159, 249, 255, 255, 253, 197, 243, + 159, 121, 128, 176, 207, 255, 3, 80, 238, 135, 249, 255, 255, 253, 109, 211, + 135, 57, 2, 94, 192, 255, 63, 0, 238, 191, 251, 255, 255, 253, 237, 243, + 191, 59, 1, 0, 207, 255, 0, 254, 238, 159, 249, 255, 159, 57, 224, 176, + 207, 255, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, + 192, 255, 0, 0, 255, 223, 253, 255, 255, 253, 255, 227, 223, 61, 96, 7, + 207, 255, 0, 0, 239, 223, 253, 255, 255, 253, 239, 243, 223, 61, 96, 64, + 207, 255, 6, 0, 223, 125, 240, 128, 207, 255, 0, 252, 238, 255, 127, 252, + 255, 255, 251, 47, 127, 132, 95, 255, 192, 255, 12, 0, 254, 255, 255, 255, + 255, 255, 255, 7, 255, 127, 255, 3, 214, 247, 255, 255, 175, 255, 255, 63, + 95, 63, 255, 243, 1, 0, 0, 3, 255, 3, 160, 194, 255, 254, 255, 255, + 255, 31, 254, 255, 223, 255, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, + 255, 3, 255, 255, 255, 255, 255, 63, 191, 32, 255, 255, 255, 255, 255, 247, + 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, + 255, 255, 61, 255, 255, 255, 255, 231, 0, 254, 3, 0, 255, 255, 0, 0, + 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, 255, 223, 31, 0, + 255, 255, 31, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 143, 48, + 255, 3, 0, 0, 0, 56, 255, 3, 255, 255, 255, 1, 255, 7, 255, 255, + 255, 255, 63, 0, 255, 255, 255, 127, 255, 15, 255, 15, 192, 255, 255, 255, + 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 7, 255, 255, 255, 159, + 255, 3, 255, 3, 128, 0, 255, 191, 1, 0, 0, 0, 255, 15, 255, 3, + 0, 248, 15, 0, 255, 255, 255, 0, 255, 227, 255, 255, 255, 1, 255, 255, + 0, 0, 247, 255, 255, 255, 255, 251, 63, 63, 255, 170, 255, 255, 223, 95, + 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 0, 128, 1, 0, 16, 0, + 0, 0, 2, 128, 0, 0, 255, 31, 226, 255, 1, 0, 132, 252, 47, 63, + 80, 253, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 255, 127, 255, 255, + 31, 248, 15, 0, 255, 128, 0, 128, 255, 255, 127, 0, 127, 127, 127, 127, + 224, 0, 0, 0, 254, 255, 62, 31, 255, 255, 127, 254, 224, 255, 255, 255, + 255, 127, 0, 0, 255, 31, 0, 0, 255, 31, 255, 255, 255, 15, 0, 0, + 255, 255, 240, 191, 0, 0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, + 252, 7, 0, 0, 0, 0, 224, 255, 255, 16, 0, 0, 63, 0, 255, 3, + 255, 255, 255, 232, 255, 63, 255, 255, 1, 128, 255, 3, 255, 63, 255, 3, + 255, 255, 127, 252, 7, 0, 0, 56, 255, 255, 124, 0, 126, 126, 126, 0, + 127, 127, 255, 255, 255, 55, 255, 3, 15, 0, 255, 255, 127, 248, 255, 255, + 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, + 0, 0, 248, 255, 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 15, + 255, 255, 24, 0, 0, 224, 0, 0, 0, 0, 223, 255, 252, 252, 252, 28, + 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 0, 0, 0, 32, + 255, 255, 1, 0, 0, 224, 255, 255, 15, 255, 62, 0, 255, 255, 15, 255, + 255, 0, 255, 255, 15, 0, 0, 0, 63, 253, 255, 255, 255, 255, 191, 145, + 255, 255, 55, 0, 255, 255, 255, 192, 111, 240, 239, 254, 255, 255, 63, 135, + 127, 0, 0, 0, 255, 255, 7, 0, 255, 0, 255, 3, 255, 27, 3, 0, + 128, 0, 255, 255, 31, 0, 0, 0, 192, 255, 0, 128, 255, 1, 255, 3, + 240, 0, 255, 255, 255, 255, 79, 0, 31, 222, 255, 23, 255, 255, 251, 255, + 255, 255, 255, 64, 127, 189, 255, 191, 255, 7, 255, 3, 255, 253, 237, 251, + 159, 57, 129, 224, 207, 31, 31, 0, 255, 7, 255, 195, 3, 0, 0, 0, + 191, 0, 255, 3, 255, 255, 63, 255, 1, 0, 0, 63, 17, 0, 255, 3, + 255, 3, 0, 128, 127, 242, 111, 255, 255, 255, 191, 249, 15, 0, 255, 3, + 255, 252, 255, 255, 255, 255, 255, 252, 27, 0, 0, 0, 255, 255, 255, 35, + 255, 253, 255, 255, 1, 0, 255, 3, 0, 0, 252, 255, 255, 254, 127, 0, + 127, 251, 255, 255, 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251, 1, + 0, 0, 1, 0, 248, 255, 255, 224, 255, 135, 255, 255, 255, 128, 255, 255, + 27, 0, 3, 0, 0, 0, 7, 0, 255, 7, 255, 31, 255, 1, 255, 99, + 224, 227, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, + 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, + 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, + 247, 207, 255, 255, 255, 255, 127, 248, 255, 31, 32, 0, 16, 0, 0, 248, + 254, 255, 0, 0, 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 255, 63, + 255, 67, 0, 0, 31, 0, 127, 0, 150, 254, 247, 10, 132, 234, 150, 170, + 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255 }; -static RE_UINT8 re_sentence_break_stage_4[] = { - 0, 0, 0, 0, 0, 6, 2, 6, 6, 1, 0, 0, 6, 12, 13, 0, - 0, 0, 0, 13, 13, 13, 0, 0, 14, 14, 11, 0, 10, 10, 10, 10, - 10, 10, 14, 0, 0, 0, 0, 12, 0, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 13, 0, 13, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 13, 0, 4, 0, 0, 6, 0, 0, 0, 0, 0, 7, 13, - 0, 5, 0, 0, 0, 7, 0, 0, 8, 8, 8, 0, 8, 8, 8, 7, - 7, 7, 7, 0, 8, 7, 8, 7, 7, 8, 7, 8, 7, 7, 8, 7, - 8, 8, 7, 8, 7, 8, 7, 7, 7, 8, 8, 7, 8, 7, 8, 8, - 7, 8, 8, 8, 7, 7, 8, 8, 8, 7, 7, 7, 8, 7, 7, 9, - 9, 9, 9, 9, 9, 7, 7, 7, 7, 9, 9, 9, 7, 7, 0, 0, - 0, 0, 9, 9, 9, 9, 0, 0, 7, 0, 0, 0, 9, 0, 9, 0, - 3, 3, 3, 3, 9, 0, 8, 7, 0, 0, 7, 7, 7, 7, 0, 8, - 0, 0, 8, 0, 8, 0, 8, 8, 8, 8, 0, 8, 7, 7, 7, 8, - 8, 7, 0, 8, 8, 7, 0, 3, 3, 3, 8, 7, 0, 9, 0, 0, - 0, 14, 0, 0, 7, 12, 0, 0, 0, 3, 3, 3, 3, 3, 0, 3, - 0, 3, 3, 0, 9, 9, 9, 0, 0, 0, 0, 9, 5, 5, 5, 5, - 5, 5, 0, 0, 14, 14, 0, 0, 3, 3, 3, 0, 5, 0, 12, 12, - 9, 9, 9, 3, 10, 10, 0, 10, 10, 0, 9, 9, 3, 9, 9, 9, - 12, 9, 3, 3, 3, 5, 0, 3, 3, 9, 9, 3, 3, 0, 3, 3, - 3, 3, 9, 9, 10, 10, 9, 9, 9, 0, 0, 9, 12, 12, 12, 0, - 0, 0, 0, 5, 9, 3, 9, 9, 0, 9, 9, 9, 9, 9, 3, 3, - 3, 9, 0, 0, 14, 12, 9, 0, 0, 3, 0, 0, 3, 3, 9, 3, - 9, 3, 3, 3, 3, 3, 0, 0, 0, 12, 0, 0, 0, 12, 12, 0, - 9, 0, 9, 9, 0, 0, 0, 3, 3, 3, 5, 3, 3, 9, 3, 3, - 12, 12, 10, 10, 3, 0, 0, 3, 3, 3, 9, 0, 9, 9, 0, 9, - 0, 0, 10, 10, 9, 0, 3, 0, 0, 9, 9, 0, 9, 3, 0, 0, - 9, 0, 0, 0, 0, 9, 3, 3, 0, 0, 3, 3, 0, 0, 3, 9, - 0, 0, 9, 0, 0, 0, 3, 0, 3, 0, 3, 0, 10, 10, 0, 0, - 0, 9, 0, 9, 0, 3, 0, 3, 0, 3, 13, 13, 13, 13, 3, 3, - 3, 0, 0, 0, 3, 3, 3, 9, 10, 10, 12, 12, 10, 10, 3, 3, - 0, 8, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 8, 8, 0, 0, - 9, 0, 12, 9, 6, 9, 9, 9, 9, 9, 9, 13, 13, 0, 0, 0, - 3, 12, 12, 0, 9, 0, 3, 3, 0, 0, 14, 12, 14, 12, 0, 3, - 3, 3, 5, 0, 9, 3, 3, 9, 9, 3, 9, 0, 12, 12, 12, 12, - 0, 0, 12, 12, 9, 9, 12, 12, 0, 8, 0, 8, 7, 0, 7, 7, - 8, 0, 7, 0, 8, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 5, - 3, 3, 5, 5, 0, 0, 0, 14, 14, 0, 0, 0, 13, 13, 13, 13, - 11, 0, 0, 0, 4, 4, 5, 5, 5, 5, 5, 6, 0, 13, 13, 0, - 12, 12, 0, 0, 0, 13, 13, 12, 0, 0, 0, 6, 5, 0, 5, 5, - 0, 13, 13, 7, 0, 0, 0, 8, 0, 0, 7, 8, 8, 8, 7, 7, - 8, 0, 8, 0, 8, 8, 0, 7, 9, 7, 0, 0, 0, 8, 7, 7, - 0, 0, 7, 0, 9, 9, 9, 8, 0, 0, 8, 8, 0, 0, 13, 13, - 8, 7, 7, 8, 7, 8, 7, 3, 7, 7, 0, 7, 0, 0, 12, 9, - 0, 0, 13, 0, 6, 14, 12, 0, 0, 13, 13, 13, 9, 9, 0, 12, - 9, 0, 12, 12, 8, 7, 9, 3, 3, 3, 0, 9, 7, 7, 3, 3, - 3, 3, 0, 12, 0, 0, 8, 7, 9, 0, 0, 8, 7, 8, 7, 9, - 7, 7, 7, 9, 9, 9, 3, 9, 0, 9, 9, 3, 0, 12, 12, 12, - 0, 0, 9, 3, 12, 12, 9, 9, 9, 3, 3, 0, 3, 3, 3, 12, - 0, 0, 0, 7, 0, 9, 3, 9, 9, 9, 13, 13, 14, 14, 0, 14, - 0, 14, 14, 0, 13, 0, 0, 13, 0, 14, 12, 12, 14, 13, 13, 13, - 13, 13, 13, 0, 9, 0, 0, 5, 0, 13, 0, 13, 13, 12, 13, 13, - 14, 0, 9, 9, 0, 5, 5, 5, 0, 5, 12, 12, 3, 0, 10, 10, - 9, 12, 12, 0, 3, 12, 0, 0, 10, 10, 9, 0, 12, 12, 0, 12, - 12, 0, 3, 0, 9, 12, 0, 0, 9, 9, 0, 3, 9, 9, 9, 12, - 3, 0, 12, 12, 3, 9, 0, 9, 12, 9, 0, 0, 5, 0, 0, 0, - 0, 3, 3, 12, 3, 3, 3, 5, 5, 5, 5, 3, 0, 8, 8, 0, - 8, 0, 7, 7, -}; +RE_UINT32 re_get_id_continue(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* Sentence_Break: 8564 bytes. */ - -RE_UINT32 re_get_sentence_break(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_sentence_break_stage_1[f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_sentence_break_stage_2[pos + f] << 5; - f = code >> 2; - code ^= f << 2; - pos = (RE_UINT32)re_sentence_break_stage_3[pos + f] << 2; - value = re_sentence_break_stage_4[pos + code]; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* Math. */ + v = re_id_continue_table_1[field_2]; + v = re_id_continue_table_2[(v << 5) | field_1]; + v = re_id_continue_table_3[(v << 2) | field_0]; -static RE_UINT8 re_math_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; + return (v >> offset) & 0x1; +} -static RE_UINT8 re_math_stage_2[] = { - 0, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 7, - 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2, +/* Ideographic. */ +static RE_UINT8 re_ideographic_table_1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, + 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 2, 2, 2, 2, + 2, 7, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 11, 12, 2, + 2, 2, 2, 13, 2, 2, 2, 2, 2, 2, 14, 0, 0, 0, 15, 0, + 2, 2, 2, 2, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_math_stage_3[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, - 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15, 15, 16, 17, 18, 19, - 4, 4, 4, 4, 4, 4, 20, 21, 22, 23, 4, 4, 4, 4, 4, 15, - 4, 4, 4, 4, 15, 15, 15, 15, 15, 15, 15, 15, 24, 25, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 26, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 27, 4, 4, 28, 29, 4, 30, - 15, 31, 32, 33, 34, 35, 15, 15, 15, 15, 36, 15, 15, 15, 15, 37, - 4, 4, 4, 4, 4, 4, 4, 4, 38, 39, 40, 41, 4, 4, 4, 4, +static RE_UINT8 re_ideographic_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 5, 3, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, + 3, 3, 3, 3, 3, 3, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 12, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 13, 0, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 14, 3, 3, 3, 3, 3, 3, + 13, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 15, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 16, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 17, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_math_stage_4[] = { - 0, 0, 0, 0, 0, 8, 0, 112, 0, 0, 0, 64, 0, 0, 0, 80, - 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 128, 0, 0, 0, 128, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 115, 0, - 192, 1, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 28, 0, - 17, 0, 4, 0, 30, 0, 0, 124, 0, 124, 0, 0, 0, 0, 0, 0, - 0, 0, 255, 31, 98, 248, 0, 0, 132, 252, 47, 63, 16, 179, 251, 241, - 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 126, 195, 240, - 255, 255, 255, 47, 48, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 0, 15, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, - 0, 0, 0, 248, 255, 255, 191, 0, 0, 0, 1, 240, 7, 0, 0, 0, - 0, 0, 0, 0, 3, 192, 255, 240, 195, 140, 15, 0, 148, 31, 0, 255, - 96, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 15, 224, 0, 0, - 0, 0, 0, 0, 0, 0, 255, 255, 159, 31, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 126, 1, 0, 0, - 0, 8, 0, 112, 0, 0, 0, 80, 0, 0, 0, 80, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 30, 0, 0, 255, 255, 223, 255, 255, 255, 255, 255, - 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 255, 255, 255, 255, - 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 63, 255, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255, - 239, 255, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, - 255, 251, 255, 15, 238, 251, 255, 15, 0, 0, 0, 0, 0, 0, 3, 0, +static RE_UINT8 re_ideographic_table_3[] = { + 0, 0, 0, 0, 192, 0, 0, 0, 254, 3, 0, 7, 255, 255, 255, 255, + 255, 255, 255, 31, 255, 63, 255, 255, 255, 255, 255, 3, 16, 0, 0, 0, + 255, 255, 255, 0, 255, 255, 63, 0, 255, 1, 0, 0, 0, 0, 255, 255, + 255, 255, 255, 15, 255, 255, 255, 63, 255, 255, 31, 0, 3, 0, 255, 255, + 1, 0, 0, 0, 255, 7, 0, 0 }; -/* Math: 628 bytes. */ - -RE_UINT32 re_get_math(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_math_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_math_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_math_stage_3[pos + f] << 6; - pos += code; - value = (re_math_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; +RE_UINT32 re_get_ideographic(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_ideographic_table_1[field_2]; + v = re_ideographic_table_2[(v << 5) | field_1]; + v = re_ideographic_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; } -/* Alphabetic. */ +/* IDS_Binary_Operator. */ +RE_UINT32 re_get_ids_binary_operator(RE_UINT32 codepoint) { + if (0x2FF0 <= codepoint && codepoint <= 0x2FF1) + return 1; + if (0x2FF4 <= codepoint && codepoint <= 0x2FFB) + return 1; + + return 0; +} -static RE_UINT8 re_alphabetic_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 21, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 23, 24, 5, 25, 26, +/* ID_Start. */ +static RE_UINT8 re_id_start_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 12, 12, + 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 17, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 9, 9, 12, 30, 9, 9, + 9, 31, 9, 9, 9, 9, 9, 9, 9, 9, 32, 33, 12, 12, 12, 12, + 12, 34, 12, 35, 9, 9, 9, 9, 9, 9, 9, 9, 36, 9, 9, 37, + 9, 9, 9, 9, 9, 38, 9, 9, 39, 9, 40, 41, 9, 9, 9, 9, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 42, 12, 12, 12, 43, 44, 12, + 12, 12, 12, 45, 12, 12, 12, 12, 12, 12, 46, 9, 9, 9, 47, 9, + 12, 12, 12, 12, 48, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -7455,3134 +12959,5435 @@ static RE_UINT8 re_alphabetic_stage_1[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; -static RE_UINT8 re_alphabetic_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 32, 31, 31, 31, 31, 31, 31, 31, 33, 34, 35, 31, - 36, 37, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39, - 1, 1, 1, 1, 40, 1, 41, 42, 43, 44, 45, 46, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 47, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 48, 49, 1, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 1, 59, 60, 61, 62, 63, 64, 65, 31, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 31, 78, 79, 80, 31, - 1, 1, 1, 81, 82, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 84, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 85, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 86, 87, 31, 31, 88, 89, - 1, 1, 1, 1, 1, 1, 1, 90, 1, 1, 91, 31, 31, 31, 31, 31, - 1, 92, 93, 31, 31, 31, 31, 31, 31, 31, 31, 31, 94, 31, 31, 31, - 31, 31, 31, 31, 95, 96, 97, 98, 31, 31, 31, 31, 31, 31, 31, 31, - 99, 100, 101, 31, 31, 31, 31, 31, 102, 103, 31, 31, 31, 31, 104, 31, - 31, 105, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 1, 1, 106, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 107, 108, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 109, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 110, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 111, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_alphabetic_stage_3[] = { +static RE_UINT8 re_id_start_table_2[] = { 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 7, 8, 9, 10, 4, 11, - 4, 4, 4, 4, 12, 4, 4, 4, 4, 13, 14, 4, 15, 16, 17, 18, - 19, 4, 20, 21, 4, 4, 22, 23, 24, 4, 25, 4, 4, 26, 27, 28, - 29, 30, 31, 32, 0, 33, 34, 35, 4, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 48, 52, 53, 54, 55, 56, 0, - 57, 58, 59, 60, 57, 61, 62, 63, 57, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 0, 74, 75, 76, 0, 77, 0, 78, 79, 80, 81, 0, 0, - 4, 82, 24, 4, 83, 4, 84, 85, 4, 4, 86, 4, 87, 88, 89, 4, - 90, 4, 72, 0, 91, 4, 4, 92, 71, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 93, 1, 4, 4, 94, 95, 96, 96, 97, 4, 98, 99, 0, - 0, 4, 4, 31, 4, 100, 4, 101, 102, 103, 24, 104, 4, 105, 106, 0, - 107, 4, 102, 108, 0, 109, 0, 0, 4, 110, 111, 0, 4, 112, 4, 113, - 4, 114, 115, 116, 117, 64, 0, 118, 4, 4, 4, 4, 4, 4, 0, 119, - 92, 4, 120, 116, 4, 121, 122, 123, 0, 0, 0, 124, 125, 0, 0, 0, - 126, 127, 128, 4, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 129, 4, 106, 4, 130, 102, 4, 4, 4, 4, 131, - 4, 84, 4, 132, 114, 133, 133, 4, 0, 134, 0, 0, 0, 0, 0, 0, - 135, 136, 71, 4, 137, 71, 4, 85, 138, 13, 4, 4, 139, 72, 0, 24, - 4, 4, 4, 4, 4, 101, 0, 0, 4, 4, 4, 4, 4, 4, 4, 91, - 4, 4, 4, 4, 30, 0, 24, 116, 140, 141, 4, 142, 4, 4, 4, 91, - 143, 144, 4, 4, 145, 4, 146, 143, 147, 148, 4, 96, 4, 4, 149, 150, - 27, 100, 151, 81, 4, 152, 134, 153, 4, 114, 154, 155, 4, 102, 156, 157, - 158, 159, 85, 160, 4, 4, 4, 32, 4, 4, 4, 4, 4, 161, 162, 107, - 4, 4, 4, 163, 4, 4, 164, 0, 165, 166, 167, 4, 4, 26, 168, 4, - 4, 116, 24, 4, 169, 4, 148, 170, 0, 0, 0, 171, 4, 4, 4, 81, - 0, 1, 1, 172, 4, 102, 173, 0, 174, 175, 176, 0, 4, 4, 4, 72, - 0, 0, 4, 177, 0, 0, 0, 0, 0, 0, 0, 0, 81, 4, 178, 0, - 4, 25, 100, 72, 116, 4, 179, 0, 4, 4, 4, 4, 116, 24, 180, 107, - 4, 160, 4, 60, 0, 0, 0, 0, 4, 114, 101, 148, 0, 0, 0, 0, - 181, 182, 101, 114, 102, 0, 0, 183, 101, 164, 0, 0, 4, 184, 0, 0, - 185, 101, 0, 81, 81, 0, 78, 186, 4, 101, 101, 151, 26, 0, 0, 0, - 4, 4, 15, 0, 4, 151, 4, 151, 4, 148, 0, 0, 0, 0, 0, 0, - 81, 187, 188, 0, 0, 0, 0, 114, 4, 4, 188, 0, 144, 31, 24, 15, - 4, 151, 189, 190, 4, 4, 191, 0, 192, 193, 0, 0, 194, 117, 4, 15, - 39, 48, 195, 60, 0, 0, 0, 0, 4, 4, 196, 0, 4, 4, 197, 0, - 0, 0, 0, 0, 4, 198, 199, 0, 4, 102, 200, 0, 4, 201, 0, 0, - 64, 32, 0, 0, 0, 0, 0, 0, 4, 31, 0, 0, 0, 4, 4, 202, - 0, 0, 0, 0, 0, 203, 29, 204, 4, 205, 24, 4, 206, 0, 4, 31, - 207, 208, 77, 209, 169, 210, 0, 0, 211, 212, 213, 214, 215, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 114, 4, 4, 4, 4, 164, 0, 0, 0, - 4, 4, 4, 139, 4, 4, 4, 4, 4, 4, 60, 0, 0, 0, 0, 0, - 4, 139, 0, 0, 0, 0, 0, 0, 4, 4, 216, 0, 0, 0, 0, 0, - 4, 31, 102, 0, 0, 0, 24, 154, 4, 91, 60, 217, 91, 0, 0, 0, - 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 218, 4, 219, 0, 0, 220, - 4, 4, 4, 4, 4, 4, 4, 221, 4, 4, 4, 4, 4, 4, 4, 151, - 102, 0, 222, 223, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 107, - 4, 4, 4, 224, 225, 0, 0, 0, 4, 4, 226, 4, 227, 228, 229, 4, - 230, 231, 232, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 233, 234, 85, - 226, 226, 130, 130, 207, 207, 235, 0, 236, 237, 0, 0, 0, 0, 0, 0, - 4, 238, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 240, - 4, 4, 4, 4, 4, 4, 186, 0, 4, 4, 241, 0, 0, 0, 0, 0, - 229, 242, 243, 244, 245, 246, 0, 0, 0, 24, 247, 247, 106, 0, 0, 0, - 4, 4, 4, 4, 4, 4, 114, 0, 4, 177, 4, 4, 4, 4, 4, 4, - 116, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 248, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 77, 116, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 0, 7, 8, 9, 4, 10, + 4, 4, 4, 4, 11, 4, 4, 4, 4, 12, 13, 4, 14, 0, 15, 16, + 0, 4, 17, 18, 4, 4, 19, 20, 21, 22, 23, 4, 4, 24, 25, 26, + 27, 28, 29, 17, 0, 30, 31, 0, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 45, 49, 50, 51, 52, 46, 0, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 0, + 68, 69, 67, 0, 70, 71, 72, 0, 73, 0, 74, 75, 76, 0, 0, 0, + 4, 77, 78, 79, 80, 4, 81, 82, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 83, 4, 84, 85, 86, 4, 87, 4, 88, 0, 22, 4, 4, 89, + 68, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 90, 1, 4, 4, 91, 92, 93, 93, 94, 4, 95, 96, 0, + 0, 4, 4, 29, 4, 97, 4, 98, 99, 0, 15, 100, 4, 101, 102, 0, + 103, 4, 104, 0, 0, 105, 0, 0, 106, 95, 107, 0, 108, 109, 4, 110, + 4, 111, 112, 113, 114, 115, 0, 116, 4, 4, 4, 4, 4, 4, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 89, 4, 117, 113, 4, 118, 119, 120, + 0, 0, 0, 121, 122, 0, 0, 0, 123, 124, 125, 4, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 126, 99, 4, 4, 4, 4, 127, 4, 81, 4, 128, 103, 129, 129, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 130, 131, 68, 4, 132, 68, 4, 82, 106, 12, 4, 4, 133, 4, 0, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 134, + 4, 4, 4, 4, 75, 0, 15, 113, 4, 4, 4, 4, 4, 4, 4, 4, + 135, 136, 4, 137, 113, 4, 4, 22, 138, 139, 4, 4, 140, 4, 141, 142, + 143, 144, 4, 95, 139, 95, 0, 145, 25, 146, 67, 134, 32, 147, 148, 149, + 4, 14, 150, 151, 4, 152, 153, 154, 155, 156, 82, 157, 4, 4, 4, 144, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 158, 159, 160, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 161, 4, 4, 162, 0, 163, 164, 165, 4, 4, 93, 166, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 113, 15, 4, 167, 4, 31, 168, + 0, 0, 0, 169, 4, 4, 4, 134, 0, 1, 1, 170, 4, 99, 171, 0, + 172, 173, 174, 0, 4, 4, 4, 88, 0, 0, 4, 104, 0, 0, 0, 0, + 0, 0, 0, 0, 134, 4, 175, 0, 4, 23, 176, 98, 113, 4, 177, 0, + 4, 4, 4, 4, 113, 15, 178, 160, 4, 179, 4, 111, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 103, 98, 31, 0, 0, 0, 0, + 180, 181, 98, 103, 99, 0, 0, 182, 98, 162, 0, 0, 4, 183, 0, 0, + 184, 98, 0, 134, 134, 0, 74, 185, 4, 98, 98, 147, 93, 0, 0, 0, + 4, 4, 14, 0, 4, 147, 4, 147, 4, 111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 186, 0, 0, 134, 187, 110, 0, 0, 15, 185, 103, + 108, 188, 0, 0, 108, 22, 15, 14, 108, 67, 189, 190, 108, 147, 191, 0, + 192, 193, 0, 0, 194, 114, 99, 0, 48, 45, 195, 56, 0, 0, 0, 0, + 4, 104, 196, 56, 4, 22, 197, 0, 0, 0, 0, 0, 4, 133, 198, 0, + 4, 22, 199, 0, 4, 200, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, + 4, 193, 0, 0, 0, 4, 4, 201, 202, 203, 204, 0, 0, 205, 175, 206, + 207, 208, 209, 4, 210, 0, 4, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 211, 133, 73, 212, 22, 0, 0, 0, 213, 175, 214, 215, 216, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 46, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 162, 0, 0, 0, + 4, 4, 4, 133, 4, 4, 4, 4, 4, 4, 111, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 29, 99, 0, 0, 0, 15, 217, 4, 22, 111, 218, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 219, 0, 166, 0, 0, 220, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 188, + 4, 4, 4, 4, 4, 4, 98, 0, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 99, 0, 221, 222, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 160, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 223, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 30, 4, 225, 226, 227, 4, 228, 229, 230, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 231, 232, 82, 30, 30, 126, 126, 211, 211, 150, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 233, 234, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 193, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 185, 0, 4, 4, 235, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 227, 236, 237, 238, 239, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 113, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 104, 4, 4, 4, 4, 4, 4, + 113, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 241, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 73, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 17, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_alphabetic_stage_4[] = { +static RE_UINT8 re_id_start_table_3[] = { 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, - 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 32, 0, 0, 0, - 0, 0, 223, 188, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, - 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 0, 0, - 0, 0, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, 0, 0, 255, 7, - 255, 255, 255, 254, 0, 192, 255, 255, 255, 255, 239, 31, 254, 225, 0, 156, - 0, 0, 255, 255, 0, 224, 255, 255, 255, 255, 3, 0, 0, 252, 255, 255, - 255, 7, 48, 4, 255, 255, 255, 252, 255, 31, 0, 0, 255, 255, 255, 1, - 255, 7, 0, 0, 255, 255, 223, 63, 0, 0, 240, 255, 248, 3, 255, 255, - 255, 255, 255, 239, 255, 223, 225, 255, 15, 0, 254, 255, 239, 159, 249, 255, - 255, 253, 197, 227, 159, 89, 128, 176, 15, 0, 3, 16, 238, 135, 249, 255, - 255, 253, 109, 195, 135, 25, 2, 94, 0, 0, 63, 0, 238, 191, 251, 255, - 255, 253, 237, 227, 191, 27, 1, 0, 15, 0, 0, 30, 238, 159, 249, 255, - 159, 25, 192, 176, 15, 0, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, - 199, 29, 129, 0, 239, 223, 253, 255, 255, 253, 255, 227, 223, 29, 96, 7, - 15, 0, 0, 0, 255, 253, 239, 227, 223, 29, 96, 64, 15, 0, 6, 0, - 255, 255, 255, 231, 223, 93, 240, 128, 15, 0, 0, 252, 236, 255, 127, 252, - 255, 255, 251, 47, 127, 128, 95, 255, 0, 0, 12, 0, 254, 255, 255, 255, - 255, 255, 255, 7, 127, 32, 0, 0, 214, 247, 255, 255, 175, 255, 255, 59, - 95, 32, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, 255, 31, 254, 255, - 3, 255, 255, 254, 255, 255, 255, 31, 255, 255, 127, 249, 255, 255, 0, 60, - 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, - 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 0, 0, - 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, 255, 223, 15, 0, - 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 207, 255, 255, 1, 128, 16, - 255, 7, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, 255, 15, 255, 1, - 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 0, 0, 255, 255, 255, 15, - 254, 255, 31, 0, 128, 0, 0, 0, 255, 255, 239, 255, 239, 15, 0, 0, - 255, 243, 0, 252, 191, 255, 3, 0, 255, 255, 127, 0, 0, 224, 0, 252, - 255, 255, 255, 63, 255, 1, 255, 255, 0, 222, 111, 4, 128, 255, 31, 0, - 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, - 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, 80, 189, 255, 243, - 224, 67, 0, 0, 0, 0, 192, 255, 255, 127, 255, 255, 31, 120, 12, 0, - 255, 128, 0, 0, 127, 127, 127, 127, 0, 128, 0, 0, 224, 0, 0, 0, - 254, 3, 62, 31, 255, 255, 127, 224, 224, 255, 255, 255, 255, 127, 0, 0, - 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 240, 143, 0, 0, 128, 255, - 252, 255, 255, 255, 255, 249, 255, 255, 124, 0, 0, 0, 191, 255, 255, 255, - 255, 0, 0, 0, 47, 0, 0, 0, 0, 0, 252, 232, 255, 255, 7, 0, - 255, 255, 247, 255, 255, 255, 0, 124, 255, 63, 0, 0, 255, 255, 127, 252, - 5, 0, 0, 56, 255, 255, 60, 0, 126, 126, 126, 0, 127, 127, 255, 255, - 255, 0, 255, 255, 15, 0, 255, 255, 127, 248, 255, 255, 255, 63, 255, 255, - 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, - 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 15, 0, 0, 223, 255, - 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, - 255, 63, 255, 63, 255, 255, 31, 0, 255, 255, 1, 0, 15, 255, 62, 0, - 255, 255, 15, 255, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, - 255, 255, 255, 192, 111, 240, 239, 254, 31, 0, 0, 0, 128, 0, 255, 255, - 63, 0, 0, 0, 112, 0, 255, 255, 255, 255, 71, 0, 30, 0, 0, 20, - 255, 255, 251, 255, 255, 255, 159, 64, 127, 189, 255, 191, 159, 25, 129, 224, - 187, 7, 0, 128, 179, 0, 0, 0, 255, 255, 63, 127, 0, 0, 0, 63, - 17, 0, 0, 0, 255, 255, 63, 1, 0, 0, 0, 128, 255, 252, 255, 255, - 26, 0, 0, 0, 255, 255, 231, 127, 255, 255, 255, 32, 255, 253, 255, 255, - 255, 255, 127, 127, 0, 0, 252, 255, 255, 254, 127, 0, 127, 251, 255, 255, - 255, 255, 127, 180, 203, 0, 0, 0, 191, 253, 255, 255, 255, 127, 123, 1, - 127, 0, 0, 0, 248, 255, 255, 224, 255, 135, 255, 255, 255, 128, 255, 255, - 11, 0, 0, 0, 255, 255, 255, 0, 0, 0, 7, 0, 240, 0, 255, 255, - 255, 7, 255, 31, 255, 1, 255, 67, 255, 255, 223, 255, 255, 255, 255, 223, - 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, - 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 247, 15, 0, 0, - 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 128, 63, 0, 64, 0, 0, - 255, 15, 0, 0, 143, 8, 0, 0, 150, 254, 247, 10, 132, 234, 150, 170, - 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 255, 3, 255, 255, - 3, 0, 255, 255, -}; - -/* Alphabetic: 2596 bytes. */ - -RE_UINT32 re_get_alphabetic(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_alphabetic_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_alphabetic_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_alphabetic_stage_3[pos + f] << 5; - pos += code; - value = (re_alphabetic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 0, 0, 223, 188, + 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, + 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 0, 0, 0, 0, 255, 255, + 255, 135, 7, 0, 255, 7, 0, 0, 0, 192, 254, 255, 255, 255, 47, 0, + 96, 192, 0, 156, 0, 0, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, + 63, 0, 2, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 63, 4, + 16, 1, 0, 0, 255, 255, 255, 1, 255, 255, 223, 255, 255, 0, 0, 0, + 240, 255, 255, 255, 255, 255, 255, 35, 0, 0, 1, 255, 3, 0, 254, 255, + 225, 159, 249, 255, 255, 253, 197, 35, 0, 64, 0, 176, 3, 0, 3, 16, + 224, 135, 249, 255, 255, 253, 109, 3, 0, 0, 0, 94, 0, 0, 28, 0, + 224, 191, 251, 255, 255, 253, 237, 35, 0, 0, 1, 0, 3, 0, 0, 2, + 224, 159, 249, 255, 0, 0, 0, 176, 3, 0, 2, 0, 232, 199, 61, 214, + 24, 199, 255, 3, 224, 223, 253, 255, 255, 253, 255, 35, 0, 0, 0, 7, + 3, 0, 0, 0, 225, 223, 253, 255, 255, 253, 239, 35, 0, 0, 0, 64, + 3, 0, 6, 0, 240, 223, 253, 255, 255, 255, 255, 39, 0, 64, 112, 128, + 3, 0, 0, 252, 224, 255, 127, 252, 255, 255, 251, 47, 127, 0, 0, 0, + 254, 255, 255, 255, 255, 255, 13, 0, 214, 247, 255, 255, 175, 255, 13, 32, + 95, 0, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, 255, 31, 0, 0, + 0, 31, 0, 0, 255, 7, 0, 128, 0, 0, 63, 60, 98, 192, 225, 255, + 3, 64, 0, 0, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, + 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, + 255, 255, 255, 7, 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, + 255, 223, 3, 0, 255, 255, 3, 0, 255, 223, 1, 0, 255, 255, 15, 0, + 0, 0, 128, 16, 255, 5, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, + 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 0, 0, 255, 255, 127, 0, + 255, 255, 31, 0, 128, 0, 0, 0, 224, 255, 255, 255, 224, 15, 0, 0, + 248, 255, 255, 255, 1, 192, 0, 252, 63, 0, 0, 0, 15, 0, 0, 0, + 0, 224, 0, 252, 255, 255, 255, 63, 255, 1, 255, 255, 255, 255, 255, 231, + 0, 222, 111, 4, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, + 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 63, + 80, 253, 255, 243, 224, 67, 0, 0, 255, 127, 255, 255, 31, 120, 12, 0, + 255, 128, 0, 0, 127, 127, 127, 127, 224, 0, 0, 0, 254, 3, 62, 31, + 255, 255, 127, 248, 255, 127, 0, 0, 255, 255, 255, 31, 255, 31, 255, 255, + 0, 12, 0, 0, 255, 127, 0, 128, 0, 0, 128, 255, 252, 255, 255, 255, + 255, 249, 255, 255, 252, 7, 0, 0, 0, 0, 224, 255, 187, 247, 255, 255, + 7, 0, 0, 0, 0, 0, 252, 104, 63, 0, 255, 255, 255, 255, 7, 0, + 0, 128, 0, 0, 223, 255, 0, 124, 247, 15, 0, 0, 255, 255, 127, 196, + 255, 255, 98, 62, 5, 0, 0, 56, 255, 7, 28, 0, 126, 126, 126, 0, + 127, 127, 255, 255, 255, 3, 255, 255, 15, 0, 255, 255, 127, 248, 255, 255, + 255, 255, 255, 15, 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 160, + 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, + 0, 0, 255, 15, 0, 0, 223, 255, 192, 255, 255, 255, 252, 252, 252, 28, + 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 1, 0, + 255, 7, 255, 255, 15, 255, 62, 0, 255, 255, 15, 255, 255, 0, 255, 255, + 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, 255, 255, 255, 192, + 1, 0, 239, 254, 31, 0, 0, 0, 255, 3, 3, 0, 128, 0, 255, 255, + 255, 255, 255, 0, 144, 0, 255, 255, 255, 255, 71, 0, 30, 0, 0, 20, + 255, 255, 251, 255, 255, 15, 0, 0, 127, 189, 255, 191, 0, 0, 1, 224, + 128, 7, 0, 128, 176, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, + 255, 7, 0, 1, 0, 0, 0, 128, 127, 242, 111, 255, 255, 255, 0, 128, + 2, 0, 0, 0, 255, 252, 255, 255, 10, 0, 0, 0, 1, 248, 255, 255, + 255, 255, 7, 4, 0, 0, 1, 240, 255, 3, 0, 32, 255, 253, 255, 255, + 0, 0, 252, 255, 127, 251, 255, 255, 64, 0, 0, 0, 191, 253, 255, 255, + 255, 3, 0, 1, 255, 63, 0, 0, 248, 255, 255, 224, 255, 7, 1, 0, + 11, 0, 0, 0, 0, 0, 7, 0, 240, 0, 255, 255, 255, 7, 255, 31, + 255, 1, 255, 3, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, + 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, + 253, 255, 255, 247, 255, 31, 128, 63, 0, 64, 0, 0, 15, 8, 0, 0, + 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, + 238, 251, 255, 15, 3, 0, 255, 255 +}; + +RE_UINT32 re_get_id_start(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_id_start_table_1[field_2]; + v = re_id_start_table_2[(v << 5) | field_1]; + v = re_id_start_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; } -/* Lowercase. */ - -static RE_UINT8 re_lowercase_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_lowercase_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 3, 14, - 3, 3, 15, 3, 3, 3, 16, 3, 3, 3, 3, 3, 17, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 18, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 19, 20, 3, 3, 3, 3, - 3, 3, 3, 3, 21, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -}; - -static RE_UINT8 re_lowercase_stage_3[] = { - 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 5, 13, 14, 15, 16, 17, 18, 19, 0, 0, 20, 21, 22, 23, 24, 25, - 0, 26, 15, 5, 27, 5, 28, 5, 5, 29, 0, 15, 30, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 31, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, - 0, 0, 0, 0, 30, 0, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, - 5, 5, 5, 5, 33, 5, 5, 5, 34, 35, 36, 37, 35, 38, 39, 40, - 0, 0, 0, 41, 42, 0, 0, 0, 43, 44, 45, 26, 46, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 47, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 26, 48, 49, 5, 5, 5, 50, 15, 51, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 52, 53, 0, 0, 0, 0, 54, 5, 55, 56, 57, 58, 59, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 60, 61, 15, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 63, 64, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 68, 69, 81, - 71, 72, 82, 64, 75, 83, 84, 85, 86, 82, 87, 26, 88, 75, 89, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 91, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_lowercase_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 0, 0, 0, 128, - 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 85, 85, 171, 170, 170, - 170, 170, 170, 212, 41, 49, 36, 78, 42, 45, 81, 230, 64, 82, 85, 181, - 170, 170, 41, 170, 170, 170, 250, 147, 133, 170, 255, 255, 255, 255, 255, 255, - 255, 255, 239, 255, 255, 255, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 138, 60, 0, 0, 1, 0, 0, 240, 255, 255, - 255, 127, 227, 170, 170, 170, 47, 25, 0, 0, 255, 255, 2, 168, 170, 170, - 84, 213, 170, 170, 170, 170, 0, 0, 255, 1, 0, 0, 255, 255, 255, 231, - 0, 0, 0, 63, 170, 170, 234, 191, 255, 0, 63, 0, 255, 0, 255, 0, - 63, 0, 255, 0, 255, 0, 255, 63, 255, 0, 223, 64, 220, 0, 207, 0, - 255, 0, 220, 0, 0, 0, 2, 128, 0, 0, 255, 31, 0, 196, 8, 0, - 0, 128, 16, 50, 192, 67, 0, 0, 16, 0, 0, 0, 255, 3, 0, 0, - 255, 255, 255, 127, 98, 21, 218, 63, 26, 80, 8, 0, 191, 32, 0, 0, - 170, 42, 0, 0, 170, 170, 170, 58, 168, 170, 171, 170, 170, 170, 255, 149, - 170, 80, 186, 170, 170, 130, 160, 170, 8, 0, 0, 0, 0, 0, 0, 7, - 255, 255, 255, 247, 255, 0, 255, 255, 127, 0, 248, 0, 0, 255, 255, 255, - 255, 255, 0, 0, 0, 0, 0, 255, 255, 255, 255, 15, 255, 255, 7, 0, - 0, 0, 0, 252, 255, 255, 15, 0, 0, 192, 223, 255, 255, 0, 0, 0, - 252, 255, 255, 15, 0, 0, 192, 235, 239, 255, 0, 0, 0, 252, 255, 255, - 15, 0, 0, 192, 255, 255, 255, 0, 0, 0, 252, 255, 255, 15, 0, 0, - 192, 255, 255, 255, 0, 192, 255, 255, 0, 0, 192, 255, 63, 0, 0, 0, - 252, 255, 255, 247, 3, 0, 0, 240, 255, 255, 223, 15, 255, 127, 63, 0, - 255, 253, 0, 0, 247, 11, 0, 0, 252, 255, 255, 255, 15, 0, 0, 0, -}; +/* IDS_Trinary_Operator. */ +RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 codepoint) { + if (0x2FF2 <= codepoint && codepoint <= 0x2FF3) + return 1; -/* Lowercase: 1000 bytes. */ - -RE_UINT32 re_get_lowercase(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_lowercase_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_lowercase_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_lowercase_stage_3[pos + f] << 5; - pos += code; - value = (re_lowercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return 0; } -/* Uppercase. */ - -static RE_UINT8 re_uppercase_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_uppercase_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 12, - 3, 3, 13, 3, 3, 3, 14, 3, 3, 3, 3, 3, 15, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 16, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 17, 18, 3, 3, 3, 3, - 3, 3, 3, 3, 19, 3, 3, 3, 20, 3, 3, 3, 3, 3, 3, 3, -}; - -static RE_UINT8 re_uppercase_stage_3[] = { - 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, - 3, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, - 18, 19, 0, 3, 20, 3, 21, 3, 3, 22, 23, 0, 0, 0, 0, 0, +/* Indic_Positional_Category. */ +static RE_UINT8 re_indic_positional_category_table_1[] = { + 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 25, - 0, 0, 0, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 28, 3, 3, 3, 29, 30, 31, 32, 0, 33, 34, 35, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 19, 39, 0, 0, 0, - 0, 0, 0, 0, 0, 40, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 41, 0, 42, 3, 3, 3, 43, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 44, 45, 0, 0, 0, 0, 46, 3, 47, 48, 49, 50, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 18, 51, 0, 0, 0, 26, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 18, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 54, 55, 56, 57, 58, 59, 26, 60, 61, 62, 63, 64, 65, 54, 55, 56, - 57, 66, 25, 26, 60, 57, 67, 68, 69, 70, 40, 41, 26, 71, 72, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 18, 73, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 74, 74, 60, 0, 0, 0, -}; - -static RE_UINT8 re_uppercase_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 255, 255, 127, 127, 85, 85, 85, 85, - 85, 85, 85, 170, 170, 84, 85, 85, 85, 85, 85, 43, 214, 206, 219, 177, - 213, 210, 174, 17, 144, 164, 170, 74, 85, 85, 210, 85, 85, 85, 5, 108, - 122, 85, 0, 0, 0, 0, 69, 128, 64, 215, 254, 255, 251, 15, 0, 0, - 0, 128, 28, 85, 85, 85, 144, 230, 255, 255, 255, 255, 255, 255, 0, 0, - 1, 84, 85, 85, 171, 42, 85, 85, 85, 85, 254, 255, 255, 255, 127, 0, - 191, 32, 0, 0, 255, 255, 63, 0, 0, 0, 255, 255, 255, 255, 255, 231, - 85, 85, 21, 64, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, - 0, 255, 0, 0, 0, 0, 0, 15, 0, 15, 0, 15, 0, 31, 0, 15, - 132, 56, 39, 62, 80, 61, 15, 192, 32, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, 5, 40, 4, 0, - 85, 21, 0, 0, 85, 85, 85, 5, 84, 85, 84, 85, 85, 85, 0, 106, - 85, 40, 69, 85, 85, 125, 95, 85, 116, 0, 0, 0, 255, 0, 0, 0, - 255, 255, 15, 0, 255, 255, 7, 0, 255, 255, 255, 3, 0, 0, 240, 255, - 255, 63, 0, 0, 0, 255, 255, 255, 3, 0, 0, 208, 100, 222, 63, 0, - 255, 3, 0, 0, 176, 231, 223, 31, 0, 0, 0, 123, 95, 252, 1, 0, - 0, 240, 255, 255, 63, 0, 0, 0, 3, 0, 0, 240, 1, 0, 0, 0, - 252, 255, 255, 7, 0, 0, 0, 240, 255, 255, 31, 0, 255, 1, 0, 0, - 0, 4, 0, 0, 3, 0, 0, 0, 255, 3, 255, 255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Uppercase: 916 bytes. */ - -RE_UINT32 re_get_uppercase(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_uppercase_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_uppercase_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_uppercase_stage_3[pos + f] << 5; - pos += code; - value = (re_uppercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Cased. */ - -static RE_UINT8 re_cased_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, +static RE_UINT8 re_indic_positional_category_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 6, 10, 11, 9, 6, 12, 13, 5, 14, 15, 4, 16, 17, 18, 0, + 19, 20, 21, 4, 5, 14, 22, 4, 23, 24, 25, 4, 5, 0, 26, 27, + 0, 28, 29, 0, 0, 30, 31, 0, 32, 33, 0, 34, 35, 36, 37, 0, + 0, 38, 39, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 43, 43, 0, 44, 45, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 48, 0, + 49, 0, 50, 51, 0, 0, 0, 0, 52, 53, 54, 55, 56, 57, 0, 58, + 0, 59, 0, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 62, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 64, 65, 0, 0, 66, 67, 68, 69, 0, 70, 71, 0, 1, 72, 73, 74, + 0, 75, 76, 77, 0, 78, 79, 80, 0, 0, 0, 0, 0, 0, 0, 81, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 84, 85, 86, 0, 56, 87, 0, 0, 88, 89, 90, 91, 56, 92, 93, 0, + 0, 94, 0, 0, 0, 0, 95, 96, 23, 97, 98, 99, 0, 0, 0, 0, + 0, 100, 101, 0, 0, 102, 103, 0, 0, 0, 0, 0, 0, 104, 105, 0, + 0, 106, 107, 0, 0, 108, 0, 0, 109, 110, 0, 0, 0, 0, 0, 0, + 0, 111, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 114, 115, + 116, 117, 118, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 120, 0, 0, 121, 122, 0, 0, 0, 123, 124, 0, 125, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_cased_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, +static RE_UINT8 re_indic_positional_category_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 2, 4, + 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2, 2, 3, 4, 2, + 0, 1, 3, 1, 1, 1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 4, + 2, 3, 3, 3, 3, 0, 0, 4, 4, 0, 0, 5, 5, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 3, 3, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 3, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 3, 3, 3, 3, 1, 0, 1, 1, 6, 0, 2, 2, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 1, + 2, 3, 3, 3, 3, 0, 0, 4, 7, 0, 0, 5, 8, 3, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, + 1, 2, 2, 0, 0, 0, 4, 4, 4, 0, 5, 5, 5, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 2, 2, 2, 2, 0, 1, 1, 9, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 2, 2, 2, 2, 0, 1, 6, 6, 0, 6, 6, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 2, 2, + 2, 2, 2, 3, 3, 0, 4, 4, 4, 0, 5, 5, 5, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, + 2, 2, 1, 1, 3, 0, 3, 0, 2, 4, 7, 4, 5, 8, 5, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 1, 2, 2, 1, 1, 1, 1, 3, 3, 3, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 1, 2, 2, 1, 1, 1, 1, 3, 3, 3, 1, 3, 0, 0, 0, + 10, 10, 10, 10, 10, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 3, 0, 1, 0, 0, 0, 0, 2, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 1, 9, 3, 3, 9, 9, 9, 9, 1, 1, 1, 1, 1, 2, + 1, 9, 1, 1, 3, 0, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 3, 14, - 3, 3, 15, 3, 3, 3, 16, 3, 3, 3, 3, 3, 17, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 18, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 19, 20, 3, 3, 3, 3, - 3, 3, 3, 3, 21, 3, 3, 3, 22, 3, 3, 3, 3, 3, 3, 3, -}; - -static RE_UINT8 re_cased_stage_3[] = { - 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 5, 6, 4, - 4, 4, 4, 4, 7, 8, 9, 10, 0, 0, 11, 12, 13, 14, 4, 15, - 4, 4, 4, 4, 16, 4, 4, 4, 4, 17, 18, 4, 19, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 20, 21, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 22, - 0, 0, 0, 0, 23, 21, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, - 4, 4, 4, 4, 4, 4, 4, 4, 22, 4, 24, 25, 4, 26, 27, 28, - 0, 0, 0, 29, 30, 0, 0, 0, 31, 32, 33, 4, 34, 0, 0, 0, - 0, 0, 0, 0, 0, 35, 4, 36, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 37, 38, 4, 4, 4, 4, 39, 4, 40, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 41, 25, 0, 0, 0, 0, 42, 4, 4, 43, 4, 44, 45, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 5, 47, 4, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, - 4, 4, 49, 0, 0, 46, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 52, 4, 52, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 4, 53, 4, 54, 55, 56, 4, 57, 58, 59, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 60, 61, 5, 53, 53, 37, 37, 62, 62, 63, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 64, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 65, 65, 36, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 1, 3, + 3, 4, 1, 1, 1, 1, 1, 3, 2, 0, 1, 2, 11, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 3, 3, 0, 0, 0, 0, 3, 3, + 3, 0, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 2, 4, 1, 1, 2, 2, 2, 2, 2, 2, 3, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 3, 3, 3, 7, 8, + 5, 4, 4, 4, 5, 5, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 1, 1, 3, 2, 2, 6, 6, 1, 1, 2, 2, 2, 0, 0, 0, 0, + 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 1, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 10, 10, 10, 2, 2, 10, 2, 2, 2, 2, 2, + 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 3, 4, 2, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 3, 2, 1, 1, 1, 3, 3, 3, 3, 0, + 0, 2, 1, 2, 2, 1, 1, 1, 1, 3, 3, 1, 3, 2, 4, 4, + 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 3, + 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 1, 1, 3, 3, 3, 12, 9, 13, 4, 4, + 5, 5, 1, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 3, 1, 3, 4, 2, 1, 1, 2, 0, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 1, 2, 2, 2, 1, 2, 1, + 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 4, 4, 7, 2, 2, 3, 1, 1, 1, + 1, 1, 1, 1, 4, 4, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 14, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, + 1, 2, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 3, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 1, 3, 3, 3, 3, 1, + 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 2, 2, 1, 1, 3, 3, 4, 4, 1, 3, 12, 15, + 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 3, 1, 4, + 4, 1, 3, 2, 4, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 1, 1, 3, 10, 10, 1, 1, 10, 2, 10, 10, 2, 1, 1, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 1, 4, 2, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 1, 2, 2, 3, 2, 2, 0, 2, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 3, 3, 0, 1, 14, 0, 0, 0, 0, 0, 3, 3, 3, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 0, 0, 0, 0, 0, + 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 3, 3, 3, 3, + 3, 3, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 4, 2, 3, 3, 1, 1, 2, 2, 3, 3, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, 4, 1, 9, 9, + 1, 3, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 4, 2, 3, 3, 3, 3, 3, 3, 1, 1, 1, 6, + 2, 0, 1, 1, 0, 0, 0, 0, 0, 3, 3, 1, 3, 0, 4, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, + 1, 1, 6, 6, 1, 2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 2, 4, 2, 3, 3, 1, 1, 1, 1, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, + 1, 2, 2, 2, 2, 0, 0, 4, 4, 0, 0, 5, 5, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 4, 2, 3, 3, 3, 3, 3, 3, 1, 1, + 2, 2, 3, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 4, 2, 3, 3, 3, 3, 3, 3, 4, 1, 7, 5, 2, 5, 1, + 1, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 4, 2, 3, 3, 3, 3, 0, 0, 4, 7, 5, 8, 1, 1, 2, 3, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 3, 3, 3, 3, 3, 3, 1, 1, 2, 2, 1, 2, 3, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 4, 2, + 3, 3, 1, 1, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 11, 1, + 2, 2, 1, 1, 3, 3, 4, 1, 3, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 2, 3, + 3, 3, 3, 1, 1, 1, 1, 1, 2, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 4, 0, 4, 5, 0, 0, 1, 1, 2, 0, 1, + 2, 1, 12, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 4, 2, 3, 3, 3, 3, 0, 0, 1, 1, 2, 2, 2, 2, + 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 3, 3, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 3, 1, 1, 1, 1, 2, 1, 3, 3, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 3, 3, 1, 1, 1, 2, 2, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 1, 1, 3, 3, 3, 3, 3, 0, 1, 1, 1, 1, 1, 1, 2, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 2, 3, 3, 3, 3, 3, 3, + 3, 4, 3, 1, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 3, 0, 0, 0, 1, 0, 1, 1, 0, 1, + 1, 1, 3, 1, 3, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, + 1, 1, 0, 2, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 3, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_cased_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, - 255, 255, 255, 255, 255, 255, 255, 247, 240, 255, 255, 255, 255, 255, 239, 255, - 255, 255, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, - 0, 0, 207, 188, 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, - 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 0, 255, 1, 0, 0, - 191, 32, 255, 255, 255, 255, 255, 231, 255, 255, 63, 63, 255, 1, 255, 255, - 63, 63, 255, 170, 255, 255, 255, 63, 255, 255, 223, 95, 220, 31, 207, 15, - 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, - 80, 189, 31, 242, 224, 67, 0, 0, 24, 0, 0, 0, 0, 0, 192, 255, - 255, 3, 0, 0, 255, 127, 255, 255, 255, 255, 255, 127, 31, 120, 12, 0, - 191, 32, 0, 0, 255, 63, 0, 0, 252, 255, 255, 255, 255, 120, 255, 255, - 124, 0, 0, 0, 0, 0, 0, 7, 0, 0, 255, 255, 255, 0, 255, 255, - 127, 0, 248, 0, 255, 255, 0, 0, 255, 255, 15, 255, 255, 255, 255, 15, - 255, 255, 7, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, - 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, - 63, 255, 255, 255, 253, 255, 255, 247, 255, 253, 255, 255, 247, 15, 0, 0, - 15, 0, 0, 0, 255, 3, 255, 255, -}; +RE_UINT32 re_get_indic_positional_category(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -/* Cased: 912 bytes. */ - -RE_UINT32 re_get_cased(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_cased_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_cased_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_cased_stage_3[pos + f] << 5; - pos += code; - value = (re_cased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -/* Case_Ignorable. */ + v = re_indic_positional_category_table_1[field_2]; + v = re_indic_positional_category_table_2[(v << 5) | field_1]; + v = re_indic_positional_category_table_3[(v << 5) | field_0]; -static RE_UINT8 re_case_ignorable_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 6, 2, 7, 2, 8, 9, 10, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; + return v; +} -static RE_UINT8 re_case_ignorable_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 1, 17, 1, 1, 1, 18, 19, 20, 21, 22, 23, 24, 1, 25, - 26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 28, 29, 1, - 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* Indic_Syllabic_Category. */ +static RE_UINT8 re_indic_syllabic_category_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 31, 1, 1, 1, 32, 1, 33, 34, 35, 36, 37, 38, 1, 1, 1, 1, + 1, 1, 11, 1, 12, 13, 14, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39, 1, 1, 40, 41, - 1, 42, 43, 44, 1, 1, 1, 1, 1, 1, 45, 1, 1, 46, 1, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 1, 59, 60, 61, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 62, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 63, 64, 1, 1, 1, 65, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 66, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 67, 68, 1, 1, 1, 1, 1, 1, 1, 69, 1, 1, 1, 1, 1, - 70, 71, 72, 1, 1, 1, 1, 1, 73, 74, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 75, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 76, 77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_case_ignorable_stage_3[] = { - 0, 1, 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 6, 6, 6, 6, 6, 7, 8, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 11, 12, 13, 14, - 15, 0, 16, 17, 0, 0, 18, 19, 20, 5, 21, 0, 0, 22, 0, 23, - 24, 25, 26, 0, 0, 0, 27, 6, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 33, 37, 38, 36, 33, 39, 40, 32, 41, 42, 43, 44, 0, 45, 0, - 46, 47, 48, 43, 32, 41, 49, 43, 50, 51, 34, 43, 0, 0, 52, 0, - 0, 53, 54, 0, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 62, 0, - 0, 63, 64, 65, 66, 0, 0, 33, 0, 0, 67, 0, 0, 0, 0, 0, - 68, 68, 69, 69, 0, 70, 71, 0, 72, 0, 73, 0, 74, 75, 0, 0, - 0, 76, 0, 0, 0, 0, 0, 0, 77, 0, 78, 79, 0, 80, 0, 0, - 81, 82, 44, 83, 50, 84, 0, 85, 0, 86, 0, 87, 0, 0, 88, 89, - 0, 90, 6, 91, 92, 6, 6, 93, 0, 0, 0, 0, 0, 94, 95, 96, - 97, 98, 0, 99, 100, 0, 5, 101, 0, 0, 0, 102, 0, 0, 0, 103, - 0, 0, 0, 104, 0, 0, 0, 6, 0, 105, 0, 0, 0, 0, 0, 0, - 106, 107, 0, 0, 108, 0, 0, 109, 110, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 87, 111, 0, 0, 112, 113, 0, 0, 114, - 6, 50, 0, 17, 115, 0, 0, 57, 116, 74, 0, 0, 0, 0, 117, 118, - 0, 119, 120, 0, 28, 121, 105, 74, 0, 122, 123, 124, 0, 125, 126, 127, - 0, 0, 92, 0, 0, 0, 0, 128, 2, 0, 0, 0, 0, 129, 50, 0, - 130, 131, 132, 0, 0, 0, 0, 133, 1, 2, 3, 17, 47, 0, 0, 134, - 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 136, 0, 0, 0, 0, 137, 138, 0, 0, 0, 0, 0, 74, - 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, - 32, 140, 141, 133, 50, 142, 143, 0, 28, 144, 0, 145, 50, 146, 147, 0, - 0, 148, 0, 0, 0, 0, 133, 149, 50, 51, 3, 150, 0, 0, 0, 0, - 0, 140, 151, 0, 0, 152, 153, 0, 0, 0, 0, 0, 0, 154, 155, 0, - 0, 156, 3, 0, 0, 157, 0, 0, 67, 158, 0, 0, 0, 0, 0, 0, - 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 3, - 161, 162, 163, 0, 164, 0, 0, 0, 0, 165, 0, 0, 129, 166, 0, 0, - 0, 167, 168, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, - 0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, - 0, 173, 81, 0, 0, 0, 0, 0, 0, 0, 105, 0, 174, 0, 0, 175, - 0, 0, 0, 0, 176, 81, 0, 0, 0, 0, 0, 177, 178, 179, 0, 0, - 0, 0, 180, 0, 0, 0, 0, 0, 6, 181, 6, 182, 183, 184, 0, 0, - 185, 186, 0, 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 173, 0, - 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, - 32, 6, 6, 6, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 131, -}; - -static RE_UINT8 re_case_ignorable_stage_4[] = { - 0, 0, 0, 0, 128, 64, 0, 4, 0, 0, 0, 64, 1, 0, 0, 0, - 0, 161, 144, 1, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 48, 4, - 176, 0, 0, 0, 248, 3, 0, 0, 0, 0, 0, 2, 0, 0, 254, 255, - 255, 255, 255, 191, 182, 0, 0, 0, 0, 0, 16, 0, 63, 0, 255, 23, - 1, 248, 255, 255, 0, 0, 1, 0, 0, 0, 192, 191, 255, 61, 0, 0, - 0, 128, 2, 0, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 63, 36, - 0, 0, 192, 255, 255, 63, 0, 0, 0, 0, 0, 14, 0, 0, 248, 255, - 7, 0, 0, 0, 0, 0, 0, 20, 254, 33, 254, 0, 12, 0, 2, 0, - 2, 0, 0, 0, 0, 0, 0, 16, 30, 32, 0, 0, 12, 0, 0, 64, - 6, 0, 0, 0, 134, 57, 2, 0, 0, 0, 35, 0, 190, 33, 0, 0, - 12, 0, 0, 252, 0, 0, 0, 144, 30, 32, 64, 0, 12, 0, 0, 0, - 4, 0, 0, 0, 1, 32, 0, 0, 17, 0, 0, 0, 0, 0, 0, 192, - 193, 61, 96, 0, 64, 48, 0, 0, 3, 0, 0, 0, 0, 0, 0, 24, - 0, 4, 92, 0, 0, 0, 242, 7, 192, 127, 0, 0, 0, 0, 242, 31, - 64, 63, 0, 0, 0, 0, 0, 3, 0, 0, 160, 2, 0, 0, 254, 127, - 223, 224, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 0, 224, 253, 102, - 0, 0, 0, 195, 1, 0, 30, 0, 100, 32, 0, 32, 0, 0, 0, 224, - 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 176, 63, 64, 254, 143, 32, - 0, 120, 0, 0, 8, 0, 0, 0, 96, 0, 0, 0, 0, 2, 0, 0, - 135, 1, 4, 14, 0, 0, 128, 9, 0, 0, 64, 127, 229, 31, 248, 159, - 128, 0, 255, 127, 15, 0, 0, 0, 0, 0, 208, 23, 0, 248, 15, 0, - 60, 59, 0, 0, 64, 163, 3, 0, 0, 240, 207, 0, 0, 0, 0, 63, - 0, 0, 247, 255, 253, 33, 16, 3, 0, 240, 255, 255, 255, 7, 0, 1, - 0, 0, 0, 248, 255, 255, 255, 251, 0, 0, 0, 160, 3, 224, 0, 224, - 0, 224, 0, 96, 0, 248, 0, 3, 144, 124, 0, 0, 223, 255, 2, 128, - 0, 0, 255, 31, 255, 255, 1, 0, 0, 0, 0, 48, 0, 128, 3, 0, - 0, 128, 0, 128, 0, 128, 0, 0, 32, 0, 0, 0, 0, 60, 62, 8, - 0, 0, 0, 126, 0, 0, 0, 112, 0, 0, 32, 0, 0, 16, 0, 0, - 0, 128, 247, 191, 0, 0, 0, 240, 0, 0, 3, 0, 0, 7, 0, 0, - 68, 8, 0, 0, 48, 0, 0, 0, 255, 255, 3, 128, 192, 63, 0, 0, - 128, 255, 3, 0, 0, 0, 200, 51, 0, 126, 102, 0, 8, 16, 0, 0, - 0, 0, 1, 16, 0, 0, 157, 193, 2, 0, 0, 32, 0, 48, 88, 0, - 32, 33, 0, 0, 0, 0, 252, 255, 255, 255, 8, 0, 255, 255, 0, 0, - 0, 0, 36, 0, 0, 0, 0, 128, 8, 0, 0, 14, 0, 0, 0, 32, - 0, 0, 192, 7, 110, 240, 0, 0, 0, 0, 0, 135, 240, 0, 0, 0, - 0, 0, 0, 255, 127, 0, 0, 0, 0, 0, 120, 38, 0, 32, 0, 0, - 128, 239, 31, 0, 0, 0, 8, 0, 0, 0, 192, 127, 0, 30, 0, 0, - 0, 128, 211, 64, 248, 7, 0, 0, 192, 31, 31, 0, 92, 0, 0, 64, - 0, 0, 248, 133, 13, 0, 0, 0, 0, 0, 60, 176, 1, 0, 0, 48, - 0, 0, 248, 167, 0, 40, 191, 0, 188, 15, 0, 0, 0, 128, 255, 6, - 0, 0, 240, 12, 254, 7, 0, 0, 0, 0, 248, 121, 128, 0, 126, 14, - 0, 252, 127, 3, 0, 0, 127, 191, 255, 252, 109, 0, 0, 0, 126, 180, - 191, 0, 0, 0, 0, 0, 163, 0, 0, 0, 24, 0, 0, 0, 255, 1, - 0, 0, 31, 0, 0, 0, 127, 0, 0, 128, 255, 255, 11, 0, 0, 0, - 0, 0, 0, 96, 128, 3, 248, 255, 231, 15, 0, 0, 0, 60, 0, 0, - 28, 0, 0, 0, 255, 255, 127, 248, 255, 31, 32, 0, 16, 0, 0, 248, - 254, 255, 0, 0, 127, 255, 255, 249, 219, 7, 0, 0, 0, 0, 255, 63, - 0, 240, 0, 0, 240, 15, 0, 0, -}; - -/* Case_Ignorable: 1904 bytes. */ - -RE_UINT32 re_get_case_ignorable(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_case_ignorable_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_case_ignorable_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_case_ignorable_stage_3[pos + f] << 5; - pos += code; - value = (re_case_ignorable_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Changes_When_Lowercased. */ - -static RE_UINT8 re_changes_when_lowercased_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_changes_when_lowercased_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 12, - 3, 3, 13, 3, 3, 3, 14, 3, 3, 3, 3, 3, 15, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 16, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 17, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +static RE_UINT8 re_indic_syllabic_category_table_2[] = { + 0, 1, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 17, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 27, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 0, 45, 46, 47, 0, 0, 48, 49, 50, 51, 52, 53, 0, + 54, 55, 56, 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 59, 60, 61, 62, 54, 63, 64, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 67, 68, 69, 54, 70, 71, 0, + 72, 54, 73, 74, 75, 0, 0, 0, 76, 77, 78, 0, 79, 80, 54, 81, + 54, 82, 83, 0, 0, 0, 84, 85, 0, 0, 0, 0, 0, 0, 0, 86, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 0, 0, 88, 89, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 0, 103, 104, 105, 106, + 107, 108, 109, 110, 54, 111, 112, 113, 0, 0, 0, 0, 0, 0, 114, 115, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 117, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 119, 120, 121, 122, 123, 124, 0, 0, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 0, 0, 135, 136, 137, 138, 139, 140, 141, 142, 0, 0, 0, 0, + 143, 144, 145, 146, 147, 148, 149, 0, 0, 0, 0, 0, 143, 150, 151, 0, + 143, 152, 153, 0, 154, 155, 65, 0, 156, 157, 0, 0, 0, 0, 0, 0, + 154, 158, 0, 0, 0, 0, 0, 0, 159, 160, 161, 0, 0, 162, 163, 164, + 165, 166, 167, 54, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 169, 170, 171, 172, 173, 174, 0, 0, 175, 176, 177, 178, 179, 65, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_changes_when_lowercased_stage_3[] = { - 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, - 3, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, - 18, 19, 0, 3, 20, 3, 21, 3, 3, 22, 23, 0, 0, 0, 0, 0, +static RE_UINT8 re_indic_syllabic_category_table_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 25, - 0, 0, 0, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 28, 3, 3, 3, 29, 30, 31, 32, 30, 33, 34, 35, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 19, 37, 0, 0, 0, - 0, 0, 0, 0, 0, 38, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 39, 0, 40, 3, 3, 3, 41, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 42, 43, 0, 0, 0, 0, 44, 3, 45, 46, 47, 48, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 18, 49, 0, 0, 0, 26, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 18, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 18, 52, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_changes_when_lowercased_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 255, 255, 127, 127, 85, 85, 85, 85, - 85, 85, 85, 170, 170, 84, 85, 85, 85, 85, 85, 43, 214, 206, 219, 177, - 213, 210, 174, 17, 176, 173, 170, 74, 85, 85, 214, 85, 85, 85, 5, 108, - 122, 85, 0, 0, 0, 0, 69, 128, 64, 215, 254, 255, 251, 15, 0, 0, - 0, 128, 0, 85, 85, 85, 144, 230, 255, 255, 255, 255, 255, 255, 0, 0, - 1, 84, 85, 85, 171, 42, 85, 85, 85, 85, 254, 255, 255, 255, 127, 0, - 191, 32, 0, 0, 255, 255, 63, 0, 0, 0, 255, 255, 255, 255, 255, 231, - 85, 85, 21, 64, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, - 0, 255, 0, 0, 0, 255, 0, 31, 0, 31, 0, 15, 0, 31, 0, 31, - 64, 12, 4, 0, 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, - 157, 234, 37, 192, 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 5, - 84, 85, 84, 85, 85, 85, 0, 106, 85, 40, 69, 85, 85, 125, 95, 85, - 116, 0, 0, 0, 255, 0, 0, 0, 255, 255, 15, 0, 255, 255, 7, 0, - 3, 0, 0, 0, -}; - -/* Changes_When_Lowercased: 764 bytes. */ - -RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_changes_when_lowercased_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_changes_when_lowercased_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_changes_when_lowercased_stage_3[pos + f] << 5; - pos += code; - value = (re_changes_when_lowercased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Changes_When_Uppercased. */ - -static RE_UINT8 re_changes_when_uppercased_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, 8, 8, + 0, 12, 12, 0, 0, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, + 1, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 6, + 6, 0, 0, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, + 7, 0, 7, 0, 0, 0, 7, 7, 7, 7, 0, 0, 9, 10, 8, 8, + 8, 8, 8, 8, 8, 0, 0, 8, 8, 0, 0, 8, 8, 11, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 7, 7, 0, 7, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 0, + 0, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 6, + 6, 0, 0, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, + 7, 0, 7, 7, 0, 7, 7, 0, 7, 7, 0, 0, 9, 0, 8, 8, + 8, 8, 8, 0, 0, 0, 0, 8, 8, 0, 0, 8, 8, 11, 0, 0, + 0, 12, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 4, 14, 1, 1, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 6, + 6, 6, 0, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, + 7, 0, 7, 7, 0, 7, 7, 7, 7, 7, 0, 0, 9, 10, 8, 8, + 8, 8, 8, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 12, 12, 12, 9, 9, 9, + 0, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 6, + 6, 0, 0, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 0, 0, 8, 8, 0, 0, 8, 8, 11, 0, 0, + 0, 0, 0, 0, 0, 8, 8, 8, 0, 0, 0, 0, 7, 7, 0, 7, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 16, 0, 6, 6, 6, 6, 6, 6, 0, 0, 0, 6, 6, + 6, 0, 6, 6, 6, 7, 0, 0, 0, 7, 7, 0, 7, 0, 7, 7, + 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 7, 0, 0, 0, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 8, 8, + 8, 8, 8, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 5, 4, 6, 6, 6, 6, 6, 6, 6, 6, 0, 6, 6, + 6, 0, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 10, 8, 8, + 8, 8, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 11, 0, 0, + 0, 0, 0, 0, 0, 8, 8, 0, 7, 7, 7, 0, 0, 0, 0, 0, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 0, 6, 6, + 6, 0, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 0, 0, 9, 10, 8, 8, + 8, 8, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 11, 0, 0, + 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 7, 0, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 18, 18, 10, 8, 8, + 8, 8, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 11, 19, 0, + 0, 0, 0, 0, 13, 13, 13, 8, 0, 0, 0, 0, 0, 0, 0, 6, + 6, 6, 8, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, + 0, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 11, 0, 0, 0, 0, 8, + 8, 8, 8, 8, 8, 0, 8, 0, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 18, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 0, 8, 20, 20, 20, 20, 21, 4, 18, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 7, 7, 0, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 0, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 18, 8, 15, 15, 0, 0, + 8, 8, 8, 8, 8, 0, 0, 0, 20, 20, 20, 20, 0, 4, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 7, 7, 7, 7, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 3, 0, 3, 0, 9, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, + 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 5, + 8, 8, 4, 4, 18, 10, 0, 0, 22, 22, 22, 22, 22, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 4, 20, 5, 24, 18, 15, 15, 15, 15, 7, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 0, 0, 1, 0, + 7, 7, 6, 6, 6, 6, 8, 8, 8, 8, 7, 7, 7, 7, 15, 15, + 15, 7, 8, 20, 20, 7, 7, 8, 8, 20, 20, 20, 20, 20, 7, 7, + 7, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 15, 8, 8, 8, 8, 20, 20, 20, 20, 20, 20, 20, 7, 20, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20, 20, 8, 8, 0, 0, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, + 7, 7, 8, 8, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 8, 8, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, + 7, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 4, 5, 8, 25, 25, 3, 26, 21, 3, 3, + 3, 18, 24, 3, 0, 0, 0, 0, 0, 0, 0, 0, 10, 3, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 23, 23, 23, 0, 0, 0, 0, + 27, 27, 4, 27, 27, 27, 27, 27, 27, 27, 8, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, + 29, 29, 29, 29, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 27, 27, 27, 27, 27, 27, 27, 20, 20, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, + 6, 6, 6, 7, 7, 15, 15, 23, 27, 27, 30, 23, 23, 23, 23, 0, + 24, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 4, 20, 20, 20, 20, 20, 18, 3, 3, 0, 0, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 26, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 11, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 4, 26, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 23, 23, 23, 8, 8, 8, 8, 8, 8, 18, 24, 23, 23, 7, 7, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 7, 7, 7, 27, 27, + 7, 7, 7, 7, 6, 6, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 27, 27, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 23, 23, 8, 8, 8, 8, 8, 8, 8, 27, 27, 27, + 27, 27, 27, 27, 4, 4, 3, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 13, 12, 17, 17, 12, 12, 12, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 8, 6, 6, 6, 11, 7, 7, 7, 7, 4, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 8, 8, 8, 8, 8, 0, 0, 0, 0, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 28, 28, + 28, 28, 7, 7, 7, 7, 28, 23, 23, 7, 7, 7, 7, 7, 7, 7, + 7, 23, 7, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 15, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 11, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 28, 28, 28, 28, 28, 28, 28, 28, 28, 20, 20, 20, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 27, + 27, 27, 27, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 26, 5, 6, 6, 6, 6, 6, 7, 7, 7, 6, 6, 6, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 15, 15, 15, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 8, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 7, 7, 0, + 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 7, 7, 7, 1, 1, 1, 0, 0, 0, 7, 20, 20, 20, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 20, + 29, 20, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 5, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, + 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 27, 27, 27, 27, 27, + 27, 27, 27, 8, 8, 8, 8, 8, 8, 8, 8, 0, 20, 18, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 7, 8, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 8, 8, 4, 5, + 7, 7, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 0, 0, 9, 9, 9, 0, 0, 0, 0, 24, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 5, 17, 17, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 4, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, 9, 0, 0, 0, 0, 0, + 4, 4, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 24, 18, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 7, 8, 8, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 28, 28, 28, 28, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 11, 10, 35, 35, 0, 0, 0, 0, 0, 3, 9, 8, 8, 0, 8, 4, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 4, 11, 9, 14, 0, 0, 0, 0, 0, 0, 12, 0, + 6, 6, 6, 6, 7, 7, 7, 0, 7, 0, 7, 7, 7, 7, 0, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 18, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 6, + 6, 0, 0, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, + 7, 0, 7, 7, 0, 7, 7, 7, 7, 7, 0, 9, 9, 10, 8, 8, + 8, 8, 8, 8, 8, 0, 0, 8, 8, 0, 0, 8, 8, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 4, 4, + 6, 6, 8, 8, 0, 0, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, + 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 11, 4, 4, 5, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 3, 4, + 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, + 4, 5, 11, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, + 8, 8, 8, 8, 8, 8, 0, 0, 8, 8, 8, 8, 4, 4, 5, 11, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 8, 8, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 5, 11, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 5, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 11, 9, 7, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 15, 15, 15, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 18, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 4, 5, 11, 9, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 0, 0, 6, 0, 0, 7, 7, 7, 7, + 7, 7, 7, 7, 0, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 0, 8, 8, 0, 0, 4, 4, 18, 24, 35, + 15, 19, 15, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 6, 6, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 8, 0, 0, 8, 8, 8, 8, 4, 5, + 11, 10, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 3, 18, 4, 4, 4, 4, 5, 35, 15, 15, 15, 15, 1, + 0, 0, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, + 7, 7, 7, 7, 35, 35, 35, 35, 35, 35, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 4, 5, 14, 24, 0, 0, 0, 10, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 6, 6, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, + 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, 8, 8, 4, 4, 5, 11, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, + 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 23, 23, + 8, 8, 8, 8, 8, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 0, 6, 6, 0, 6, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 0, 0, 0, 8, 0, 8, 8, 0, 8, + 4, 5, 9, 8, 18, 24, 19, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 0, 6, 6, 0, 6, 6, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 0, + 8, 8, 0, 8, 8, 4, 5, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 1, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_changes_when_uppercased_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 3, 14, - 3, 3, 15, 3, 3, 3, 16, 3, 3, 3, 3, 3, 17, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 18, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 19, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -}; +RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -static RE_UINT8 re_changes_when_uppercased_stage_3[] = { - 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 5, 13, 14, 15, 16, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, - 0, 23, 24, 5, 25, 5, 26, 5, 5, 27, 0, 28, 29, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 30, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, - 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 33, 34, 0, 0, 0, - 5, 5, 5, 5, 35, 5, 5, 5, 36, 37, 38, 39, 24, 40, 41, 42, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 23, 43, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 44, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 23, 45, 46, 5, 5, 5, 47, 24, 48, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 49, 50, 0, 0, 0, 0, 51, 5, 52, 53, 54, 55, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 23, 24, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 58, 59, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -static RE_UINT8 re_changes_when_uppercased_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 0, 0, 0, 128, - 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 84, 85, 171, 170, 170, - 170, 170, 170, 212, 41, 17, 36, 70, 42, 33, 81, 162, 96, 91, 85, 181, - 170, 170, 45, 170, 168, 170, 10, 144, 133, 170, 223, 26, 107, 159, 38, 32, - 141, 31, 4, 96, 32, 0, 0, 0, 0, 0, 138, 56, 0, 0, 1, 0, - 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 47, 9, 0, 0, 255, 255, - 255, 255, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 170, 0, 0, - 254, 255, 255, 255, 255, 0, 0, 0, 255, 255, 255, 231, 0, 0, 0, 63, - 255, 1, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 170, 170, 234, 15, - 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, - 255, 255, 223, 80, 220, 16, 207, 0, 255, 0, 220, 16, 16, 0, 0, 0, - 255, 3, 0, 0, 255, 255, 255, 127, 98, 21, 72, 0, 10, 80, 8, 0, - 191, 32, 0, 0, 170, 42, 0, 0, 170, 170, 170, 10, 168, 170, 168, 170, - 170, 170, 0, 148, 170, 16, 154, 170, 170, 2, 160, 170, 8, 0, 0, 0, - 0, 0, 8, 0, 127, 0, 248, 0, 0, 255, 255, 255, 255, 255, 0, 0, - 0, 0, 0, 255, 255, 255, 255, 15, 255, 255, 7, 0, 252, 255, 255, 255, - 15, 0, 0, 0, -}; + v = re_indic_syllabic_category_table_1[field_2]; + v = re_indic_syllabic_category_table_2[(v << 5) | field_1]; + v = re_indic_syllabic_category_table_3[(v << 5) | field_0]; -/* Changes_When_Uppercased: 844 bytes. */ - -RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_changes_when_uppercased_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_changes_when_uppercased_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_changes_when_uppercased_stage_3[pos + f] << 5; - pos += code; - value = (re_changes_when_uppercased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return v; } -/* Changes_When_Titlecased. */ - -static RE_UINT8 re_changes_when_titlecased_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; +/* Join_Control. */ +RE_UINT32 re_get_join_control(RE_UINT32 codepoint) { + if (0x200C <= codepoint && codepoint <= 0x200D) + return 1; -static RE_UINT8 re_changes_when_titlecased_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 5, 6, - 7, 3, 8, 3, 3, 3, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 10, 3, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 12, 3, 13, - 3, 3, 14, 3, 3, 3, 15, 3, 3, 3, 3, 3, 16, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 17, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 18, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -}; + return 0; +} -static RE_UINT8 re_changes_when_titlecased_stage_3[] = { - 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 5, 13, 14, 15, 16, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, - 0, 23, 24, 5, 25, 5, 26, 5, 5, 27, 0, 28, 29, 0, 0, 0, +/* Joining_Group. */ +static RE_UINT8 re_joining_group_table_1[] = { + 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_joining_group_table_2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, - 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, - 5, 5, 5, 5, 34, 5, 5, 5, 35, 36, 37, 38, 36, 39, 40, 41, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 23, 42, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 43, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 23, 44, 45, 5, 5, 5, 46, 24, 47, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 48, 49, 0, 0, 0, 0, 50, 5, 51, 52, 53, 54, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 23, 24, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 57, 58, 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0, + 0, 0, 0, 12, 0, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_changes_when_titlecased_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 0, 0, 0, 128, - 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 84, 85, 171, 170, 170, - 170, 170, 170, 212, 41, 17, 36, 70, 42, 33, 81, 162, 208, 86, 85, 181, - 170, 170, 43, 170, 168, 170, 10, 144, 133, 170, 223, 26, 107, 159, 38, 32, - 141, 31, 4, 96, 32, 0, 0, 0, 0, 0, 138, 56, 0, 0, 1, 0, - 0, 240, 255, 255, 255, 127, 227, 170, 170, 170, 47, 9, 0, 0, 255, 255, - 255, 255, 255, 255, 2, 168, 170, 170, 84, 213, 170, 170, 170, 170, 0, 0, - 254, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 63, 255, 1, 0, 0, - 0, 0, 0, 34, 0, 64, 0, 0, 170, 170, 234, 15, 255, 0, 63, 0, - 255, 0, 255, 0, 63, 0, 255, 0, 255, 0, 255, 63, 255, 0, 223, 64, - 220, 0, 207, 0, 255, 0, 220, 0, 16, 0, 0, 0, 255, 3, 0, 0, - 255, 255, 255, 127, 98, 21, 72, 0, 10, 80, 8, 0, 191, 32, 0, 0, - 170, 42, 0, 0, 170, 170, 170, 10, 168, 170, 168, 170, 170, 170, 0, 148, - 170, 16, 154, 170, 170, 2, 160, 170, 8, 0, 0, 0, 0, 0, 8, 0, - 127, 0, 248, 0, 0, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 255, - 255, 255, 255, 15, 255, 255, 7, 0, 252, 255, 255, 255, 15, 0, 0, 0, +static RE_UINT8 re_joining_group_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 2, 2, 3, 2, 1, 2, 4, 5, 4, 4, 6, 6, 6, 7, + 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, + 0, 15, 16, 17, 18, 19, 20, 21, 3, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 16, + 0, 2, 2, 2, 0, 2, 3, 3, 1, 4, 4, 4, 4, 4, 4, 4, + 4, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 10, 10, 11, + 12, 15, 15, 15, 15, 15, 15, 16, 16, 13, 22, 13, 17, 17, 17, 13, + 13, 13, 13, 13, 13, 18, 18, 18, 18, 20, 20, 20, 20, 23, 24, 6, + 5, 25, 25, 26, 3, 3, 3, 3, 3, 3, 3, 3, 14, 27, 14, 3, + 1, 1, 28, 28, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 12, 0, 0, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 30, 31, 31, 32, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 32, 51, 52, 30, 31, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 55, + 4, 4, 4, 4, 4, 4, 4, 6, 6, 7, 7, 8, 9, 12, 12, 12, + 15, 15, 13, 13, 13, 19, 19, 20, 20, 20, 18, 8, 8, 9, 6, 6, + 9, 8, 6, 2, 2, 14, 14, 1, 3, 3, 56, 56, 6, 9, 9, 17, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 6, 11, 15, 16, 18, 19, 1, 1, 8, 3, 68, 0, 7, 10, + 13, 69, 8, 12, 17, 0, 4, 4, 4, 8, 1, 70, 71, 72, 4, 4, + 4, 6, 13, 12, 71, 6, 6, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 73, 74, 74, 75, 75, 76, 0, 77, 0, 78, 78, 0, 0, 79, 80, 81, + 82, 82, 82, 83, 84, 85, 86, 87, 88, 89, 89, 90, 90, 91, 92, 92, + 92, 93, 0, 0, 94, 0, 0, 0, 0, 0, 0, 95, 96, 97, 98, 99, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 100, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 100, 0, 101, 0, + 101, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Changes_When_Titlecased: 824 bytes. */ - -RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_changes_when_titlecased_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_changes_when_titlecased_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_changes_when_titlecased_stage_3[pos + f] << 5; - pos += code; - value = (re_changes_when_titlecased_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} +RE_UINT32 re_get_joining_group(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -/* Changes_When_Casefolded. */ + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -static RE_UINT8 re_changes_when_casefolded_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; + v = re_joining_group_table_1[field_2]; + v = re_joining_group_table_2[(v << 5) | field_1]; + v = re_joining_group_table_3[(v << 5) | field_0]; -static RE_UINT8 re_changes_when_casefolded_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 3, 14, - 3, 3, 15, 3, 3, 3, 16, 3, 3, 3, 3, 3, 17, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 18, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 19, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -}; + return v; +} -static RE_UINT8 re_changes_when_casefolded_stage_3[] = { - 0, 0, 1, 0, 0, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, - 4, 12, 13, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, - 20, 21, 0, 4, 22, 4, 23, 4, 4, 24, 25, 0, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 20, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, - 0, 0, 0, 0, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 4, 4, 4, 31, 4, 4, 4, 32, 33, 34, 35, 20, 36, 37, 38, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 21, 40, 0, 0, 0, - 0, 0, 0, 0, 0, 41, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 42, 0, 43, 4, 4, 4, 44, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 45, 46, 0, 0, 0, 0, 47, 4, 48, 49, 50, 51, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 20, 20, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 20, 54, 0, 0, 0, 52, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 20, 57, 0, 0, 0, 0, 0, 0, +/* Joining_Type. */ +static RE_UINT8 re_joining_type_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 15, + 16, 9, 17, 18, 19, 20, 21, 22, 9, 9, 9, 9, 9, 23, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 24, 25, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 26, + 9, 9, 9, 9, 27, 9, 28, 9, 29, 9, 30, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 31, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; -static RE_UINT8 re_changes_when_casefolded_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 255, 255, 127, 255, - 85, 85, 85, 85, 85, 85, 85, 170, 170, 86, 85, 85, 85, 85, 85, 171, - 214, 206, 219, 177, 213, 210, 174, 17, 176, 173, 170, 74, 85, 85, 214, 85, - 85, 85, 5, 108, 122, 85, 0, 0, 32, 0, 0, 0, 0, 0, 69, 128, - 64, 215, 254, 255, 251, 15, 0, 0, 4, 128, 99, 85, 85, 85, 179, 230, - 255, 255, 255, 255, 255, 255, 0, 0, 1, 84, 85, 85, 171, 42, 85, 85, - 85, 85, 254, 255, 255, 255, 127, 0, 128, 0, 0, 0, 191, 32, 0, 0, - 0, 0, 0, 63, 255, 1, 255, 255, 255, 255, 255, 231, 85, 85, 21, 76, - 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, 0, 255, 0, 0, - 255, 255, 156, 31, 156, 31, 0, 15, 0, 31, 156, 31, 64, 12, 4, 0, - 8, 0, 0, 0, 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, - 5, 40, 4, 0, 85, 21, 0, 0, 85, 85, 85, 5, 84, 85, 84, 85, - 85, 85, 0, 106, 85, 40, 69, 85, 85, 125, 95, 85, 116, 0, 0, 0, - 0, 0, 255, 255, 127, 0, 248, 0, 255, 0, 0, 0, 255, 255, 15, 0, - 255, 255, 7, 0, 3, 0, 0, 0, +static RE_UINT8 re_joining_type_table_2[] = { + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 20, 21, 22, + 23, 24, 25, 26, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 35, 39, 40, 38, 35, 41, 42, 34, 43, 44, 33, 45, 0, 46, 0, + 47, 48, 49, 33, 34, 43, 50, 33, 51, 52, 36, 33, 34, 0, 53, 0, + 0, 54, 55, 0, 0, 56, 57, 0, 58, 59, 0, 60, 61, 62, 63, 0, + 0, 64, 65, 66, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 69, 69, 70, 70, 0, 71, 72, 0, + 73, 13, 13, 74, 75, 76, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, + 78, 0, 79, 80, 0, 81, 82, 0, 83, 84, 45, 85, 51, 86, 0, 87, + 0, 88, 0, 0, 0, 0, 89, 90, 0, 0, 0, 0, 0, 0, 2, 91, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92, 93, 0, 94, 0, 0, 81, 95, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 97, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 98, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 100, 48, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, + 102, 103, 13, 104, 0, 0, 105, 106, 0, 107, 108, 0, 30, 109, 0, 110, + 0, 111, 112, 35, 0, 113, 34, 114, 0, 0, 0, 0, 0, 0, 0, 115, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 117, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, + 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 119, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 120, 121, 0, 0, 0, 0, 122, 123, 0, 0, 0, 0, 124, 125, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 126, 127, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 129, 130, 0, 0, 131, 132, 0, + 34, 133, 134, 97, 51, 135, 0, 0, 30, 136, 0, 137, 51, 138, 139, 0, + 0, 140, 0, 0, 0, 0, 97, 141, 51, 52, 82, 142, 0, 0, 0, 0, + 0, 133, 143, 0, 0, 144, 145, 0, 0, 0, 0, 0, 0, 146, 147, 0, + 0, 148, 82, 0, 0, 149, 0, 0, 68, 150, 0, 0, 0, 0, 0, 0, + 0, 151, 0, 0, 0, 0, 0, 0, 0, 152, 153, 0, 0, 0, 154, 82, + 155, 156, 157, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 159, 0, 0, 160, 161, 0, 0, 0, 162, 163, 0, 164, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 167, 0, 168, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 0, 170, 0, 0, 171, + 0, 0, 0, 0, 172, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 174, 98, 0, 0, + 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 176, 2, 177, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 181, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 168, 0, 13, 13, 183, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Changes_When_Casefolded: 816 bytes. */ - -RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_changes_when_casefolded_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_changes_when_casefolded_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_changes_when_casefolded_stage_3[pos + f] << 5; - pos += code; - value = (re_changes_when_casefolded_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Changes_When_Casemapped. */ - -static RE_UINT8 re_changes_when_casemapped_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, +static RE_UINT8 re_joining_type_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, + 2, 0, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 3, + 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 4, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, + 1, 3, 3, 3, 0, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3, + 2, 2, 3, 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 3, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 3, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, + 2, 3, 2, 3, 3, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 2, 2, 2, 2, 2, 3, 3, 2, 3, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 2, 3, 3, 3, 1, 1, 1, 0, 0, 0, 0, + 2, 0, 2, 2, 2, 2, 0, 3, 2, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 0, 3, 2, + 2, 3, 3, 2, 2, 0, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 4, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, + 2, 2, 2, 2, 2, 3, 0, 3, 0, 3, 3, 0, 0, 5, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 3, 2, 2, + 2, 3, 0, 0, 3, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 2, 2, 3, 2, 3, 3, + 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 2, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 2, 2, 3, 3, 3, 0, 2, 3, 3, 2, 2, 3, 2, 2, + 0, 2, 3, 3, 2, 0, 0, 0, 0, 3, 2, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_changes_when_casemapped_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 4, 5, 3, 3, 3, 3, 6, 7, - 8, 3, 9, 3, 3, 3, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 11, 3, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 3, 14, - 3, 3, 15, 3, 3, 3, 16, 3, 3, 3, 3, 3, 17, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 18, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 19, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -}; +RE_UINT32 re_get_joining_type(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -static RE_UINT8 re_changes_when_casemapped_stage_3[] = { - 0, 0, 1, 1, 0, 2, 3, 3, 4, 5, 4, 4, 6, 7, 8, 4, - 4, 9, 10, 11, 12, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, 18, - 4, 4, 4, 4, 19, 4, 4, 4, 4, 20, 21, 22, 23, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 24, 25, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 26, - 0, 0, 0, 0, 27, 25, 0, 0, 0, 0, 0, 28, 29, 0, 0, 0, - 4, 4, 4, 4, 30, 4, 4, 4, 26, 4, 31, 32, 4, 33, 34, 35, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 29, 4, 37, 0, 0, 0, - 0, 0, 0, 0, 0, 38, 4, 39, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 40, 41, 42, 4, 4, 4, 43, 4, 44, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 45, 46, 0, 0, 0, 0, 47, 4, 48, 49, 40, 50, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 4, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, - 4, 4, 54, 0, 0, 52, 55, 46, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 56, 4, 56, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 57, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -static RE_UINT8 re_changes_when_casemapped_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 0, 32, 0, 255, 255, 127, 255, - 255, 255, 255, 255, 255, 255, 255, 254, 255, 223, 255, 247, 255, 243, 255, 179, - 240, 255, 255, 255, 253, 255, 15, 252, 255, 255, 223, 26, 107, 159, 38, 32, - 141, 31, 4, 96, 32, 0, 0, 0, 0, 0, 207, 184, 64, 215, 255, 255, - 251, 255, 255, 255, 255, 255, 227, 255, 255, 255, 191, 239, 3, 252, 255, 255, - 255, 255, 254, 255, 255, 255, 127, 0, 254, 255, 255, 255, 255, 0, 0, 0, - 191, 32, 255, 255, 255, 255, 255, 231, 255, 255, 63, 63, 255, 1, 255, 255, - 0, 0, 0, 34, 0, 64, 0, 0, 255, 255, 255, 79, 63, 63, 255, 170, - 255, 255, 255, 63, 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, - 64, 12, 4, 0, 24, 0, 0, 0, 0, 0, 192, 255, 255, 3, 0, 0, - 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 109, 192, 15, 120, 12, 0, - 191, 32, 0, 0, 255, 63, 0, 0, 255, 255, 255, 15, 252, 255, 252, 255, - 255, 255, 0, 254, 255, 56, 223, 255, 124, 0, 0, 0, 0, 0, 8, 0, - 0, 0, 255, 255, 127, 0, 248, 0, 255, 255, 0, 0, 255, 255, 15, 255, - 255, 255, 7, 0, 15, 0, 0, 0, -}; + v = re_joining_type_table_1[field_2]; + v = re_joining_type_table_2[(v << 5) | field_1]; + v = re_joining_type_table_3[(v << 5) | field_0]; -/* Changes_When_Casemapped: 816 bytes. */ - -RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_changes_when_casemapped_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_changes_when_casemapped_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_changes_when_casemapped_stage_3[pos + f] << 5; - pos += code; - value = (re_changes_when_casemapped_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return v; } -/* ID_Start. */ - -static RE_UINT8 re_id_start_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 9, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 22, 23, 5, 24, 25, +/* Line_Break. */ +static RE_UINT8 re_line_break_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 18, 19, 20, 25, 26, 26, 27, 27, 27, 27, 27, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 27, 27, 40, 41, 27, 27, + 27, 42, 27, 27, 27, 27, 27, 27, 27, 27, 43, 44, 13, 13, 13, 13, + 13, 45, 46, 47, 27, 27, 27, 27, 27, 27, 27, 27, 48, 27, 27, 49, + 27, 27, 27, 27, 50, 51, 52, 27, 53, 27, 54, 55, 56, 57, 58, 59, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 59, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 59, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 60, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27 +}; + +static RE_UINT16 re_line_break_table_2[] = { + 0, 1, 2, 3, 4, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 8, 7, 9, 9, 10, 11, 12, 13, 7, 7, + 7, 7, 7, 7, 14, 7, 7, 7, 7, 15, 16, 7, 17, 18, 19, 20, + 21, 7, 22, 23, 7, 7, 24, 25, 26, 27, 28, 7, 7, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 53, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 36, 82, 83, 84, 36, 85, 86, 87, 88, 89, 90, 91, 36, + 92, 92, 93, 92, 94, 7, 95, 7, 96, 96, 96, 97, 97, 98, 99, 99, + 7, 7, 100, 7, 101, 102, 103, 7, 104, 7, 105, 106, 107, 7, 7, 108, + 109, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 110, 7, 7, 111, 112, 113, 114, 115, 92, 92, 116, 117, + 118, 7, 7, 119, 120, 121, 7, 122, 123, 124, 125, 126, 92, 127, 128, 7, + 129, 92, 130, 131, 132, 133, 134, 36, 135, 136, 137, 138, 139, 140, 7, 141, + 7, 142, 143, 144, 145, 146, 147, 148, 7, 7, 7, 7, 7, 7, 9, 149, + 7, 7, 7, 7, 7, 7, 7, 7, 108, 7, 150, 151, 7, 37, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 7, 167, 7, + 168, 169, 170, 171, 172, 173, 7, 174, 175, 176, 7, 7, 7, 7, 7, 177, + 7, 178, 35, 179, 179, 179, 179, 180, 179, 179, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 7, 196, 197, 198, 7, 199, 200, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 201, 7, 202, 203, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 204, 205, 206, 7, 7, 7, + 7, 207, 123, 7, 7, 7, 7, 208, 7, 95, 7, 209, 210, 211, 211, 9, + 212, 213, 214, 36, 215, 216, 216, 217, 216, 216, 216, 216, 216, 216, 218, 219, + 220, 221, 222, 223, 224, 225, 223, 226, 227, 228, 216, 216, 229, 216, 216, 230, + 231, 216, 232, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 7, 7, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 233, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 234, 216, 235, 144, 7, 7, 7, 7, 7, 7, 7, 7, + 236, 237, 7, 238, 239, 7, 7, 240, 7, 7, 7, 7, 7, 7, 241, 242, + 243, 244, 7, 245, 246, 136, 247, 248, 30, 249, 250, 251, 40, 252, 253, 254, + 7, 255, 256, 92, 92, 92, 257, 258, 259, 260, 7, 261, 7, 7, 7, 262, + 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, + 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, + 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, + 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, + 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, + 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, + 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, + 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, + 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, + 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, + 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, + 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, + 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, + 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, + 268, 269, 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 269, + 263, 264, 265, 266, 267, 268, 269, 263, 264, 265, 266, 267, 268, 270, 271, 272, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 274, 275, 276, 7, 7, 7, 277, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 278, 279, 7, 280, 7, 281, 282, + 283, 284, 285, 286, 7, 7, 7, 287, 288, 289, 290, 291, 292, 231, 293, 294, + 295, 296, 297, 36, 7, 7, 7, 298, 299, 300, 7, 7, 301, 302, 279, 303, + 36, 36, 36, 36, 304, 7, 305, 306, 7, 307, 308, 309, 310, 7, 311, 36, + 7, 7, 7, 7, 151, 312, 313, 314, 7, 315, 7, 316, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 210, 122, 281, 36, 36, 36, 36, + 317, 318, 319, 7, 123, 320, 36, 321, 322, 323, 36, 36, 7, 324, 280, 7, + 325, 326, 327, 7, 7, 36, 7, 328, 7, 329, 330, 331, 332, 333, 36, 36, + 7, 7, 334, 36, 7, 335, 7, 336, 7, 337, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 123, 7, 338, 36, 36, 7, 315, 339, 36, 36, 279, 340, 210, + 139, 341, 342, 343, 139, 344, 345, 346, 139, 347, 348, 349, 139, 252, 350, 351, + 352, 353, 36, 36, 354, 355, 356, 357, 358, 359, 360, 361, 36, 36, 36, 36, + 7, 362, 363, 364, 7, 27, 365, 36, 36, 36, 36, 36, 7, 366, 367, 36, + 7, 27, 368, 369, 7, 370, 371, 36, 372, 373, 36, 36, 36, 36, 36, 36, + 7, 374, 36, 36, 36, 7, 7, 375, 376, 377, 378, 36, 36, 379, 380, 381, + 382, 383, 384, 7, 385, 386, 7, 119, 36, 36, 36, 36, 36, 36, 36, 36, + 387, 388, 389, 390, 391, 392, 36, 36, 393, 394, 395, 396, 397, 371, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 398, 36, 36, 36, 36, 36, 399, 400, 401, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 107, 36, 36, 36, + 7, 7, 7, 402, 7, 7, 7, 7, 7, 7, 403, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 404, 7, 405, 7, 7, 7, 7, 7, 7, 406, 7, 7, 7, 7, + 7, 407, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 408, 7, + 7, 7, 178, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 119, 123, 409, 36, 36, 279, 410, 7, 411, 412, 413, 414, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 7, 7, 415, 36, 36, 36, 7, 7, 416, 9, 417, 36, 36, 418, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 419, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 122, 36, 420, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 216, 216, 216, 216, 216, 216, 216, 216, 231, 36, 421, 422, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 423, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 424, 425, 426, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 122, 7, 427, 7, 428, 429, 430, 7, 334, + 7, 7, 431, 36, 36, 36, 36, 432, 7, 7, 210, 119, 36, 36, 36, 36, + 7, 7, 37, 7, 433, 434, 435, 7, 436, 437, 438, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 439, 7, 7, 7, 7, 7, 7, 7, 7, 440, 441, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 9, 442, 9, 443, 444, 445, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 446, 447, 36, 36, 36, 36, 36, 36, 7, 448, 449, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 7, 450, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 451, 36, 7, 7, 452, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 453, 7, 454, 36, 36, 455, 151, 36, 36, 36, 36, 36, 36, + 435, 456, 457, 458, 459, 460, 36, 461, 36, 36, 36, 36, 36, 36, 36, 36, + 216, 216, 216, 216, 216, 216, 216, 216, 462, 463, 179, 464, 179, 465, 216, 466, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 467, 468, 469, 470, + 216, 216, 471, 472, 473, 474, 216, 216, 475, 476, 477, 478, 479, 216, 480, 481, + 216, 216, 482, 483, 216, 484, 485, 216, 7, 7, 7, 486, 7, 7, 487, 216, + 488, 7, 489, 7, 490, 491, 216, 216, 492, 493, 216, 494, 216, 495, 496, 216, + 7, 7, 486, 216, 216, 216, 216, 216, 7, 7, 7, 7, 497, 7, 35, 498, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 499, + 500, 9, 9, 9, 36, 36, 36, 36, 9, 9, 9, 9, 9, 9, 9, 501, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36 +}; + +static RE_UINT8 re_line_break_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 6, 7, 8, 9, 10, 11, 9, 8, 12, 13, 9, 10, 14, 15, 14, 16, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 14, 14, 9, 9, 9, 7, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 10, 13, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 2, 18, 9, 1, + 1, 1, 1, 1, 1, 19, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 20, 12, 11, 10, 10, 10, 9, 21, 21, 9, 21, 8, 9, 2, 9, 9, + 11, 10, 21, 21, 22, 9, 21, 21, 21, 21, 21, 8, 21, 21, 21, 12, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 21, 22, 21, 21, 21, 22, 21, 9, 9, + 21, 9, 9, 9, 9, 9, 9, 9, 21, 21, 21, 21, 9, 21, 9, 22, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 20, 20, 20, + 20, 20, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 14, 9, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 2, 0, 0, 9, 9, 10, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 9, 1, 1, 9, 1, 1, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, 0, 23, + 23, 23, 23, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 14, 14, 9, 9, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 0, 7, 7, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 11, 17, 17, 9, 9, 9, + 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 7, 9, 1, 1, 1, 1, 1, 1, 1, 9, 9, 1, + 1, 1, 1, 1, 1, 9, 9, 1, 1, 9, 1, 1, 1, 1, 9, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, + 9, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 9, 9, 9, 9, 14, 7, 9, 0, 0, 1, 10, 10, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 9, 1, 1, 1, 9, 1, 1, 1, 1, 1, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 0, 0, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 9, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 9, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 1, 2, 2, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, + 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 0, 0, 0, 9, 9, 9, 9, 0, 0, 1, 9, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 9, 9, 0, 9, + 9, 9, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 9, 9, 11, 11, 9, 9, 9, 9, 9, 11, 9, 10, 9, 9, 1, 0, + 0, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, + 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 0, 9, 9, 0, 9, 9, 0, 0, 1, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 1, 1, 9, 9, 9, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, 1, 9, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 9, 10, 0, 0, 0, 0, 0, 0, 0, 9, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, + 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 9, 9, 0, 9, + 9, 9, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 9, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, + 9, 0, 9, 9, 9, 9, 0, 0, 0, 9, 9, 0, 9, 0, 9, 9, + 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 9, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 9, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 9, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 0, 0, 0, 0, 0, 0, 22, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 1, 1, 1, 22, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, 1, 9, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 9, 0, + 9, 9, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 9, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 9, 9, + 0, 0, 0, 0, 9, 9, 9, 1, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 9, 9, 9, 9, 9, 9, + 0, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 0, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 10, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 2, 2, 0, 0, 0, 0, + 0, 24, 24, 0, 24, 0, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 0, 24, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, + 24, 24, 24, 24, 24, 0, 24, 0, 24, 24, 24, 24, 24, 24, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 24, 24, 24, 24, + 9, 22, 22, 22, 22, 9, 22, 22, 20, 22, 22, 2, 20, 7, 7, 7, + 7, 7, 20, 9, 7, 9, 9, 9, 1, 1, 9, 9, 9, 9, 9, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 2, 1, 9, 1, 9, 1, 12, 18, 12, 18, 1, 1, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 2, 1, 1, 9, 9, 9, 9, 9, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, + 9, 9, 9, 9, 9, 9, 1, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 22, 22, 2, 22, 9, 9, 9, 9, 9, 20, 20, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 2, 2, 9, 9, 9, 9, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 24, 24, 24, 24, 24, + 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 0, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 1, 1, 1, + 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, + 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 9, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 2, 2, 28, 24, 2, 9, 2, 10, 24, 24, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 7, 7, 2, 2, 22, 9, 7, 7, 9, 1, 1, 1, 20, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 9, 0, 0, 0, 7, 7, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, + 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 0, 0, 0, 24, 24, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 0, 0, 9, 9, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 1, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 2, 2, 9, 2, 2, 2, + 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 9, 9, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 1, 9, 9, + 9, 9, 9, 9, 1, 9, 9, 1, 1, 1, 9, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 0, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 22, 9, 0, + 2, 2, 2, 2, 2, 2, 2, 20, 2, 2, 2, 29, 1, 30, 1, 1, + 2, 20, 2, 2, 31, 21, 21, 9, 8, 8, 12, 8, 8, 8, 12, 8, + 21, 21, 9, 9, 32, 32, 32, 2, 4, 4, 1, 1, 1, 1, 1, 20, + 11, 11, 11, 11, 11, 11, 11, 11, 9, 8, 8, 21, 28, 28, 9, 9, + 9, 9, 9, 9, 14, 12, 18, 28, 28, 28, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 2, 9, 2, 2, 2, 2, 9, 2, 2, 2, + 33, 9, 9, 9, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 9, 9, 0, 0, 21, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 21, + 9, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 11, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 11, 10, 10, 10, 10, 11, 10, 10, 11, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 11, 9, 21, 9, 9, 9, 11, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 21, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 21, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 21, 21, 9, 9, 9, 9, 9, 21, 9, 9, 21, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, 9, 9, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, 9, 9, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 21, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 21, 9, 21, 21, 9, 9, 9, 21, 21, 9, 9, 21, 9, 9, 9, 21, + 9, 21, 10, 10, 9, 21, 9, 9, 9, 9, 21, 9, 9, 21, 21, 21, + 21, 9, 9, 21, 9, 21, 9, 21, 21, 21, 21, 21, 21, 9, 21, 9, + 9, 9, 9, 9, 21, 21, 21, 21, 9, 9, 9, 9, 21, 21, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 21, 9, 9, 9, 21, 9, 9, 9, + 9, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 21, 21, 9, 9, 21, 21, 21, 21, 9, 9, 21, 21, 9, 9, 21, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 21, 21, 9, 9, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 21, 9, 9, 9, 21, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 32, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 12, 18, 9, 9, 9, 9, + 9, 9, 21, 9, 9, 9, 9, 9, 9, 9, 34, 34, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, 9, 9, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 9, 9, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 21, 21, 9, 21, 21, 21, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, + 9, 9, 21, 21, 9, 9, 21, 21, 9, 9, 9, 9, 21, 21, 9, 9, + 21, 21, 9, 9, 9, 9, 21, 21, 21, 9, 9, 21, 9, 9, 21, 21, + 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 34, 34, 34, 34, 9, 21, 21, 9, 9, 21, 9, 9, 9, 9, 21, 21, + 9, 9, 9, 9, 34, 34, 21, 21, 34, 9, 34, 34, 34, 35, 34, 34, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 9, 9, 9, 9, + 21, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 21, 21, 9, 21, 21, 21, 9, 21, 34, 21, 21, 9, 21, 21, 9, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 21, 21, 21, 34, 9, 34, + 34, 34, 21, 34, 34, 21, 21, 21, 34, 34, 21, 21, 34, 21, 21, 34, + 34, 34, 9, 21, 9, 9, 9, 9, 21, 21, 34, 21, 21, 21, 21, 21, + 21, 34, 34, 34, 34, 34, 21, 34, 34, 35, 34, 21, 21, 34, 34, 34, + 34, 34, 34, 34, 34, 9, 9, 9, 34, 34, 35, 35, 35, 35, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 21, 9, 9, 9, 8, 8, 8, 8, 8, + 8, 9, 7, 7, 34, 9, 9, 9, 12, 18, 12, 18, 12, 18, 12, 18, + 12, 18, 12, 18, 12, 18, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 12, 18, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, 12, + 18, 12, 18, 12, 18, 12, 18, 12, 18, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 12, 18, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 21, 21, 21, 21, 21, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, + 1, 1, 9, 9, 0, 0, 0, 0, 0, 7, 2, 2, 2, 9, 7, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 2, + 2, 2, 2, 2, 2, 2, 9, 2, 12, 2, 9, 9, 8, 8, 9, 9, + 8, 8, 12, 18, 12, 18, 12, 18, 12, 18, 2, 2, 2, 2, 7, 9, + 2, 2, 9, 2, 2, 9, 9, 9, 9, 9, 31, 31, 2, 2, 2, 9, + 2, 2, 12, 2, 2, 2, 2, 2, 2, 2, 2, 9, 2, 9, 2, 2, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, + 2, 18, 18, 34, 34, 28, 34, 34, 12, 18, 12, 18, 12, 18, 12, 18, + 12, 18, 34, 34, 12, 18, 12, 18, 12, 18, 12, 18, 28, 12, 18, 18, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 1, 1, 1, 1, 1, 1, + 34, 34, 34, 34, 34, 1, 34, 34, 34, 34, 34, 28, 28, 34, 34, 34, + 0, 36, 34, 36, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 36, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34, 36, 34, + 34, 34, 34, 34, 34, 36, 36, 0, 0, 1, 1, 28, 28, 28, 28, 34, + 28, 36, 34, 36, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 36, 34, 36, 34, 36, 34, 34, 34, 34, 34, 34, 36, 34, + 34, 34, 34, 34, 34, 36, 36, 34, 34, 34, 34, 28, 36, 28, 28, 34, + 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 21, 21, 21, 21, 21, 21, 21, 21, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 7, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, + 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 9, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 9, 9, 9, 1, 9, 9, 9, 9, 1, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 1, 1, 1, 1, 1, 9, 9, 9, 9, 1, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 11, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 22, 22, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 1, + 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 9, 9, 9, 9, 9, 9, 2, 2, 2, 9, 9, 9, 9, 0, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 9, 9, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 24, 24, 24, 24, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 1, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 9, 2, 2, 2, + 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, + 2, 2, 9, 9, 9, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, + 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 23, 1, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 9, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 0, 23, 0, + 23, 23, 0, 23, 23, 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 12, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 9, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 14, 18, 18, 14, 14, 7, 7, 12, 18, 32, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 34, 34, 34, 34, 34, 12, 18, 12, 18, 12, 18, 12, 18, 12, 18, 12, + 18, 12, 18, 12, 18, 34, 34, 12, 18, 34, 34, 34, 34, 34, 34, 34, + 18, 34, 18, 0, 28, 28, 7, 7, 34, 12, 18, 12, 18, 12, 18, 34, + 34, 34, 34, 34, 34, 34, 34, 0, 34, 10, 11, 34, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 33, + 0, 7, 34, 34, 10, 11, 34, 34, 12, 18, 34, 34, 18, 34, 18, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 28, 28, 34, 34, 34, 7, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 12, 34, 18, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 12, 34, 18, 34, 12, + 18, 18, 12, 18, 18, 28, 34, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 28, 28, + 0, 0, 34, 34, 34, 34, 34, 34, 0, 0, 34, 34, 34, 34, 34, 34, + 0, 0, 34, 34, 34, 34, 34, 34, 0, 0, 34, 34, 34, 0, 0, 0, + 11, 10, 34, 34, 34, 10, 10, 0, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 40, 21, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 2, 2, 2, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 2, + 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 2, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static RE_UINT8 re_id_start_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, - 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, - 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 1, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 1, 57, 58, 59, 60, 61, 62, 63, 31, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 31, 76, 77, 78, 31, - 1, 1, 1, 79, 80, 81, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 82, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 84, 85, 31, 31, 86, 87, - 1, 1, 1, 1, 1, 1, 1, 88, 1, 1, 89, 31, 31, 31, 31, 31, - 1, 90, 91, 31, 31, 31, 31, 31, 31, 31, 31, 31, 92, 31, 31, 31, - 31, 31, 31, 31, 93, 94, 95, 96, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 97, 98, 31, 31, 31, 31, 31, 99, 100, 31, 31, 31, 31, 101, 31, - 1, 1, 1, 1, 1, 1, 102, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 103, 104, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 105, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 106, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 107, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_id_start_stage_3[] = { - 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 0, 7, 8, 9, 4, 10, - 4, 4, 4, 4, 11, 4, 4, 4, 4, 12, 13, 4, 14, 0, 15, 16, - 0, 4, 17, 18, 4, 4, 19, 20, 21, 22, 23, 4, 4, 24, 25, 26, - 27, 28, 29, 17, 0, 30, 0, 0, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 44, 48, 49, 50, 51, 45, 0, - 52, 53, 54, 55, 56, 57, 58, 59, 52, 60, 61, 62, 63, 64, 65, 0, - 66, 67, 65, 0, 68, 69, 70, 0, 71, 0, 72, 73, 74, 0, 0, 0, - 4, 75, 76, 77, 78, 4, 79, 80, 4, 4, 81, 4, 82, 83, 84, 4, - 85, 4, 86, 0, 22, 4, 4, 87, 66, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 88, 1, 4, 4, 89, 90, 91, 91, 92, 4, 93, 94, 0, - 0, 4, 4, 29, 4, 95, 4, 96, 97, 0, 15, 98, 4, 99, 100, 0, - 101, 4, 102, 0, 0, 103, 0, 0, 104, 93, 105, 0, 106, 107, 4, 108, - 4, 109, 110, 111, 112, 113, 0, 114, 4, 4, 4, 4, 4, 4, 0, 0, - 87, 4, 115, 111, 4, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, - 121, 122, 123, 4, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 124, 97, 4, 4, 4, 4, 125, 4, 79, 4, 126, 101, 127, 127, 0, - 128, 129, 66, 4, 130, 66, 4, 80, 104, 12, 4, 4, 131, 86, 0, 15, - 4, 4, 4, 4, 4, 96, 0, 0, 4, 4, 4, 4, 4, 4, 4, 22, - 4, 4, 4, 4, 73, 0, 15, 111, 132, 133, 4, 134, 111, 4, 4, 22, - 135, 136, 4, 4, 137, 4, 138, 135, 139, 140, 4, 93, 136, 93, 0, 141, - 25, 142, 65, 143, 31, 144, 145, 146, 4, 14, 147, 148, 4, 149, 150, 151, - 152, 153, 80, 154, 4, 4, 4, 140, 4, 4, 4, 4, 4, 155, 156, 157, - 4, 4, 4, 158, 4, 4, 159, 0, 160, 161, 162, 4, 4, 91, 163, 4, - 4, 111, 15, 4, 164, 4, 165, 166, 0, 0, 0, 167, 4, 4, 4, 143, - 0, 1, 1, 168, 4, 97, 169, 0, 170, 171, 172, 0, 4, 4, 4, 86, - 0, 0, 4, 102, 0, 0, 0, 0, 0, 0, 0, 0, 143, 4, 173, 0, - 4, 23, 174, 96, 111, 4, 175, 0, 4, 4, 4, 4, 111, 15, 176, 157, - 4, 154, 4, 109, 0, 0, 0, 0, 4, 101, 96, 165, 0, 0, 0, 0, - 177, 178, 96, 101, 97, 0, 0, 179, 96, 159, 0, 0, 4, 180, 0, 0, - 181, 96, 0, 143, 143, 0, 72, 182, 4, 96, 96, 144, 91, 0, 0, 0, - 4, 4, 14, 0, 4, 144, 4, 144, 4, 109, 0, 0, 0, 0, 0, 0, - 143, 183, 108, 0, 0, 0, 0, 101, 106, 184, 0, 0, 106, 22, 15, 14, - 106, 65, 185, 186, 106, 144, 187, 0, 188, 189, 0, 0, 190, 112, 97, 0, - 47, 44, 191, 55, 0, 0, 0, 0, 4, 102, 192, 0, 4, 22, 193, 0, - 0, 0, 0, 0, 4, 131, 194, 0, 4, 22, 195, 0, 4, 196, 0, 0, - 86, 0, 0, 0, 0, 0, 0, 0, 4, 189, 0, 0, 0, 4, 4, 197, - 0, 0, 0, 0, 0, 198, 173, 199, 200, 201, 202, 4, 203, 0, 4, 29, - 204, 131, 71, 205, 22, 0, 0, 0, 206, 173, 207, 208, 209, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 144, 4, 4, 4, 4, 159, 0, 0, 0, - 4, 4, 4, 131, 4, 4, 4, 4, 4, 4, 109, 0, 0, 0, 0, 0, - 4, 131, 0, 0, 0, 0, 0, 0, 4, 4, 65, 0, 0, 0, 0, 0, - 4, 29, 97, 0, 0, 0, 15, 210, 4, 22, 109, 211, 22, 0, 0, 0, - 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 212, 0, 163, 0, 0, 213, - 4, 4, 4, 4, 4, 4, 4, 184, 4, 4, 4, 4, 4, 4, 4, 144, - 97, 0, 214, 215, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 157, - 4, 4, 4, 216, 217, 0, 0, 0, 4, 4, 218, 4, 219, 220, 221, 4, - 222, 223, 224, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 225, 226, 80, - 218, 218, 124, 124, 204, 204, 147, 0, 4, 227, 228, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 189, 4, 4, 4, 4, 4, 4, 182, 0, - 4, 4, 229, 0, 0, 0, 0, 0, 221, 230, 231, 232, 233, 234, 0, 0, - 4, 4, 4, 4, 4, 4, 101, 0, 4, 102, 4, 4, 4, 4, 4, 4, - 111, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 235, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 71, 111, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_id_start_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, - 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 0, 0, 223, 188, - 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, - 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 0, 0, 0, 0, 255, 255, - 255, 135, 7, 0, 255, 7, 0, 0, 0, 192, 254, 255, 255, 255, 47, 0, - 96, 192, 0, 156, 0, 0, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, - 63, 0, 2, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 63, 4, - 16, 1, 0, 0, 255, 255, 255, 1, 255, 255, 223, 63, 240, 255, 255, 255, - 255, 255, 255, 35, 0, 0, 1, 255, 3, 0, 254, 255, 225, 159, 249, 255, - 255, 253, 197, 35, 0, 64, 0, 176, 3, 0, 3, 16, 224, 135, 249, 255, - 255, 253, 109, 3, 0, 0, 0, 94, 0, 0, 28, 0, 224, 191, 251, 255, - 255, 253, 237, 35, 0, 0, 1, 0, 3, 0, 0, 2, 224, 159, 249, 255, - 0, 0, 0, 176, 3, 0, 2, 0, 232, 199, 61, 214, 24, 199, 255, 3, - 224, 223, 253, 255, 255, 253, 255, 35, 0, 0, 0, 7, 3, 0, 0, 0, - 225, 223, 253, 255, 255, 253, 239, 35, 0, 0, 0, 64, 3, 0, 6, 0, - 255, 255, 255, 39, 0, 64, 112, 128, 3, 0, 0, 252, 224, 255, 127, 252, - 255, 255, 251, 47, 127, 0, 0, 0, 254, 255, 255, 255, 255, 255, 13, 0, - 214, 247, 255, 255, 175, 255, 13, 32, 95, 0, 0, 240, 1, 0, 0, 0, - 255, 254, 255, 255, 255, 31, 0, 0, 0, 31, 0, 0, 255, 7, 0, 128, - 0, 0, 63, 60, 98, 192, 225, 255, 3, 64, 0, 0, 191, 32, 255, 255, - 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, - 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 7, 255, 255, 63, 63, - 255, 159, 255, 255, 255, 199, 255, 1, 255, 223, 3, 0, 255, 255, 3, 0, - 255, 223, 1, 0, 255, 255, 15, 0, 0, 0, 128, 16, 255, 5, 255, 255, - 255, 255, 63, 0, 255, 255, 255, 127, 255, 63, 31, 0, 255, 15, 255, 255, - 255, 3, 0, 0, 255, 255, 127, 0, 255, 255, 31, 0, 128, 0, 0, 0, - 224, 255, 255, 255, 224, 15, 0, 0, 248, 255, 255, 255, 1, 192, 0, 252, - 63, 0, 0, 0, 15, 0, 0, 0, 0, 224, 0, 252, 255, 255, 255, 63, - 255, 1, 255, 255, 255, 255, 255, 231, 0, 222, 111, 4, 63, 63, 255, 170, - 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, - 0, 0, 255, 31, 132, 252, 47, 63, 80, 253, 255, 243, 224, 67, 0, 0, - 255, 127, 255, 255, 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, - 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 248, 255, 127, 0, 0, - 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 0, 128, 0, 0, 128, 255, - 252, 255, 255, 255, 255, 249, 255, 255, 124, 0, 0, 0, 187, 247, 255, 255, - 7, 0, 0, 0, 0, 0, 252, 104, 63, 0, 255, 255, 255, 255, 255, 31, - 255, 255, 7, 0, 0, 128, 0, 0, 223, 255, 0, 124, 247, 15, 0, 0, - 255, 255, 127, 196, 255, 255, 98, 62, 5, 0, 0, 56, 255, 7, 28, 0, - 126, 126, 126, 0, 127, 127, 255, 255, 255, 0, 255, 255, 15, 0, 255, 255, - 127, 248, 255, 255, 255, 255, 255, 15, 255, 63, 255, 255, 255, 255, 255, 3, - 127, 0, 248, 160, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, - 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 15, 0, 0, 223, 255, - 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, - 255, 63, 255, 63, 255, 255, 1, 0, 255, 7, 255, 255, 15, 255, 62, 0, - 255, 255, 15, 255, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, - 255, 255, 255, 192, 1, 0, 239, 254, 31, 0, 0, 0, 128, 0, 255, 255, - 255, 255, 255, 0, 16, 0, 255, 255, 255, 255, 71, 0, 30, 0, 0, 20, - 255, 255, 251, 255, 255, 15, 0, 0, 127, 189, 255, 191, 0, 0, 1, 224, - 128, 7, 0, 128, 176, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, - 255, 7, 0, 1, 0, 0, 0, 128, 255, 252, 255, 255, 10, 0, 0, 0, - 1, 248, 255, 255, 255, 255, 7, 4, 0, 0, 1, 240, 255, 3, 0, 32, - 255, 253, 255, 255, 0, 0, 252, 255, 127, 251, 255, 255, 64, 0, 0, 0, - 191, 253, 255, 255, 255, 3, 0, 1, 255, 63, 0, 0, 248, 255, 255, 224, - 255, 7, 1, 0, 11, 0, 0, 0, 0, 0, 7, 0, 240, 0, 255, 255, - 255, 7, 255, 31, 255, 1, 255, 3, 255, 255, 223, 255, 255, 255, 255, 223, - 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, - 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 31, 128, 63, - 0, 64, 0, 0, 15, 8, 0, 0, 150, 254, 247, 10, 132, 234, 150, 170, - 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255, -}; - -/* ID_Start: 2496 bytes. */ - -RE_UINT32 re_get_id_start(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_id_start_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_id_start_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_id_start_stage_3[pos + f] << 5; - pos += code; - value = (re_id_start_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* ID_Continue. */ - -static RE_UINT8 re_id_continue_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 9, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 22, 23, 5, 24, 25, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 2, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 9, 9, 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 1, 1, 0, 0, 0, 0, 9, 9, 9, 9, 9, + 2, 2, 2, 2, 2, 2, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 26, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static RE_UINT8 re_id_continue_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, - 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, - 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 1, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 1, 57, 58, 59, 60, 61, 62, 63, 31, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 31, 76, 77, 78, 31, - 1, 1, 1, 79, 80, 81, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 82, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 84, 85, 31, 31, 86, 87, - 1, 1, 1, 1, 1, 1, 1, 88, 1, 1, 89, 31, 31, 31, 31, 31, - 1, 90, 91, 31, 31, 31, 31, 31, 31, 31, 31, 31, 92, 31, 31, 31, - 31, 93, 94, 31, 95, 96, 97, 98, 31, 31, 99, 31, 31, 31, 31, 31, - 100, 101, 102, 31, 31, 31, 31, 31, 103, 104, 31, 31, 31, 31, 105, 31, - 1, 1, 1, 1, 1, 1, 106, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 107, 108, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 109, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 110, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 111, 31, 31, 31, 31, 31, - 31, 37, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_id_continue_stage_3[] = { - 0, 0, 0, 1, 2, 3, 2, 4, 0, 0, 5, 6, 7, 8, 7, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 0, - 7, 7, 7, 7, 7, 7, 7, 12, 13, 7, 14, 7, 7, 7, 7, 15, - 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 2, 7, 17, 7, 7, 18, 2, 7, 19, 20, 7, 3, 21, - 0, 4, 7, 7, 7, 7, 22, 7, 7, 7, 7, 7, 7, 23, 24, 25, - 0, 7, 7, 7, 26, 7, 7, 7, 7, 7, 7, 10, 7, 7, 7, 27, - 7, 7, 28, 0, 7, 29, 4, 0, 0, 0, 7, 30, 0, 31, 14, 7, - 7, 7, 7, 7, 7, 7, 32, 2, 23, 33, 24, 34, 35, 36, 32, 37, - 38, 33, 24, 39, 40, 41, 42, 43, 44, 14, 24, 45, 46, 47, 32, 48, - 49, 33, 24, 45, 50, 51, 32, 52, 53, 54, 55, 22, 56, 57, 42, 0, - 58, 59, 24, 60, 61, 62, 32, 0, 63, 59, 24, 64, 61, 65, 32, 66, - 63, 59, 7, 7, 67, 68, 32, 69, 70, 71, 7, 72, 73, 74, 42, 75, - 2, 7, 7, 4, 76, 1, 0, 0, 77, 7, 78, 28, 79, 80, 0, 0, - 47, 81, 1, 82, 83, 7, 84, 2, 85, 83, 7, 84, 86, 0, 0, 0, - 7, 7, 7, 7, 1, 7, 7, 7, 7, 28, 7, 7, 87, 7, 7, 88, - 7, 7, 7, 7, 89, 90, 7, 7, 89, 7, 7, 91, 92, 8, 7, 7, - 7, 92, 7, 7, 7, 26, 48, 10, 7, 0, 7, 7, 7, 7, 7, 93, - 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 25, 7, 2, 4, 7, 7, 7, 7, 94, 18, - 58, 95, 7, 95, 7, 96, 58, 97, 7, 7, 7, 7, 7, 98, 1, 0, - 99, 1, 7, 7, 7, 7, 7, 18, 7, 7, 4, 7, 7, 7, 7, 43, - 7, 76, 29, 29, 42, 7, 28, 95, 7, 7, 29, 7, 1, 4, 0, 0, - 7, 29, 7, 7, 7, 76, 7, 25, 1, 1, 100, 28, 0, 0, 0, 0, - 7, 7, 7, 7, 29, 1, 101, 96, 7, 7, 7, 7, 7, 7, 7, 96, - 7, 7, 7, 102, 60, 7, 7, 28, 18, 7, 7, 26, 0, 103, 7, 4, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 104, - 7, 93, 7, 7, 93, 105, 7, 28, 7, 7, 7, 106, 107, 108, 84, 107, - 0, 0, 0, 109, 47, 110, 0, 111, 0, 84, 0, 0, 0, 84, 112, 47, - 113, 114, 115, 80, 116, 0, 7, 7, 18, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 76, 7, 7, 76, 7, 7, 7, 7, 7, 7, 7, 7, 117, 96, - 7, 7, 87, 7, 7, 7, 118, 109, 7, 119, 120, 120, 120, 120, 7, 7, - 121, 0, 2, 122, 2, 7, 7, 7, 7, 123, 2, 7, 7, 7, 7, 88, - 124, 7, 7, 2, 7, 7, 7, 7, 76, 0, 7, 4, 0, 0, 0, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 43, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 84, 0, 0, 0, 0, 7, 7, 28, - 84, 7, 29, 0, 7, 7, 7, 125, 7, 7, 7, 7, 7, 7, 7, 10, - 0, 126, 127, 7, 7, 7, 7, 7, 128, 7, 7, 7, 129, 0, 0, 126, - 7, 7, 102, 0, 7, 7, 7, 96, 7, 7, 7, 7, 43, 1, 7, 130, - 7, 7, 28, 7, 7, 96, 7, 84, 7, 7, 7, 7, 131, 1, 7, 76, - 7, 7, 7, 119, 28, 1, 7, 71, 7, 7, 7, 7, 21, 99, 7, 129, - 132, 133, 120, 7, 7, 88, 102, 7, 7, 7, 7, 7, 7, 7, 134, 1, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 96, 7, 135, 7, 7, 29, - 7, 7, 7, 7, 7, 7, 28, 7, 7, 7, 7, 7, 7, 1, 0, 0, - 119, 136, 24, 137, 138, 7, 7, 7, 7, 7, 7, 10, 0, 31, 7, 7, - 7, 7, 7, 28, 0, 7, 7, 7, 7, 127, 7, 7, 102, 0, 0, 29, - 7, 0, 7, 139, 140, 0, 0, 85, 7, 7, 7, 7, 7, 7, 7, 84, - 0, 1, 2, 3, 2, 4, 42, 7, 7, 7, 7, 76, 141, 142, 0, 0, - 143, 7, 8, 144, 28, 28, 0, 0, 7, 7, 7, 7, 7, 7, 7, 4, - 0, 0, 0, 0, 7, 7, 7, 95, 0, 0, 0, 0, 0, 0, 0, 145, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 84, 7, 7, 7, 47, 47, 0, - 7, 7, 140, 7, 4, 7, 7, 4, 7, 28, 7, 7, 146, 147, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 28, 1, 7, 7, 146, 7, 29, - 7, 7, 102, 7, 7, 7, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 119, 7, 43, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 148, 7, 7, 149, 7, 43, 7, 119, 7, 76, 0, 0, 0, 0, 7, 150, - 7, 43, 7, 1, 0, 0, 0, 0, 7, 7, 7, 151, 0, 0, 0, 0, - 152, 153, 7, 154, 0, 0, 7, 84, 7, 84, 0, 0, 83, 7, 119, 0, - 7, 7, 7, 43, 7, 43, 7, 21, 7, 10, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 18, 0, 0, 0, 7, 7, 7, 21, 7, 7, 7, 21, - 7, 7, 102, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 84, 100, 7, 7, 47, 0, 0, 0, 0, 0, 0, 0, 0, 7, 119, - 7, 7, 7, 7, 119, 0, 42, 109, 7, 7, 7, 4, 0, 7, 18, 1, - 7, 7, 7, 85, 155, 7, 7, 156, 7, 7, 7, 7, 157, 158, 0, 0, - 7, 14, 7, 159, 0, 0, 0, 0, 160, 19, 18, 7, 7, 7, 4, 1, - 23, 33, 24, 161, 50, 162, 163, 95, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 4, 22, 0, 0, 7, 7, 7, 7, 164, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 165, 47, 166, 0, 0, - 7, 7, 7, 7, 167, 1, 0, 0, 7, 7, 7, 18, 1, 0, 0, 0, - 7, 26, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 4, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 1, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 7, 7, 168, 169, 0, - 7, 7, 7, 76, 100, 7, 7, 7, 7, 170, 0, 0, 7, 7, 7, 18, - 24, 7, 7, 8, 47, 1, 0, 127, 7, 127, 83, 119, 0, 0, 0, 0, - 171, 7, 7, 172, 102, 1, 173, 7, 76, 174, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 119, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 76, 0, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 18, 7, 76, 1, 0, 0, 0, 0, 0, 0, 7, 28, 95, - 7, 7, 7, 119, 96, 1, 31, 175, 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 3, 7, 7, 7, 118, 7, 0, 0, 0, 0, 176, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 102, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, - 7, 76, 0, 0, 0, 21, 177, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 29, - 7, 7, 7, 7, 7, 7, 4, 84, 18, 178, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 179, 180, 181, 0, 182, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 85, 7, 7, 7, 58, 184, 185, 186, 7, 7, 7, - 187, 188, 7, 189, 190, 59, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 165, 7, 59, 88, 7, 88, - 7, 85, 7, 85, 76, 7, 76, 7, 24, 7, 24, 7, 191, 7, 7, 7, - 7, 7, 7, 135, 7, 7, 84, 192, 110, 101, 2, 0, 0, 0, 0, 0, - 8, 128, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 84, 28, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 1, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 95, 119, 0, 0, - 7, 7, 7, 7, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 186, 7, 195, 196, 197, 198, 199, 200, 104, 29, 201, 29, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 119, 0, 0, - 7, 7, 7, 95, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 28, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 47, 0, - 7, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_id_continue_stage_4[] = { - 0, 0, 255, 3, 254, 255, 255, 135, 255, 7, 0, 4, 160, 4, 255, 255, - 127, 255, 195, 255, 3, 0, 31, 80, 223, 188, 192, 215, 251, 255, 191, 255, - 251, 252, 127, 2, 255, 1, 255, 191, 182, 0, 7, 0, 255, 195, 239, 159, - 255, 253, 255, 159, 255, 231, 63, 36, 255, 63, 255, 15, 223, 63, 248, 255, - 207, 255, 249, 255, 197, 243, 159, 121, 128, 176, 3, 80, 238, 135, 109, 211, - 135, 57, 2, 94, 192, 255, 63, 0, 238, 191, 237, 243, 191, 59, 1, 0, - 0, 254, 238, 159, 159, 57, 192, 176, 2, 0, 236, 199, 61, 214, 24, 199, - 199, 61, 129, 0, 255, 223, 253, 255, 255, 227, 223, 61, 96, 7, 239, 223, - 239, 243, 96, 64, 6, 0, 223, 125, 240, 128, 0, 252, 236, 255, 127, 252, - 251, 47, 127, 132, 95, 255, 12, 0, 255, 127, 214, 247, 175, 255, 95, 63, - 255, 243, 0, 3, 160, 194, 255, 254, 255, 31, 223, 255, 64, 0, 191, 32, - 255, 247, 255, 61, 127, 61, 61, 127, 61, 255, 63, 63, 255, 199, 31, 0, - 15, 0, 13, 0, 143, 48, 0, 56, 128, 0, 0, 248, 255, 0, 247, 255, - 255, 251, 255, 170, 223, 95, 220, 31, 207, 15, 0, 128, 16, 0, 2, 128, - 226, 255, 132, 252, 47, 63, 80, 253, 224, 67, 31, 248, 255, 128, 127, 0, - 127, 127, 224, 0, 62, 31, 127, 254, 224, 255, 240, 191, 128, 255, 252, 255, - 255, 249, 124, 0, 255, 232, 1, 128, 126, 126, 126, 0, 255, 55, 127, 248, - 248, 224, 127, 95, 219, 255, 24, 0, 0, 224, 252, 252, 252, 28, 255, 239, - 255, 183, 0, 32, 15, 255, 62, 0, 63, 253, 191, 145, 55, 0, 255, 192, - 111, 240, 239, 254, 63, 135, 112, 0, 79, 0, 31, 30, 255, 23, 255, 64, - 127, 189, 237, 251, 129, 224, 207, 31, 191, 0, 63, 255, 0, 63, 17, 0, - 255, 252, 27, 0, 255, 35, 127, 251, 127, 180, 191, 253, 251, 1, 255, 224, - 11, 0, 240, 0, 255, 99, 224, 227, 7, 248, 231, 15, 0, 60, 28, 0, - 100, 222, 255, 235, 239, 255, 191, 231, 223, 223, 255, 123, 95, 252, 247, 207, - 32, 0, 219, 7, 255, 67, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, - 247, 94, 238, 251, -}; - -/* ID_Continue: 2900 bytes. */ - -RE_UINT32 re_get_id_continue(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_id_continue_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_id_continue_stage_2[pos + f] << 4; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_id_continue_stage_3[pos + f] << 4; - pos += code; - value = (re_id_continue_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* XID_Start. */ - -static RE_UINT8 re_xid_start_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 9, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 22, 23, 5, 24, 25, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1, 2, 0, 0, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 2, 2, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 2, 2, 2, 2, 9, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 1, 9, 22, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 9, 9, 9, 9, 2, 2, 9, 2, 1, 1, 1, 1, 9, 1, 1, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 22, 9, 2, 2, 2, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 9, 2, 2, 9, 1, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, + 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 0, 1, 1, 9, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 2, 2, 2, 2, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 2, 2, 0, 9, 1, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 22, 2, 2, 7, 7, 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, 1, 1, 0, 0, + 1, 2, 2, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 24, 2, 2, 2, 24, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 9, + 1, 9, 1, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 9, 22, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static RE_UINT8 re_xid_start_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, - 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, - 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 1, 58, 59, 60, 61, 62, 63, 64, 31, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 31, 77, 78, 79, 31, - 1, 1, 1, 80, 81, 82, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 84, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 85, 86, 31, 31, 87, 88, - 1, 1, 1, 1, 1, 1, 1, 89, 1, 1, 90, 31, 31, 31, 31, 31, - 1, 91, 92, 31, 31, 31, 31, 31, 31, 31, 31, 31, 93, 31, 31, 31, - 31, 31, 31, 31, 94, 95, 96, 97, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 98, 99, 31, 31, 31, 31, 31, 100, 101, 31, 31, 31, 31, 102, 31, - 1, 1, 1, 1, 1, 1, 103, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 104, 105, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 106, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 107, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 108, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_xid_start_stage_3[] = { - 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 0, 7, 8, 9, 4, 10, - 4, 4, 4, 4, 11, 4, 4, 4, 4, 12, 13, 4, 14, 0, 15, 16, - 0, 4, 17, 18, 4, 4, 19, 20, 21, 22, 23, 4, 4, 24, 25, 26, - 27, 28, 29, 17, 0, 30, 0, 0, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 44, 48, 49, 50, 51, 45, 0, - 52, 53, 54, 55, 56, 57, 58, 59, 52, 60, 61, 62, 63, 64, 65, 0, - 66, 67, 65, 0, 68, 69, 70, 0, 71, 0, 72, 73, 74, 0, 0, 0, - 4, 75, 76, 77, 78, 4, 79, 80, 4, 4, 81, 4, 82, 83, 84, 4, - 85, 4, 86, 0, 22, 4, 4, 87, 66, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 88, 1, 4, 4, 89, 90, 91, 91, 92, 4, 93, 94, 0, - 0, 4, 4, 29, 4, 95, 4, 96, 97, 0, 15, 98, 4, 99, 100, 0, - 101, 4, 102, 0, 0, 103, 0, 0, 104, 93, 105, 0, 106, 107, 4, 108, - 4, 109, 110, 111, 112, 113, 0, 114, 4, 4, 4, 4, 4, 4, 0, 0, - 87, 4, 115, 111, 4, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, - 121, 122, 123, 4, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 124, 97, 4, 4, 4, 4, 125, 4, 79, 4, 126, 101, 127, 127, 0, - 128, 129, 66, 4, 130, 66, 4, 80, 104, 12, 4, 4, 131, 86, 0, 15, - 4, 4, 4, 4, 4, 96, 0, 0, 4, 4, 4, 4, 4, 4, 4, 22, - 4, 4, 4, 4, 73, 0, 15, 111, 132, 133, 4, 134, 111, 4, 4, 22, - 135, 136, 4, 4, 137, 4, 138, 135, 139, 140, 4, 93, 136, 93, 0, 141, - 25, 142, 65, 143, 31, 144, 145, 146, 4, 14, 147, 148, 4, 149, 150, 151, - 152, 153, 80, 154, 4, 4, 4, 140, 4, 4, 4, 4, 4, 155, 156, 157, - 4, 4, 4, 158, 4, 4, 159, 0, 160, 161, 162, 4, 4, 91, 163, 4, - 4, 4, 111, 31, 4, 4, 4, 4, 4, 111, 15, 4, 164, 4, 165, 166, - 0, 0, 0, 167, 4, 4, 4, 143, 0, 1, 1, 168, 111, 97, 169, 0, - 170, 171, 172, 0, 4, 4, 4, 86, 0, 0, 4, 102, 0, 0, 0, 0, - 0, 0, 0, 0, 143, 4, 173, 0, 4, 23, 174, 96, 111, 4, 175, 0, - 4, 4, 4, 4, 111, 15, 176, 157, 4, 154, 4, 109, 0, 0, 0, 0, - 4, 101, 96, 165, 0, 0, 0, 0, 177, 178, 96, 101, 97, 0, 0, 179, - 96, 159, 0, 0, 4, 180, 0, 0, 181, 96, 0, 143, 143, 0, 72, 182, - 4, 96, 96, 144, 91, 0, 0, 0, 4, 4, 14, 0, 4, 144, 4, 144, - 4, 109, 0, 0, 0, 0, 0, 0, 143, 183, 108, 0, 0, 0, 0, 101, - 106, 184, 0, 0, 106, 22, 15, 14, 106, 65, 185, 186, 106, 144, 187, 0, - 188, 189, 0, 0, 190, 112, 97, 0, 47, 44, 191, 55, 0, 0, 0, 0, - 4, 102, 192, 0, 4, 22, 193, 0, 0, 0, 0, 0, 4, 131, 194, 0, - 4, 22, 195, 0, 4, 196, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, - 4, 189, 0, 0, 0, 4, 4, 197, 0, 0, 0, 0, 0, 198, 173, 199, - 200, 201, 202, 4, 203, 0, 4, 29, 204, 131, 71, 205, 22, 0, 0, 0, - 206, 173, 207, 208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, - 4, 4, 4, 4, 159, 0, 0, 0, 4, 4, 4, 131, 4, 4, 4, 4, - 4, 4, 109, 0, 0, 0, 0, 0, 4, 131, 0, 0, 0, 0, 0, 0, - 4, 4, 65, 0, 0, 0, 0, 0, 4, 29, 97, 0, 0, 0, 15, 210, - 4, 22, 109, 211, 22, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, - 4, 4, 212, 0, 163, 0, 0, 213, 4, 4, 4, 4, 4, 4, 4, 184, - 4, 4, 4, 4, 4, 4, 4, 144, 97, 0, 214, 215, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 157, 4, 4, 4, 216, 217, 0, 0, 0, - 4, 4, 218, 4, 219, 220, 221, 4, 222, 223, 224, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 225, 226, 80, 218, 218, 124, 124, 204, 204, 147, 0, - 4, 227, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 189, - 4, 4, 4, 4, 4, 4, 182, 0, 4, 4, 229, 0, 0, 0, 0, 0, - 221, 230, 231, 232, 233, 234, 0, 0, 4, 4, 4, 4, 4, 4, 101, 0, - 4, 102, 4, 4, 4, 4, 4, 4, 111, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 235, 4, 4, 4, 4, 4, 4, 4, 4, 4, 71, - 111, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_xid_start_stage_4[] = { - 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, - 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 0, 0, 223, 184, - 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, - 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 0, 0, 0, 0, 255, 255, - 255, 135, 7, 0, 255, 7, 0, 0, 0, 192, 254, 255, 255, 255, 47, 0, - 96, 192, 0, 156, 0, 0, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, - 63, 0, 2, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 63, 4, - 16, 1, 0, 0, 255, 255, 255, 1, 255, 255, 223, 63, 240, 255, 255, 255, - 255, 255, 255, 35, 0, 0, 1, 255, 3, 0, 254, 255, 225, 159, 249, 255, - 255, 253, 197, 35, 0, 64, 0, 176, 3, 0, 3, 16, 224, 135, 249, 255, - 255, 253, 109, 3, 0, 0, 0, 94, 0, 0, 28, 0, 224, 191, 251, 255, - 255, 253, 237, 35, 0, 0, 1, 0, 3, 0, 0, 2, 224, 159, 249, 255, - 0, 0, 0, 176, 3, 0, 2, 0, 232, 199, 61, 214, 24, 199, 255, 3, - 224, 223, 253, 255, 255, 253, 255, 35, 0, 0, 0, 7, 3, 0, 0, 0, - 225, 223, 253, 255, 255, 253, 239, 35, 0, 0, 0, 64, 3, 0, 6, 0, - 255, 255, 255, 39, 0, 64, 112, 128, 3, 0, 0, 252, 224, 255, 127, 252, - 255, 255, 251, 47, 127, 0, 0, 0, 254, 255, 255, 255, 255, 255, 5, 0, - 214, 247, 255, 255, 175, 255, 5, 32, 95, 0, 0, 240, 1, 0, 0, 0, - 255, 254, 255, 255, 255, 31, 0, 0, 0, 31, 0, 0, 255, 7, 0, 128, - 0, 0, 63, 60, 98, 192, 225, 255, 3, 64, 0, 0, 191, 32, 255, 255, - 255, 255, 255, 247, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, - 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 7, 255, 255, 63, 63, - 255, 159, 255, 255, 255, 199, 255, 1, 255, 223, 3, 0, 255, 255, 3, 0, - 255, 223, 1, 0, 255, 255, 15, 0, 0, 0, 128, 16, 255, 5, 255, 255, - 255, 255, 63, 0, 255, 255, 255, 127, 255, 63, 31, 0, 255, 15, 255, 255, - 255, 3, 0, 0, 255, 255, 127, 0, 255, 255, 31, 0, 128, 0, 0, 0, - 224, 255, 255, 255, 224, 15, 0, 0, 248, 255, 255, 255, 1, 192, 0, 252, - 63, 0, 0, 0, 15, 0, 0, 0, 0, 224, 0, 252, 255, 255, 255, 63, - 255, 1, 255, 255, 255, 255, 255, 231, 0, 222, 111, 4, 63, 63, 255, 170, - 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, - 0, 0, 255, 31, 132, 252, 47, 63, 80, 253, 255, 243, 224, 67, 0, 0, - 255, 127, 255, 255, 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, - 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 224, 255, 127, 0, 0, - 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 0, 128, 0, 0, 128, 255, - 252, 255, 255, 255, 255, 249, 255, 255, 124, 0, 0, 0, 187, 247, 255, 255, - 7, 0, 0, 0, 0, 0, 252, 104, 63, 0, 255, 255, 255, 255, 255, 31, - 255, 255, 7, 0, 0, 128, 0, 0, 223, 255, 0, 124, 247, 15, 0, 0, - 255, 255, 127, 196, 255, 255, 98, 62, 5, 0, 0, 56, 255, 7, 28, 0, - 126, 126, 126, 0, 127, 127, 255, 255, 255, 0, 255, 255, 15, 0, 255, 255, - 127, 248, 255, 255, 255, 255, 255, 15, 255, 63, 255, 255, 255, 255, 255, 3, - 127, 0, 248, 160, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, - 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 3, 0, 0, 138, 170, - 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, - 255, 63, 255, 63, 255, 255, 1, 0, 255, 7, 255, 255, 15, 255, 62, 0, - 255, 255, 15, 255, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, - 255, 255, 255, 192, 1, 0, 239, 254, 31, 0, 0, 0, 128, 0, 255, 255, - 255, 255, 255, 0, 16, 0, 255, 255, 255, 255, 71, 0, 30, 0, 0, 20, - 255, 255, 251, 255, 255, 15, 0, 0, 127, 189, 255, 191, 0, 0, 1, 224, - 128, 7, 0, 128, 176, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, - 255, 7, 0, 1, 0, 0, 0, 128, 255, 252, 255, 255, 10, 0, 0, 0, - 1, 248, 255, 255, 255, 255, 7, 4, 0, 0, 1, 240, 255, 3, 0, 32, - 255, 253, 255, 255, 0, 0, 252, 255, 127, 251, 255, 255, 64, 0, 0, 0, - 191, 253, 255, 255, 255, 3, 0, 1, 255, 63, 0, 0, 248, 255, 255, 224, - 255, 7, 1, 0, 11, 0, 0, 0, 0, 0, 7, 0, 240, 0, 255, 255, - 255, 7, 255, 31, 255, 1, 255, 3, 255, 255, 223, 255, 255, 255, 255, 223, - 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, - 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 255, 31, 128, 63, - 0, 64, 0, 0, 15, 8, 0, 0, 150, 254, 247, 10, 132, 234, 150, 170, - 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255, -}; - -/* XID_Start: 2504 bytes. */ - -RE_UINT32 re_get_xid_start(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_xid_start_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_xid_start_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_xid_start_stage_3[pos + f] << 5; - pos += code; - value = (re_xid_start_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* XID_Continue. */ - -static RE_UINT8 re_xid_continue_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 9, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 22, 23, 5, 24, 25, + 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 22, + 9, 2, 2, 2, 2, 22, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 9, 22, 22, + 22, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 9, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 22, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 0, + 1, 1, 0, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 1, 1, 1, 1, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, + 11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 12, 12, 12, 18, 18, 18, 9, 9, + 9, 9, 18, 9, 9, 9, 12, 18, 12, 18, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, 18, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 20, 20, 20, 20, 20, 20, 20, 12, 18, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 18, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 2, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 1, + 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 28, 28, 28, 28, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 1, 1, 2, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 9, 9, 9, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 9, 9, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 1, 1, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 0, 0, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, + 9, 9, 9, 9, 9, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 1, 9, 9, 2, 2, 2, 2, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 10, + 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 12, 12, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 9, 9, 9, + 11, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 9, 0, 9, 0, 9, 0, 9, 9, 9, + 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, + 0, 9, 9, 0, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 34, 34, 34, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 9, 9, 9, 34, 34, 34, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 9, 9, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 9, 9, 34, 34, 34, 34, 34, 9, 34, 34, 34, + 34, 34, 35, 35, 35, 34, 34, 35, 34, 34, 35, 35, 35, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 42, 42, 42, 42, 42, + 34, 34, 35, 35, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 34, 35, 34, 34, 34, + 34, 35, 35, 35, 34, 35, 35, 35, 34, 34, 34, 34, 34, 34, 34, 35, + 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 9, 34, 9, 34, 9, 34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 9, + 34, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 35, 35, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 34, 34, 34, 34, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 35, 35, 35, 34, 34, 34, 35, 35, 35, 35, 35, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 8, 8, 8, 28, 28, 28, 9, 9, 9, 9, + 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 35, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 26, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, + 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, 34, 34, 34, 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 35, 34, 34, 35, + 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, + 34, 34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 35, 35, 35, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 35, 35, 34, 35, 35, 34, 35, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, + 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_xid_continue_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 31, 31, - 34, 35, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, - 1, 1, 1, 1, 38, 1, 39, 40, 41, 42, 43, 44, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 45, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 1, 58, 59, 60, 61, 62, 63, 64, 31, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 31, 77, 78, 79, 31, - 1, 1, 1, 80, 81, 82, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 84, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 85, 86, 31, 31, 87, 88, - 1, 1, 1, 1, 1, 1, 1, 89, 1, 1, 90, 31, 31, 31, 31, 31, - 1, 91, 92, 31, 31, 31, 31, 31, 31, 31, 31, 31, 93, 31, 31, 31, - 31, 94, 95, 31, 96, 97, 98, 99, 31, 31, 100, 31, 31, 31, 31, 31, - 101, 102, 103, 31, 31, 31, 31, 31, 104, 105, 31, 31, 31, 31, 106, 31, - 1, 1, 1, 1, 1, 1, 107, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 108, 109, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 110, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 111, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 112, 31, 31, 31, 31, 31, - 31, 37, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, +RE_UINT32 re_get_line_break(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_line_break_table_1[field_2]; + v = re_line_break_table_2[(v << 5) | field_1]; + v = re_line_break_table_3[(v << 5) | field_0]; + + return v; +} + +/* Logical_Order_Exception. */ +RE_UINT32 re_get_logical_order_exception(RE_UINT32 codepoint) { + if (0x0E40 <= codepoint && codepoint <= 0x0E44) + return 1; + if (0x0EC0 <= codepoint && codepoint <= 0x0EC4) + return 1; + if (0x19B5 <= codepoint && codepoint <= 0x19B7) + return 1; + if (codepoint == 0x19BA) + return 1; + if (0xAAB5 <= codepoint && codepoint <= 0xAAB6) + return 1; + if (codepoint == 0xAAB9) + return 1; + if (0xAABB <= codepoint && codepoint <= 0xAABC) + return 1; + + return 0; +} + +/* Lowercase. */ +static RE_UINT8 re_lowercase_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 17, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_lowercase_table_2[] = { + 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 5, 13, 14, 15, 16, 17, 18, 19, 0, 0, 20, 21, 22, 23, 24, 25, + 0, 26, 15, 5, 27, 5, 28, 5, 5, 29, 0, 15, 30, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, + 0, 0, 0, 0, 30, 0, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, + 5, 5, 5, 5, 33, 5, 5, 5, 34, 35, 36, 37, 35, 38, 39, 40, + 0, 0, 0, 41, 42, 0, 0, 0, 43, 44, 45, 26, 46, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 47, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 26, 48, 49, 5, 5, 5, 50, 15, 51, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 52, 53, 0, 0, 0, 0, 54, 5, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 60, 61, 15, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 63, 64, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 68, 69, 81, + 71, 72, 82, 64, 75, 83, 84, 85, 86, 82, 87, 26, 88, 75, 89, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 91, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_lowercase_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 0, 0, 0, 128, + 255, 255, 127, 255, 170, 170, 170, 170, 170, 170, 170, 85, 85, 171, 170, 170, + 170, 170, 170, 212, 41, 49, 36, 78, 42, 45, 81, 230, 64, 82, 85, 181, + 170, 170, 41, 170, 170, 170, 250, 147, 133, 170, 255, 255, 255, 255, 255, 255, + 255, 255, 239, 255, 255, 255, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 138, 60, 0, 0, 1, 0, 0, 240, 255, 255, + 255, 127, 227, 170, 170, 170, 47, 25, 0, 0, 255, 255, 2, 168, 170, 170, + 84, 213, 170, 170, 170, 170, 0, 0, 255, 1, 0, 0, 255, 255, 255, 231, + 0, 0, 0, 63, 170, 170, 234, 191, 255, 0, 63, 0, 255, 0, 255, 0, + 63, 0, 255, 0, 255, 0, 255, 63, 255, 0, 223, 64, 220, 0, 207, 0, + 255, 0, 220, 0, 0, 0, 2, 128, 0, 0, 255, 31, 0, 196, 8, 0, + 0, 128, 16, 50, 192, 67, 0, 0, 16, 0, 0, 0, 255, 3, 0, 0, + 255, 255, 255, 127, 98, 21, 218, 63, 26, 80, 8, 0, 191, 32, 0, 0, + 170, 42, 0, 0, 170, 170, 170, 58, 168, 170, 171, 170, 170, 170, 255, 149, + 170, 80, 186, 170, 170, 130, 160, 170, 8, 5, 0, 0, 0, 0, 64, 7, + 255, 255, 255, 247, 255, 1, 255, 255, 127, 0, 248, 0, 0, 255, 255, 255, + 255, 255, 0, 0, 0, 0, 0, 255, 255, 255, 255, 15, 255, 255, 7, 0, + 0, 0, 0, 252, 255, 255, 15, 0, 0, 192, 223, 255, 255, 0, 0, 0, + 252, 255, 255, 15, 0, 0, 192, 235, 239, 255, 0, 0, 0, 252, 255, 255, + 15, 0, 0, 192, 255, 255, 255, 0, 0, 0, 252, 255, 255, 15, 0, 0, + 192, 255, 255, 255, 0, 192, 255, 255, 0, 0, 192, 255, 63, 0, 0, 0, + 252, 255, 255, 247, 3, 0, 0, 240, 255, 255, 223, 15, 255, 127, 63, 0, + 255, 253, 0, 0, 247, 11, 0, 0, 252, 255, 255, 255, 15, 0, 0, 0 }; -static RE_UINT8 re_xid_continue_stage_3[] = { - 0, 0, 0, 1, 2, 3, 2, 4, 0, 0, 5, 6, 7, 8, 7, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 0, - 7, 7, 7, 7, 7, 7, 7, 12, 13, 7, 14, 7, 7, 7, 7, 15, - 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 2, 7, 17, 7, 7, 18, 2, 7, 19, 20, 7, 3, 21, - 0, 4, 7, 7, 7, 7, 22, 7, 7, 7, 7, 7, 7, 23, 24, 25, - 0, 7, 7, 7, 26, 7, 7, 7, 7, 7, 7, 10, 7, 7, 7, 27, - 7, 7, 28, 0, 7, 29, 4, 0, 0, 0, 7, 30, 0, 31, 14, 7, - 7, 7, 7, 7, 7, 7, 32, 2, 23, 33, 24, 34, 35, 36, 32, 37, - 38, 33, 24, 39, 40, 41, 42, 43, 44, 14, 24, 45, 46, 47, 32, 48, - 49, 33, 24, 45, 50, 51, 32, 52, 53, 54, 55, 22, 56, 57, 42, 0, - 58, 59, 24, 60, 61, 62, 32, 0, 63, 59, 24, 64, 61, 65, 32, 66, - 63, 59, 7, 7, 67, 68, 32, 69, 70, 71, 7, 72, 73, 74, 42, 75, - 2, 7, 7, 4, 76, 1, 0, 0, 77, 7, 78, 28, 79, 80, 0, 0, - 47, 81, 1, 82, 83, 7, 84, 2, 85, 83, 7, 84, 86, 0, 0, 0, - 7, 7, 7, 7, 1, 7, 7, 7, 7, 28, 7, 7, 87, 7, 7, 88, - 7, 7, 7, 7, 89, 90, 7, 7, 89, 7, 7, 91, 92, 8, 7, 7, - 7, 92, 7, 7, 7, 26, 48, 10, 7, 0, 7, 7, 7, 7, 7, 93, - 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 25, 7, 2, 4, 7, 7, 7, 7, 94, 18, - 58, 95, 7, 95, 7, 96, 58, 97, 7, 7, 7, 7, 7, 98, 1, 0, - 99, 1, 7, 7, 7, 7, 7, 18, 7, 7, 4, 7, 7, 7, 7, 43, - 7, 76, 29, 29, 42, 7, 28, 95, 7, 7, 29, 7, 1, 4, 0, 0, - 7, 29, 7, 7, 7, 76, 7, 25, 1, 1, 100, 28, 0, 0, 0, 0, - 7, 7, 7, 7, 29, 1, 101, 96, 7, 7, 7, 7, 7, 7, 7, 96, - 7, 7, 7, 102, 60, 7, 7, 28, 18, 7, 7, 26, 0, 103, 7, 4, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 104, - 7, 93, 7, 7, 93, 105, 7, 28, 7, 7, 7, 106, 107, 108, 84, 107, - 0, 0, 0, 109, 47, 110, 0, 111, 0, 84, 0, 0, 0, 84, 112, 47, - 113, 114, 115, 80, 116, 0, 7, 7, 18, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 76, 7, 7, 76, 7, 7, 7, 7, 7, 7, 7, 7, 117, 96, - 7, 7, 87, 7, 7, 7, 118, 109, 7, 119, 120, 120, 120, 120, 7, 7, - 121, 0, 2, 122, 2, 7, 7, 7, 7, 123, 2, 7, 7, 7, 7, 88, - 124, 7, 7, 2, 7, 7, 7, 7, 76, 0, 7, 4, 0, 0, 0, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 43, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 84, 0, 0, 0, 0, 7, 7, 28, - 84, 7, 29, 0, 7, 7, 7, 125, 7, 7, 7, 7, 7, 7, 7, 10, - 0, 126, 127, 7, 7, 7, 7, 7, 128, 7, 7, 7, 129, 0, 0, 126, - 7, 7, 102, 0, 7, 7, 7, 96, 7, 7, 7, 7, 43, 1, 7, 130, - 7, 7, 28, 7, 7, 96, 7, 84, 7, 7, 7, 7, 131, 1, 7, 76, - 7, 7, 7, 119, 28, 1, 7, 71, 7, 7, 7, 7, 21, 99, 7, 129, - 132, 133, 120, 7, 7, 88, 102, 7, 7, 7, 7, 7, 7, 7, 134, 1, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 96, 7, 135, 7, 7, 29, - 7, 7, 7, 7, 7, 7, 28, 7, 7, 7, 7, 7, 7, 1, 0, 0, - 119, 136, 24, 137, 138, 7, 7, 7, 7, 7, 7, 10, 0, 31, 7, 7, - 7, 7, 7, 7, 7, 28, 139, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 28, 0, 7, 7, 7, 7, 127, 7, 7, 102, 0, 0, 1, - 7, 0, 7, 140, 141, 0, 0, 142, 7, 7, 7, 7, 7, 7, 7, 84, - 0, 1, 2, 3, 2, 4, 42, 7, 7, 7, 7, 76, 143, 144, 0, 0, - 145, 7, 8, 146, 28, 28, 0, 0, 7, 7, 7, 7, 7, 7, 7, 4, - 0, 0, 0, 0, 7, 7, 7, 95, 0, 0, 0, 0, 0, 0, 0, 147, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 84, 7, 7, 7, 47, 47, 0, - 7, 7, 141, 7, 4, 7, 7, 4, 7, 28, 7, 7, 148, 149, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 28, 1, 7, 7, 148, 7, 29, - 7, 7, 102, 7, 7, 7, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 119, 7, 43, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 150, 7, 7, 151, 7, 43, 7, 119, 7, 76, 0, 0, 0, 0, 7, 152, - 7, 43, 7, 1, 0, 0, 0, 0, 7, 7, 7, 153, 0, 0, 0, 0, - 154, 155, 7, 156, 0, 0, 7, 84, 7, 84, 0, 0, 83, 7, 119, 0, - 7, 7, 7, 43, 7, 43, 7, 21, 7, 10, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 18, 0, 0, 0, 7, 7, 7, 21, 7, 7, 7, 21, - 7, 7, 102, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 84, 100, 7, 7, 47, 0, 0, 0, 0, 0, 0, 0, 0, 7, 119, - 7, 7, 7, 7, 119, 0, 42, 109, 7, 7, 7, 4, 0, 7, 18, 1, - 7, 7, 7, 85, 157, 7, 7, 158, 7, 7, 7, 7, 159, 160, 0, 0, - 7, 14, 7, 161, 0, 0, 0, 0, 162, 19, 18, 7, 7, 7, 4, 1, - 23, 33, 24, 163, 50, 164, 165, 95, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 4, 22, 0, 0, 7, 7, 7, 7, 166, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 167, 47, 168, 0, 0, - 7, 7, 7, 7, 169, 1, 0, 0, 7, 7, 7, 18, 1, 0, 0, 0, - 7, 26, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 4, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 1, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 7, 7, 170, 171, 0, - 7, 7, 7, 76, 100, 7, 7, 7, 7, 172, 0, 0, 7, 7, 7, 18, - 24, 7, 7, 8, 47, 1, 0, 127, 7, 127, 83, 119, 0, 0, 0, 0, - 173, 7, 7, 174, 102, 1, 175, 7, 76, 176, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 119, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 76, 0, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 18, 7, 76, 1, 0, 0, 0, 0, 0, 0, 7, 28, 95, - 7, 7, 7, 119, 96, 1, 31, 177, 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 3, 7, 7, 7, 118, 7, 0, 0, 0, 0, 178, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 102, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, - 7, 76, 0, 0, 0, 21, 179, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 29, - 7, 7, 7, 7, 7, 7, 4, 84, 18, 180, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 181, 182, 183, 0, 184, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 85, 7, 7, 7, 58, 186, 187, 188, 7, 7, 7, - 189, 190, 7, 191, 192, 59, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 167, 7, 59, 88, 7, 88, - 7, 85, 7, 85, 76, 7, 76, 7, 24, 7, 24, 7, 193, 7, 7, 7, - 7, 7, 7, 135, 7, 7, 84, 194, 110, 101, 2, 0, 0, 0, 0, 0, - 8, 128, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 84, 28, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 1, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 95, 119, 0, 0, - 7, 7, 7, 7, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 188, 7, 197, 198, 199, 200, 201, 202, 104, 29, 203, 29, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 119, 0, 0, - 7, 7, 7, 95, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 28, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 47, 0, - 7, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_lowercase(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_xid_continue_stage_4[] = { - 0, 0, 255, 3, 254, 255, 255, 135, 255, 7, 0, 4, 160, 4, 255, 255, - 127, 255, 195, 255, 3, 0, 31, 80, 223, 184, 192, 215, 251, 255, 191, 255, - 251, 252, 127, 2, 255, 1, 255, 191, 182, 0, 7, 0, 255, 195, 239, 159, - 255, 253, 255, 159, 255, 231, 63, 36, 255, 63, 255, 15, 223, 63, 248, 255, - 207, 255, 249, 255, 197, 243, 159, 121, 128, 176, 3, 80, 238, 135, 109, 211, - 135, 57, 2, 94, 192, 255, 63, 0, 238, 191, 237, 243, 191, 59, 1, 0, - 0, 254, 238, 159, 159, 57, 192, 176, 2, 0, 236, 199, 61, 214, 24, 199, - 199, 61, 129, 0, 255, 223, 253, 255, 255, 227, 223, 61, 96, 7, 239, 223, - 239, 243, 96, 64, 6, 0, 223, 125, 240, 128, 0, 252, 236, 255, 127, 252, - 251, 47, 127, 132, 95, 255, 12, 0, 255, 127, 214, 247, 175, 255, 95, 63, - 255, 243, 0, 3, 160, 194, 255, 254, 255, 31, 223, 255, 64, 0, 191, 32, - 255, 247, 255, 61, 127, 61, 61, 127, 61, 255, 63, 63, 255, 199, 31, 0, - 15, 0, 13, 0, 143, 48, 0, 56, 128, 0, 0, 248, 255, 0, 247, 255, - 255, 251, 255, 170, 223, 95, 220, 31, 207, 15, 0, 128, 16, 0, 2, 128, - 226, 255, 132, 252, 47, 63, 80, 253, 224, 67, 31, 248, 255, 128, 127, 0, - 127, 127, 224, 0, 62, 31, 127, 230, 224, 255, 240, 191, 128, 255, 252, 255, - 255, 249, 124, 0, 255, 232, 1, 128, 126, 126, 126, 0, 255, 55, 127, 248, - 248, 224, 127, 95, 219, 255, 240, 255, 24, 0, 0, 224, 138, 170, 252, 252, - 252, 28, 255, 239, 255, 183, 0, 32, 15, 255, 62, 0, 63, 253, 191, 145, - 55, 0, 255, 192, 111, 240, 239, 254, 63, 135, 112, 0, 79, 0, 31, 30, - 255, 23, 255, 64, 127, 189, 237, 251, 129, 224, 207, 31, 191, 0, 63, 255, - 0, 63, 17, 0, 255, 252, 27, 0, 255, 35, 127, 251, 127, 180, 191, 253, - 251, 1, 255, 224, 11, 0, 240, 0, 255, 99, 224, 227, 7, 248, 231, 15, - 0, 60, 28, 0, 100, 222, 255, 235, 239, 255, 191, 231, 223, 223, 255, 123, - 95, 252, 247, 207, 32, 0, 219, 7, 255, 67, 150, 254, 247, 10, 132, 234, - 150, 170, 150, 247, 247, 94, 238, 251, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* XID_Continue: 2920 bytes. */ - -RE_UINT32 re_get_xid_continue(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_xid_continue_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_xid_continue_stage_2[pos + f] << 4; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_xid_continue_stage_3[pos + f] << 4; - pos += code; - value = (re_xid_continue_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} + v = re_lowercase_table_1[field_2]; + v = re_lowercase_table_2[(v << 5) | field_1]; + v = re_lowercase_table_3[(v << 2) | field_0]; -/* Default_Ignorable_Code_Point. */ + return (v >> offset) & 0x1; +} -static RE_UINT8 re_default_ignorable_code_point_stage_1[] = { - 0, 1, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 4, 5, 2, +/* Math. */ +static RE_UINT8 re_math_table_1[] = { + 0, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 7, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; -static RE_UINT8 re_default_ignorable_code_point_stage_2[] = { - 0, 1, 2, 3, 2, 2, 2, 2, 4, 2, 2, 5, 6, 2, 2, 2, - 7, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, - 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, +static RE_UINT8 re_math_table_2[] = { + 0, 1, 2, 3, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 10, 11, 12, 13, 0, 14, 15, 16, 17, 18, 0, 19, 20, 21, 22, + 23, 23, 23, 23, 23, 23, 23, 23, 24, 25, 0, 26, 27, 28, 29, 30, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, + 34, 0, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, + 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 0, 19, 37, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 39, 0, 0, 0, 0, 1, 3, 3, 0, 0, 0, 0, 40, + 23, 23, 41, 23, 42, 43, 44, 23, 45, 46, 47, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 48, 23, 23, 23, 23, 23, 23, 23, 23, 49, 23, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 44, 50, 51, 52, 53, 54, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_default_ignorable_code_point_stage_3[] = { - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 10, 0, 0, 11, 0, 0, 12, 13, - 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 16, 16, 16, 16, 16, 16, 16, 16, +static RE_UINT8 re_math_table_3[] = { + 0, 0, 0, 0, 0, 8, 0, 112, 0, 0, 0, 64, 0, 0, 0, 80, + 0, 16, 2, 0, 0, 0, 128, 0, 0, 0, 39, 0, 0, 0, 115, 0, + 192, 1, 0, 0, 0, 0, 64, 0, 0, 0, 28, 0, 17, 0, 4, 0, + 30, 0, 0, 124, 0, 124, 0, 0, 0, 0, 255, 31, 98, 248, 0, 0, + 132, 252, 47, 63, 16, 179, 251, 241, 255, 11, 0, 0, 0, 0, 255, 255, + 255, 126, 195, 240, 255, 255, 255, 47, 48, 0, 240, 255, 255, 255, 255, 255, + 0, 15, 0, 0, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 248, + 255, 255, 191, 0, 0, 0, 1, 240, 7, 0, 0, 0, 3, 192, 255, 240, + 195, 140, 15, 0, 148, 31, 0, 255, 96, 0, 0, 0, 5, 0, 0, 0, + 15, 224, 0, 0, 159, 31, 0, 0, 0, 2, 0, 0, 126, 1, 0, 0, + 4, 30, 0, 0, 255, 255, 223, 255, 255, 255, 255, 223, 100, 222, 255, 235, + 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, + 63, 255, 255, 255, 255, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, + 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 0, 0, 3, 0 }; -static RE_UINT8 re_default_ignorable_code_point_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, - 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, - 0, 120, 0, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 124, 0, 0, - 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 1, - 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 7, - 255, 255, 255, 255, 255, 255, 255, 255, -}; +RE_UINT32 re_get_math(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_math_table_1[field_2]; + v = re_math_table_2[(v << 5) | field_1]; + v = re_math_table_3[(v << 2) | field_0]; -/* Default_Ignorable_Code_Point: 488 bytes. */ - -RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_default_ignorable_code_point_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_default_ignorable_code_point_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_default_ignorable_code_point_stage_3[pos + f] << 6; - pos += code; - value = (re_default_ignorable_code_point_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return (v >> offset) & 0x1; } -/* Grapheme_Extend. */ +/* NFC_Quick_Check. */ +static RE_UINT8 re_nfc_quick_check_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 9, 5, 10, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 5, + 5, 5, 5, 5, 12, 13, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 15, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 16, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 +}; -static RE_UINT8 re_grapheme_extend_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 7, 8, 9, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, +static RE_UINT8 re_nfc_quick_check_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 9, 10, 0, + 0, 11, 12, 0, 0, 0, 0, 0, 0, 9, 13, 0, 0, 9, 14, 0, + 0, 0, 15, 0, 0, 0, 16, 0, 0, 9, 14, 0, 0, 0, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, 21, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 24, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 28, 29, 30, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, + 37, 38, 36, 39, 36, 36, 40, 0, 41, 42, 43, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 44, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 51, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_nfc_quick_check_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, + 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, + 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 2, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 }; -static RE_UINT8 re_grapheme_extend_stage_2[] = { - 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 0, 0, 15, 0, 0, 0, 16, 17, 18, 19, 20, 21, 22, 0, 0, - 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 0, 0, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +RE_UINT32 re_get_nfc_quick_check(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_nfc_quick_check_table_1[field_2]; + v = re_nfc_quick_check_table_2[(v << 5) | field_1]; + v = re_nfc_quick_check_table_3[(v << 5) | field_0]; + + return v; +} + +/* NFD_Quick_Check. */ +static RE_UINT8 re_nfd_quick_check_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 9, 5, 10, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 12, 5, 5, 5, 5, 5, 5, 5, 5, 13, 5, + 5, 5, 5, 5, 14, 15, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 17, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 +}; + +static RE_UINT8 re_nfd_quick_check_table_2[] = { + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 7, 8, 9, + 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, 15, 16, 0, + 17, 18, 19, 20, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 23, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 0, 0, 0, 27, 0, + 0, 28, 29, 0, 0, 0, 0, 0, 0, 0, 30, 0, 31, 0, 32, 0, + 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 35, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, + 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 27, 0, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 33, 34, - 0, 35, 36, 37, 0, 0, 0, 0, 0, 0, 38, 0, 0, 39, 0, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 52, 53, 54, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 0, 0, 57, + 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 44, 44, 44, 44, 45, 44, 44, 46, 47, 44, 48, 49, 44, 50, 51, 52, + 53, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 55, 56, 57, 0, + 58, 59, 60, 61, 62, 63, 0, 64, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 67, 68, 13, 67, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 60, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, - 62, 56, 63, 0, 0, 0, 0, 0, 64, 65, 0, 0, 0, 0, 0, 0, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 70, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, + 71, 72, 44, 73, 44, 44, 46, 0, 74, 75, 76, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 77, 78, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_grapheme_extend_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0, - 7, 0, 8, 9, 0, 0, 10, 11, 12, 13, 14, 0, 0, 15, 0, 16, - 17, 18, 19, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 30, 31, 34, 35, 26, 36, 37, 25, 38, 39, 40, 0, - 41, 42, 43, 25, 26, 44, 45, 25, 46, 47, 28, 25, 0, 0, 48, 0, - 0, 49, 50, 0, 0, 51, 52, 0, 53, 54, 0, 55, 56, 57, 58, 0, - 0, 59, 60, 61, 62, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, - 64, 64, 65, 65, 0, 66, 67, 0, 68, 0, 0, 0, 69, 70, 0, 0, - 0, 71, 0, 0, 0, 0, 0, 0, 72, 0, 73, 74, 0, 75, 0, 0, - 76, 77, 38, 78, 46, 79, 0, 80, 0, 81, 0, 0, 0, 0, 82, 83, - 0, 0, 0, 0, 0, 0, 1, 84, 85, 0, 0, 0, 0, 0, 13, 86, - 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 1, - 0, 89, 0, 0, 90, 0, 0, 0, 0, 0, 0, 91, 42, 0, 0, 92, - 93, 69, 0, 0, 0, 0, 94, 95, 0, 96, 97, 0, 22, 98, 0, 99, - 0, 100, 101, 31, 0, 102, 26, 103, 0, 0, 0, 0, 0, 0, 0, 104, - 39, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, - 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 107, 0, 0, 0, 0, - 108, 109, 0, 0, 0, 0, 0, 69, 0, 110, 0, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, 0, 0, 26, 111, 112, 88, 46, 113, 0, 0, - 22, 114, 0, 115, 46, 116, 117, 0, 0, 118, 0, 0, 0, 0, 88, 119, - 46, 47, 120, 121, 0, 0, 0, 0, 0, 111, 122, 0, 0, 123, 124, 0, - 0, 0, 0, 0, 0, 125, 126, 0, 0, 127, 106, 0, 0, 128, 0, 0, - 63, 129, 0, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 131, 106, 132, 133, 134, 0, 135, 0, 0, 0, - 0, 136, 0, 0, 137, 138, 0, 0, 0, 139, 140, 0, 141, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 143, - 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 146, 0, 0, 0, - 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 148, 149, 150, 0, 0, - 0, 0, 151, 0, 0, 0, 0, 0, 1, 152, 1, 153, 154, 155, 0, 0, - 156, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, - 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 159, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, -}; - -static RE_UINT8 re_grapheme_extend_stage_4[] = { - 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 0, 248, 3, 0, 0, - 0, 0, 254, 255, 255, 255, 255, 191, 182, 0, 0, 0, 0, 0, 255, 7, - 0, 248, 255, 255, 0, 0, 1, 0, 0, 0, 192, 159, 159, 61, 0, 0, - 0, 0, 2, 0, 0, 0, 255, 255, 255, 7, 0, 0, 192, 255, 1, 0, - 0, 248, 15, 32, 0, 0, 192, 251, 239, 62, 0, 0, 0, 0, 0, 14, - 0, 0, 248, 255, 251, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 20, - 254, 33, 254, 0, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 80, - 30, 32, 128, 0, 12, 0, 0, 64, 6, 0, 0, 0, 0, 0, 0, 16, - 134, 57, 2, 0, 0, 0, 35, 0, 190, 33, 0, 0, 12, 0, 0, 252, - 0, 0, 0, 208, 30, 32, 192, 0, 4, 0, 0, 0, 0, 0, 0, 64, - 1, 32, 128, 0, 17, 0, 0, 0, 0, 0, 0, 192, 193, 61, 96, 0, - 0, 0, 0, 144, 68, 48, 96, 0, 3, 0, 0, 0, 0, 0, 0, 88, - 0, 132, 92, 128, 0, 0, 242, 7, 128, 127, 0, 0, 0, 0, 242, 31, - 0, 63, 0, 0, 0, 0, 0, 3, 0, 0, 160, 2, 0, 0, 254, 127, - 223, 224, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 0, 224, 253, 102, - 0, 0, 0, 195, 1, 0, 30, 0, 100, 32, 0, 32, 0, 0, 0, 224, - 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 176, 63, 64, 254, 15, 32, - 0, 56, 0, 0, 96, 0, 0, 0, 0, 2, 0, 0, 135, 1, 4, 14, - 0, 0, 128, 9, 0, 0, 64, 127, 229, 31, 248, 159, 0, 0, 255, 127, - 15, 0, 0, 0, 0, 0, 240, 23, 0, 248, 15, 0, 60, 59, 0, 0, - 64, 163, 3, 0, 0, 240, 207, 0, 0, 0, 247, 255, 253, 33, 16, 3, - 255, 255, 255, 251, 0, 16, 0, 0, 255, 255, 1, 0, 0, 128, 3, 0, - 0, 0, 0, 128, 0, 252, 0, 0, 0, 0, 0, 6, 0, 128, 247, 63, - 0, 0, 3, 0, 68, 8, 0, 0, 48, 0, 0, 0, 255, 255, 3, 128, - 192, 63, 0, 0, 128, 255, 3, 0, 0, 0, 200, 51, 32, 0, 0, 0, - 0, 126, 102, 0, 8, 16, 0, 0, 0, 0, 157, 193, 0, 48, 64, 0, - 32, 33, 0, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 192, 7, - 110, 240, 0, 0, 0, 0, 0, 135, 240, 0, 0, 0, 0, 0, 0, 255, - 127, 0, 0, 0, 0, 0, 120, 6, 128, 239, 31, 0, 0, 0, 8, 0, - 0, 0, 192, 127, 0, 30, 0, 0, 0, 128, 211, 64, 248, 7, 0, 0, - 1, 0, 128, 0, 192, 31, 31, 0, 92, 0, 0, 64, 0, 0, 249, 165, - 13, 0, 0, 0, 0, 128, 60, 176, 1, 0, 0, 48, 0, 0, 248, 167, - 0, 40, 191, 0, 188, 15, 0, 0, 0, 128, 255, 6, 0, 0, 240, 12, - 254, 7, 0, 0, 0, 0, 248, 121, 128, 0, 126, 14, 0, 252, 127, 3, - 0, 0, 127, 191, 0, 0, 252, 255, 255, 252, 109, 0, 0, 0, 126, 180, - 191, 0, 0, 0, 0, 0, 163, 0, 0, 0, 24, 0, 0, 0, 31, 0, - 0, 0, 127, 0, 0, 128, 0, 0, 0, 128, 7, 0, 0, 0, 0, 96, - 160, 195, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, - 255, 255, 127, 248, 255, 31, 32, 0, 16, 0, 0, 248, 254, 255, 0, 0, - 127, 255, 255, 249, 219, 7, 0, 0, 0, 240, 0, 0, 240, 7, 0, 0, -}; - -/* Grapheme_Extend: 1672 bytes. */ - -RE_UINT32 re_get_grapheme_extend(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_grapheme_extend_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_grapheme_extend_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_grapheme_extend_stage_3[pos + f] << 5; - pos += code; - value = (re_grapheme_extend_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 85, 86, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_nfd_quick_check_table_3[] = { + 255, 255, 255, 255, 64, 0, 129, 193, 64, 0, 129, 65, 0, 0, 3, 0, + 192, 0, 14, 129, 7, 14, 12, 0, 192, 0, 0, 128, 252, 127, 254, 255, + 255, 31, 0, 32, 48, 0, 206, 0, 0, 0, 0, 48, 63, 0, 240, 255, + 228, 255, 255, 255, 255, 255, 239, 191, 31, 40, 254, 255, 255, 3, 254, 255, + 255, 131, 231, 255, 116, 143, 255, 253, 255, 255, 255, 253, 255, 255, 116, 143, + 255, 255, 63, 255, 249, 255, 48, 3, 3, 3, 192, 252, 131, 255, 255, 255, + 250, 255, 247, 255, 255, 253, 237, 255, 255, 255, 255, 0, 255, 231, 255, 79, + 255, 255, 183, 255, 255, 255, 255, 177, 255, 230, 255, 207, 255, 255, 239, 255, + 255, 227, 255, 255, 255, 254, 255, 255, 126, 242, 255, 255, 255, 255, 255, 139, + 247, 223, 123, 239, 255, 253, 151, 254, 253, 255, 247, 223, 123, 239, 255, 253, + 191, 255, 255, 255, 191, 170, 251, 255, 255, 255, 255, 215, 244, 255, 255, 255, + 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 252, 0, 0, 192, 192, + 192, 192, 0, 85, 0, 0, 0, 192, 0, 0, 32, 160, 33, 0, 48, 16, + 0, 0, 35, 192, 252, 255, 255, 255, 191, 243, 255, 255, 255, 255, 255, 243, + 255, 191, 255, 255, 255, 31, 255, 255, 239, 237, 255, 255, 175, 255, 255, 255, + 109, 253, 255, 255, 250, 31, 204, 252, 204, 252, 255, 255, 255, 15, 255, 255, + 240, 195, 255, 255, 255, 249, 255, 255, 255, 255, 255, 239, 255, 175, 170, 170, + 90, 253, 36, 201, 255, 255, 111, 184, 240, 255, 255, 255, 0, 192, 26, 128, + 154, 3, 0, 0, 0, 192, 0, 0, 255, 255, 255, 95, 255, 3, 128, 160, + 36, 128, 255, 255, 255, 255, 255, 235, 255, 247, 255, 255, 255, 63, 255, 255, + 255, 231, 255, 255, 255, 255, 255, 167, 255, 255, 255, 254, 255, 255, 255, 63, + 224, 255, 255, 255, 255, 255, 255, 7, 254, 255, 255, 255 +}; + +RE_UINT32 re_get_nfd_quick_check(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_nfd_quick_check_table_1[field_2]; + v = re_nfd_quick_check_table_2[(v << 5) | field_1]; + v = re_nfd_quick_check_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; } -/* Grapheme_Base. */ - -static RE_UINT8 re_grapheme_base_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, -}; - -static RE_UINT8 re_grapheme_base_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, - 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 19, 19, 13, 32, 19, 19, - 19, 33, 19, 19, 19, 19, 19, 19, 19, 19, 34, 35, 13, 13, 13, 13, - 13, 36, 37, 19, 19, 19, 19, 19, 19, 19, 19, 19, 38, 19, 19, 39, - 19, 19, 19, 19, 40, 41, 42, 19, 43, 19, 44, 45, 46, 47, 48, 19, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 49, 13, 13, 13, 50, 51, 13, - 13, 13, 13, 52, 13, 13, 13, 13, 13, 13, 53, 19, 19, 19, 54, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, -}; - -static RE_UINT8 re_grapheme_base_stage_3[] = { - 0, 1, 2, 2, 2, 2, 3, 4, 2, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 2, 2, 30, 31, 32, 33, 2, 2, 2, 2, 2, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 2, 47, 2, 2, 48, 49, - 50, 51, 2, 52, 2, 2, 2, 2, 53, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 54, 55, 56, 57, 58, 59, 60, 61, 2, 62, - 63, 64, 65, 66, 67, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 68, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 69, - 2, 70, 2, 2, 71, 72, 2, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 2, 2, 2, 2, 2, 2, 2, 82, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 2, 2, 84, 85, 86, 87, 2, 2, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 83, 98, 99, 100, 2, 101, 102, 83, 2, 2, 103, 83, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 83, 115, 83, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 83, 125, 126, 83, 127, 128, 129, 130, 83, - 131, 132, 83, 133, 134, 135, 83, 83, 136, 137, 138, 139, 83, 140, 83, 141, - 2, 2, 2, 2, 2, 2, 2, 142, 143, 2, 144, 83, 83, 83, 83, 83, - 145, 83, 83, 83, 83, 83, 83, 83, 2, 2, 2, 2, 146, 83, 83, 83, - 2, 2, 2, 2, 147, 148, 149, 150, 83, 83, 83, 83, 151, 152, 153, 154, - 2, 2, 2, 2, 2, 2, 2, 155, 2, 2, 2, 2, 2, 156, 83, 83, - 2, 2, 157, 2, 2, 158, 83, 83, 159, 160, 83, 83, 83, 83, 83, 83, - 2, 161, 162, 163, 164, 165, 166, 83, 167, 168, 169, 2, 2, 170, 2, 171, - 2, 2, 2, 2, 172, 173, 83, 83, 83, 83, 174, 83, 83, 175, 83, 83, - 2, 176, 177, 83, 83, 83, 83, 83, 178, 179, 180, 83, 181, 182, 83, 83, - 183, 184, 185, 186, 187, 83, 2, 2, 2, 2, 2, 2, 2, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 83, 83, 2, 2, 2, 2, 2, 197, 2, 2, - 2, 2, 2, 2, 2, 2, 198, 2, 199, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 200, 2, 2, 2, 2, 2, 2, 2, 2, 2, 201, - 2, 2, 2, 2, 202, 83, 83, 83, +/* NFKC_Quick_Check. */ +static RE_UINT8 re_nfkc_quick_check_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 14, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 16, + 5, 5, 5, 5, 17, 18, 19, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 20, 21, 5, 5, 5, 5, 5, 22, 23, 5, 24, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; -static RE_UINT8 re_grapheme_base_stage_4[] = { - 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, - 0, 0, 0, 0, 255, 223, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 252, - 240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 7, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 127, 254, 255, 255, 255, 255, - 255, 231, 0, 0, 0, 0, 0, 64, 73, 0, 255, 255, 255, 135, 31, 0, - 192, 255, 0, 200, 255, 255, 255, 255, 255, 7, 0, 0, 255, 255, 254, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 64, 96, 194, 255, 255, - 255, 63, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 63, 0, 2, 0, 255, 255, 255, 255, 255, 7, 240, 199, - 255, 255, 63, 4, 16, 1, 255, 127, 255, 255, 255, 65, 255, 7, 0, 0, - 0, 0, 0, 0, 255, 255, 223, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 248, 255, 255, 255, 255, 255, 255, 235, 1, 222, 1, 255, 243, 255, 255, 255, - 237, 159, 249, 255, 255, 253, 197, 163, 129, 89, 0, 176, 195, 255, 255, 63, - 232, 135, 249, 255, 255, 253, 109, 195, 1, 0, 0, 94, 192, 255, 92, 0, - 232, 191, 251, 255, 255, 253, 237, 227, 1, 26, 1, 0, 195, 255, 3, 2, - 236, 159, 249, 255, 255, 253, 237, 35, 129, 25, 0, 176, 195, 255, 255, 0, - 232, 199, 61, 214, 24, 199, 255, 131, 198, 29, 1, 0, 192, 255, 255, 7, - 238, 223, 253, 255, 255, 253, 255, 35, 30, 0, 0, 7, 195, 255, 128, 255, - 253, 223, 253, 255, 255, 253, 239, 99, 155, 13, 0, 64, 195, 255, 6, 0, - 236, 223, 253, 255, 255, 255, 255, 167, 193, 221, 112, 255, 195, 255, 255, 255, - 236, 255, 127, 252, 255, 255, 251, 47, 127, 0, 3, 127, 192, 255, 28, 0, - 254, 255, 255, 255, 255, 255, 13, 128, 127, 128, 255, 15, 0, 0, 0, 0, - 214, 247, 255, 255, 175, 255, 13, 32, 95, 0, 255, 243, 0, 0, 0, 0, - 255, 255, 255, 252, 255, 255, 95, 253, 255, 254, 255, 255, 255, 31, 0, 128, - 32, 31, 0, 0, 0, 0, 0, 192, 191, 223, 255, 7, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 31, 2, 153, 255, 255, 255, 60, 254, 255, 225, 255, - 155, 223, 255, 223, 255, 255, 255, 255, 191, 32, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 61, 127, 61, 255, 255, 255, 255, - 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 255, 255, - 255, 255, 61, 255, 255, 255, 255, 255, 255, 255, 255, 7, 255, 255, 255, 31, - 255, 255, 255, 3, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 63, - 255, 255, 255, 31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, - 255, 223, 3, 0, 255, 255, 99, 0, 255, 255, 3, 0, 255, 223, 1, 0, - 255, 255, 255, 255, 255, 255, 79, 192, 191, 1, 240, 31, 255, 3, 255, 3, - 255, 7, 255, 3, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, - 159, 255, 255, 255, 255, 5, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, - 255, 255, 255, 127, 120, 14, 251, 1, 241, 255, 255, 255, 255, 63, 31, 0, - 255, 255, 255, 255, 255, 15, 255, 255, 255, 3, 255, 199, 255, 255, 255, 255, - 255, 255, 127, 198, 255, 255, 255, 255, 255, 255, 191, 0, 26, 224, 7, 0, - 255, 3, 255, 3, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 255, 255, 255, 255, 255, 15, 232, 251, 15, 255, 255, 255, 7, 240, 31, - 252, 255, 255, 255, 195, 196, 255, 255, 255, 255, 255, 255, 191, 92, 12, 240, - 255, 255, 255, 255, 255, 15, 48, 248, 255, 227, 255, 255, 255, 255, 255, 255, - 255, 1, 255, 255, 255, 255, 255, 231, 255, 0, 8, 0, 2, 222, 239, 4, - 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 63, 63, 255, 255, 255, 255, 63, 63, 255, 170, 255, 255, 255, 63, - 255, 255, 255, 255, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127, - 255, 7, 255, 255, 255, 128, 255, 255, 255, 255, 255, 255, 0, 0, 243, 255, - 255, 127, 255, 31, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 127, 0, 0, 0, 255, 7, 0, 0, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 255, - 255, 255, 63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 12, 254, - 255, 255, 255, 255, 191, 32, 255, 255, 255, 255, 255, 255, 255, 128, 1, 0, - 255, 255, 127, 0, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 255, 15, - 255, 255, 255, 255, 255, 3, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 127, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 224, 255, 255, 255, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 127, 255, 255, 255, 255, 255, 7, 255, 255, 255, 255, 15, 0, 255, 255, - 255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 63, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, - 255, 31, 255, 255, 255, 255, 255, 255, 127, 0, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 15, 0, 0, 255, 255, 255, 255, 255, 127, 8, 192, - 255, 255, 255, 63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 124, 0, 0, 0, 0, 0, 128, 255, - 187, 247, 255, 255, 159, 15, 255, 3, 255, 255, 255, 255, 255, 255, 255, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 15, 192, 255, 3, 0, 0, 252, 127, - 255, 255, 255, 255, 63, 192, 255, 255, 127, 0, 12, 128, 255, 255, 255, 31, - 248, 255, 255, 255, 255, 255, 55, 204, 255, 191, 255, 195, 223, 255, 255, 127, - 255, 255, 255, 255, 255, 129, 25, 0, 247, 47, 255, 243, 255, 255, 255, 239, - 255, 255, 255, 255, 255, 255, 98, 62, 5, 0, 0, 248, 255, 207, 63, 0, - 126, 126, 126, 0, 127, 127, 255, 255, 255, 255, 255, 255, 255, 0, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 30, 255, 3, - 255, 255, 255, 255, 15, 0, 255, 255, 127, 248, 255, 255, 255, 255, 255, 15, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 3, 0, 0, 0, 0, - 127, 0, 248, 160, 255, 255, 127, 95, 219, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 3, 0, 248, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 255, 255, 255, 255, 255, 255, - 255, 255, 252, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 255, 63, - 0, 0, 255, 3, 0, 0, 255, 255, 255, 255, 247, 255, 127, 15, 223, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 31, - 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 63, 255, 255, 255, 127, 252, 252, 252, 28, 127, 127, 0, 48, - 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 7, - 135, 255, 255, 255, 255, 255, 143, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 127, 255, 15, 1, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 31, - 255, 255, 255, 31, 255, 255, 255, 255, 255, 255, 1, 0, 254, 255, 255, 15, - 255, 255, 255, 255, 15, 224, 255, 255, 255, 7, 255, 255, 255, 255, 63, 0, - 255, 255, 255, 191, 255, 255, 255, 255, 15, 255, 63, 0, 0, 0, 0, 0, - 255, 255, 255, 63, 255, 3, 255, 255, 255, 255, 15, 255, 255, 255, 255, 15, - 255, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 255, 15, 128, 0, 0, - 255, 255, 255, 255, 255, 255, 127, 0, 255, 255, 63, 0, 255, 0, 0, 0, - 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 191, 255, 255, 255, 255, 255, - 255, 255, 255, 127, 128, 255, 0, 0, 0, 0, 0, 0, 255, 255, 55, 248, - 255, 255, 255, 143, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 240, 255, 255, 252, 255, 255, 255, 255, 255, - 1, 0, 239, 254, 255, 255, 63, 0, 255, 1, 255, 1, 255, 255, 255, 255, - 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 31, 248, 127, 0, - 255, 255, 255, 255, 255, 255, 63, 254, 255, 255, 63, 255, 255, 255, 7, 255, - 255, 255, 3, 30, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 7, 0, 255, 255, 255, 255, 255, 255, 7, 252, - 255, 255, 255, 255, 15, 0, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 127, - 255, 255, 255, 255, 255, 0, 255, 255, 63, 0, 254, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 127, 0, - 253, 255, 255, 255, 255, 255, 255, 0, 128, 63, 252, 255, 255, 255, 0, 0, - 252, 255, 255, 255, 255, 255, 135, 217, 3, 0, 255, 255, 255, 1, 255, 3, - 248, 255, 255, 255, 127, 16, 192, 255, 127, 0, 255, 255, 255, 255, 119, 0, - 252, 255, 255, 255, 255, 255, 63, 128, 255, 33, 255, 255, 254, 255, 31, 0, - 255, 255, 251, 255, 255, 127, 44, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 127, 189, 255, 191, 255, 3, 255, 255, 255, 255, 255, 127, 7, 0, 255, 3, - 236, 159, 249, 255, 255, 253, 237, 163, 158, 57, 1, 224, 15, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 0, 163, 255, 255, 171, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 6, 90, 242, 0, 255, 3, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 127, 3, 79, 254, 255, 255, 15, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 7, 88, 30, 0, 255, 3, 255, 31, 0, 0, - 255, 255, 255, 255, 255, 215, 64, 1, 255, 3, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 7, 67, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 127, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 7, 128, - 0, 0, 0, 0, 255, 252, 255, 255, 255, 255, 15, 240, 30, 0, 0, 0, - 1, 248, 255, 255, 255, 255, 7, 134, 127, 0, 129, 241, 255, 255, 255, 255, - 255, 3, 128, 252, 7, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 1, - 255, 253, 255, 255, 255, 255, 0, 64, 63, 0, 255, 255, 255, 31, 255, 255, - 255, 255, 0, 0, 0, 2, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 127, 251, 255, 255, 255, 255, 1, 0, 64, 0, 255, 3, 191, 253, 255, 255, - 255, 127, 88, 1, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 231, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 3, 128, - 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 31, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 1, 255, 255, 255, 127, 255, 195, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 32, 0, - 255, 255, 255, 255, 255, 255, 128, 255, 63, 0, 255, 251, 251, 255, 255, 224, - 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 7, 255, 255, 255, 255, 255, 255, - 255, 0, 248, 255, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 7, 0, - 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 7, 0, 240, 0, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 7, 255, 31, - 255, 1, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, - 255, 255, 255, 255, 127, 254, 255, 255, 255, 255, 255, 255, 95, 60, 0, 0, - 24, 240, 255, 255, 255, 195, 255, 255, 255, 255, 255, 255, 255, 1, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 35, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 15, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 255, 255, 255, 1, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 255, 255, 255, 255, 255, - 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 255, 255, 255, 255, - 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255, - 0, 0, 0, 0, 0, 0, 128, 7, 0, 0, 0, 0, 0, 224, 223, 255, - 239, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 31, 128, 63, 255, 195, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 15, 255, 131, - 255, 255, 255, 255, 255, 255, 255, 255, 159, 255, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 15, 8, 255, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, - 255, 255, 255, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 254, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 239, 255, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, - 255, 251, 255, 15, 238, 251, 255, 15, 0, 0, 0, 0, 0, 0, 3, 0, - 255, 255, 255, 255, 255, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 15, 0, 255, 127, 254, 255, 254, 255, 254, 255, 255, 255, 63, 0, - 255, 31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 31, 255, 255, - 255, 255, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, - 7, 0, 255, 255, 255, 255, 255, 15, 255, 1, 3, 0, 63, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, 255, 31, 255, 7, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, 255, 15, 0, 0, - 255, 15, 255, 255, 255, 255, 255, 255, 255, 0, 255, 3, 255, 255, 255, 255, - 255, 0, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 123, 252, - 255, 255, 255, 255, 231, 199, 255, 255, 255, 231, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 255, 63, 15, 7, - 7, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 31, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 3, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, 0, 0, 0, - 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_nfkc_quick_check_table_2[] = { + 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 3, 4, 0, 0, 5, 6, + 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 0, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 0, 0, 22, 23, 0, + 0, 24, 25, 0, 0, 0, 0, 0, 0, 22, 26, 0, 0, 22, 27, 0, + 0, 0, 28, 0, 0, 0, 29, 0, 0, 22, 27, 0, 0, 0, 30, 0, + 0, 31, 0, 0, 0, 31, 32, 0, 33, 0, 34, 35, 36, 37, 0, 0, + 0, 38, 0, 0, 0, 0, 0, 39, 0, 0, 0, 40, 0, 41, 42, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 45, 46, 47, 48, 0, 0, + 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 50, 0, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 0, 0, 60, 61, 62, 48, 63, 0, 0, 0, + 0, 64, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 48, 48, 48, 48, 66, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 33, 0, 0, 67, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 31, 48, 48, 48, 48, 48, 48, 69, 0, + 70, 71, 0, 0, 72, 0, 0, 4, 0, 73, 48, 48, 74, 0, 0, 0, + 75, 48, 76, 75, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 80, 81, 48, 82, 48, 48, 83, 0, 84, 85, 86, 48, 48, 87, 88, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 89, 90, 48, 91, 48, 92, 93, + 94, 90, 95, 96, 48, 48, 48, 97, 98, 48, 48, 48, 48, 75, 99, 100, + 0, 0, 0, 0, 0, 101, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 27, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 9, 0, 47, 70, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 107, 48, 108, 109, 110, 48, 111, 112, 113, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 114, 48, 48, 48, 48, 48, 48, 48, 48, 115, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 110, 116, 117, 118, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, 77, 0, 0, 0, + 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Grapheme_Base: 3946 bytes. */ - -RE_UINT32 re_get_grapheme_base(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_grapheme_base_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_grapheme_base_stage_2[pos + f] << 3; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_grapheme_base_stage_3[pos + f] << 7; - pos += code; - value = (re_grapheme_base_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Grapheme_Link. */ - -static RE_UINT8 re_grapheme_link_stage_1[] = { - 0, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +static RE_UINT8 re_nfkc_quick_check_table_3[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, + 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_grapheme_link_stage_2[] = { - 0, 0, 1, 2, 3, 4, 5, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 9, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_grapheme_link_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, 2, 1, 0, 3, 4, 0, 4, 0, 0, 0, 5, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 5, 10, 11, - 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13, 0, 0, 5, 0, 14, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, - 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 0, 18, 19, 0, 20, 0, 0, 15, 21, 0, 0, 22, 0, 1, 0, 0, - 0, 23, 0, 23, 0, 0, 12, 0, 12, 0, 16, 0, 24, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 0, 9, 25, 26, 27, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 0, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_grapheme_link_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 24, 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 16, 0, 0, 0, 16, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, 0, 128, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 32, 0, 0, - 64, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, -}; - -/* Grapheme_Link: 580 bytes. */ - -RE_UINT32 re_get_grapheme_link(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_grapheme_link_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_grapheme_link_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_grapheme_link_stage_3[pos + f] << 6; - pos += code; - value = (re_grapheme_link_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* White_Space. */ - -static RE_UINT8 re_white_space_stage_1[] = { + 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, + 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, + 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 2, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_white_space_stage_2[] = { - 0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_white_space_stage_3[] = { - 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, - 3, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_white_space_stage_4[] = { - 0, 62, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 7, 0, 0, 0, 131, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, -}; - -/* White_Space: 218 bytes. */ - -RE_UINT32 re_get_white_space(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_white_space_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_white_space_stage_2[pos + f] << 3; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_white_space_stage_3[pos + f] << 7; - pos += code; - value = (re_white_space_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Bidi_Control. */ - -static RE_UINT8 re_bidi_control_stage_1[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_bidi_control_stage_2[] = { - 0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_bidi_control_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_bidi_control_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 192, 0, 0, 0, 124, 0, 0, 0, 0, 0, 0, 192, 3, 0, 0, -}; - -/* Bidi_Control: 162 bytes. */ - -RE_UINT32 re_get_bidi_control(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_bidi_control_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_bidi_control_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_bidi_control_stage_3[pos + f] << 7; - pos += code; - value = (re_bidi_control_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Join_Control. */ - -static RE_UINT8 re_join_control_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_join_control_stage_2[] = { - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_join_control_stage_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_join_control_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -/* Join_Control: 130 bytes. */ - -RE_UINT32 re_get_join_control(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_join_control_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_join_control_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_join_control_stage_3[pos + f] << 7; - pos += code; - value = (re_join_control_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Dash. */ - -static RE_UINT8 re_dash_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_dash_stage_2[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 4, 1, 1, 1, - 5, 6, 1, 1, 1, 1, 1, 7, 8, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, -}; - -static RE_UINT8 re_dash_stage_3[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 4, 1, 1, 1, 1, 1, 1, 1, 5, 6, 7, 1, 1, 1, 1, 1, - 8, 1, 1, 1, 1, 1, 1, 1, 9, 3, 1, 1, 1, 1, 1, 1, - 10, 1, 11, 1, 1, 1, 1, 1, 12, 13, 1, 1, 14, 1, 1, 1, -}; - -static RE_UINT8 re_dash_stage_4[] = { - 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128, 4, 0, 0, 0, 12, - 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 1, 8, 0, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, -}; - -/* Dash: 364 bytes. */ - -RE_UINT32 re_get_dash(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_dash_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_dash_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_dash_stage_3[pos + f] << 6; - pos += code; - value = (re_dash_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Hyphen. */ - -static RE_UINT8 re_hyphen_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_hyphen_stage_2[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, - 4, 1, 1, 1, 1, 1, 1, 5, 6, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, + 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_hyphen_stage_3[] = { - 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 4, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 8, 9, 1, 1, -}; +RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -static RE_UINT8 re_hyphen_stage_4[] = { - 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 8, 0, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -/* Hyphen: 308 bytes. */ - -RE_UINT32 re_get_hyphen(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_hyphen_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_hyphen_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_hyphen_stage_3[pos + f] << 6; - pos += code; - value = (re_hyphen_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} + v = re_nfkc_quick_check_table_1[field_2]; + v = re_nfkc_quick_check_table_2[(v << 5) | field_1]; + v = re_nfkc_quick_check_table_3[(v << 5) | field_0]; -/* Quotation_Mark. */ + return v; +} -static RE_UINT8 re_quotation_mark_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, +/* NFKD_Quick_Check. */ +static RE_UINT8 re_nfkd_quick_check_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 14, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 16, 5, 5, 5, 5, 5, 5, 5, 5, 17, 18, + 5, 5, 5, 5, 19, 20, 21, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 22, 23, 5, 5, 5, 5, 5, 24, 25, 5, 26, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; -static RE_UINT8 re_quotation_mark_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 3, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, +static RE_UINT8 re_nfkd_quick_check_table_2[] = { + 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, + 11, 12, 0, 0, 0, 13, 14, 15, 0, 0, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 29, 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 34, 0, + 0, 35, 36, 0, 0, 0, 0, 0, 0, 0, 37, 0, 38, 0, 39, 0, + 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 39, 0, 0, 0, 42, 0, + 0, 43, 0, 0, 0, 43, 44, 0, 45, 0, 46, 47, 48, 49, 0, 0, + 0, 50, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 57, 58, 59, 0, 0, + 59, 59, 59, 59, 60, 59, 59, 61, 62, 59, 63, 64, 59, 65, 66, 67, + 68, 69, 70, 71, 72, 40, 0, 0, 73, 74, 75, 59, 76, 77, 78, 0, + 79, 80, 81, 82, 83, 84, 0, 85, 0, 86, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 59, 59, 59, 59, 87, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45, 0, 0, 88, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, + 0, 0, 0, 0, 90, 0, 0, 43, 59, 59, 59, 59, 59, 59, 91, 0, + 92, 93, 94, 95, 96, 94, 95, 97, 0, 98, 59, 59, 99, 0, 0, 0, + 100, 59, 101, 100, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 103, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 105, 0, 0, 0, 0, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 106, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 59, 59, 59, 59, 59, 59, 59, 59, + 107, 108, 59, 109, 59, 59, 61, 0, 110, 111, 112, 59, 59, 113, 114, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 64, 115, 59, 4, 59, 116, 117, + 118, 115, 119, 120, 59, 59, 59, 121, 122, 59, 59, 59, 59, 100, 123, 124, + 0, 0, 0, 0, 125, 126, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 130, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 15, 0, 58, 92, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 59, 59, 65, 59, 133, 134, 135, 59, 136, 137, 138, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 7, 59, 59, 59, 59, 59, 59, 59, 59, 139, 59, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 135, 140, 141, 142, 143, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 145, 146, 147, 39, 102, 0, 0, 0, + 148, 60, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_nfkd_quick_check_table_3[] = { + 255, 255, 255, 255, 254, 122, 195, 136, 64, 0, 129, 193, 64, 0, 129, 65, + 0, 0, 3, 0, 192, 0, 2, 1, 6, 12, 12, 0, 192, 0, 0, 0, + 252, 127, 254, 255, 15, 0, 0, 32, 48, 0, 192, 0, 0, 0, 0, 48, + 63, 0, 240, 255, 255, 255, 0, 254, 255, 255, 255, 192, 224, 255, 255, 255, + 228, 255, 255, 255, 255, 255, 239, 187, 15, 40, 254, 255, 255, 3, 254, 255, + 255, 131, 128, 255, 255, 255, 200, 253, 116, 143, 255, 253, 255, 255, 255, 253, + 255, 255, 116, 143, 255, 255, 63, 255, 249, 255, 48, 3, 3, 3, 192, 252, + 127, 255, 255, 255, 131, 255, 255, 255, 255, 255, 31, 254, 250, 255, 247, 255, + 255, 253, 237, 255, 255, 255, 255, 0, 255, 231, 255, 79, 255, 255, 183, 255, + 255, 255, 255, 177, 255, 230, 255, 207, 255, 255, 239, 255, 255, 227, 255, 255, + 255, 254, 255, 255, 126, 242, 255, 255, 255, 255, 255, 139, 255, 255, 247, 255, + 255, 255, 255, 207, 255, 239, 255, 255, 247, 223, 123, 239, 255, 253, 23, 252, + 253, 255, 247, 223, 123, 239, 255, 253, 191, 255, 255, 255, 255, 255, 255, 239, + 191, 170, 251, 255, 255, 255, 255, 215, 244, 255, 255, 255, 255, 143, 0, 8, + 0, 64, 0, 0, 0, 248, 255, 254, 255, 255, 255, 7, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 0, 252, 0, 0, 192, 192, 192, 192, 0, 85, + 0, 0, 0, 192, 0, 0, 32, 0, 32, 0, 48, 16, 0, 0, 35, 128, + 0, 248, 125, 255, 143, 127, 39, 175, 127, 252, 127, 127, 255, 255, 12, 0, + 0, 128, 0, 224, 16, 1, 144, 193, 168, 66, 4, 4, 30, 252, 0, 0, + 255, 253, 255, 243, 255, 191, 255, 255, 255, 31, 255, 255, 239, 237, 255, 255, + 175, 79, 254, 255, 109, 253, 255, 255, 250, 31, 204, 252, 204, 252, 255, 255, + 255, 15, 255, 255, 240, 195, 255, 255, 255, 249, 255, 255, 0, 248, 255, 255, + 255, 255, 143, 255, 255, 127, 255, 255, 255, 255, 255, 127, 0, 0, 192, 255, + 254, 255, 255, 255, 255, 255, 191, 248, 255, 175, 170, 170, 90, 253, 36, 201, + 255, 255, 239, 39, 255, 255, 111, 56, 255, 255, 1, 0, 0, 128, 3, 0, + 0, 0, 0, 128, 0, 255, 0, 0, 255, 255, 254, 255, 255, 255, 255, 252, + 255, 255, 255, 15, 255, 253, 255, 255, 240, 255, 255, 255, 0, 192, 26, 128, + 154, 3, 0, 0, 0, 192, 0, 0, 128, 255, 7, 95, 0, 0, 128, 160, + 36, 0, 0, 0, 0, 0, 252, 255, 255, 255, 7, 0, 255, 255, 0, 0, + 0, 255, 255, 255, 255, 255, 0, 224, 255, 255, 0, 252, 96, 0, 8, 0, + 128, 240, 40, 0, 0, 0, 0, 224, 1, 0, 0, 0, 3, 3, 3, 227, + 128, 128, 255, 255, 255, 255, 255, 235, 255, 247, 255, 255, 255, 63, 255, 255, + 255, 231, 255, 255, 255, 255, 255, 167, 255, 255, 255, 243, 255, 255, 255, 254, + 255, 255, 255, 63, 0, 0, 0, 32, 155, 33, 0, 20, 16, 0, 0, 0, + 64, 24, 32, 32, 0, 0, 0, 132, 160, 3, 2, 0, 0, 48, 0, 0, + 105, 1, 8, 245, 123, 21, 105, 85, 105, 8, 8, 161, 0, 4, 0, 240, + 17, 4, 0, 240, 0, 248, 0, 0, 0, 128, 0, 0, 0, 0, 255, 255, + 248, 255, 0, 0, 0, 254, 252, 255 +}; + +RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_nfkd_quick_check_table_1[field_2]; + v = re_nfkd_quick_check_table_2[(v << 5) | field_1]; + v = re_nfkd_quick_check_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Noncharacter_Code_Point. */ +static RE_UINT8 re_noncharacter_code_point_table_1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 }; -static RE_UINT8 re_quotation_mark_stage_3[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, - 5, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 7, 8, 1, 1, +static RE_UINT8 re_noncharacter_code_point_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 }; -static RE_UINT8 re_quotation_mark_stage_4[] = { - 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 255, 0, 0, 0, 6, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 224, 0, 0, 0, 0, - 30, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 0, 0, 0, +static RE_UINT8 re_noncharacter_code_point_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 192 }; -/* Quotation_Mark: 284 bytes. */ - -RE_UINT32 re_get_quotation_mark(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_quotation_mark_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_quotation_mark_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_quotation_mark_stage_3[pos + f] << 6; - pos += code; - value = (re_quotation_mark_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} +RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* Terminal_Punctuation. */ + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_terminal_punctuation_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 6, 2, 7, 2, 8, 9, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; + v = re_noncharacter_code_point_table_1[field_2]; + v = re_noncharacter_code_point_table_2[(v << 5) | field_1]; + v = re_noncharacter_code_point_table_3[(v << 2) | field_0]; -static RE_UINT8 re_terminal_punctuation_stage_2[] = { - 0, 1, 1, 2, 1, 3, 4, 5, 6, 7, 1, 1, 1, 1, 8, 9, - 10, 1, 1, 11, 1, 1, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, - 19, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, - 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 22, 1, 23, 1, 24, 25, 26, 27, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 29, - 1, 1, 1, 30, 1, 1, 1, 1, 31, 32, 33, 34, 1, 1, 1, 35, - 36, 37, 38, 1, 39, 40, 41, 42, 1, 1, 43, 1, 44, 1, 45, 1, - 1, 1, 1, 1, 46, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 48, 1, 1, 49, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 51, 1, 1, 1, 1, 1, -}; + return (v >> offset) & 0x1; +} -static RE_UINT8 re_terminal_punctuation_stage_3[] = { - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, - 6, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 9, - 0, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, - 0, 0, 12, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 0, 17, 0, 18, 0, 0, 0, 0, 19, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, - 0, 23, 0, 24, 0, 0, 0, 0, 0, 25, 26, 0, 0, 0, 0, 0, - 0, 27, 28, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 24, 30, 0, 0, 0, 0, 0, 0, 31, - 0, 0, 0, 32, 0, 0, 33, 0, 0, 34, 0, 0, 0, 0, 26, 0, - 0, 0, 35, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 38, - 0, 0, 39, 0, 0, 0, 0, 0, 1, 0, 0, 40, 0, 0, 0, 0, - 0, 0, 0, 0, 36, 0, 41, 0, 0, 0, 42, 0, 0, 0, 0, 0, - 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 43, - 0, 44, 0, 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, - 0, 0, 47, 0, 0, 24, 48, 0, 0, 0, 49, 0, 0, 0, 50, 0, - 0, 51, 0, 0, 0, 4, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 29, 0, 0, 0, 0, 0, - 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 56, 29, 0, 0, - 0, 0, 49, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, - 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 60, - 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, - 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, +/* Numeric_Type. */ +static RE_UINT8 re_numeric_type_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 10, + 10, 10, 10, 15, 16, 17, 18, 19, 20, 21, 10, 22, 23, 24, 10, 10, + 25, 26, 10, 27, 10, 28, 10, 10, 10, 29, 30, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 10, 41, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 42, 43, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 44, 45, 10, 10, 46, 10, 47, 48, 49, 10, 50, 10, + 51, 10, 52, 10, 10, 10, 10, 10, 53, 10, 54, 10, 10, 10, 55, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 56, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 57, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; -static RE_UINT8 re_terminal_punctuation_stage_4[] = { - 0, 0, 0, 0, 2, 80, 0, 140, 0, 0, 0, 64, 128, 0, 0, 0, - 0, 2, 0, 0, 8, 0, 0, 0, 0, 16, 0, 200, 0, 0, 16, 0, - 255, 23, 0, 0, 0, 0, 0, 3, 0, 0, 255, 127, 48, 0, 0, 0, - 0, 0, 0, 12, 0, 225, 7, 0, 0, 12, 0, 0, 254, 1, 0, 0, - 0, 64, 0, 0, 0, 56, 0, 0, 0, 0, 96, 0, 0, 0, 112, 4, - 60, 3, 0, 0, 0, 15, 0, 0, 0, 0, 0, 236, 0, 0, 0, 248, - 0, 0, 0, 192, 0, 0, 0, 48, 128, 3, 0, 0, 0, 64, 0, 16, - 2, 208, 0, 0, 6, 0, 0, 0, 0, 224, 0, 0, 0, 0, 248, 0, - 0, 0, 192, 0, 0, 192, 0, 0, 0, 128, 0, 0, 0, 0, 0, 224, - 0, 0, 0, 128, 0, 0, 3, 0, 0, 8, 0, 0, 0, 0, 247, 0, - 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 128, 0, 0, 0, 63, 0, - 0, 0, 0, 252, 0, 0, 0, 30, 0, 0, 224, 3, 128, 63, 0, 0, - 3, 0, 0, 0, 14, 0, 0, 0, 96, 32, 0, 192, 0, 0, 0, 31, - 0, 56, 0, 8, 60, 254, 255, 0, 0, 0, 0, 112, 12, 0, 0, 0, - 0, 0, 0, 24, 0, 0, 2, 0, 0, 0, 128, 1, 0, 0, 31, 0, - 0, 0, 32, 0, 0, 0, 128, 3, 16, 0, 0, 0, 128, 7, 0, 0, +static RE_UINT8 re_numeric_type_table_2[] = { + 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, + 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 7, + 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 9, 10, 0, 0, 0, 4, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 14, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 18, 0, 0, 0, 0, 0, 19, 20, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 23, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, + 0, 31, 32, 0, 31, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 38, 0, 27, 0, 39, 40, 41, 42, 37, 0, 0, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, 46, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 51, 0, 0, 0, 52, 53, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 58, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 59, 60, 61, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 63, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 56, 65, 27, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 67, 20, 68, 69, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 70, 0, 71, 72, 0, 0, 0, 73, 0, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 74, 75, 0, 76, 0, 77, 78, 0, 0, 0, 0, 79, 80, 20, + 0, 0, 81, 82, 83, 0, 0, 84, 0, 0, 74, 74, 0, 85, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 86, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 87, 0, 0, 0, 0, 83, 88, 89, 0, 0, 0, 90, 0, + 0, 0, 91, 92, 0, 0, 0, 1, 0, 93, 0, 0, 0, 0, 1, 94, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 3, 0, 0, 95, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 97, 98, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, + 20, 20, 20, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 101, 102, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 105, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 33, 20, 106, 0, 0, 107, 108, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 59, 0, 0, 44, 0, 0, 0, 110, 0, 59, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 111, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Terminal_Punctuation: 1128 bytes. */ - -RE_UINT32 re_get_terminal_punctuation(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_terminal_punctuation_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_terminal_punctuation_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_terminal_punctuation_stage_3[pos + f] << 5; - pos += code; - value = (re_terminal_punctuation_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Other_Math. */ - -static RE_UINT8 re_other_math_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, +static RE_UINT8 re_numeric_type_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 3, 3, 3, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 3, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, 3, 3, 3, 3, + 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, + 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_other_math_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, - 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, -}; +RE_UINT32 re_get_numeric_type(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -static RE_UINT8 re_other_math_stage_3[] = { - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 11, 0, 12, 13, - 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 0, 0, 0, 0, 0, 18, - 0, 0, 0, 0, 0, 0, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 22, 0, 0, 0, - 23, 24, 25, 26, 27, 28, 23, 23, 23, 23, 29, 30, 31, 32, 33, 34, - 0, 0, 0, 0, 0, 0, 0, 0, 35, 36, 37, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -static RE_UINT8 re_other_math_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, - 0, 0, 39, 0, 0, 0, 51, 0, 0, 0, 64, 0, 0, 0, 28, 0, - 1, 0, 0, 0, 30, 0, 0, 96, 0, 96, 0, 0, 0, 0, 0, 0, - 0, 0, 255, 31, 98, 248, 0, 0, 132, 252, 47, 62, 16, 179, 251, 241, - 224, 3, 0, 0, 0, 0, 0, 0, 0, 0, 224, 243, 182, 62, 195, 240, - 255, 63, 235, 47, 48, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 3, 192, 127, 240, 193, 140, 15, 0, 148, 31, 0, 0, - 96, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 15, 96, 0, 0, - 96, 0, 0, 0, 192, 255, 0, 0, 248, 255, 255, 1, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, 0, 48, 0, 0, 0, 0, 10, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 223, 255, 255, 255, 255, 255, 255, 255, 255, 223, 100, 222, 255, 235, - 239, 255, 255, 255, 255, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, - 95, 252, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 255, 255, 255, - 253, 255, 255, 247, 255, 255, 255, 247, 255, 255, 223, 255, 255, 255, 223, 255, - 255, 127, 255, 255, 255, 127, 255, 255, 255, 253, 255, 255, 255, 253, 255, 255, - 247, 207, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 150, 254, 247, 10, - 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, -}; + v = re_numeric_type_table_1[field_2]; + v = re_numeric_type_table_2[(v << 5) | field_1]; + v = re_numeric_type_table_3[(v << 5) | field_0]; -/* Other_Math: 564 bytes. */ - -RE_UINT32 re_get_other_math(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_other_math_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_other_math_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_other_math_stage_3[pos + f] << 6; - pos += code; - value = (re_other_math_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return v; } -/* Hex_Digit. */ - -static RE_UINT8 re_hex_digit_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -}; - -static RE_UINT8 re_hex_digit_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_hex_digit_stage_3[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, +/* Numeric_Value. */ +static RE_UINT8 re_numeric_value_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 10, + 10, 10, 10, 15, 16, 17, 18, 19, 20, 21, 10, 22, 23, 24, 10, 10, + 25, 26, 10, 27, 10, 28, 10, 10, 10, 29, 30, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 10, 41, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 42, 43, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 44, 45, 10, 10, 46, 10, 47, 48, 49, 10, 50, 10, + 51, 10, 52, 10, 10, 10, 10, 10, 53, 10, 54, 10, 10, 10, 55, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 56, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 57, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; -static RE_UINT8 re_hex_digit_stage_4[] = { - 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, +static RE_UINT8 re_numeric_value_table_2[] = { + 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, -}; - -/* Hex_Digit: 177 bytes. */ - -RE_UINT32 re_get_hex_digit(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 16; - code = ch ^ (f << 16); - pos = (RE_UINT32)re_hex_digit_stage_1[f] << 5; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_hex_digit_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_hex_digit_stage_3[pos + f] << 7; - pos += code; - value = (re_hex_digit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* ASCII_Hex_Digit. */ - -static RE_UINT8 re_ascii_hex_digit_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_ascii_hex_digit_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_ascii_hex_digit_stage_3[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_ascii_hex_digit_stage_4[] = { - 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, + 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 7, + 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 9, 10, 0, 0, 0, 4, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 14, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 3, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 20, 21, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 29, 30, 0, 29, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 0, 37, 0, 38, 39, 40, 41, 42, 0, 0, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, 46, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 51, 0, 0, 0, 52, 53, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64, 65, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 69, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 71, 72, 73, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 78, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 79, 0, 80, 81, 0, 0, 0, 82, 0, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 83, 84, 0, 85, 0, 86, 87, 0, 0, 0, 0, 88, 89, 90, + 0, 0, 91, 92, 93, 0, 0, 94, 0, 0, 95, 95, 0, 96, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 97, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 98, 0, 0, 0, 0, 99, 100, 101, 0, 0, 0, 102, 0, + 0, 0, 103, 104, 0, 0, 0, 1, 0, 105, 0, 0, 0, 0, 1, 106, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 3, 0, 0, 107, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 109, 110, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 0, + 112, 113, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 116, 117, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 120, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 124, 125, 126, 0, 0, 127, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 130, 0, 0, 131, 0, 0, 0, 132, 0, 133, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 0, 0, 135, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 136, 137, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* ASCII_Hex_Digit: 130 bytes. */ - -RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_ascii_hex_digit_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_ascii_hex_digit_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_ascii_hex_digit_stage_3[pos + f] << 7; - pos += code; - value = (re_ascii_hex_digit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Other_Alphabetic. */ - -static RE_UINT8 re_other_alphabetic_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 7, 2, 8, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, +static RE_UINT8 re_numeric_value_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 0, 0, 0, 0, 0, 2, 0, 0, 11, 12, 13, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 0, 0, 14, 15, 16, 11, 13, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 18, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 2, 3, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 21, 22, 23, 24, 25, 26, 27, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 18, 19, 20, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 18, 37, 38, 39, 40, 41, 42, 43, 44, 19, 45, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 47, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 50, 25, 51, 52, 27, 53, 54, 55, 56, 57, 15, 58, 59, 60, 2, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 61, 62, 40, 19, 63, 20, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 61, 62, 40, 19, 63, 20, + 20, 64, 45, 0, 0, 7, 40, 65, 66, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 61, 62, 67, 68, 69, 17, + 46, 47, 48, 37, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 61, 62, + 67, 68, 69, 17, 46, 47, 48, 37, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 18, 61, 62, 67, 68, 69, 17, 46, 47, 48, 37, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 61, 62, 67, 68, 69, + 17, 46, 47, 48, 37, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 37, 38, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 37, 38, 39, 40, 41, 42, 43, + 0, 70, 71, 72, 73, 74, 75, 76, 77, 78, 38, 79, 80, 81, 82, 83, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 84, 85, 86, 87, 39, 88, 89, 90, 91, 92, 93, 94, 95, 96, 40, + 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 8, 0, 0, 0, 45, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, + 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 9, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 0, 20, 37, 38, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 37, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 18, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 18, 37, 38, 39, 40, 41, 42, 43, 44, 19, 99, 100, 101, 63, 102, 103, + 104, 105, 20, 106, 107, 108, 64, 109, 110, 111, 112, 45, 113, 114, 115, 65, + 116, 117, 118, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 12, 2, 6, 40, 63, 64, 65, 6, 18, 40, 19, 63, 20, 64, 6, + 18, 40, 19, 63, 20, 45, 65, 18, 2, 2, 2, 3, 3, 3, 3, 6, + 18, 18, 18, 18, 18, 38, 40, 40, 40, 40, 19, 100, 63, 63, 63, 63, + 63, 20, 64, 6, 40, 12, 12, 52, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, + 42, 43, 44, 19, 99, 100, 101, 63, 102, 103, 104, 105, 0, 0, 0, 0, + 2, 6, 18, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 105, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 18, 37, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 18, 37, 19, 20, 45, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 18, 37, + 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 5, 6, 18, 37, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 18, 37, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 18, 37, 19, 3, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 12, 0, 0, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, 42, + 0, 0, 19, 99, 100, 101, 63, 102, 103, 104, 105, 20, 106, 107, 108, 64, + 109, 110, 111, 112, 45, 113, 114, 115, 65, 116, 117, 118, 119, 66, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 56, 11, 51, 130, 12, 131, 52, 13, 57, + 2, 3, 4, 5, 18, 37, 19, 20, 12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 40, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 18, 37, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 18, 37, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 18, 37, 19, 20, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 18, 37, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 18, 40, 19, 20, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, 42, + 43, 44, 19, 99, 100, 101, 63, 102, 103, 104, 105, 12, 11, 51, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, + 5, 6, 18, 37, 38, 19, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 18, 37, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 3, 4, 5, 18, 37, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, + 41, 42, 43, 44, 19, 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, + 42, 43, 44, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, + 42, 43, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 18, 37, 38, 39, 40, 41, 42, 43, 44, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132, 21, 133, 134, 22, 135, 23, 136, 24, 14, 14, 25, 15, 26, 16, 27, + 11, 12, 12, 13, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 8, 9, 10, 5, + 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, + 4, 5, 6, 3, 4, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 4, + 5, 6, 137, 138, 2, 3, 4, 4, 5, 6, 4, 4, 5, 5, 5, 5, + 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 3, 4, 5, 6, 7, 2, + 3, 4, 5, 5, 6, 6, 3, 4, 2, 3, 51, 52, 57, 51, 52, 15, + 11, 56, 11, 11, 12, 51, 52, 39, 40, 5, 6, 7, 8, 9, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 18, 19, 45, 139, 97, + 140, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 61, 62, 67, 68, 69, + 17, 46, 47, 48, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 61, 62, 67, 68, 69, + 17, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, 42, + 43, 44, 2, 3, 4, 5, 6, 2, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, + 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, + 42, 43, 44, 19, 99, 100, 101, 63, 102, 103, 104, 105, 20, 106, 107, 108, + 64, 109, 110, 111, 112, 45, 113, 114, 115, 65, 116, 117, 118, 119, 66, 121, + 66, 141, 142, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 11, 12, 13, + 0, 2, 3, 45, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 37, 38, 39, 40, 41, + 42, 43, 44, 19, 99, 100, 101, 63, 102, 103, 104, 105, 20, 106, 107, 108, + 64, 109, 110, 111, 112, 45, 113, 114, 115, 65, 116, 117, 118, 119, 0, 3, + 4, 5, 6, 7, 8, 9, 10, 18, 101, 102, 106, 45, 12, 56, 0, 0, + 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_other_alphabetic_stage_2[] = { - 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 0, 0, - 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 0, 24, 25, 26, 27, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, - 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 30, 0, 0, 31, 0, 0, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 0, 43, 44, 45, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, - 48, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, - 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +RE_UINT32 re_get_numeric_value(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_numeric_value_table_1[field_2]; + v = re_numeric_value_table_2[(v << 5) | field_1]; + v = re_numeric_value_table_3[(v << 5) | field_0]; + + return v; +} + +/* Other_Alphabetic. */ +static RE_UINT8 re_other_alphabetic_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 10, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, 12, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 8, + 14, 8, 15, 16, 17, 18, 19, 20, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 21, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 22, + 8, 8, 8, 8, 8, 8, 8, 8, 23, 8, 24, 8, 25, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; -static RE_UINT8 re_other_alphabetic_stage_3[] = { +static RE_UINT8 re_other_alphabetic_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 3, 0, 4, 0, 5, 6, 0, 0, 7, 8, - 9, 10, 0, 0, 0, 11, 0, 0, 12, 13, 0, 0, 0, 0, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 19, 20, 21, 23, 24, 20, 21, 25, 26, - 20, 21, 27, 19, 28, 21, 29, 0, 16, 21, 30, 19, 20, 21, 30, 19, - 16, 21, 31, 19, 19, 0, 32, 33, 0, 34, 35, 0, 0, 36, 35, 0, - 0, 0, 0, 37, 38, 39, 0, 0, 0, 40, 41, 42, 43, 0, 0, 0, - 33, 33, 33, 33, 0, 44, 45, 0, 0, 0, 0, 0, 46, 47, 0, 0, - 0, 48, 0, 0, 0, 0, 0, 0, 49, 0, 50, 51, 0, 0, 0, 0, - 52, 53, 16, 0, 54, 55, 0, 56, 0, 57, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 44, 59, 60, - 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 61, 21, 0, 0, 0, - 62, 63, 0, 0, 64, 14, 65, 66, 0, 67, 68, 0, 16, 14, 0, 1, - 0, 69, 70, 71, 0, 72, 0, 73, 0, 0, 0, 0, 0, 0, 0, 74, - 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, - 77, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, - 54, 79, 80, 0, 28, 81, 0, 0, 54, 68, 46, 0, 54, 82, 0, 0, - 0, 83, 0, 0, 0, 0, 66, 45, 16, 21, 22, 19, 0, 0, 0, 0, - 0, 53, 84, 0, 0, 10, 64, 0, 0, 0, 0, 0, 0, 85, 86, 0, - 0, 87, 88, 0, 0, 89, 0, 0, 90, 91, 0, 0, 0, 0, 0, 0, - 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 94, - 95, 96, 97, 0, 98, 0, 0, 0, 0, 99, 0, 0, 100, 101, 0, 0, - 0, 102, 103, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, - 0, 0, 106, 59, 107, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, - 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, - 0, 10, 111, 111, 60, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, + 4, 0, 5, 6, 0, 0, 7, 8, 9, 10, 0, 0, 0, 11, 0, 0, + 12, 13, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 19, + 20, 21, 23, 24, 20, 21, 25, 26, 20, 21, 27, 19, 28, 21, 29, 0, + 16, 21, 30, 19, 20, 21, 30, 19, 16, 21, 31, 19, 20, 0, 32, 33, + 0, 34, 35, 0, 0, 36, 35, 0, 0, 0, 0, 37, 38, 39, 0, 0, + 0, 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 33, 33, 33, 33, 0, 44, 45, 0, + 0, 0, 0, 0, 46, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, + 49, 0, 50, 51, 0, 52, 53, 0, 54, 55, 16, 0, 56, 57, 0, 58, + 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 44, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 64, 65, 0, 0, 66, 14, 67, 52, 0, 68, 69, 0, 16, 14, 0, 1, + 0, 70, 71, 72, 0, 73, 0, 74, 0, 0, 0, 0, 0, 0, 0, 75, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 81, 82, 0, 28, 83, 0, 0, 56, 69, 46, 0, 56, 84, 85, 0, + 0, 86, 0, 0, 0, 0, 52, 45, 16, 21, 22, 19, 0, 0, 0, 0, + 0, 55, 87, 0, 0, 10, 66, 0, 0, 0, 0, 0, 0, 88, 89, 0, + 0, 90, 53, 0, 0, 91, 0, 0, 92, 93, 0, 0, 0, 0, 0, 0, + 0, 94, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 97, 98, + 99, 100, 101, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 103, 0, 0, 104, 105, 0, 0, 0, 106, 107, 0, 108, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 61, 111, 0, 0, 112, + 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 113, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 116, 116, 62, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_other_alphabetic_stage_4[] = { +static RE_UINT8 re_other_alphabetic_table_3[] = { 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 255, 191, 182, 0, 0, 0, 0, 0, 255, 7, 0, 248, 255, 254, 0, 0, 1, 0, 0, 0, 192, 31, 158, 33, 0, 0, 0, 0, 2, 0, 0, 0, 255, 255, 192, 255, 1, 0, @@ -10596,5620 +18401,7541 @@ static RE_UINT8 re_other_alphabetic_stage_4[] = { 0, 248, 127, 121, 0, 0, 192, 195, 157, 63, 30, 0, 252, 191, 0, 60, 0, 0, 192, 255, 255, 1, 0, 0, 96, 0, 0, 0, 0, 2, 0, 0, 255, 15, 255, 1, 0, 0, 128, 15, 0, 0, 224, 127, 254, 255, 31, 0, - 31, 0, 0, 0, 0, 0, 224, 255, 7, 0, 0, 0, 254, 51, 0, 0, - 128, 255, 3, 0, 240, 255, 127, 0, 128, 255, 31, 0, 255, 255, 255, 255, - 255, 3, 0, 0, 0, 0, 240, 15, 4, 8, 0, 0, 248, 0, 0, 0, - 3, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 128, 192, 7, 0, 0, - 128, 255, 7, 0, 0, 254, 127, 0, 8, 48, 0, 0, 0, 0, 0, 56, - 0, 0, 157, 65, 0, 248, 32, 0, 248, 7, 0, 0, 0, 0, 0, 64, - 0, 0, 192, 7, 110, 240, 0, 0, 240, 0, 0, 0, 0, 0, 0, 255, - 63, 0, 0, 0, 0, 0, 255, 1, 0, 0, 248, 255, 0, 240, 159, 64, - 59, 0, 0, 0, 0, 128, 63, 127, 0, 0, 0, 48, 0, 0, 255, 127, - 1, 0, 0, 0, 0, 248, 63, 0, 0, 0, 0, 224, 255, 7, 0, 0, - 0, 240, 255, 1, 0, 0, 254, 252, 16, 0, 0, 0, 254, 7, 0, 0, + 0, 0, 0, 128, 1, 0, 0, 0, 31, 0, 0, 0, 0, 0, 224, 255, + 7, 0, 0, 0, 254, 51, 0, 0, 128, 255, 3, 0, 240, 255, 127, 0, + 128, 255, 31, 0, 255, 255, 255, 255, 255, 3, 0, 0, 0, 0, 240, 15, + 4, 8, 0, 0, 248, 0, 0, 0, 3, 0, 0, 0, 47, 0, 0, 0, + 192, 7, 0, 0, 128, 255, 7, 0, 0, 254, 127, 0, 8, 48, 0, 0, + 0, 0, 0, 56, 0, 0, 157, 65, 0, 248, 32, 0, 248, 7, 0, 0, + 0, 0, 0, 64, 0, 0, 192, 7, 110, 240, 0, 0, 240, 0, 0, 0, + 0, 24, 0, 0, 0, 0, 0, 255, 63, 0, 0, 0, 0, 0, 255, 1, + 0, 0, 248, 255, 0, 192, 0, 0, 0, 240, 159, 64, 59, 0, 0, 0, + 0, 128, 63, 127, 0, 0, 0, 48, 0, 0, 255, 127, 0, 248, 63, 0, + 0, 0, 0, 224, 255, 7, 0, 0, 0, 240, 255, 1, 0, 0, 191, 25, + 5, 0, 0, 0, 0, 0, 254, 252, 16, 0, 0, 0, 254, 7, 0, 0, 0, 0, 224, 123, 0, 0, 254, 15, 0, 252, 255, 0, 0, 128, 127, 127, 0, 0, 252, 255, 255, 254, 127, 0, 0, 0, 126, 180, 139, 0, 0, 0, 0, 124, 123, 0, 0, 0, 120, 0, 0, 128, 254, 255, 255, 128, 7, 0, - 127, 255, 255, 249, 219, 7, 0, 0, 128, 0, 0, 0, 255, 3, 255, 255, -}; - -/* Other_Alphabetic: 1280 bytes. */ - -RE_UINT32 re_get_other_alphabetic(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_other_alphabetic_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_other_alphabetic_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_other_alphabetic_stage_3[pos + f] << 5; - pos += code; - value = (re_other_alphabetic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Ideographic. */ - -static RE_UINT8 re_ideographic_stage_1[] = { - 0, 1, 2, 3, 4, 0, 0, 5, 0, 0, 0, 6, 7, 8, 0, 0, - 3, 3, 3, 3, 3, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_ideographic_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 7, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 12, 13, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 15, 0, 0, 0, 0, 0, 0, 2, 16, 0, 0, -}; - -static RE_UINT8 re_ideographic_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, - 2, 2, 2, 2, 2, 2, 2, 4, 0, 0, 0, 0, 2, 2, 2, 2, - 2, 5, 2, 6, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 7, - 2, 2, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 2, 2, - 2, 2, 2, 10, 0, 0, 0, 0, 2, 2, 2, 11, 2, 2, 2, 2, - 2, 2, 2, 2, 12, 2, 2, 2, 13, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, - 16, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_ideographic_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 254, 3, 0, 7, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, - 255, 255, 255, 255, 255, 255, 0, 0, 255, 255, 255, 255, 255, 63, 255, 255, - 255, 255, 255, 3, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 0, - 255, 255, 255, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 15, 255, 255, 127, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 31, 0, 255, 255, 255, 63, 255, 255, 255, 255, - 255, 255, 255, 255, 3, 0, 255, 255, 255, 255, 255, 255, 1, 0, 0, 0, - 255, 255, 255, 63, 0, 0, 0, 0, -}; - -/* Ideographic: 600 bytes. */ - -RE_UINT32 re_get_ideographic(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_ideographic_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_ideographic_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_ideographic_stage_3[pos + f] << 6; - pos += code; - value = (re_ideographic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Diacritic. */ - -static RE_UINT8 re_diacritic_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 7, 8, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_diacritic_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 1, 17, 1, 1, 1, 18, 1, 19, 20, 21, 22, 23, 1, 24, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 1, 26, 1, - 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 28, 29, 30, 31, 32, 33, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 34, 1, 1, 35, 36, - 1, 1, 37, 1, 1, 1, 1, 1, 1, 1, 38, 1, 1, 39, 1, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 37, 50, 1, 51, 52, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 53, 54, 1, 1, 1, 55, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 56, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 54, 57, 1, 1, 1, 1, 1, 58, 59, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_diacritic_stage_3[] = { - 0, 0, 1, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 5, 5, 5, 5, 6, 7, 8, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 11, 12, 13, 0, - 0, 0, 14, 0, 0, 0, 15, 16, 0, 4, 17, 0, 0, 18, 0, 19, - 20, 0, 0, 0, 0, 0, 0, 21, 0, 22, 23, 24, 0, 22, 25, 0, - 0, 22, 25, 0, 0, 22, 25, 26, 0, 22, 25, 0, 0, 0, 25, 0, - 0, 0, 25, 0, 0, 22, 25, 0, 0, 27, 25, 0, 0, 0, 28, 0, - 0, 0, 29, 0, 0, 30, 31, 0, 20, 32, 0, 0, 33, 0, 34, 0, - 0, 35, 0, 36, 37, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 38, 0, 0, 39, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 40, 0, 41, 0, 0, 0, 42, 43, 44, 0, 45, 0, 0, - 0, 46, 0, 47, 0, 0, 4, 48, 0, 49, 5, 17, 0, 0, 50, 51, - 0, 0, 0, 0, 0, 52, 53, 54, 0, 0, 0, 0, 0, 0, 0, 55, - 0, 56, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 58, 0, 0, 22, - 0, 0, 0, 59, 60, 0, 0, 61, 5, 62, 0, 0, 63, 0, 0, 20, - 0, 0, 0, 0, 0, 0, 43, 64, 0, 65, 66, 0, 0, 66, 2, 67, - 0, 0, 0, 68, 0, 15, 69, 70, 0, 0, 71, 0, 0, 0, 0, 72, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 74, 75, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 77, 0, 78, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, - 0, 80, 0, 66, 0, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0, 83, - 0, 22, 25, 84, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 86, 0, - 0, 0, 0, 0, 0, 15, 2, 0, 0, 15, 0, 0, 0, 46, 0, 0, - 0, 87, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, - 0, 42, 88, 0, 10, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 89, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, - 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, - 0, 0, 0, 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, - 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 98, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_diacritic_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 129, 144, 1, - 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 224, 7, 0, 48, 4, - 48, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 2, 0, 0, 254, 255, - 251, 255, 255, 191, 22, 0, 0, 0, 0, 248, 135, 1, 0, 0, 0, 128, - 97, 28, 0, 0, 255, 7, 0, 0, 192, 255, 1, 0, 0, 248, 63, 0, - 0, 0, 0, 3, 248, 255, 255, 127, 0, 0, 0, 16, 0, 32, 30, 0, - 0, 0, 2, 0, 0, 32, 0, 0, 0, 0, 0, 224, 0, 0, 0, 24, - 0, 4, 0, 0, 128, 95, 0, 0, 0, 0, 0, 4, 0, 31, 0, 0, - 0, 0, 160, 194, 220, 0, 0, 0, 64, 0, 0, 0, 0, 0, 128, 6, - 24, 62, 0, 0, 128, 191, 0, 12, 0, 254, 15, 32, 0, 0, 0, 14, - 0, 0, 224, 159, 0, 0, 255, 63, 0, 0, 16, 0, 16, 0, 0, 0, - 0, 248, 15, 0, 0, 12, 0, 0, 0, 0, 192, 0, 0, 0, 0, 63, - 255, 33, 144, 3, 0, 240, 255, 255, 240, 255, 0, 0, 0, 0, 224, 227, - 0, 0, 0, 160, 3, 224, 0, 224, 0, 224, 0, 96, 0, 128, 3, 0, - 0, 128, 0, 0, 0, 252, 0, 0, 0, 0, 0, 30, 0, 128, 0, 176, - 0, 0, 0, 48, 0, 0, 3, 0, 3, 0, 0, 0, 0, 7, 0, 0, - 255, 255, 3, 0, 0, 120, 0, 0, 0, 0, 8, 0, 32, 0, 0, 0, - 0, 0, 0, 56, 7, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 248, - 0, 48, 0, 0, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 0, 192, - 8, 0, 0, 0, 96, 0, 0, 0, 252, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 24, 0, 1, 28, 0, 0, 0, 0, 96, 0, 0, 6, 0, 0, - 192, 31, 31, 0, 68, 0, 0, 0, 12, 0, 0, 0, 0, 8, 0, 0, - 128, 0, 0, 0, 52, 0, 0, 0, 0, 0, 128, 0, 0, 0, 31, 0, - 0, 0, 127, 0, 0, 128, 255, 255, 128, 227, 7, 248, 231, 15, 0, 0, - 0, 60, 0, 0, 0, 240, 0, 0, 112, 7, 0, 0, -}; - -/* Diacritic: 1300 bytes. */ - -RE_UINT32 re_get_diacritic(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_diacritic_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_diacritic_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_diacritic_stage_3[pos + f] << 5; - pos += code; - value = (re_diacritic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Extender. */ - -static RE_UINT8 re_extender_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 3, 0, 127, 255, 255, 249, 219, 7, 0, 0, 128, 0, 0, 0, + 255, 3, 255, 255 }; -static RE_UINT8 re_extender_stage_2[] = { - 0, 1, 2, 3, 2, 2, 2, 4, 2, 2, 2, 2, 5, 6, 7, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 9, 2, 2, 10, 11, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 14, 15, 2, 2, 16, 2, 2, - 2, 2, 2, 2, 2, 17, 2, 18, 2, 2, 2, 2, 2, 2, 2, 2, - 19, 2, 2, 2, 20, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -}; +RE_UINT32 re_get_other_alphabetic(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_extender_stage_3[] = { - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, - 0, 5, 0, 5, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, - 11, 0, 12, 13, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, - 0, 17, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, - 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 24, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_extender_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 32, 0, 0, 0, 0, 0, 62, 0, - 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, - 0, 0, 32, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 32, 0, 0, 24, 0, 0, 0, 0, 32, 0, 0, 0, 0, - 192, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 112, 0, 0, 0, 0, 0, 0, 0, -}; + v = re_other_alphabetic_table_1[field_2]; + v = re_other_alphabetic_table_2[(v << 5) | field_1]; + v = re_other_alphabetic_table_3[(v << 2) | field_0]; -/* Extender: 640 bytes. */ - -RE_UINT32 re_get_extender(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_extender_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_extender_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_extender_stage_3[pos + f] << 6; - pos += code; - value = (re_extender_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return (v >> offset) & 0x1; } -/* Other_Lowercase. */ - -static RE_UINT8 re_other_lowercase_stage_1[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* Other_Default_Ignorable_Code_Point. */ +static RE_UINT8 re_other_default_ignorable_code_point_table_1[] = { + 0, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_other_lowercase_stage_2[] = { - 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, - 4, 2, 5, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 7, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_other_lowercase_stage_3[] = { - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, - 0, 8, 9, 0, 0, 10, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, - 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 0, 15, - 0, 0, 0, 0, 0, 16, 0, 0, -}; - -static RE_UINT8 re_other_lowercase_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, - 0, 0, 0, 0, 0, 0, 255, 1, 3, 0, 0, 0, 31, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 240, 255, 255, - 255, 255, 255, 255, 255, 7, 0, 1, 0, 0, 0, 248, 255, 255, 255, 255, - 0, 0, 0, 0, 0, 0, 2, 128, 0, 0, 255, 31, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 255, 255, 255, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 240, 0, 0, 0, 0, -}; - -/* Other_Lowercase: 372 bytes. */ - -RE_UINT32 re_get_other_lowercase(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_other_lowercase_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_other_lowercase_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_other_lowercase_stage_3[pos + f] << 6; - pos += code; - value = (re_other_lowercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Other_Uppercase. */ - -static RE_UINT8 re_other_uppercase_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_other_uppercase_stage_2[] = { - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -}; - -static RE_UINT8 re_other_uppercase_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 7, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_other_uppercase_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 3, 255, 255, - 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_other_default_ignorable_code_point_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 7, + 8, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 10, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; -/* Other_Uppercase: 210 bytes. */ - -RE_UINT32 re_get_other_uppercase(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_other_uppercase_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_other_uppercase_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_other_uppercase_stage_3[pos + f] << 7; - pos += code; - value = (re_other_uppercase_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Noncharacter_Code_Point. */ - -static RE_UINT8 re_noncharacter_code_point_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, +static RE_UINT8 re_other_default_ignorable_code_point_table_3[] = { + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 128, 1, 0, 0, 0, + 0, 0, 48, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 0, 255, 1, + 253, 255, 255, 255, 255, 255, 255, 255, 0, 0, 255, 255 }; -static RE_UINT8 re_noncharacter_code_point_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -}; +RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_noncharacter_code_point_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_noncharacter_code_point_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, -}; + v = re_other_default_ignorable_code_point_table_1[field_2]; + v = re_other_default_ignorable_code_point_table_2[(v << 5) | field_1]; + v = re_other_default_ignorable_code_point_table_3[(v << 2) | field_0]; -/* Noncharacter_Code_Point: 177 bytes. */ - -RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 16; - code = ch ^ (f << 16); - pos = (RE_UINT32)re_noncharacter_code_point_stage_1[f] << 5; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_noncharacter_code_point_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_noncharacter_code_point_stage_3[pos + f] << 7; - pos += code; - value = (re_noncharacter_code_point_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return (v >> offset) & 0x1; } /* Other_Grapheme_Extend. */ - -static RE_UINT8 re_other_grapheme_extend_stage_1[] = { - 0, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_other_grapheme_extend_stage_2[] = { +static RE_UINT8 re_other_grapheme_extend_table_1[] = { 0, 0, 1, 2, 0, 0, 3, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_other_grapheme_extend_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, - 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 8, 0, 9, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_other_grapheme_extend_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 2, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 2, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_other_grapheme_extend_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 96, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 192, 7, 0, - 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +static RE_UINT8 re_other_grapheme_extend_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 128, 0, 4, 0, 96, 0, + 0, 128, 0, 128, 0, 0, 32, 0, 0, 16, 0, 0, 0, 192, 0, 0, + 0, 0, 0, 192, 0, 0, 1, 32, 0, 128, 0, 0, 0, 0, 1, 0, + 32, 192, 7, 0, 255, 255, 255, 255 }; -/* Other_Grapheme_Extend: 444 bytes. */ - -RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_other_grapheme_extend_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_other_grapheme_extend_stage_2[pos + f] << 3; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_other_grapheme_extend_stage_3[pos + f] << 7; - pos += code; - value = (re_other_grapheme_extend_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; +RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_other_grapheme_extend_table_1[field_2]; + v = re_other_grapheme_extend_table_2[(v << 5) | field_1]; + v = re_other_grapheme_extend_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; } -/* IDS_Binary_Operator. */ +/* Other_ID_Continue. */ +RE_UINT32 re_get_other_id_continue(RE_UINT32 codepoint) { + if (codepoint == 0xB7) + return 1; + if (codepoint == 0x0387) + return 1; + if (0x1369 <= codepoint && codepoint <= 0x1371) + return 1; + if (codepoint == 0x19DA) + return 1; + + return 0; +} -static RE_UINT8 re_ids_binary_operator_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* Other_ID_Start. */ +RE_UINT32 re_get_other_id_start(RE_UINT32 codepoint) { + if (0x1885 <= codepoint && codepoint <= 0x1886) + return 1; + if (codepoint == 0x2118) + return 1; + if (codepoint == 0x212E) + return 1; + if (0x309B <= codepoint && codepoint <= 0x309C) + return 1; + + return 0; +} + +/* Other_Lowercase. */ +static RE_UINT8 re_other_lowercase_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_ids_binary_operator_stage_2[] = { - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_other_lowercase_table_2[] = { + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 5, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 12, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_ids_binary_operator_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, +static RE_UINT8 re_other_lowercase_table_3[] = { + 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 255, 1, 3, 0, 0, 0, + 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 4, 0, 240, 255, 255, + 255, 255, 255, 255, 255, 7, 0, 1, 0, 0, 0, 248, 0, 0, 2, 128, + 0, 0, 255, 31, 0, 0, 255, 255, 255, 3, 0, 0, 0, 0, 0, 48, + 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 0, 240 }; -static RE_UINT8 re_ids_binary_operator_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 15, -}; +RE_UINT32 re_get_other_lowercase(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* IDS_Binary_Operator: 130 bytes. */ - -RE_UINT32 re_get_ids_binary_operator(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_ids_binary_operator_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_ids_binary_operator_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_ids_binary_operator_stage_3[pos + f] << 7; - pos += code; - value = (re_ids_binary_operator_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* IDS_Trinary_Operator. */ + v = re_other_lowercase_table_1[field_2]; + v = re_other_lowercase_table_2[(v << 5) | field_1]; + v = re_other_lowercase_table_3[(v << 2) | field_0]; -static RE_UINT8 re_ids_trinary_operator_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + return (v >> offset) & 0x1; +} + +/* Other_Math. */ +static RE_UINT8 re_other_math_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_ids_trinary_operator_stage_2[] = { - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_ids_trinary_operator_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_ids_trinary_operator_stage_4[] = { +static RE_UINT8 re_other_math_table_2[] = { + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, -}; - -/* IDS_Trinary_Operator: 130 bytes. */ - -RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_ids_trinary_operator_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_ids_trinary_operator_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_ids_trinary_operator_stage_3[pos + f] << 7; - pos += code; - value = (re_ids_trinary_operator_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Radical. */ - -static RE_UINT8 re_radical_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 5, 6, 7, 8, 0, 9, 10, 11, 12, 13, 0, 14, 15, 16, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 19, 20, 21, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, 24, + 25, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 28, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 30, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 32, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, + 34, 34, 35, 34, 36, 37, 38, 34, 39, 40, 41, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 42, 43, 44, 35, 35, 45, 45, 46, 46, 47, 34, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 38, 48, 49, 50, 51, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_other_math_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 39, 0, 0, 0, 51, 0, + 0, 0, 64, 0, 0, 0, 28, 0, 1, 0, 0, 0, 30, 0, 0, 96, + 0, 96, 0, 0, 0, 0, 255, 31, 98, 248, 0, 0, 132, 252, 47, 62, + 16, 179, 251, 241, 224, 3, 0, 0, 0, 0, 224, 243, 182, 62, 195, 240, + 255, 63, 235, 47, 48, 0, 0, 0, 0, 15, 0, 0, 0, 0, 176, 0, + 0, 0, 1, 0, 4, 0, 0, 0, 3, 192, 127, 240, 193, 140, 15, 0, + 148, 31, 0, 0, 96, 0, 0, 0, 5, 0, 0, 0, 15, 96, 0, 0, + 192, 255, 0, 0, 248, 255, 255, 1, 0, 0, 0, 15, 0, 0, 0, 48, + 10, 1, 0, 0, 0, 0, 0, 80, 255, 255, 255, 255, 255, 255, 223, 255, + 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, + 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, + 255, 255, 255, 247, 255, 127, 255, 255, 255, 253, 255, 255, 247, 207, 255, 255, + 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, + 238, 251, 255, 15 }; -static RE_UINT8 re_radical_stage_2[] = { - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_other_math(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_radical_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_radical_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 0, 0, -}; + v = re_other_math_table_1[field_2]; + v = re_other_math_table_2[(v << 5) | field_1]; + v = re_other_math_table_3[(v << 2) | field_0]; -/* Radical: 162 bytes. */ - -RE_UINT32 re_get_radical(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_radical_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_radical_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_radical_stage_3[pos + f] << 7; - pos += code; - value = (re_radical_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return (v >> offset) & 0x1; } -/* Unified_Ideograph. */ - -static RE_UINT8 re_unified_ideograph_stage_1[] = { - 0, 1, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, -}; +/* Other_Uppercase. */ +RE_UINT32 re_get_other_uppercase(RE_UINT32 codepoint) { + if (0x2160 <= codepoint && codepoint <= 0x216F) + return 1; + if (0x24B6 <= codepoint && codepoint <= 0x24CF) + return 1; + if (0x01F130 <= codepoint && codepoint <= 0x01F149) + return 1; + if (0x01F150 <= codepoint && codepoint <= 0x01F169) + return 1; + if (0x01F170 <= codepoint && codepoint <= 0x01F189) + return 1; + + return 0; +} -static RE_UINT8 re_unified_ideograph_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, - 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* Pattern_Syntax. */ +static RE_UINT8 re_pattern_syntax_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 6, 7, 1, - 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_unified_ideograph_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, - 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, -}; - -static RE_UINT8 re_unified_ideograph_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 63, 0, 255, 255, 255, 255, 255, 255, 0, 0, - 0, 192, 26, 128, 154, 3, 0, 0, 255, 255, 127, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 31, 0, 255, 255, 255, 63, 255, 255, 255, 255, - 255, 255, 255, 255, 3, 0, 255, 255, 255, 255, 255, 255, 1, 0, 0, 0, -}; - -/* Unified_Ideograph: 434 bytes. */ - -RE_UINT32 re_get_unified_ideograph(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_unified_ideograph_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_unified_ideograph_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_unified_ideograph_stage_3[pos + f] << 6; - pos += code; - value = (re_unified_ideograph_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Other_Default_Ignorable_Code_Point. */ - -static RE_UINT8 re_other_default_ignorable_code_point_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_other_default_ignorable_code_point_stage_2[] = { - 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 7, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_other_default_ignorable_code_point_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, 9, 9, 0, 0, 0, 10, - 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static RE_UINT8 re_other_default_ignorable_code_point_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, - 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 1, - 253, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 0, 0, 0, 0, 0, 0, 255, 255, -}; - -/* Other_Default_Ignorable_Code_Point: 356 bytes. */ - -RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_other_default_ignorable_code_point_stage_3[pos + f] << 6; - pos += code; - value = (re_other_default_ignorable_code_point_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Deprecated. */ - -static RE_UINT8 re_deprecated_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_deprecated_stage_2[] = { - 0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, 1, - 5, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_deprecated_stage_3[] = { - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_deprecated_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 128, 2, - 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 252, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, -}; - -/* Deprecated: 292 bytes. */ - -RE_UINT32 re_get_deprecated(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_deprecated_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_deprecated_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_deprecated_stage_3[pos + f] << 6; - pos += code; - value = (re_deprecated_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Soft_Dotted. */ - -static RE_UINT8 re_soft_dotted_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_soft_dotted_stage_2[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, - 6, 3, 3, 3, 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 9, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_soft_dotted_stage_3[] = { - 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_pattern_syntax_table_2[] = { + 0, 1, 2, 2, 0, 3, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, - 0, 12, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 18, 0, 19, 20, 0, 21, 0, 22, 23, 0, 24, 0, 17, 18, - 0, 19, 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_soft_dotted_stage_4[] = { - 0, 0, 0, 0, 0, 6, 0, 0, 0, 128, 0, 0, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 32, 0, 0, 4, 0, 0, 0, 8, 0, - 0, 0, 64, 1, 4, 0, 0, 0, 0, 0, 64, 0, 16, 1, 0, 0, - 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, - 0, 0, 0, 16, 12, 0, 0, 0, 0, 0, 192, 0, 0, 12, 0, 0, - 0, 0, 0, 192, 0, 0, 12, 0, 192, 0, 0, 0, 0, 0, 0, 12, - 0, 192, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 10, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Soft_Dotted: 424 bytes. */ - -RE_UINT32 re_get_soft_dotted(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_soft_dotted_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_soft_dotted_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_soft_dotted_stage_3[pos + f] << 5; - pos += code; - value = (re_soft_dotted_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Logical_Order_Exception. */ - -static RE_UINT8 re_logical_order_exception_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, +static RE_UINT8 re_pattern_syntax_table_3[] = { + 0, 0, 0, 0, 254, 255, 0, 252, 1, 0, 0, 120, 254, 90, 67, 136, + 0, 0, 128, 0, 0, 0, 255, 255, 255, 0, 255, 127, 254, 255, 239, 127, + 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 240, 255, 14, 255, 255, 255, + 1, 0, 1, 0, 0, 0, 0, 192, 96, 0, 0, 0 }; -static RE_UINT8 re_logical_order_exception_stage_2[] = { - 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_pattern_syntax(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_logical_order_exception_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_logical_order_exception_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 224, 4, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 96, 26, 0, 0, 0, 0, 0, 0, 0, 0, -}; + v = re_pattern_syntax_table_1[field_2]; + v = re_pattern_syntax_table_2[(v << 5) | field_1]; + v = re_pattern_syntax_table_3[(v << 2) | field_0]; -/* Logical_Order_Exception: 209 bytes. */ - -RE_UINT32 re_get_logical_order_exception(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 16; - code = ch ^ (f << 16); - pos = (RE_UINT32)re_logical_order_exception_stage_1[f] << 5; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_logical_order_exception_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_logical_order_exception_stage_3[pos + f] << 7; - pos += code; - value = (re_logical_order_exception_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return (v >> offset) & 0x1; } -/* Other_ID_Start. */ - -static RE_UINT8 re_other_id_start_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_other_id_start_stage_2[] = { - 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_other_id_start_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; +/* Pattern_White_Space. */ +RE_UINT32 re_get_pattern_white_space(RE_UINT32 codepoint) { + if (0x09 <= codepoint && codepoint <= 0x0D) + return 1; + if (codepoint == 0x20) + return 1; + if (codepoint == 0x85) + return 1; + if (0x200E <= codepoint && codepoint <= 0x200F) + return 1; + if (0x2028 <= codepoint && codepoint <= 0x2029) + return 1; + + return 0; +} -static RE_UINT8 re_other_id_start_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 64, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, +/* Posix_AlNum. */ +static RE_UINT8 re_posix_alnum_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10, + 10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38, + 10, 10, 10, 10, 10, 39, 10, 10, 40, 10, 41, 42, 43, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 44, 13, 13, 13, 45, 46, 13, + 13, 13, 13, 47, 13, 13, 13, 13, 13, 13, 48, 10, 10, 10, 49, 10, + 13, 13, 13, 13, 50, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; -/* Other_ID_Start: 194 bytes. */ - -RE_UINT32 re_get_other_id_start(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_other_id_start_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_other_id_start_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_other_id_start_stage_3[pos + f] << 6; - pos += code; - value = (re_other_id_start_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Other_ID_Continue. */ - -static RE_UINT8 re_other_id_continue_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, +static RE_UINT8 re_posix_alnum_table_2[] = { + 0, 1, 2, 2, 0, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 6, 7, 0, 0, 8, 9, 10, 11, 5, 12, + 5, 5, 5, 5, 13, 5, 5, 5, 5, 14, 15, 5, 16, 17, 18, 19, + 20, 5, 21, 22, 5, 5, 23, 24, 25, 5, 26, 5, 5, 27, 28, 29, + 30, 31, 32, 33, 0, 34, 35, 36, 5, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 49, 53, 54, 55, 56, 57, 0, + 58, 59, 60, 61, 58, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 0, 76, 77, 78, 0, 79, 0, 80, 81, 82, 83, 0, 0, + 5, 84, 25, 5, 85, 5, 86, 87, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 88, 5, 89, 90, 91, 5, 92, 5, 74, 0, 93, 5, 5, 94, + 73, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 95, 2, 5, 5, 96, 97, 98, 98, 99, 5, 100, 101, 0, + 0, 5, 5, 32, 5, 102, 5, 103, 104, 105, 25, 106, 5, 107, 108, 0, + 109, 5, 104, 110, 0, 111, 79, 0, 5, 112, 113, 0, 5, 114, 5, 115, + 5, 116, 117, 118, 119, 66, 0, 120, 5, 5, 5, 5, 5, 5, 0, 121, + 5, 5, 5, 5, 5, 5, 5, 5, 94, 5, 122, 118, 5, 123, 124, 125, + 0, 0, 0, 126, 127, 0, 0, 0, 128, 129, 130, 5, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 131, 5, 108, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 132, 104, 5, 5, 5, 5, 133, 5, 86, 5, 134, 116, 135, 135, 5, + 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 137, 138, 73, 5, 139, 73, 5, 87, 140, 14, 5, 5, 141, 5, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 83, + 5, 5, 5, 5, 31, 0, 25, 118, 5, 5, 5, 5, 5, 5, 5, 5, + 142, 143, 5, 144, 5, 5, 5, 93, 145, 146, 5, 5, 147, 5, 148, 149, + 150, 151, 5, 98, 5, 5, 152, 153, 28, 102, 154, 83, 5, 155, 136, 156, + 5, 116, 157, 158, 5, 104, 159, 160, 161, 162, 87, 163, 5, 5, 5, 33, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 164, 165, 109, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 166, 5, 5, 167, 0, 168, 169, 170, 5, 5, 27, 171, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 118, 25, 5, 172, 5, 151, 173, + 0, 0, 0, 174, 5, 5, 5, 83, 0, 2, 2, 175, 5, 104, 176, 0, + 177, 178, 179, 0, 5, 5, 5, 74, 0, 0, 5, 180, 0, 0, 0, 0, + 0, 0, 0, 0, 83, 5, 181, 0, 5, 26, 102, 74, 118, 5, 182, 0, + 5, 5, 5, 5, 118, 25, 183, 109, 5, 184, 5, 61, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 116, 103, 151, 0, 0, 0, 0, + 185, 186, 103, 116, 104, 0, 0, 187, 103, 167, 0, 0, 5, 188, 0, 0, + 189, 103, 0, 83, 83, 0, 80, 190, 5, 103, 103, 154, 27, 0, 0, 0, + 5, 5, 16, 0, 5, 154, 5, 154, 5, 151, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 191, 0, 0, 83, 192, 193, 0, 0, 25, 190, 116, + 5, 5, 193, 0, 146, 32, 25, 16, 5, 154, 194, 195, 5, 5, 196, 0, + 197, 198, 0, 0, 199, 119, 5, 16, 40, 49, 200, 61, 0, 0, 0, 0, + 5, 5, 201, 202, 5, 5, 203, 0, 0, 0, 0, 0, 5, 204, 205, 0, + 5, 104, 206, 0, 5, 207, 0, 0, 66, 33, 0, 0, 0, 0, 0, 0, + 5, 32, 0, 0, 0, 5, 5, 208, 209, 210, 211, 0, 0, 212, 30, 213, + 5, 214, 25, 5, 215, 0, 5, 32, 0, 0, 0, 0, 0, 0, 0, 0, + 216, 217, 79, 218, 172, 219, 0, 0, 220, 221, 222, 223, 224, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 225, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 167, 0, 0, 0, + 5, 5, 5, 141, 5, 5, 5, 5, 5, 5, 61, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 32, 104, 0, 0, 0, 25, 157, 5, 93, 61, 227, 93, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 0, 0, 0, 0, 5, 5, 228, 5, 229, 0, 0, 230, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 231, + 5, 5, 5, 5, 5, 5, 103, 0, 16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 104, 0, 232, 194, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 109, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 233, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 34, 5, 235, 236, 237, 5, 238, 239, 240, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 241, 242, 87, 34, 34, 132, 132, 216, 216, 243, 0, + 244, 245, 0, 0, 0, 0, 0, 0, 5, 246, 247, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 248, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 190, 0, 5, 5, 249, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 237, 250, 251, 252, 253, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 163, 163, 108, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 118, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 180, 5, 5, 5, 5, 5, 5, + 118, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 255, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 79, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 33, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_posix_alnum_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 7, 0, 4, 32, 4, + 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, + 32, 0, 0, 0, 0, 0, 223, 188, 64, 215, 255, 255, 251, 255, 255, 255, + 255, 255, 191, 255, 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, + 255, 1, 0, 0, 0, 0, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, + 0, 0, 255, 7, 255, 255, 255, 254, 0, 192, 255, 255, 255, 255, 239, 31, + 254, 225, 0, 156, 0, 0, 255, 255, 0, 224, 255, 255, 255, 255, 3, 0, + 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 255, 252, 255, 31, 0, 0, + 255, 255, 255, 1, 255, 7, 0, 0, 255, 255, 223, 255, 255, 0, 240, 255, + 248, 3, 255, 255, 255, 255, 255, 239, 255, 223, 225, 255, 15, 0, 254, 255, + 239, 159, 249, 255, 255, 253, 197, 227, 159, 89, 128, 176, 15, 0, 3, 16, + 238, 135, 249, 255, 255, 253, 109, 195, 135, 25, 2, 94, 0, 0, 63, 0, + 238, 191, 251, 255, 255, 253, 237, 227, 191, 27, 1, 0, 15, 0, 0, 30, + 238, 159, 249, 255, 159, 25, 192, 176, 15, 0, 2, 0, 236, 199, 61, 214, + 24, 199, 255, 195, 199, 29, 129, 0, 239, 223, 253, 255, 255, 253, 255, 227, + 223, 29, 96, 7, 15, 0, 0, 0, 255, 253, 239, 227, 223, 29, 96, 64, + 15, 0, 6, 0, 255, 223, 253, 255, 255, 255, 255, 231, 223, 93, 240, 128, + 15, 0, 0, 252, 238, 255, 127, 252, 255, 255, 251, 47, 127, 128, 95, 255, + 0, 0, 12, 0, 254, 255, 255, 255, 255, 255, 255, 7, 127, 32, 0, 0, + 214, 247, 255, 255, 175, 255, 255, 59, 95, 32, 0, 240, 1, 0, 0, 0, + 255, 254, 255, 255, 255, 31, 254, 255, 3, 255, 255, 254, 255, 255, 255, 31, + 255, 255, 127, 249, 255, 255, 0, 60, 191, 32, 255, 255, 255, 255, 255, 247, + 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, + 255, 255, 61, 255, 255, 255, 0, 0, 255, 255, 63, 63, 255, 159, 255, 255, + 255, 199, 255, 1, 255, 223, 15, 0, 255, 255, 15, 0, 255, 223, 13, 0, + 255, 255, 207, 255, 255, 1, 128, 16, 255, 7, 255, 255, 255, 255, 63, 0, + 255, 255, 255, 127, 255, 15, 255, 1, 255, 63, 31, 0, 255, 15, 255, 255, + 255, 3, 0, 0, 255, 255, 255, 15, 254, 255, 31, 0, 128, 0, 0, 128, + 255, 255, 239, 255, 239, 15, 0, 0, 255, 243, 0, 252, 191, 255, 3, 0, + 255, 255, 127, 0, 0, 224, 0, 252, 255, 255, 255, 63, 255, 1, 255, 255, + 0, 222, 111, 4, 128, 255, 31, 0, 63, 63, 255, 170, 255, 255, 223, 95, + 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, + 132, 252, 47, 62, 80, 189, 255, 243, 224, 67, 0, 0, 0, 0, 192, 255, + 255, 127, 255, 255, 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, + 0, 128, 0, 0, 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 224, + 224, 255, 255, 255, 255, 127, 0, 0, 255, 31, 255, 255, 0, 12, 0, 0, + 255, 127, 240, 143, 0, 0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, + 252, 7, 0, 0, 0, 0, 224, 255, 191, 255, 255, 255, 255, 0, 0, 0, + 47, 0, 0, 0, 0, 0, 252, 232, 255, 255, 7, 0, 255, 255, 247, 255, + 255, 255, 0, 124, 255, 63, 0, 0, 255, 255, 127, 252, 5, 0, 0, 56, + 255, 255, 60, 0, 126, 126, 126, 0, 127, 127, 255, 255, 255, 3, 255, 255, + 15, 0, 255, 255, 127, 248, 255, 255, 255, 63, 255, 255, 255, 255, 255, 3, + 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, + 255, 255, 252, 255, 0, 0, 255, 15, 0, 0, 223, 255, 192, 255, 255, 255, + 252, 252, 252, 28, 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, + 255, 255, 31, 0, 255, 255, 1, 0, 15, 255, 62, 0, 255, 255, 15, 255, + 255, 0, 255, 255, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, + 255, 255, 255, 192, 111, 240, 239, 254, 31, 0, 0, 0, 255, 27, 3, 0, + 128, 0, 255, 255, 63, 0, 0, 0, 240, 0, 255, 255, 255, 255, 71, 0, + 30, 192, 0, 20, 255, 255, 251, 255, 255, 255, 159, 64, 127, 189, 255, 191, + 159, 25, 129, 224, 187, 7, 0, 128, 3, 0, 0, 0, 179, 0, 0, 0, + 255, 255, 63, 127, 0, 0, 0, 63, 17, 0, 0, 0, 255, 255, 63, 1, + 0, 0, 0, 128, 127, 242, 111, 255, 255, 255, 191, 153, 7, 0, 0, 0, + 255, 252, 255, 255, 26, 0, 0, 0, 255, 255, 231, 127, 255, 255, 255, 32, + 255, 253, 255, 255, 255, 255, 127, 127, 0, 0, 252, 255, 255, 254, 127, 0, + 127, 251, 255, 255, 255, 255, 127, 180, 203, 0, 0, 0, 191, 253, 255, 255, + 255, 127, 123, 1, 0, 0, 1, 0, 127, 0, 0, 0, 248, 255, 255, 224, + 255, 135, 255, 255, 255, 128, 255, 255, 11, 0, 3, 0, 255, 255, 255, 0, + 0, 0, 7, 0, 255, 7, 255, 31, 255, 1, 255, 67, 255, 255, 255, 223, + 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, + 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, 247, 15, 0, 0, + 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 128, 63, 0, 64, 0, 0, + 255, 15, 0, 0, 143, 8, 0, 0, 150, 254, 247, 10, 132, 234, 150, 170, + 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255 }; -static RE_UINT8 re_other_id_continue_stage_2[] = { - 0, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; +RE_UINT32 re_get_posix_alnum(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_other_id_continue_stage_3[] = { - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_other_id_continue_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, - 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 3, 0, - 0, 0, 0, 4, 0, 0, 0, 0, -}; + v = re_posix_alnum_table_1[field_2]; + v = re_posix_alnum_table_2[(v << 5) | field_1]; + v = re_posix_alnum_table_3[(v << 2) | field_0]; -/* Other_ID_Continue: 202 bytes. */ - -RE_UINT32 re_get_other_id_continue(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_other_id_continue_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_other_id_continue_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_other_id_continue_stage_3[pos + f] << 6; - pos += code; - value = (re_other_id_continue_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return (v >> offset) & 0x1; } -/* Sentence_Terminal. */ +/* Posix_Digit. */ +RE_UINT32 re_get_posix_digit(RE_UINT32 codepoint) { + if (0x30 <= codepoint && codepoint <= 0x39) + return 1; -static RE_UINT8 re_sentence_terminal_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 7, 8, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; + return 0; +} -static RE_UINT8 re_sentence_terminal_stage_2[] = { - 0, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, - 7, 1, 1, 8, 1, 1, 9, 10, 11, 12, 13, 14, 15, 1, 1, 1, - 16, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 1, - 18, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 19, 1, 20, 1, 21, 22, 23, 24, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 26, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 1, 1, 1, 1, 28, - 29, 30, 31, 1, 32, 33, 34, 35, 1, 1, 36, 1, 34, 1, 37, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, 39, 1, 1, 40, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 42, 1, 1, 1, 1, 1, +/* Posix_Punct. */ +static RE_UINT8 re_posix_punct_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 13, 27, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 28, 29, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 30, + 13, 13, 13, 13, 31, 32, 33, 13, 34, 13, 35, 36, 37, 38, 39, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13 }; -static RE_UINT8 re_sentence_terminal_stage_3[] = { - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 0, - 5, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, - 0, 12, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, - 0, 0, 15, 0, 0, 0, 0, 0, 0, 16, 0, 3, 0, 0, 0, 0, - 0, 17, 18, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, - 22, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 24, 0, 0, 22, 0, - 0, 25, 0, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 0, 28, - 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 30, 0, 0, 0, 0, 0, - 1, 0, 0, 31, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, - 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 3, 34, 0, - 0, 0, 35, 0, 0, 0, 36, 0, 0, 37, 0, 0, 0, 2, 0, 0, - 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, - 0, 0, 40, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, - 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, - 0, 0, 0, 22, 0, 0, 0, 44, 0, 43, 45, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, - 0, 0, 0, 0, 47, 0, 0, 0, -}; +static RE_UINT8 re_posix_punct_table_2[] = { + 0, 1, 2, 3, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 8, 9, 0, 0, 10, + 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 12, 0, 13, 14, 15, 16, + 17, 0, 0, 18, 0, 0, 19, 20, 21, 0, 0, 0, 0, 0, 0, 22, + 0, 23, 14, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 25, + 0, 0, 0, 10, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 28, + 0, 0, 0, 29, 30, 0, 0, 0, 0, 0, 31, 32, 0, 0, 0, 33, + 0, 34, 35, 0, 0, 0, 0, 0, 36, 37, 0, 0, 38, 39, 40, 0, + 0, 0, 41, 0, 39, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 0, 0, + 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 46, 47, 0, 0, 48, 0, 49, 0, 0, 0, 0, 50, 0, + 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 39, 53, + 39, 0, 0, 0, 0, 54, 0, 0, 0, 0, 12, 55, 0, 0, 0, 56, + 0, 57, 0, 39, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 60, 61, + 62, 63, 64, 65, 66, 53, 0, 0, 67, 68, 69, 0, 70, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 71, 51, 0, 56, 72, 0, 0, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 72, 73, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 74, 75, 53, 53, 53, + 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 27, 0, 0, 0, 0, + 53, 77, 78, 0, 79, 53, 53, 80, 53, 53, 53, 53, 53, 53, 72, 81, + 82, 83, 0, 0, 47, 45, 0, 42, 0, 0, 0, 0, 84, 0, 53, 85, + 64, 86, 87, 53, 86, 88, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 62, 53, 71, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 89, 0, 0, 90, 0, 0, 0, 91, 92, 93, 0, 0, 94, 0, 0, 0, + 0, 95, 0, 96, 0, 0, 97, 98, 0, 97, 34, 0, 0, 0, 99, 0, + 0, 0, 56, 100, 0, 0, 39, 26, 0, 0, 42, 101, 0, 0, 0, 102, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 0, 0, 0, 104, 93, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 105, + 44, 62, 106, 107, 0, 0, 0, 0, 1, 2, 2, 108, 0, 0, 0, 109, + 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, 112, 113, 45, 62, 114, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 115, 0, 0, 0, 0, 34, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 116, 34, 0, 0, 117, 118, 0, 112, 0, 0, 119, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, + 0, 0, 122, 0, 0, 123, 93, 0, 0, 0, 85, 124, 0, 0, 125, 0, + 0, 126, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 127, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 129, 0, + 0, 0, 130, 131, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, + 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 11, + 0, 34, 71, 0, 133, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 134, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, 0, 135, 136, + 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 97, 0, 0, 0, 138, 0, 111, 139, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 53, 53, 53, 53, 53, 53, 72, 53, 142, 53, 143, 144, 145, 53, 43, + 53, 53, 146, 0, 0, 0, 0, 0, 53, 53, 92, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 147, 42, 138, 138, 31, 31, 103, 103, 148, 0, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 0, 140, 0, 149, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 151, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 153, 53, 53, 80, 154, 155, 72, 156, 157, 41, 41, 86, 21, 0, 158, + 159, 160, 161, 108, 0, 0, 0, 0, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 162, 163, 53, 53, 53, 80, 53, 53, 164, 165, + 153, 53, 166, 53, 63, 167, 0, 0, 53, 53, 53, 168, 53, 53, 169, 53, + 53, 53, 80, 170, 171, 172, 173, 0, 53, 53, 53, 53, 106, 53, 51, 0 +}; + +static RE_UINT8 re_posix_punct_table_3[] = { + 0, 0, 0, 0, 254, 255, 0, 252, 1, 0, 0, 248, 1, 0, 0, 120, + 254, 219, 211, 137, 0, 0, 128, 0, 60, 0, 252, 255, 224, 175, 255, 255, + 0, 0, 32, 64, 176, 0, 0, 0, 0, 0, 64, 0, 4, 0, 0, 0, + 0, 0, 0, 252, 0, 230, 0, 0, 0, 0, 0, 64, 73, 0, 0, 0, + 0, 0, 24, 0, 192, 255, 0, 200, 0, 60, 0, 0, 0, 0, 16, 64, + 0, 2, 0, 96, 255, 63, 0, 0, 0, 0, 192, 195, 0, 0, 255, 127, + 48, 0, 1, 0, 0, 0, 12, 44, 0, 0, 3, 0, 0, 0, 1, 0, + 0, 0, 248, 7, 0, 0, 128, 128, 16, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 2, 0, 0, 16, 0, 0, 0, 0, 128, 0, 128, 0, 12, + 254, 255, 255, 252, 0, 0, 80, 61, 32, 0, 0, 0, 0, 0, 0, 192, + 191, 223, 255, 7, 0, 252, 0, 0, 0, 0, 0, 8, 255, 1, 0, 0, + 0, 0, 255, 3, 1, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 24, + 0, 56, 0, 0, 0, 0, 96, 0, 0, 0, 112, 15, 255, 7, 0, 0, + 49, 0, 0, 0, 255, 255, 255, 255, 127, 63, 0, 0, 255, 7, 240, 31, + 0, 0, 0, 240, 0, 0, 0, 248, 255, 0, 8, 0, 0, 0, 0, 160, + 3, 224, 0, 224, 0, 224, 0, 96, 0, 0, 255, 255, 255, 0, 255, 255, + 255, 255, 255, 127, 0, 0, 0, 124, 0, 124, 0, 0, 123, 3, 208, 193, + 175, 66, 0, 12, 31, 188, 0, 0, 0, 12, 255, 255, 127, 0, 0, 0, + 255, 255, 63, 0, 0, 0, 240, 255, 255, 255, 207, 255, 255, 255, 191, 255, + 224, 7, 0, 222, 255, 127, 255, 255, 255, 255, 7, 0, 255, 255, 255, 251, + 255, 255, 15, 0, 0, 0, 255, 15, 30, 255, 255, 255, 1, 0, 193, 224, + 0, 0, 195, 255, 15, 0, 0, 0, 0, 252, 255, 255, 255, 0, 1, 0, + 255, 255, 1, 0, 0, 224, 0, 0, 0, 0, 8, 64, 0, 0, 252, 0, + 255, 255, 127, 0, 3, 0, 0, 0, 0, 6, 0, 0, 0, 15, 192, 3, + 0, 0, 240, 0, 0, 192, 0, 0, 0, 0, 0, 23, 254, 63, 0, 192, + 0, 0, 128, 3, 0, 12, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, + 0, 0, 252, 255, 0, 0, 0, 48, 255, 255, 247, 255, 127, 15, 0, 0, + 63, 0, 0, 0, 127, 127, 0, 48, 7, 0, 0, 0, 0, 0, 128, 255, + 0, 0, 0, 254, 255, 115, 255, 31, 255, 255, 255, 31, 0, 0, 128, 1, + 0, 0, 255, 1, 0, 1, 0, 0, 0, 0, 127, 0, 0, 0, 0, 30, + 0, 32, 0, 0, 0, 0, 224, 3, 128, 63, 0, 0, 0, 0, 0, 216, + 0, 0, 48, 0, 224, 33, 0, 232, 0, 0, 0, 63, 0, 248, 0, 44, + 64, 0, 0, 0, 254, 255, 255, 0, 14, 0, 0, 0, 255, 31, 0, 0, + 112, 0, 0, 0, 0, 0, 0, 220, 62, 0, 0, 0, 0, 0, 224, 255, + 255, 255, 3, 128, 0, 0, 31, 0, 0, 0, 32, 0, 48, 0, 0, 0, + 0, 0, 128, 7, 0, 0, 0, 144, 127, 254, 255, 255, 31, 28, 0, 0, + 24, 240, 255, 255, 255, 195, 255, 255, 35, 0, 0, 0, 2, 0, 0, 8, + 8, 0, 0, 0, 0, 224, 223, 255, 239, 15, 0, 0, 0, 16, 1, 0, + 0, 64, 0, 0, 255, 15, 255, 255, 255, 127, 254, 255, 254, 255, 254, 255, + 0, 224, 255, 255, 255, 255, 0, 0, 192, 255, 255, 255, 7, 0, 255, 255, + 255, 255, 255, 15, 255, 1, 3, 0, 255, 255, 255, 0, 255, 31, 255, 31, + 255, 255, 255, 1, 255, 15, 0, 0, 255, 0, 255, 3, 255, 63, 3, 0, + 255, 255, 255, 253, 255, 239, 255, 255, 255, 63, 31, 7, 127, 0, 255, 255, + 255, 1, 127, 0, 7, 0, 127, 0 +}; + +RE_UINT32 re_get_posix_punct(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_posix_punct_table_1[field_2]; + v = re_posix_punct_table_2[(v << 5) | field_1]; + v = re_posix_punct_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} -static RE_UINT8 re_sentence_terminal_stage_4[] = { - 0, 0, 0, 0, 2, 64, 0, 128, 0, 2, 0, 0, 0, 0, 0, 192, - 0, 0, 16, 0, 7, 0, 0, 0, 0, 0, 0, 2, 0, 0, 128, 98, - 48, 0, 0, 0, 0, 12, 0, 0, 132, 1, 0, 0, 0, 64, 0, 0, - 0, 0, 96, 0, 8, 2, 0, 0, 0, 15, 0, 0, 0, 0, 0, 204, - 0, 0, 0, 24, 0, 0, 0, 48, 128, 3, 0, 0, 0, 64, 0, 16, - 4, 0, 0, 0, 0, 0, 0, 128, 0, 192, 0, 0, 0, 0, 136, 0, - 0, 0, 192, 0, 0, 128, 0, 0, 0, 3, 0, 0, 0, 0, 0, 224, - 0, 0, 3, 0, 0, 8, 0, 0, 0, 0, 196, 0, 2, 0, 0, 0, - 0, 0, 224, 3, 128, 1, 0, 0, 3, 0, 0, 0, 14, 0, 0, 0, - 96, 32, 0, 192, 0, 0, 0, 27, 0, 24, 0, 0, 12, 254, 255, 0, - 6, 0, 0, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 0, 128, 1, - 0, 0, 32, 0, 16, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, -}; +/* Posix_XDigit. */ +RE_UINT32 re_get_posix_xdigit(RE_UINT32 codepoint) { + if (0x30 <= codepoint && codepoint <= 0x39) + return 1; + if (0x41 <= codepoint && codepoint <= 0x46) + return 1; + if (0x61 <= codepoint && codepoint <= 0x66) + return 1; + + return 0; +} -/* Sentence_Terminal: 960 bytes. */ - -RE_UINT32 re_get_sentence_terminal(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_sentence_terminal_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_sentence_terminal_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_sentence_terminal_stage_3[pos + f] << 5; - pos += code; - value = (re_sentence_terminal_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; +/* Prepended_Concatenation_Mark. */ +RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 codepoint) { + if (0x0600 <= codepoint && codepoint <= 0x0605) + return 1; + if (codepoint == 0x06DD) + return 1; + if (codepoint == 0x070F) + return 1; + if (codepoint == 0x08E2) + return 1; + if (codepoint == 0x0110BD) + return 1; + if (codepoint == 0x0110CD) + return 1; + + return 0; } -/* Variation_Selector. */ +/* Print. */ +static RE_UINT8 re_print_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 14, 13, 15, 16, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 17, 18, 18, 13, 13, 13, 13, 13, 13, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 18, 18, 13, 31, 18, 18, + 18, 32, 18, 18, 18, 18, 18, 18, 18, 18, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 18, 18, 18, 18, 18, 18, 18, 18, 37, 18, 18, 38, + 18, 18, 18, 18, 39, 40, 41, 18, 42, 18, 43, 44, 45, 46, 47, 18, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 48, 13, 13, 13, 49, 50, 13, + 13, 13, 13, 51, 13, 13, 13, 13, 13, 13, 52, 18, 18, 18, 53, 18, + 13, 13, 13, 13, 54, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 56 +}; -static RE_UINT8 re_variation_selector_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, +static RE_UINT16 re_print_table_2[] = { + 0, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, 5, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 1, 8, 1, 9, 10, + 11, 1, 1, 1, 1, 1, 1, 1, 12, 1, 13, 1, 1, 14, 1, 15, + 1, 16, 17, 18, 0, 19, 20, 1, 1, 1, 1, 1, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 30, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 40, 44, 45, 46, 40, 1, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 0, 56, 57, 58, 0, 1, 1, 59, 60, 61, 11, 62, 0, + 1, 1, 1, 1, 1, 1, 63, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 64, 1, 65, 66, 67, 1, 68, 1, 15, 69, 70, 1, 1, 71, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 69, 1, 1, 72, 73, 74, 75, 76, 1, 1, 77, 78, + 79, 1, 1, 72, 1, 80, 1, 81, 2, 82, 83, 84, 1, 85, 86, 1, + 87, 1, 2, 88, 78, 89, 90, 0, 1, 1, 85, 69, 1, 1, 1, 91, + 1, 92, 93, 1, 94, 15, 9, 95, 1, 1, 1, 1, 1, 1, 1, 96, + 1, 1, 1, 1, 1, 1, 1, 1, 71, 1, 97, 77, 1, 19, 98, 99, + 1, 100, 1, 101, 102, 1, 103, 104, 1, 1, 1, 1, 85, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 105, 18, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 106, 107, 1, 1, 1, + 1, 108, 2, 1, 1, 1, 1, 109, 1, 63, 1, 110, 74, 111, 111, 1, + 1, 1, 112, 0, 96, 1, 1, 75, 1, 1, 1, 1, 1, 1, 81, 113, + 1, 1, 53, 1, 7, 1, 1, 1, 114, 6, 1, 1, 108, 1, 1, 115, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 69, + 1, 1, 1, 1, 116, 1, 117, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 118, 1, 1, 1, 1, 1, 119, 1, 1, 1, 1, 1, 1, 120, 121, + 1, 122, 1, 119, 1, 1, 123, 1, 1, 1, 124, 69, 1, 1, 125, 2, + 1, 74, 126, 1, 1, 1, 127, 74, 128, 129, 1, 85, 1, 1, 1, 130, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 115, 131, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 89, 1, 1, 70, 0, 132, 133, 134, 1, 1, 1, 135, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 103, 1, 136, 1, 137, 138, + 70, 1, 139, 140, 1, 1, 1, 88, 53, 1, 1, 1, 1, 2, 141, 142, + 143, 144, 145, 0, 1, 1, 1, 95, 146, 147, 1, 1, 102, 90, 103, 77, + 0, 0, 0, 0, 69, 1, 104, 55, 1, 148, 80, 95, 149, 1, 150, 0, + 1, 1, 1, 1, 77, 151, 152, 55, 1, 9, 1, 153, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 74, 81, 137, 0, 0, 0, 0, + 154, 155, 107, 1, 2, 156, 0, 157, 158, 159, 0, 0, 1, 160, 136, 1, + 161, 162, 163, 1, 1, 0, 1, 164, 1, 165, 166, 167, 168, 169, 0, 0, + 1, 1, 170, 0, 1, 112, 1, 171, 1, 172, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 1, 173, 0, 0, 1, 9, 70, 0, 0, 103, 118, 74, + 1, 1, 174, 175, 1, 1, 176, 177, 1, 19, 9, 74, 1, 1, 1, 178, + 179, 2, 0, 0, 180, 151, 1, 181, 21, 182, 183, 184, 0, 0, 0, 0, + 1, 1, 185, 186, 1, 1, 172, 0, 0, 0, 0, 0, 1, 166, 77, 0, + 1, 1, 187, 188, 1, 72, 189, 0, 15, 85, 0, 0, 0, 0, 0, 0, + 1, 55, 0, 0, 0, 1, 1, 190, 191, 192, 193, 0, 0, 100, 3, 194, + 1, 1, 9, 1, 1, 195, 1, 72, 0, 0, 0, 0, 0, 0, 0, 0, + 196, 197, 198, 116, 136, 199, 0, 0, 200, 201, 172, 202, 203, 189, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 204, 1, 205, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 70, 0, 0, 0, + 1, 1, 1, 206, 1, 1, 1, 1, 1, 1, 207, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 72, 2, 209, 0, 0, 103, 210, 1, 1, 211, 212, 213, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 95, 0, 0, 0, 1, 1, 214, 1, 215, 0, 0, 216, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 119, + 1, 1, 1, 1, 1, 1, 81, 0, 170, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 217, 218, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 219, 220, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 81, 1, 221, 1, 1, 1, 1, 1, 170, + 1, 1, 222, 0, 0, 0, 0, 75, 1, 1, 74, 72, 0, 0, 0, 0, + 1, 1, 19, 1, 11, 223, 224, 1, 225, 226, 227, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 228, 1, 1, 1, 1, 1, 1, 1, 1, 229, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 230, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 232, 233, 0, 0, 0, 0, 0, 0, 1, 234, 209, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 159, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 235, 0, 1, 1, 236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 237, 1, 238, 0, 0, 53, 77, 0, 0, 0, 0, 0, 0, + 224, 239, 240, 241, 242, 243, 0, 244, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 85, 1, 1, 75, 245, 246, 81, 1, 1, 1, 1, 1, 247, 0, 248, + 249, 55, 250, 222, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 119, 251, 1, 1, 1, 75, 1, 1, 72, 118, + 85, 1, 172, 1, 9, 252, 0, 0, 1, 1, 1, 253, 1, 1, 143, 1, + 1, 1, 75, 254, 117, 255, 256, 0, 1, 1, 1, 1, 139, 1, 18, 257, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 77, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 238, 1, 1, 1, 1, 1, 1, + 77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 258, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 90, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 0, 0, 0, 0, 0, + 259, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 213, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 77 }; -static RE_UINT8 re_variation_selector_stage_2[] = { - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_print_table_3[] = { + 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 252, + 240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 254, 255, 255, 255, 127, 254, + 255, 231, 254, 255, 255, 0, 255, 255, 255, 135, 31, 0, 255, 255, 255, 223, + 255, 191, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 255, 231, + 255, 63, 255, 127, 255, 255, 255, 79, 255, 7, 0, 0, 255, 255, 223, 255, + 255, 0, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176, + 207, 255, 255, 127, 238, 135, 249, 255, 255, 253, 109, 211, 135, 57, 2, 94, + 192, 255, 127, 0, 238, 191, 251, 255, 255, 253, 237, 243, 191, 59, 1, 0, + 207, 255, 3, 254, 238, 159, 249, 255, 159, 57, 224, 176, 207, 255, 255, 0, + 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, 192, 255, 255, 7, + 255, 223, 253, 255, 255, 253, 255, 227, 223, 61, 96, 7, 207, 255, 128, 255, + 255, 253, 239, 243, 223, 61, 96, 64, 207, 255, 6, 0, 223, 253, 240, 255, + 207, 255, 255, 255, 238, 255, 127, 252, 255, 255, 251, 47, 127, 132, 95, 255, + 192, 255, 28, 0, 254, 255, 255, 255, 255, 255, 255, 135, 255, 255, 255, 15, + 214, 247, 255, 255, 175, 255, 255, 63, 95, 63, 255, 243, 255, 254, 255, 255, + 255, 31, 254, 255, 255, 255, 255, 254, 255, 223, 255, 7, 191, 32, 255, 255, + 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, + 255, 255, 61, 255, 255, 255, 255, 31, 255, 255, 255, 3, 255, 255, 63, 63, + 255, 255, 255, 1, 255, 223, 31, 0, 255, 255, 127, 0, 255, 255, 15, 0, + 255, 223, 13, 0, 255, 255, 255, 63, 255, 3, 255, 3, 255, 127, 255, 3, + 255, 7, 255, 255, 255, 255, 63, 0, 255, 15, 255, 15, 241, 255, 255, 255, + 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 199, 255, 255, 255, 207, + 255, 255, 255, 159, 255, 63, 255, 255, 1, 0, 0, 0, 255, 255, 15, 240, + 255, 255, 255, 248, 255, 227, 255, 255, 255, 1, 255, 255, 255, 255, 255, 7, + 255, 255, 255, 251, 63, 63, 255, 170, 223, 255, 207, 239, 255, 255, 220, 127, + 255, 252, 255, 255, 223, 255, 243, 255, 255, 127, 255, 31, 0, 0, 255, 255, + 255, 255, 1, 0, 127, 0, 0, 0, 255, 255, 207, 255, 255, 255, 191, 255, + 255, 127, 255, 255, 255, 255, 15, 254, 255, 128, 1, 128, 127, 127, 127, 127, + 255, 255, 7, 0, 0, 0, 255, 15, 224, 255, 255, 255, 15, 0, 255, 255, + 255, 31, 255, 255, 127, 0, 255, 255, 255, 15, 0, 0, 255, 255, 255, 0, + 252, 7, 0, 0, 0, 0, 224, 255, 255, 31, 255, 3, 63, 192, 255, 3, + 255, 255, 15, 128, 255, 191, 255, 195, 255, 63, 255, 243, 7, 0, 0, 248, + 126, 126, 126, 0, 127, 127, 255, 255, 255, 63, 255, 3, 127, 248, 255, 255, + 127, 0, 248, 224, 255, 255, 127, 95, 219, 255, 255, 255, 3, 0, 248, 255, + 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 63, 255, 255, 247, 255, + 127, 15, 223, 255, 252, 252, 252, 28, 127, 127, 0, 62, 255, 239, 255, 255, + 127, 255, 255, 183, 255, 63, 255, 63, 135, 255, 255, 255, 255, 255, 143, 255, + 15, 224, 255, 255, 255, 255, 255, 191, 15, 255, 63, 0, 255, 3, 255, 255, + 255, 255, 15, 255, 15, 128, 0, 0, 63, 253, 255, 255, 255, 255, 191, 145, + 128, 255, 0, 0, 255, 255, 55, 248, 255, 255, 255, 143, 255, 255, 255, 131, + 255, 255, 255, 240, 111, 240, 239, 254, 255, 255, 63, 135, 255, 1, 255, 1, + 127, 248, 127, 0, 255, 255, 63, 254, 255, 255, 63, 255, 255, 255, 7, 255, + 255, 255, 3, 30, 0, 254, 0, 0, 255, 1, 0, 0, 255, 255, 7, 252, + 255, 0, 255, 3, 255, 59, 3, 0, 255, 63, 252, 255, 255, 255, 0, 128, + 3, 32, 255, 255, 255, 1, 255, 3, 254, 255, 31, 0, 255, 255, 251, 255, + 127, 189, 255, 191, 255, 7, 255, 3, 255, 253, 237, 251, 159, 57, 129, 224, + 207, 31, 31, 0, 255, 255, 255, 239, 3, 0, 0, 0, 31, 0, 255, 3, + 255, 31, 0, 0, 255, 3, 0, 0, 255, 255, 7, 128, 127, 242, 111, 255, + 255, 255, 191, 249, 127, 0, 255, 3, 31, 0, 0, 0, 7, 0, 0, 0, + 255, 253, 255, 255, 255, 255, 127, 255, 63, 0, 255, 255, 255, 254, 127, 0, + 127, 251, 255, 255, 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251, 1, + 0, 0, 1, 0, 255, 255, 3, 128, 255, 127, 31, 0, 15, 0, 0, 0, + 255, 127, 255, 1, 255, 195, 0, 0, 255, 63, 63, 0, 63, 0, 255, 251, + 251, 255, 255, 224, 255, 255, 0, 0, 255, 135, 255, 255, 255, 128, 255, 255, + 31, 0, 3, 0, 0, 0, 7, 0, 240, 0, 255, 255, 255, 7, 255, 31, + 255, 1, 255, 243, 127, 254, 255, 255, 63, 0, 0, 0, 100, 222, 255, 235, + 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, + 63, 255, 255, 255, 255, 207, 255, 255, 255, 15, 0, 248, 254, 255, 0, 0, + 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 255, 63, 159, 255, 127, 0, + 255, 15, 255, 195, 0, 0, 254, 255, 255, 255, 31, 0, 150, 254, 247, 10, + 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, + 0, 0, 3, 0, 255, 127, 254, 255, 254, 255, 254, 255, 255, 63, 0, 0, + 192, 255, 255, 255, 7, 0, 255, 255, 255, 1, 3, 0, 255, 31, 255, 31, + 255, 63, 3, 0, 255, 255, 255, 253, 255, 63, 31, 7, 255, 1, 127, 0, + 7, 0, 127, 0, 0, 0, 255, 3, 3, 0, 255, 255, 2, 0, 0, 0 }; -static RE_UINT8 re_variation_selector_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 3, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_print(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_variation_selector_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, - 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* Variation_Selector: 236 bytes. */ - -RE_UINT32 re_get_variation_selector(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_variation_selector_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_variation_selector_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_variation_selector_stage_3[pos + f] << 6; - pos += code; - value = (re_variation_selector_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} + v = re_print_table_1[field_2]; + v = re_print_table_2[(v << 5) | field_1]; + v = re_print_table_3[(v << 2) | field_0]; -/* Pattern_White_Space. */ + return (v >> offset) & 0x1; +} -static RE_UINT8 re_pattern_white_space_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* Quotation_Mark. */ +static RE_UINT8 re_quotation_mark_table_1[] = { + 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 4, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_pattern_white_space_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_pattern_white_space_stage_3[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_pattern_white_space_stage_4[] = { - 0, 62, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 3, 0, 0, -}; - -/* Pattern_White_Space: 178 bytes. */ - -RE_UINT32 re_get_pattern_white_space(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_pattern_white_space_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_pattern_white_space_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_pattern_white_space_stage_3[pos + f] << 6; - pos += code; - value = (re_pattern_white_space_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Pattern_Syntax. */ - -static RE_UINT8 re_pattern_syntax_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_pattern_syntax_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 3, 4, 5, 3, 3, 1, 6, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 9, -}; - -static RE_UINT8 re_pattern_syntax_stage_3[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 6, 4, 4, 4, 4, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 9, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 10, 11, 8, - 8, 8, 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 13, 4, 4, 4, 4, 14, 4, 4, 4, 4, 4, 4, -}; - -static RE_UINT8 re_pattern_syntax_stage_4[] = { - 0, 0, 0, 0, 254, 255, 0, 252, 1, 0, 0, 120, 1, 0, 0, 120, - 0, 0, 0, 0, 254, 90, 67, 136, 0, 0, 128, 0, 0, 0, 128, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 0, 255, 127, - 254, 255, 239, 127, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 240, 255, 255, 255, 255, 255, - 14, 255, 255, 255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 192, - 96, 0, 0, 0, 0, 0, 0, 0, -}; - -/* Pattern_Syntax: 364 bytes. */ - -RE_UINT32 re_get_pattern_syntax(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_pattern_syntax_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_pattern_syntax_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_pattern_syntax_stage_3[pos + f] << 6; - pos += code; - value = (re_pattern_syntax_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Prepended_Concatenation_Mark. */ - -static RE_UINT8 re_prepended_concatenation_mark_stage_1[] = { - 0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_prepended_concatenation_mark_stage_2[] = { - 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_quotation_mark_table_2[] = { + 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_prepended_concatenation_mark_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 3, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_prepended_concatenation_mark_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 32, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, - 0, 32, 0, 0, 0, 0, 0, 0, -}; - -/* Prepended_Concatenation_Mark: 236 bytes. */ - -RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_prepended_concatenation_mark_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_prepended_concatenation_mark_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_prepended_concatenation_mark_stage_3[pos + f] << 6; - pos += code; - value = (re_prepended_concatenation_mark_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Regional_Indicator. */ - -static RE_UINT8 re_regional_indicator_stage_1[] = { - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -}; - -static RE_UINT8 re_regional_indicator_stage_2[] = { + 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -}; - -static RE_UINT8 re_regional_indicator_stage_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 8, 0, 0, 0, 0 }; -static RE_UINT8 re_regional_indicator_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, +static RE_UINT8 re_quotation_mark_table_3[] = { + 0, 0, 0, 0, 132, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 255, + 0, 0, 0, 6, 4, 0, 0, 0, 0, 240, 0, 224, 30, 0, 0, 0, + 12, 0, 0, 0 }; -/* Regional_Indicator: 130 bytes. */ - -RE_UINT32 re_get_regional_indicator(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_regional_indicator_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_regional_indicator_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_regional_indicator_stage_3[pos + f] << 7; - pos += code; - value = (re_regional_indicator_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Hangul_Syllable_Type. */ - -static RE_UINT8 re_hangul_syllable_type_stage_1[] = { - 0, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, -}; +RE_UINT32 re_get_quotation_mark(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_hangul_syllable_type_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 4, 5, 6, - 7, 8, 9, 3, 4, 5, 6, 7, 8, 9, 3, 4, 5, 6, 7, 8, - 9, 3, 4, 5, 6, 7, 8, 9, 3, 4, 5, 6, 7, 8, 9, 3, - 4, 5, 6, 7, 8, 9, 3, 10, 0, 0, 0, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_hangul_syllable_type_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4, - 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, - 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, - 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, - 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, - 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, - 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, - 10, 8, 6, 7, 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 10, 8, - 8, 9, 8, 10, 8, 6, 7, 8, 9, 8, 11, 2, 12, 4, 4, 13, -}; + v = re_quotation_mark_table_1[field_2]; + v = re_quotation_mark_table_2[(v << 5) | field_1]; + v = re_quotation_mark_table_3[(v << 2) | field_0]; -static RE_UINT8 re_hangul_syllable_type_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, -}; + return (v >> offset) & 0x1; +} -/* Hangul_Syllable_Type: 664 bytes. */ - -RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_hangul_syllable_type_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_hangul_syllable_type_stage_2[pos + f] << 4; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_hangul_syllable_type_stage_3[pos + f] << 4; - value = re_hangul_syllable_type_stage_4[pos + code]; - - return value; +/* Radical. */ +RE_UINT32 re_get_radical(RE_UINT32 codepoint) { + if (0x2E80 <= codepoint && codepoint <= 0x2E99) + return 1; + if (0x2E9B <= codepoint && codepoint <= 0x2EF3) + return 1; + if (0x2F00 <= codepoint && codepoint <= 0x2FD5) + return 1; + + return 0; } -/* Bidi_Class. */ +/* Regional_Indicator. */ +RE_UINT32 re_get_regional_indicator(RE_UINT32 codepoint) { + if (0x01F1E6 <= codepoint && codepoint <= 0x01F1FF) + return 1; -static RE_UINT8 re_bidi_class_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 7, - 8, 9, 5, 5, 5, 5, 10, 5, 5, 5, 5, 11, 5, 12, 13, 14, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, -}; + return 0; +} -static RE_UINT8 re_bidi_class_stage_2[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 7, 8, 9, 10, - 4, 4, 11, 4, 4, 4, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 30, 32, 33, 34, 35, 36, - 37, 38, 28, 39, 40, 41, 4, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 54, 55, 4, - 56, 4, 4, 4, 4, 4, 4, 4, 4, 4, 57, 4, 58, 59, 60, 61, - 62, 4, 63, 4, 64, 65, 4, 66, 67, 68, 69, 4, 70, 71, 72, 73, - 74, 4, 4, 75, 4, 4, 4, 76, 4, 4, 4, 4, 4, 4, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 86, 86, 86, 88, 89, 90, 86, - 91, 92, 93, 94, 86, 86, 86, 86, 86, 86, 95, 86, 86, 86, 86, 86, - 4, 4, 4, 4, 86, 86, 86, 86, 86, 86, 86, 86, 86, 96, 97, 86, - 4, 4, 4, 98, 4, 99, 4, 100, 86, 101, 102, 103, 86, 86, 86, 104, - 105, 4, 106, 107, 4, 4, 4, 108, 109, 110, 111, 112, 4, 113, 4, 114, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 86, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 115, 116, 4, 4, 4, 4, 117, 118, 119, 120, 121, 4, 122, 4, - 123, 124, 4, 125, 126, 127, 128, 129, 130, 131, 132, 133, 4, 4, 4, 134, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 135, 136, 16, 16, - 16, 16, 16, 16, 137, 16, 16, 138, 139, 140, 16, 141, 142, 143, 4, 144, - 4, 4, 4, 4, 145, 86, 146, 147, 4, 4, 4, 148, 4, 149, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 150, 150, 150, 150, 151, 150, 150, 150, 152, 150, 150, 153, 154, 150, 150, 150, - 150, 150, 150, 150, 155, 150, 150, 150, 150, 156, 150, 150, 157, 158, 150, 150, - 159, 160, 161, 4, 162, 163, 164, 165, 166, 4, 4, 167, 40, 168, 4, 4, - 169, 170, 171, 172, 4, 4, 173, 174, 175, 176, 177, 4, 178, 4, 4, 4, - 179, 4, 4, 4, 4, 4, 4, 180, 181, 182, 183, 4, 4, 4, 4, 4, - 184, 4, 185, 4, 186, 187, 188, 4, 4, 4, 4, 189, 4, 4, 4, 190, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 191, 192, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 193, 194, 195, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 196, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 197, 198, 4, 86, 199, 4, 4, 86, 200, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 201, 202, 203, 204, 205, - 4, 4, 4, 4, 4, 4, 4, 4, 206, 207, 208, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 209, 4, 4, 4, 192, 4, 4, 4, 4, 4, 4, 210, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 150, 150, 150, 211, 150, 212, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 157, 16, 150, 16, 213, 150, 150, 16, 16, 16, 214, 150, 150, 150, 150, - 215, 86, 216, 217, 218, 219, 4, 4, 4, 220, 4, 4, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 221, 86, 103, 86, 222, - 223, 224, 225, 4, 226, 227, 228, 229, 86, 230, 231, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 232, +/* Script. */ +static RE_UINT8 re_script_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 21, 21, 34, 35, 21, 21, + 21, 36, 21, 21, 21, 21, 21, 21, 21, 21, 37, 38, 39, 39, 39, 39, + 39, 40, 41, 42, 21, 21, 21, 21, 21, 21, 21, 21, 43, 21, 21, 44, + 21, 21, 21, 21, 45, 46, 47, 21, 48, 21, 49, 50, 51, 52, 53, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 54, 13, 13, 13, 55, 56, 13, + 13, 13, 13, 57, 13, 13, 13, 13, 13, 13, 58, 21, 21, 21, 59, 21, + 13, 13, 13, 13, 60, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 61, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21 +}; + +static RE_UINT16 re_script_table_2[] = { + 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 5, 0, 6, 7, 7, 7, 8, 9, 10, 11, 12, + 13, 13, 13, 13, 14, 13, 13, 13, 13, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 23, 23, 26, 23, 27, 28, 29, 23, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 38, 84, 85, 86, 38, 87, 87, 88, 89, 90, 91, 92, 38, + 93, 93, 93, 93, 93, 94, 95, 96, 97, 97, 97, 97, 97, 97, 97, 97, + 98, 98, 99, 98, 100, 101, 102, 98, 103, 98, 104, 105, 106, 107, 107, 108, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 110, 111, 111, 112, 113, 114, 115, 116, 117, 117, 118, 119, + 120, 121, 121, 122, 121, 123, 109, 124, 125, 126, 127, 128, 129, 130, 131, 117, + 132, 133, 134, 135, 136, 137, 138, 38, 139, 139, 140, 141, 142, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 4, 153, 154, 155, 4, 156, 7, 157, + 4, 4, 4, 4, 4, 4, 4, 4, 158, 11, 159, 160, 11, 161, 162, 163, + 164, 0, 0, 165, 166, 0, 167, 168, 0, 169, 170, 4, 171, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 172, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 174, 174, 174, 174, 174, 174, 174, 174, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 176, 0, 0, 0, + 177, 178, 179, 4, 180, 180, 180, 181, 94, 182, 183, 184, 185, 186, 186, 13, + 0, 0, 187, 38, 188, 189, 189, 190, 189, 189, 189, 189, 189, 189, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 97, 97, 203, 204, 0, 205, + 206, 0, 0, 207, 0, 0, 208, 209, 199, 199, 210, 0, 0, 0, 0, 0, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 0, 0, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 211, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 213, 212, 214, 215, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 217, 13, 13, 13, 218, 218, 219, 0, 220, 4, 4, 221, 4, 222, 223, + 224, 225, 226, 227, 228, 228, 229, 42, 230, 231, 232, 233, 234, 234, 235, 236, + 237, 238, 239, 93, 240, 240, 241, 242, 243, 244, 245, 246, 107, 107, 247, 248, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 249, 250, 251, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 252, 189, 189, 253, 38, 254, 255, 256, 23, 23, 23, 257, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 258, 259, 23, 260, 23, 261, 262, + 263, 264, 265, 266, 23, 23, 23, 267, 268, 1, 1, 269, 270, 206, 271, 272, + 273, 274, 275, 38, 276, 276, 276, 277, 278, 279, 11, 11, 280, 281, 282, 283, + 38, 38, 38, 38, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 38, + 295, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 38, 38, 38, 38, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 307, 308, 309, 38, 38, 38, 38, + 310, 311, 312, 313, 314, 315, 38, 316, 317, 318, 38, 38, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 38, 328, 329, 330, 331, 332, 333, 334, 335, 38, 38, + 336, 336, 337, 38, 338, 339, 338, 340, 341, 342, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 343, 344, 345, 38, 38, 346, 347, 348, 38, 38, 349, 350, 351, + 352, 352, 353, 354, 355, 355, 356, 357, 358, 359, 360, 361, 362, 362, 362, 363, + 364, 365, 38, 38, 366, 367, 368, 369, 370, 371, 372, 373, 38, 38, 38, 38, + 374, 374, 375, 376, 377, 377, 378, 38, 38, 38, 38, 38, 379, 380, 381, 38, + 382, 382, 383, 384, 385, 386, 387, 38, 388, 389, 38, 38, 38, 38, 38, 38, + 390, 391, 38, 38, 38, 392, 392, 393, 394, 395, 396, 38, 38, 397, 398, 399, + 400, 400, 401, 402, 402, 403, 404, 405, 38, 38, 38, 38, 38, 38, 38, 38, + 406, 407, 408, 409, 410, 411, 38, 38, 412, 413, 414, 415, 416, 417, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 418, 38, 38, 38, 38, 38, 419, 420, 421, + 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, + 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 423, 38, 38, 38, + 422, 422, 422, 424, 422, 422, 422, 422, 422, 422, 425, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + 426, 427, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 429, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, + 218, 430, 431, 432, 38, 38, 433, 434, 435, 435, 436, 437, 438, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 439, 439, 440, 38, 38, 38, 441, 441, 442, 441, 443, 38, 38, 444, + 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, + 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, + 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, + 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 446, + 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, + 445, 445, 445, 445, 445, 445, 445, 445, 447, 447, 447, 447, 447, 447, 447, 447, + 447, 447, 447, 447, 447, 447, 448, 38, 449, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 450, 196, 196, 196, 196, 196, 196, 196, 451, 38, 452, 453, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 455, 38, 38, 38, 38, 38, 38, 38, 38, + 456, 456, 456, 457, 458, 459, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 0, 0, 0, 0, 0, 0, 0, 460, 0, 461, 0, 462, 463, 464, 0, 465, + 11, 11, 466, 38, 38, 38, 38, 467, 0, 0, 468, 469, 38, 38, 38, 38, + 0, 0, 470, 0, 471, 472, 473, 0, 474, 475, 476, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 477, 0, 0, 0, 0, 0, 0, 0, 0, 478, 0, + 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, + 479, 479, 479, 479, 480, 481, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 482, 483, 38, 38, 38, 38, 38, 38, 484, 485, 486, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 487, 488, 38, 38, 38, 38, 38, 38, 38, 38, + 489, 489, 489, 489, 489, 489, 490, 38, 491, 491, 492, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 493, 0, 494, 38, 38, 268, 495, 38, 38, 38, 38, 38, 38, + 496, 497, 498, 499, 500, 501, 38, 502, 38, 38, 38, 38, 38, 38, 38, 38, + 0, 503, 0, 0, 467, 504, 505, 460, 0, 0, 0, 0, 0, 506, 38, 507, + 508, 509, 510, 511, 38, 38, 38, 38, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 512, 513, 0, 0, 0, 467, 0, 0, 469, 514, + 503, 0, 515, 0, 516, 517, 38, 38, 0, 0, 0, 518, 0, 0, 519, 0, + 0, 0, 467, 520, 521, 522, 523, 38, 0, 0, 0, 0, 265, 0, 173, 524, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 525, 38, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 526, 189, 189, 189, 189, 189, 189, + 525, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 527, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 528, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 525, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 529, 38, 38, 38, 38, 38, + 530, 0, 0, 0, 38, 38, 38, 38, 7, 7, 7, 7, 7, 7, 7, 531, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38 +}; + +static RE_UINT8 re_script_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 232, - 233, 233, 233, 233, 7, 7, 7, 234, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, -}; - -static RE_UINT8 re_bidi_class_stage_3[] = { - 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 8, 9, 7, 8, 8, 10, - 11, 0, 0, 0, 12, 13, 14, 15, 8, 8, 16, 8, 8, 8, 16, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 17, - 18, 19, 18, 19, 20, 21, 19, 19, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 23, 24, 25, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 24, 8, 26, 27, 8, 8, 8, 8, 8, 8, - 8, 28, 29, 22, 22, 22, 22, 30, 31, 32, 32, 32, 32, 32, 32, 32, - 33, 34, 22, 35, 36, 36, 36, 36, 36, 37, 22, 22, 38, 39, 40, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 42, 43, 44, 5, 45, - 36, 36, 46, 36, 36, 36, 22, 22, 22, 35, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 41, 22, 40, 36, 32, 32, 32, 32, 32, 47, 48, 49, - 32, 32, 50, 51, 52, 53, 32, 32, 32, 32, 32, 54, 36, 36, 32, 32, - 32, 32, 32, 32, 36, 36, 36, 36, 36, 36, 37, 22, 55, 22, 22, 22, - 56, 8, 8, 8, 8, 8, 8, 57, 58, 59, 58, 8, 60, 8, 8, 8, - 61, 8, 8, 8, 8, 8, 8, 62, 63, 64, 8, 8, 60, 8, 65, 66, - 67, 8, 8, 8, 8, 8, 8, 62, 68, 69, 61, 8, 8, 8, 70, 8, - 71, 59, 8, 8, 60, 8, 72, 73, 61, 8, 8, 8, 8, 8, 8, 74, - 63, 64, 75, 8, 60, 8, 8, 8, 76, 8, 8, 8, 8, 8, 8, 8, - 77, 64, 8, 8, 8, 8, 9, 78, 79, 8, 8, 8, 8, 8, 8, 80, - 81, 82, 83, 8, 60, 8, 8, 84, 8, 85, 8, 8, 60, 8, 8, 8, - 27, 8, 8, 8, 8, 8, 8, 86, 63, 64, 8, 8, 60, 8, 8, 8, - 8, 76, 87, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 88, 89, - 90, 91, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 88, 92, - 8, 93, 8, 8, 8, 8, 8, 8, 8, 8, 8, 27, 8, 8, 94, 95, - 8, 8, 8, 8, 8, 8, 58, 91, 96, 97, 22, 58, 22, 22, 22, 92, - 75, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 97, 98, 99, - 8, 8, 8, 100, 77, 8, 63, 8, 101, 64, 8, 64, 8, 8, 8, 8, - 8, 8, 8, 97, 8, 8, 8, 8, 8, 8, 19, 102, 8, 8, 8, 8, - 7, 8, 8, 8, 8, 8, 8, 8, 103, 8, 8, 104, 8, 8, 8, 8, - 8, 8, 105, 8, 8, 8, 105, 8, 8, 8, 60, 8, 8, 8, 60, 8, - 8, 8, 8, 8, 8, 8, 106, 93, 75, 58, 107, 108, 8, 8, 19, 102, - 19, 109, 8, 8, 8, 8, 8, 8, 83, 8, 8, 8, 8, 61, 8, 8, - 8, 8, 8, 8, 110, 77, 76, 111, 112, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 113, 19, 19, 19, 19, 8, 8, 90, 114, 8, 8, 8, 8, - 8, 8, 75, 91, 115, 92, 26, 116, 8, 8, 8, 8, 8, 8, 22, 91, - 107, 8, 8, 8, 8, 8, 117, 118, 76, 8, 8, 8, 8, 26, 107, 8, - 27, 8, 8, 8, 119, 120, 8, 8, 8, 8, 8, 8, 75, 121, 27, 8, - 8, 8, 8, 8, 8, 122, 123, 8, 8, 8, 124, 22, 98, 59, 62, 27, - 22, 22, 22, 22, 22, 22, 22, 125, 8, 8, 8, 8, 8, 8, 8, 126, - 102, 20, 8, 20, 8, 20, 8, 127, 128, 129, 19, 19, 19, 130, 131, 19, - 132, 19, 19, 133, 134, 135, 136, 137, 5, 137, 8, 8, 138, 138, 138, 138, - 138, 138, 22, 22, 22, 22, 77, 8, 139, 102, 140, 141, 142, 143, 8, 144, - 145, 146, 19, 19, 8, 8, 8, 8, 8, 147, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 148, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 149, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 19, 19, 150, 19, 19, 19, 19, 19, 19, 19, 19, 19, 84, 8, 8, 8, - 19, 151, 8, 8, 19, 19, 19, 19, 19, 5, 5, 152, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 18, 19, 19, 19, 19, 19, 19, 19, 153, 19, 19, - 19, 19, 19, 19, 19, 19, 154, 19, 19, 19, 149, 19, 19, 19, 19, 19, - 8, 8, 8, 8, 20, 155, 27, 156, 8, 8, 8, 8, 8, 8, 8, 90, - 8, 8, 8, 8, 22, 22, 22, 22, 19, 19, 8, 8, 8, 8, 8, 8, - 19, 19, 19, 157, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 158, 8, - 19, 19, 149, 8, 8, 8, 19, 158, 159, 19, 19, 19, 7, 119, 141, 20, - 8, 8, 8, 160, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 161, - 19, 19, 19, 19, 158, 8, 8, 8, 8, 8, 8, 127, 8, 8, 8, 8, - 8, 8, 19, 19, 8, 8, 8, 162, 8, 8, 8, 8, 8, 8, 156, 19, - 8, 163, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16, 151, - 8, 8, 8, 113, 8, 8, 8, 16, 8, 8, 19, 19, 19, 19, 19, 19, - 84, 8, 8, 8, 8, 8, 8, 8, 8, 20, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 90, 164, 165, 8, 8, 8, 80, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 27, 8, 19, 19, 19, 19, 102, 8, 8, 8, - 8, 7, 8, 8, 8, 8, 8, 8, 166, 167, 8, 8, 83, 158, 8, 168, - 8, 8, 8, 8, 8, 8, 163, 8, 85, 8, 8, 8, 22, 22, 27, 90, - 8, 8, 8, 8, 80, 93, 8, 8, 90, 22, 27, 8, 8, 8, 8, 8, - 56, 8, 8, 8, 8, 8, 169, 170, 8, 8, 8, 8, 64, 8, 8, 8, - 8, 8, 8, 8, 8, 171, 99, 8, 167, 62, 8, 8, 8, 8, 8, 62, - 8, 8, 8, 8, 8, 8, 172, 81, 61, 8, 8, 8, 8, 85, 75, 8, - 8, 8, 8, 8, 64, 59, 8, 8, 8, 8, 8, 173, 32, 174, 32, 32, - 32, 32, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 175, - 36, 36, 0, 0, 0, 0, 36, 176, 22, 22, 19, 102, 22, 22, 19, 19, - 19, 19, 177, 178, 179, 180, 36, 36, 36, 36, 36, 36, 36, 36, 36, 181, - 182, 4, 5, 6, 7, 8, 8, 9, 7, 8, 8, 9, 149, 8, 8, 8, - 8, 8, 8, 8, 183, 84, 0, 184, 185, 8, 8, 8, 8, 8, 8, 8, - 19, 145, 19, 158, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 64, - 8, 8, 8, 8, 186, 5, 5, 152, 8, 8, 8, 8, 8, 8, 80, 56, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 187, 32, 32, 32, 32, - 188, 189, 32, 32, 32, 32, 32, 190, 32, 32, 32, 32, 191, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 192, 36, 36, 36, 36, 193, 36, 38, 194, - 32, 32, 32, 32, 38, 38, 38, 195, 32, 32, 32, 32, 32, 32, 36, 36, - 41, 22, 40, 36, 36, 36, 32, 32, 61, 8, 8, 8, 8, 8, 8, 22, - 91, 8, 18, 19, 149, 8, 8, 90, 27, 8, 8, 8, 8, 8, 196, 67, - 56, 8, 8, 8, 90, 197, 92, 8, 8, 8, 8, 8, 8, 8, 167, 8, - 27, 8, 8, 8, 8, 8, 80, 91, 8, 63, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 90, 198, 75, 8, 8, 8, 90, 26, 56, 8, 8, - 77, 8, 8, 8, 80, 92, 92, 8, 8, 8, 8, 8, 8, 8, 8, 22, - 87, 8, 8, 75, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 26, 199, - 200, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 119, 106, - 77, 8, 8, 85, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 26, 201, - 77, 8, 8, 8, 19, 145, 8, 8, 8, 8, 8, 8, 8, 202, 203, 8, - 8, 8, 8, 97, 204, 107, 8, 8, 8, 8, 8, 8, 8, 90, 22, 67, - 8, 8, 122, 60, 77, 8, 8, 8, 171, 67, 8, 8, 8, 8, 26, 205, - 90, 8, 171, 111, 8, 8, 8, 8, 8, 73, 91, 27, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 91, 93, 8, 8, 73, 22, 22, 73, 206, 8, - 8, 8, 8, 8, 8, 8, 171, 207, 203, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 121, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 86, 8, - 8, 8, 20, 208, 209, 19, 102, 8, 8, 8, 8, 8, 8, 8, 92, 8, - 8, 8, 8, 8, 8, 8, 91, 8, 8, 90, 8, 8, 8, 8, 8, 8, - 8, 90, 56, 8, 8, 8, 8, 8, 8, 8, 8, 8, 210, 8, 8, 8, - 8, 8, 8, 83, 211, 8, 8, 8, 8, 8, 8, 8, 90, 27, 212, 213, - 214, 107, 8, 8, 8, 119, 8, 8, 215, 8, 8, 8, 8, 8, 8, 8, - 19, 19, 84, 8, 8, 8, 8, 8, 8, 8, 8, 161, 8, 8, 8, 8, - 8, 8, 216, 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, - 8, 185, 8, 8, 8, 8, 8, 8, 161, 217, 5, 5, 5, 5, 5, 5, - 22, 22, 22, 22, 22, 22, 91, 26, 22, 22, 22, 22, 22, 92, 64, 8, - 62, 8, 8, 26, 58, 22, 8, 8, 91, 22, 22, 218, 219, 56, 8, 8, - 8, 8, 8, 8, 8, 122, 8, 220, 32, 32, 221, 32, 32, 32, 32, 32, - 189, 222, 32, 32, 32, 32, 32, 32, 36, 36, 32, 32, 32, 32, 32, 32, - 36, 36, 36, 36, 36, 36, 223, 36, 19, 19, 19, 19, 19, 158, 19, 19, - 19, 19, 158, 8, 19, 84, 156, 19, 156, 19, 156, 19, 19, 19, 149, 8, - 5, 224, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 225, 8, 8, - 8, 8, 8, 8, 149, 8, 8, 8, 19, 19, 149, 8, 19, 145, 19, 151, - 19, 19, 19, 7, 19, 158, 8, 8, 19, 158, 19, 19, 19, 19, 19, 19, - 19, 8, 19, 102, 19, 19, 19, 19, 19, 8, 19, 19, 19, 149, 8, 8, - 19, 153, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 139, 18, - 19, 19, 19, 19, 226, 227, 19, 19, 19, 226, 19, 19, 19, 19, 19, 19, - 19, 19, 158, 8, 19, 149, 158, 151, 151, 8, 149, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 228, 0, 0, 0, 0, 0, 0, 0, 0, - 22, 22, 22, 22, 22, 22, 0, 0, -}; - -static RE_UINT8 re_bidi_class_stage_4[] = { - 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 7, 8, 9, 7, 11, 11, - 11, 11, 11, 11, 7, 7, 7, 8, 9, 10, 10, 4, 4, 4, 10, 10, - 10, 10, 10, 3, 6, 3, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 6, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, - 0, 0, 0, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 7, 11, 11, - 6, 10, 4, 4, 4, 4, 10, 10, 10, 10, 0, 10, 10, 11, 10, 10, - 4, 4, 2, 2, 10, 0, 10, 10, 10, 2, 0, 10, 10, 10, 10, 10, - 0, 0, 0, 0, 0, 0, 0, 10, 0, 10, 10, 0, 0, 0, 0, 0, - 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, - 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 10, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 10, 10, 0, 10, - 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 10, 10, 4, 1, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 1, 12, 1, 12, 12, 1, 12, 12, 1, 12, - 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 10, 10, - 13, 4, 4, 13, 6, 13, 10, 10, 12, 12, 12, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 13, 13, 13, - 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, - 12, 12, 12, 12, 12, 5, 10, 12, 12, 12, 12, 12, 12, 13, 13, 12, - 12, 10, 12, 12, 12, 12, 13, 13, 2, 2, 13, 13, 13, 13, 13, 13, - 13, 12, 13, 13, 13, 13, 13, 13, 1, 1, 1, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 1, 1, 10, 10, 10, 10, 1, 1, 1, 12, 1, 1, - 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 1, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 1, 12, 12, 12, 1, 12, 12, 12, 12, 12, 1, 1, - 1, 12, 12, 12, 1, 1, 1, 1, 12, 12, 5, 12, 12, 12, 12, 12, - 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, - 0, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 12, 0, 0, - 0, 0, 12, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 12, 12, 12, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 12, 0, 0, 12, 12, 0, 0, 0, 0, 0, - 0, 12, 12, 0, 0, 0, 0, 12, 12, 0, 0, 12, 12, 12, 0, 0, - 12, 12, 0, 0, 0, 12, 0, 0, 0, 12, 12, 12, 12, 12, 0, 12, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, - 0, 0, 0, 0, 12, 0, 0, 12, 0, 0, 0, 0, 0, 0, 12, 0, - 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 10, 4, 10, 0, 0, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, 0, 0, 12, 12, - 12, 0, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 12, 12, 0, - 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 12, 12, 0, 0, - 0, 0, 0, 12, 12, 0, 0, 0, 0, 0, 12, 12, 12, 0, 12, 0, - 0, 12, 0, 0, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 0, - 12, 12, 12, 12, 12, 0, 0, 0, 12, 12, 12, 12, 12, 12, 0, 0, - 0, 0, 0, 0, 0, 12, 0, 12, 0, 12, 10, 10, 10, 10, 0, 0, - 12, 12, 12, 12, 12, 0, 12, 12, 0, 0, 0, 0, 0, 12, 12, 12, - 12, 0, 12, 12, 12, 12, 12, 12, 0, 12, 12, 0, 0, 12, 12, 0, - 12, 12, 0, 0, 0, 0, 12, 12, 0, 0, 12, 0, 0, 12, 12, 0, - 10, 10, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, - 0, 0, 0, 0, 12, 12, 0, 12, 12, 12, 12, 12, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 12, 0, 0, 10, 10, 10, 12, 12, 12, 11, 0, - 12, 12, 12, 0, 0, 0, 0, 12, 0, 12, 12, 12, 0, 0, 0, 0, - 10, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, - 12, 0, 0, 12, 0, 0, 0, 0, 12, 0, 12, 0, 0, 12, 12, 12, - 12, 12, 12, 12, 12, 0, 0, 12, 0, 0, 0, 0, 12, 0, 12, 12, - 12, 12, 12, 0, 12, 0, 0, 0, 0, 0, 12, 12, 12, 12, 0, 0, - 12, 12, 0, 12, 12, 12, 0, 0, 12, 12, 0, 0, 0, 12, 0, 12, - 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 12, 12, - 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, 0, 12, 12, 12, 12, 12, - 0, 0, 0, 0, 0, 10, 0, 10, 0, 0, 0, 0, 0, 10, 10, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 0, 1, - 9, 7, 16, 17, 18, 14, 15, 6, 4, 4, 4, 4, 4, 10, 10, 10, - 10, 10, 10, 10, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, - 11, 11, 11, 11, 11, 11, 19, 20, 21, 22, 11, 11, 11, 11, 11, 11, - 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 3, 3, 10, 10, 10, 0, - 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 0, 10, 10, 10, 10, 0, - 0, 0, 0, 0, 10, 0, 10, 10, 10, 0, 0, 0, 0, 0, 10, 10, - 10, 10, 10, 10, 0, 10, 0, 10, 0, 10, 0, 0, 0, 0, 4, 0, - 0, 0, 10, 10, 0, 0, 0, 0, 10, 10, 10, 10, 10, 0, 0, 0, - 0, 0, 10, 10, 10, 10, 0, 0, 0, 10, 10, 10, 0, 0, 0, 0, - 10, 10, 3, 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, - 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 0, 0, 0, 0, 10, 10, 10, 10, 0, 10, 10, 10, - 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 12, - 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 0, 0, 0, 0, 9, 10, 10, 10, 10, 0, 0, 0, - 0, 12, 12, 10, 10, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, 0, 0, 10, 10, 10, 10, - 12, 12, 12, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, - 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 0, 12, 0, 0, 0, 0, - 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 12, 12, - 12, 12, 0, 0, 12, 12, 0, 0, 0, 12, 12, 12, 12, 12, 12, 0, - 12, 0, 12, 12, 12, 0, 0, 12, 0, 0, 0, 0, 0, 1, 12, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 10, 10, - 13, 13, 13, 13, 13, 10, 13, 13, 6, 10, 6, 0, 10, 6, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 4, 10, 10, 3, 3, 10, 10, 10, 0, - 10, 4, 4, 10, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 11, - 0, 10, 10, 4, 4, 4, 10, 10, 4, 4, 10, 10, 10, 4, 4, 0, - 11, 10, 10, 10, 10, 10, 11, 11, 0, 10, 0, 0, 0, 0, 0, 0, - 12, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 10, - 1, 12, 12, 12, 1, 12, 12, 1, 1, 1, 1, 1, 12, 12, 12, 12, - 12, 12, 12, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 12, 12, 1, - 1, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 12, 12, 12, 12, - 5, 5, 13, 13, 13, 13, 13, 13, 5, 5, 5, 5, 5, 5, 5, 1, - 0, 0, 0, 12, 12, 12, 12, 0, 12, 12, 12, 12, 0, 12, 12, 12, - 12, 12, 0, 0, 12, 0, 12, 12, 12, 0, 12, 0, 0, 0, 0, 12, - 12, 0, 12, 12, 0, 0, 0, 0, 12, 12, 12, 0, 0, 12, 0, 12, - 0, 0, 0, 12, 0, 12, 0, 0, 12, 12, 12, 12, 12, 12, 0, 12, - 0, 0, 12, 12, 12, 12, 0, 12, 12, 0, 0, 12, 12, 12, 12, 0, - 12, 0, 12, 12, 0, 12, 12, 0, 0, 0, 12, 0, 12, 12, 0, 12, - 10, 10, 10, 10, 10, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, - 0, 0, 10, 0, 0, 0, 0, 0, 11, 11, 11, 11, 0, 0, 0, 0, - 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, - 12, 12, 12, 0, 0, 12, 12, 12, 10, 10, 12, 12, 12, 10, 0, 0, - 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, - 12, 0, 0, 12, 12, 12, 12, 12, 12, 12, 0, 12, 12, 0, 12, 12, - 0, 0, 0, 0, 0, 0, 0, 4, 12, 12, 12, 12, 12, 12, 12, 1, - 12, 12, 12, 1, 1, 1, 1, 1, 10, 10, 13, 13, 13, 13, 13, 13, - 2, 2, 2, 10, 10, 0, 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, - 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, 0, 0, 0, 10, 10, - 0, 0, 0, 0, 0, 0, 11, 11, -}; - -/* Bidi_Class: 5072 bytes. */ - -RE_UINT32 re_get_bidi_class(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_bidi_class_stage_1[f] << 6; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_bidi_class_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_bidi_class_stage_3[pos + f] << 3; - value = re_bidi_class_stage_4[pos + code]; - - return value; -} - -/* Canonical_Combining_Class. */ - -static RE_UINT8 re_canonical_combining_class_stage_1[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 6, - 7, 8, 4, 4, 4, 4, 9, 4, 4, 4, 4, 10, 4, 11, 12, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static RE_UINT8 re_canonical_combining_class_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, - 0, 0, 3, 0, 0, 0, 4, 5, 6, 7, 0, 8, 9, 10, 0, 11, - 12, 13, 0, 14, 15, 16, 15, 17, 15, 18, 15, 18, 15, 18, 0, 18, - 0, 19, 15, 18, 20, 18, 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 34, - 0, 0, 35, 0, 36, 0, 0, 0, 37, 38, 39, 0, 40, 41, 42, 43, - 44, 0, 0, 45, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 48, 0, 49, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, - 51, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 1, 5, 5, 5, 0, 0, 5, 5, 5, 5, 1, 5, + 0, 0, 0, 0, 5, 1, 5, 1, 5, 5, 5, 0, 5, 0, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 0, 0, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 8, 8, 8, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 1, 10, 10, 10, 10, 10, 10, 1, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 10, 0, 10, 1, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 4, 4, 4, 4, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 1, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, + 17, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, + 17, 0, 17, 0, 0, 0, 17, 17, 17, 17, 0, 0, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 0, 0, 17, 17, 0, 0, 17, 17, 17, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 17, 17, 0, 17, + 17, 17, 17, 17, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, + 0, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 18, + 18, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, + 18, 0, 18, 18, 0, 18, 18, 0, 18, 18, 0, 0, 18, 0, 18, 18, + 18, 18, 18, 0, 0, 0, 0, 18, 18, 0, 0, 18, 18, 18, 0, 0, + 0, 18, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, + 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, + 19, 0, 19, 19, 0, 19, 19, 19, 19, 19, 0, 0, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 0, 19, 19, 19, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 19, 19, 19, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, + 0, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 20, + 20, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, + 20, 0, 20, 20, 0, 20, 20, 20, 20, 20, 0, 0, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 0, 0, 20, 20, 0, 0, 20, 20, 20, 0, 0, + 0, 0, 0, 0, 0, 20, 20, 20, 0, 0, 0, 0, 20, 20, 0, 20, + 20, 20, 20, 20, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 21, 0, 21, 21, 21, 21, 21, 21, 0, 0, 0, 21, 21, + 21, 0, 21, 21, 21, 21, 0, 0, 0, 21, 21, 0, 21, 0, 21, 21, + 0, 0, 0, 21, 21, 0, 0, 0, 21, 21, 21, 0, 0, 0, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 21, 21, + 21, 21, 21, 0, 0, 0, 21, 21, 21, 0, 21, 21, 21, 21, 0, 0, + 21, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, + 22, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, 22, 22, 22, + 22, 22, 22, 22, 22, 0, 22, 22, 22, 0, 22, 22, 22, 22, 0, 0, + 0, 0, 0, 0, 0, 22, 22, 0, 22, 22, 22, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, + 23, 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 0, 0, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 0, 23, 23, 23, 0, 23, 23, 23, 23, 0, 0, + 0, 0, 0, 0, 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 23, 0, + 23, 23, 23, 23, 0, 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, + 24, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 0, 24, 24, 24, 0, 24, 24, 24, 24, 24, 24, + 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 0, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 0, 0, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 0, 0, 0, 0, 25, + 25, 25, 25, 25, 25, 0, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, + 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 0, 0, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 1, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, + 0, 27, 27, 0, 27, 0, 27, 27, 27, 27, 27, 0, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 0, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 27, 27, 27, 27, 27, 0, 27, 0, 27, 27, 27, 27, 27, 27, 0, 0, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, + 0, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, + 28, 28, 28, 28, 28, 1, 1, 1, 1, 28, 28, 0, 0, 0, 0, 0, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 0, 30, 0, 0, 0, 0, 0, 30, 0, 0, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 1, 30, 30, 30, 30, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 0, 32, 32, 32, 32, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 0, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 32, 0, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 0, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 0, 0, 33, 33, 33, 33, 33, 33, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 1, 1, 1, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, 37, 37, + 37, 37, 37, 37, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 40, 40, + 40, 0, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, + 42, 42, 1, 1, 42, 1, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, 0, + 43, 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, + 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 45, 45, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 46, 46, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 51, 51, 51, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 30, 30, 30, + 49, 49, 49, 49, 49, 49, 49, 49, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 1, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 4, 1, 1, + 1, 1, 1, 1, 4, 1, 1, 1, 4, 4, 1, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, + 5, 5, 2, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 0, 5, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, + 30, 30, 30, 30, 30, 30, 0, 30, 0, 0, 0, 0, 0, 30, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 56, 1, 56, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 56, 56, 56, 56, 56, 56, 56, 56, 56, 4, 4, 4, 4, 31, 31, + 1, 1, 1, 1, 1, 1, 1, 1, 56, 56, 56, 56, 1, 1, 1, 1, + 0, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 0, 0, 4, 4, 1, 1, 57, 57, 57, + 1, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 1, 1, 58, 58, 58, + 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 1, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 1, 1, 1, 1, 1, 1, 1, 1, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 0, 0, 0, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 0, 0, 0, 0, 0, 0, 0, 0, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 0, 0, 0, 0, 0, 0, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 1, 66, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 1, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 68, 68, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 0, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 0, 69, 69, 69, 69, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 32, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 0, + 0, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, + 31, 31, 31, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, 0, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 0, + 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 55, 0, 0, 0, 0, - 56, 0, 0, 57, 58, 59, 60, 61, 0, 0, 62, 63, 0, 0, 0, 64, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 1, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 1, 1, + 0, 0, 31, 31, 31, 31, 31, 31, 0, 0, 31, 31, 31, 31, 31, 31, + 0, 0, 31, 31, 31, 31, 31, 31, 0, 0, 31, 31, 31, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 0, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 72, 72, 0, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, - 0, 74, 75, 0, 76, 60, 0, 77, 78, 0, 0, 79, 80, 81, 0, 0, - 0, 82, 0, 83, 0, 0, 49, 84, 49, 0, 85, 0, 86, 0, 0, 0, - 75, 0, 0, 0, 0, 0, 0, 87, 88, 89, 90, 0, 0, 0, 0, 0, - 49, 0, 0, 0, 0, 91, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0, 0, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 0, 0, 0, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 75, 75, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 0, 0, 0, 0, 0, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 78, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 0, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 0, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 87, 87, 87, 87, 87, 0, 0, 87, 0, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 0, 87, 87, 0, 0, 0, 87, 0, 0, 87, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 0, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, + 0, 0, 0, 0, 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 0, 91, 91, 0, 0, 0, 0, 0, 91, 91, 91, 91, 91, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 92, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 0, 0, 0, 0, 0, 93, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 96, 96, 96, 96, 0, 96, 96, 0, 0, 0, 0, 0, 96, 96, 96, 96, + 96, 96, 96, 96, 0, 96, 96, 96, 0, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 0, 0, 96, 96, 96, 0, 0, 0, 0, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 0, 0, 0, 0, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 0, 0, 0, 100, 100, 100, 100, 100, 100, 100, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 0, 0, 101, 101, 101, 101, 101, 101, 101, 101, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 0, 0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 0, 0, 0, 0, 0, 0, 0, 103, 103, 103, 103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 103, 103, 103, 103, 103, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 107, 0, 0, + 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 0, 0, + 0, 0, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 0, 0, 0, 0, 0, 0, 0, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 0, 0, 0, 0, 0, 0, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 0, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 0, + 119, 119, 119, 119, 119, 119, 119, 0, 119, 0, 119, 119, 119, 119, 0, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 0, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 0, 0, 0, 0, 0, 0, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 0, 0, 0, 0, 0, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 0, 0, 0, 0, 0, 0, + 121, 121, 121, 121, 0, 121, 121, 121, 121, 121, 121, 121, 121, 0, 0, 121, + 121, 0, 0, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 0, 121, 121, 121, 121, 121, 121, + 121, 0, 121, 121, 0, 121, 121, 121, 121, 121, 0, 4, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 0, 0, 121, 121, 0, 0, 121, 121, 121, 0, 0, + 121, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 121, 121, 121, + 121, 121, 121, 121, 0, 0, 121, 121, 121, 121, 121, 121, 121, 0, 0, 0, + 121, 121, 121, 121, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 0, 122, 122, 122, + 122, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, 0, 0, 0, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, 0, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 0, 0, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 0, 0, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 0, 0, 0, 0, 0, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 0, 0, 0, 0, 0, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 0, 0, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 130, 130, 130, 130, 130, 130, 0, 0, 130, 0, 0, 130, 130, 130, 130, + 130, 130, 130, 130, 0, 130, 130, 0, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 0, 130, 130, 0, 0, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0, + 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 0, 0, 0, 0, 0, 0, 0, 0, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 0, 0, 0, 0, 0, 0, 0, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 0, 0, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 0, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 137, 137, 137, 137, 137, 137, 137, 0, 137, 137, 0, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 137, 0, 137, 137, 0, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 0, 0, 0, 0, 0, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 0, 0, 0, + 138, 138, 138, 138, 138, 138, 0, 138, 138, 0, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, + 138, 138, 0, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, 0, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, + 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 0, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 0, 0, 0, 0, 0, 0, 0, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, 0, 0, 0, 143, 143, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, + 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 145, 145, 145, 145, 145, + 145, 145, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 0, 0, 0, 0, 0, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, 0, 0, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, 0, 0, 0, 0, 0, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 148, 149, 1, 1, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, 0, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 58, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 94, 0, 0, 0, + 57, 57, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 58, 58, 58, 58, 0, 0, 0, 0, 0, 0, 0, 0, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, 0, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 151, 151, 151, 151, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, + 4, 4, 4, 1, 1, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 152, 152, 152, 152, + 0, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, + 54, 54, 0, 54, 54, 0, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, 0, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, 0, 0, 153, 153, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 0, 0, 0, 0, 0, 154, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 0, 0, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 0, 0, 0, 0, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 0, 0, 0, 0, 156, 156, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 10, 10, 0, 10, 0, 0, 10, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 10, 10, 10, 10, 0, 10, 0, 10, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 10, 0, 10, 0, 10, 0, 10, 10, 10, + 0, 10, 10, 0, 10, 0, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, + 0, 10, 10, 0, 10, 0, 0, 10, 10, 10, 10, 0, 10, 10, 10, 10, + 10, 10, 10, 0, 10, 10, 10, 10, 0, 10, 10, 10, 10, 0, 10, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 10, 10, 10, 0, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 96, 97, 0, 0, 98, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 57, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 101, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_canonical_combining_class_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 1, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 14, 15, 16, 17, 18, 19, 20, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 21, 0, 0, 0, 0, 0, 22, 23, 24, 0, 0, 25, 0, - 0, 0, 26, 27, 28, 29, 0, 0, 0, 0, 30, 0, 0, 0, 31, 32, - 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 35, 36, - 0, 0, 26, 37, 38, 39, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, - 0, 0, 41, 1, 42, 43, 44, 45, 0, 0, 0, 0, 0, 0, 0, 46, - 0, 47, 48, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 49, - 0, 47, 0, 0, 0, 0, 0, 0, 0, 47, 50, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 51, 0, 52, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 53, 0, 54, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 0, 56, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 57, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 60, 61, - 62, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 64, 65, 0, 36, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 67, 0, - 0, 0, 52, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 71, 72, 0, 0, 0, 0, - 0, 0, 0, 0, 73, 0, 66, 74, 0, 0, 0, 0, 0, 0, 75, 76, - 0, 0, 0, 0, 0, 0, 46, 0, 67, 0, 0, 0, 0, 77, 78, 0, - 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 80, 0, 79, 0, - 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 1, 1, 1, 90, 91, 0, 0, 92, 93, 94, 95, 96, 0, - 0, 0, 0, 0, 0, 71, 86, 0, 0, 0, 0, 0, 0, 0, 0, 97, - 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 98, 0, 0, - 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 100, 101, - 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, - 102, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 1, 1, 86, 0, - 0, 0, 0, 0, 0, 103, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 105, 0, 73, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 106, 107, 108, 0, 0, 0, 0, 0, 102, 0, - 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, - 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, - 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 112, - 0, 113, 0, 0, 0, 0, 0, 114, 0, 0, 0, 0, 115, 0, 0, 0, - 0, 0, 0, 0, 100, 0, 0, 0, 116, 117, 72, 0, 0, 0, 0, 0, - 102, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 118, - 112, 0, 0, 0, 0, 0, 51, 0, 73, 119, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 121, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 122, 0, 47, 0, 0, 26, 123, 123, 0, - 124, 0, 0, 49, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, - 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, - 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 67, 0, 97, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, - 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 132, 0, 0, 0, 0, - 0, 0, 0, 0, 133, 134, 135, 136, 137, 138, 0, 0, 0, 139, 0, 0, - 140, 0, 0, 0, 0, 0, 0, 0, 131, 1, 1, 141, 142, 112, 0, 0, - 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, - 100, 144, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_canonical_combining_class_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 51, 45, 45, 45, 45, 51, 43, 45, 45, 45, 45, - 45, 41, 41, 45, 45, 45, 45, 41, 41, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1, 1, 1, 1, 1, 45, 45, 45, 45, 50, 50, 50, - 50, 50, 50, 50, 50, 54, 50, 45, 45, 45, 50, 50, 50, 45, 45, 0, - 50, 50, 50, 45, 45, 45, 45, 50, 51, 45, 45, 50, 52, 53, 53, 52, - 53, 53, 52, 50, 50, 50, 50, 50, 0, 0, 0, 50, 50, 50, 50, 50, - 0, 45, 50, 50, 50, 50, 45, 50, 50, 50, 46, 45, 50, 50, 50, 50, - 50, 50, 45, 45, 45, 45, 45, 45, 50, 50, 45, 50, 50, 46, 49, 50, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 15, 16, 17, 0, 18, - 0, 19, 20, 0, 50, 45, 0, 13, 25, 26, 27, 0, 0, 0, 0, 0, - 0, 0, 0, 22, 23, 24, 25, 26, 27, 28, 29, 50, 50, 45, 45, 50, - 50, 50, 50, 50, 45, 50, 50, 45, 30, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 0, 0, 50, - 50, 50, 50, 45, 50, 0, 0, 50, 50, 0, 45, 50, 50, 45, 0, 0, - 0, 31, 0, 0, 0, 0, 0, 0, 50, 45, 50, 50, 45, 50, 50, 45, - 45, 45, 50, 45, 45, 50, 45, 50, 50, 50, 45, 50, 45, 50, 45, 50, - 45, 50, 50, 0, 0, 0, 0, 0, 50, 50, 45, 50, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 45, 0, 0, 50, 50, 0, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 0, 50, 50, 50, 0, 50, 50, 50, 50, 50, 0, 0, - 0, 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 45, 50, 50, 50, 50, - 50, 50, 0, 45, 50, 50, 45, 50, 50, 45, 50, 50, 50, 45, 45, 45, - 22, 23, 24, 50, 50, 50, 45, 50, 50, 45, 45, 50, 50, 50, 50, 50, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, - 0, 50, 45, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, - 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 4, 4, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 34, 34, 4, 0, 0, 0, 0, 0, - 35, 35, 35, 35, 0, 0, 0, 0, 36, 36, 4, 0, 0, 0, 0, 0, - 37, 37, 37, 37, 0, 0, 0, 0, 45, 45, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 45, 0, 45, 0, 43, 0, 0, 0, 0, 0, 0, - 0, 38, 39, 0, 40, 0, 0, 0, 0, 0, 39, 39, 39, 39, 0, 0, - 39, 0, 50, 50, 4, 0, 50, 50, 0, 0, 0, 0, 0, 0, 45, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50, 50, 50, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 50, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, - 0, 46, 50, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, - 45, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 50, 50, 50, 50, 50, 0, 0, 45, 50, 50, 50, 50, 50, 45, 45, 45, - 45, 45, 45, 50, 50, 45, 0, 0, 0, 0, 0, 50, 45, 50, 50, 50, - 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 50, 50, 50, 0, 1, 45, 45, 45, - 45, 45, 50, 50, 45, 45, 45, 45, 50, 0, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, - 50, 50, 0, 0, 0, 0, 0, 0, 50, 50, 45, 50, 50, 50, 50, 50, - 50, 50, 45, 50, 50, 53, 42, 45, 41, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 51, 49, 49, 45, 0, 50, 52, 45, 50, 45, - 50, 50, 1, 1, 50, 50, 50, 50, 1, 1, 1, 50, 50, 0, 0, 0, - 0, 50, 0, 0, 0, 1, 1, 50, 45, 50, 1, 1, 45, 45, 45, 45, - 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 44, 49, 51, 46, 47, 47, 0, 3, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 45, 45, 45, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 50, 0, 50, 50, 45, 0, 0, 50, 50, 0, 0, 0, 0, 0, 50, 50, - 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, - 50, 50, 50, 50, 50, 50, 50, 45, 45, 45, 45, 45, 45, 45, 50, 50, - 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 50, - 50, 1, 45, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 50, 45, 0, - 0, 0, 0, 0, 0, 0, 45, 45, 50, 50, 50, 45, 50, 45, 45, 45, - 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 2, 0, 0, 2, 4, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 2, 0, 0, 0, 50, 50, 50, 50, 50, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 4, 2, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 0, 0, - 1, 1, 1, 1, 1, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 43, 43, 1, - 1, 1, 0, 0, 0, 48, 43, 43, 43, 43, 43, 0, 0, 0, 0, 0, - 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 50, 50, 50, - 50, 50, 45, 45, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 0, 0, - 0, 0, 50, 50, 50, 0, 0, 0, 50, 0, 0, 50, 50, 50, 50, 50, - 50, 50, 0, 50, 50, 0, 50, 50, 45, 45, 45, 45, 45, 45, 45, 0, - 50, 50, 2, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_script(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -/* Canonical_Combining_Class: 3088 bytes. */ - -RE_UINT32 re_get_canonical_combining_class(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_canonical_combining_class_stage_1[f] << 6; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_canonical_combining_class_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_canonical_combining_class_stage_3[pos + f] << 3; - value = re_canonical_combining_class_stage_4[pos + code]; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -/* Decomposition_Type. */ + v = re_script_table_1[field_2]; + v = re_script_table_2[(v << 5) | field_1]; + v = re_script_table_3[(v << 5) | field_0]; -static RE_UINT8 re_decomposition_type_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 8, 9, 10, 10, 10, 10, 11, 7, 7, 7, 7, 12, - 7, 7, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 7, 7, 15, 16, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 17, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, -}; + return v; +} -static RE_UINT8 re_decomposition_type_stage_2[] = { - 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, - 11, 12, 0, 0, 0, 13, 14, 15, 0, 0, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 0, 28, 0, 0, 0, - 0, 29, 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 34, 0, - 0, 35, 36, 0, 0, 0, 0, 0, 0, 0, 37, 0, 38, 0, 39, 0, - 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 39, 0, 0, 0, 42, 0, - 0, 43, 0, 0, 0, 43, 44, 0, 45, 0, 46, 47, 48, 49, 0, 0, - 0, 50, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* Script_Extensions. */ +static RE_UINT8 script_extensions_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 21, 21, 34, 35, 21, 21, + 21, 36, 21, 21, 21, 21, 21, 21, 21, 21, 37, 38, 39, 39, 39, 39, + 39, 40, 41, 42, 21, 21, 21, 21, 21, 21, 21, 21, 43, 21, 21, 44, + 21, 21, 21, 21, 45, 46, 47, 21, 48, 21, 49, 50, 51, 52, 53, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 54, 13, 13, 13, 55, 56, 13, + 13, 13, 13, 57, 13, 13, 13, 13, 13, 13, 58, 21, 21, 21, 59, 21, + 13, 13, 13, 13, 60, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 61, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21 +}; +static RE_UINT16 script_extensions_table_2[] = { + 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 5, 0, 6, 7, 7, 8, 9, 10, 11, 12, 13, + 14, 14, 14, 14, 15, 14, 14, 14, 14, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 24, 24, 27, 24, 28, 29, 30, 24, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 39, 85, 86, 87, 39, 88, 88, 89, 90, 91, 92, 93, 39, + 94, 94, 95, 94, 94, 96, 97, 98, 99, 99, 99, 99, 99, 99, 99, 99, + 100, 100, 101, 100, 102, 103, 104, 100, 105, 100, 106, 107, 108, 109, 109, 110, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 112, 113, 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, + 122, 123, 123, 124, 123, 125, 111, 126, 127, 128, 129, 130, 131, 132, 133, 119, + 134, 135, 136, 137, 138, 139, 140, 39, 141, 141, 142, 143, 144, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 4, 155, 156, 157, 4, 158, 159, 160, + 4, 4, 4, 4, 4, 4, 4, 4, 161, 12, 162, 163, 12, 164, 165, 166, + 167, 168, 0, 169, 170, 0, 171, 172, 0, 173, 174, 4, 175, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 178, 178, 178, 178, 178, 178, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 180, 0, 0, 0, + 181, 182, 183, 4, 184, 184, 184, 185, 96, 186, 187, 188, 189, 190, 190, 14, + 0, 0, 191, 39, 192, 193, 193, 194, 193, 193, 193, 193, 193, 193, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 99, 99, 207, 208, 209, 210, + 211, 209, 212, 213, 209, 214, 215, 216, 203, 203, 217, 218, 0, 0, 0, 219, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 0, 0, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 220, + 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, 222, 221, 223, 224, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 226, 14, 227, 14, 228, 228, 229, 230, 231, 4, 4, 232, 4, 233, 234, + 235, 236, 237, 238, 239, 239, 240, 241, 242, 243, 244, 245, 246, 246, 247, 248, + 249, 250, 251, 94, 252, 252, 253, 254, 255, 256, 257, 258, 109, 109, 259, 260, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 261, 262, 263, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 264, 193, 193, 265, 39, 266, 267, 268, 24, 24, 24, 269, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 270, 271, 24, 272, 24, 273, 274, + 275, 276, 277, 278, 24, 24, 24, 279, 280, 1, 1, 281, 282, 211, 283, 284, + 285, 286, 287, 39, 288, 288, 288, 289, 290, 291, 12, 12, 292, 293, 294, 295, + 39, 39, 39, 39, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 39, + 307, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 39, 39, 39, 39, + 318, 318, 318, 318, 318, 318, 318, 318, 318, 319, 320, 321, 39, 39, 39, 39, + 322, 323, 324, 325, 326, 327, 39, 328, 329, 330, 39, 39, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 39, 340, 341, 342, 343, 344, 345, 346, 347, 39, 39, + 348, 348, 349, 39, 350, 351, 350, 352, 353, 354, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 355, 356, 357, 39, 39, 358, 359, 360, 39, 39, 361, 362, 363, + 364, 364, 365, 366, 367, 367, 368, 369, 370, 371, 372, 373, 374, 374, 374, 375, + 376, 377, 39, 39, 378, 379, 380, 381, 382, 383, 384, 385, 39, 39, 39, 39, + 386, 386, 387, 388, 389, 389, 390, 39, 39, 39, 39, 39, 391, 392, 393, 39, + 394, 394, 395, 396, 397, 398, 399, 39, 400, 401, 39, 39, 39, 39, 39, 39, + 402, 403, 39, 39, 39, 404, 404, 405, 406, 407, 408, 39, 39, 409, 410, 411, + 412, 412, 413, 414, 414, 415, 416, 417, 39, 39, 39, 39, 39, 39, 39, 39, + 418, 419, 420, 421, 422, 423, 39, 39, 424, 425, 426, 427, 428, 429, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 430, 39, 39, 39, 39, 39, 431, 432, 433, + 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 435, 39, 39, 39, + 434, 434, 434, 436, 434, 434, 434, 434, 434, 434, 437, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, + 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, + 438, 439, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, + 440, 440, 441, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 442, 443, 444, 39, 39, 445, 446, 447, 447, 448, 449, 450, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 451, 451, 452, 39, 39, 39, 453, 453, 454, 453, 455, 39, 39, 456, + 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, + 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, + 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, + 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 458, + 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, + 457, 457, 457, 457, 457, 457, 457, 457, 459, 459, 459, 459, 459, 459, 459, 459, + 459, 459, 459, 459, 459, 459, 460, 39, 461, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 462, 200, 200, 200, 200, 200, 200, 200, 463, 39, 464, 465, 466, 466, 466, 466, + 466, 466, 466, 466, 466, 466, 466, 467, 39, 39, 39, 39, 39, 39, 39, 39, + 468, 468, 468, 469, 470, 471, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 0, 0, 0, 0, 0, 0, 0, 472, 0, 473, 0, 474, 475, 476, 0, 477, + 12, 12, 478, 39, 39, 39, 39, 479, 0, 0, 480, 481, 39, 39, 39, 39, + 0, 0, 482, 0, 483, 484, 485, 0, 486, 487, 488, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 489, 0, 0, 0, 0, 0, 0, 0, 0, 490, 0, + 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, + 491, 491, 491, 491, 492, 493, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 494, 495, 39, 39, 39, 39, 39, 39, 496, 497, 498, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 499, 500, 39, 39, 39, 39, 39, 39, 39, 39, + 501, 501, 501, 501, 501, 501, 502, 39, 503, 503, 504, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 505, 0, 506, 39, 39, 280, 507, 39, 39, 39, 39, 39, 39, + 508, 509, 510, 511, 512, 513, 39, 514, 39, 39, 39, 39, 39, 39, 39, 39, + 0, 515, 0, 0, 479, 516, 517, 472, 0, 0, 0, 0, 0, 518, 39, 519, + 520, 521, 522, 523, 39, 39, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 0, 0, 479, 0, 0, 526, 527, + 515, 0, 528, 0, 529, 530, 39, 39, 0, 0, 0, 531, 0, 0, 532, 0, + 0, 0, 479, 533, 534, 535, 536, 39, 0, 0, 0, 0, 537, 0, 177, 538, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 539, 39, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 540, 193, 193, 193, 193, 193, 193, + 539, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 541, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 542, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 539, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 543, 39, 39, 39, 39, 39, + 544, 0, 0, 0, 39, 39, 39, 39, 7, 7, 7, 7, 7, 7, 7, 545, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39 +}; +static RE_UINT8 script_extensions_table_3[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 158, 4, 4, 158, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 5, 5, 5, 5, 1, 5, 5, 5, 0, 0, 5, 5, 5, 5, 1, 5, + 0, 0, 0, 0, 5, 1, 5, 1, 5, 5, 5, 0, 5, 0, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 160, 161, 162, 162, 161, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 0, 0, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 8, 8, 8, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 1, 10, 10, 10, 10, 10, 10, 163, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 163, 164, 0, 10, 163, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 165, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 10, 10, 10, 10, 10, 10, + 166, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 168, 10, 10, 10, 10, 10, 10, 10, 10, 1, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 169, 170, 4, 4, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 171, 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, + 17, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, + 17, 0, 17, 0, 0, 0, 17, 17, 17, 17, 0, 0, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 0, 0, 17, 17, 0, 0, 17, 17, 17, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 17, 17, 0, 17, + 17, 17, 17, 17, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, + 0, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 18, + 18, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, + 18, 0, 18, 18, 0, 18, 18, 0, 18, 18, 0, 0, 18, 0, 18, 18, + 18, 18, 18, 0, 0, 0, 0, 18, 18, 0, 0, 18, 18, 18, 0, 0, + 0, 18, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, + 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, + 19, 0, 19, 19, 0, 19, 19, 19, 19, 19, 0, 0, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 0, 19, 19, 19, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 19, 19, 19, 0, 0, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 19, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, + 0, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 20, + 20, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, + 20, 0, 20, 20, 0, 20, 20, 20, 20, 20, 0, 0, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 0, 0, 20, 20, 0, 0, 20, 20, 20, 0, 0, + 0, 0, 0, 0, 0, 20, 20, 20, 0, 0, 0, 0, 20, 20, 0, 20, + 20, 20, 20, 20, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 21, 0, 21, 21, 21, 21, 21, 21, 0, 0, 0, 21, 21, + 21, 0, 21, 21, 21, 21, 0, 0, 0, 21, 21, 0, 21, 0, 21, 21, + 0, 0, 0, 21, 21, 0, 0, 0, 21, 21, 21, 0, 0, 0, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 21, 21, + 21, 21, 21, 0, 0, 0, 21, 21, 21, 0, 21, 21, 21, 21, 0, 0, + 21, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, + 22, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, 22, 22, 22, + 22, 22, 22, 22, 22, 0, 22, 22, 22, 0, 22, 22, 22, 22, 0, 0, + 0, 0, 0, 0, 0, 22, 22, 0, 22, 22, 22, 0, 0, 0, 0, 0, + 22, 22, 22, 22, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, + 23, 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 0, 23, 23, 23, 23, 23, 0, 0, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 0, 23, 23, 23, 0, 23, 23, 23, 23, 0, 0, + 0, 0, 0, 0, 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 23, 0, + 23, 23, 23, 23, 0, 0, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, + 24, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 0, 24, 24, 24, 0, 24, 24, 24, 24, 24, 24, + 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 0, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 0, 0, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 0, 0, 0, 0, 25, + 25, 25, 25, 25, 25, 0, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, + 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 0, 0, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 1, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, + 0, 27, 27, 0, 27, 0, 27, 27, 27, 27, 27, 0, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 0, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 27, 27, 27, 27, 27, 0, 27, 0, 27, 27, 27, 27, 27, 27, 0, 0, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, + 0, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 28, + 28, 28, 28, 28, 28, 1, 1, 1, 1, 28, 28, 0, 0, 0, 0, 0, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 0, 30, 0, 0, 0, 0, 0, 30, 0, 0, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 180, 30, 30, 30, 30, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 0, 32, 32, 32, 32, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 0, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 32, 0, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 0, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 0, 0, 33, 33, 33, 33, 33, 33, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 1, 1, 1, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, 37, 37, + 37, 37, 37, 37, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 181, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 40, 40, + 40, 0, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, + 42, 42, 182, 182, 42, 182, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, 0, + 43, 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, + 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 45, 45, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 46, 46, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 51, 51, 51, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 30, 30, 30, + 49, 49, 49, 49, 49, 49, 49, 49, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 184, 183, 185, 184, 186, 186, 187, 186, 187, 188, 184, 187, 187, 184, 184, + 187, 186, 184, 184, 184, 184, 184, 184, 184, 189, 186, 184, 184, 186, 184, 184, + 184, 184, 190, 185, 191, 186, 186, 192, 185, 185, 193, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, + 5, 5, 2, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, + 158, 158, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 194, 4, 0, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 0, 5, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 195, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 57, 58, 59, 0, 0, - 60, 60, 60, 60, 61, 60, 60, 62, 63, 60, 64, 65, 60, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 0, 0, 75, 76, 77, 78, 79, 80, 81, 0, - 82, 83, 84, 85, 86, 87, 0, 88, 0, 89, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 90, 78, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, + 30, 30, 30, 30, 30, 30, 0, 30, 0, 0, 0, 0, 0, 30, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 1, 1, 1, 161, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 197, 197, 198, 1, 56, 199, 56, 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 1, 198, 197, 197, 197, 197, 197, 197, 197, 197, 198, 198, 198, 198, + 1, 56, 56, 56, 56, 56, 56, 56, 56, 56, 200, 200, 200, 200, 31, 31, + 198, 201, 201, 201, 201, 201, 1, 198, 56, 56, 56, 56, 202, 202, 199, 199, + 0, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 0, 0, 201, 201, 201, 201, 57, 57, 57, + 201, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 197, 201, 58, 58, 58, + 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, + 199, 199, 199, 199, 199, 199, 199, 199, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 1, 1, 1, 1, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 199, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 1, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 0, 0, 0, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 94, 0, 0, 95, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, - 0, 0, 0, 0, 99, 0, 0, 43, 78, 78, 78, 78, 78, 78, 100, 0, - 101, 102, 103, 104, 105, 103, 104, 106, 0, 107, 78, 78, 108, 0, 0, 0, - 109, 78, 110, 111, 92, 92, 112, 113, 114, 114, 115, 116, 114, 114, 114, 117, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 161, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 203, 203, 203, 203, 203, 203, 203, 203, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, + 204, 204, 204, 205, 205, 205, 206, 206, 206, 206, 0, 0, 0, 0, 0, 0, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 0, 0, 0, 0, 0, 0, 0, 0, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 186, 16, 207, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 208, 66, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 209, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 0, 68, 68, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 0, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 0, 69, 69, 69, 69, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 32, 32, 32, 32, 32, 0, 0, 32, 32, 32, 32, 32, 32, 0, + 0, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, + 31, 31, 31, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, 0, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 0, + 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 210, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 210, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 198, 198, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 197, 197, 197, 197, 197, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 201, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 201, 201, + 0, 0, 31, 31, 31, 31, 31, 31, 0, 0, 31, 31, 31, 31, 31, 31, + 0, 0, 31, 31, 31, 31, 31, 31, 0, 0, 31, 31, 31, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 0, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 72, 72, 0, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 0, 0, 0, 0, 0, + 211, 211, 211, 0, 0, 0, 0, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 0, 0, 0, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0, 0, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 0, 0, 0, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 0, 0, 0, 0, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 75, 75, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 0, 0, 0, 0, 0, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 78, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 0, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 0, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 87, 87, 87, 87, 87, 0, 0, 87, 0, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 0, 87, 87, 0, 0, 0, 87, 0, 0, 87, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 0, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, + 0, 0, 0, 0, 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 0, 91, 91, 0, 0, 0, 0, 0, 91, 91, 91, 91, 91, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 92, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 0, 0, 0, 0, 0, 93, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 96, 96, 96, 96, 0, 96, 96, 0, 0, 0, 0, 0, 96, 96, 96, 96, + 96, 96, 96, 96, 0, 96, 96, 96, 0, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 0, 0, 96, 96, 96, 0, 0, 0, 0, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 0, 0, 0, 0, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 0, 0, 0, 100, 100, 100, 100, 100, 100, 100, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 0, 0, 101, 101, 101, 101, 101, 101, 101, 101, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 0, 0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 0, 0, 0, 0, 0, 0, 0, 103, 103, 103, 103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 103, 103, 103, 103, 103, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 107, 0, 0, + 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 0, 0, + 0, 0, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 0, 0, 0, 0, 0, 0, 0, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 0, 0, 0, 0, 0, 0, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 0, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 0, + 119, 119, 119, 119, 119, 119, 119, 0, 119, 0, 119, 119, 119, 119, 0, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 0, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 0, 0, 0, 0, 0, 0, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 0, 0, 0, 0, 0, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 0, 0, 0, 0, 0, 0, + 121, 177, 121, 177, 0, 121, 121, 121, 121, 121, 121, 121, 121, 0, 0, 121, + 121, 0, 0, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 0, 121, 121, 121, 121, 121, 121, + 121, 0, 121, 121, 0, 121, 121, 121, 121, 121, 0, 177, 177, 121, 121, 121, + 121, 121, 121, 121, 121, 0, 0, 121, 121, 0, 0, 121, 121, 121, 0, 0, + 121, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 121, 121, 121, + 121, 121, 121, 121, 0, 0, 121, 121, 121, 121, 121, 121, 121, 0, 0, 0, + 121, 121, 121, 121, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 0, 122, 122, 122, + 122, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, 0, 0, 0, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, 0, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 0, 0, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 0, 0, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 0, 0, 0, 0, 0, 0, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 0, 0, 0, 0, 0, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 0, 0, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 130, 130, 130, 130, 130, 130, 0, 0, 130, 0, 0, 130, 130, 130, 130, + 130, 130, 130, 130, 0, 130, 130, 0, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 0, 130, 130, 0, 0, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0, + 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 0, 0, 0, 0, 0, 0, 0, 0, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 0, 0, 0, 0, 0, 0, 0, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 0, 0, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 0, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 137, 137, 137, 137, 137, 137, 137, 0, 137, 137, 0, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 137, 0, 137, 137, 0, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 0, 0, 0, 0, 0, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 0, 0, 0, + 138, 138, 138, 138, 138, 138, 0, 138, 138, 0, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, + 138, 138, 0, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, 0, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 177, 177, 21, 177, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, + 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 0, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 0, 0, 0, 0, 0, 0, 0, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, 0, 0, 0, 143, 143, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, + 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 145, 145, 145, 145, 145, + 145, 145, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 0, 0, 0, 0, 0, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, 0, 0, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, 0, 0, 0, 0, 0, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 148, 149, 1, 1, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, 0, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 58, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 120, + 57, 57, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 58, 58, 58, 58, 0, 0, 0, 0, 0, 0, 0, 0, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, 0, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 151, 151, 151, 151, + 214, 214, 214, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 122, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 60, 60, 60, 60, 60, 60, 60, 60, - 123, 124, 60, 125, 60, 60, 62, 0, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 134, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 157, 158, 159, 160, 161, 162, - 0, 0, 0, 0, 163, 164, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, + 4, 4, 4, 1, 1, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 170, 0, 171, 172, 0, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 173, 173, 174, 173, 175, 176, 177, 173, 178, 179, 180, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 181, 173, 173, 173, 173, 173, 173, 173, 173, 182, 173, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 152, 152, 152, 152, + 0, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, + 54, 54, 0, 54, 54, 0, 54, 54, 54, 54, 54, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, 0, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, 0, 0, 153, 153, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 0, 0, 0, 0, 0, 154, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 0, 0, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 0, 0, 0, 0, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 0, 0, 0, 0, 156, 156, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 10, 10, 0, 10, 0, 0, 10, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 10, 10, 10, 10, 0, 10, 0, 10, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 10, 0, 10, 0, 10, 0, 10, 10, 10, + 0, 10, 10, 0, 10, 0, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, + 0, 10, 10, 0, 10, 0, 0, 10, 10, 10, 10, 0, 10, 10, 10, 10, + 10, 10, 10, 0, 10, 10, 10, 10, 0, 10, 10, 10, 10, 0, 10, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 10, 10, 10, 0, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 57, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 199, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 177, 183, 184, 185, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 188, 189, 190, 191, 192, 0, 0, 0, - 193, 194, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; +static RE_UINT16 script_extensions_table_4[] = { + 0, 2, 4, 7, 10, 13, 19, 23, 32, 35, 39, 42, 56, 69, 90, 112, + 117, 121, 124, 127, 130, 133, 137, 140, 145, 148, 153, 155, 158, 161, 164, 171, + 174, 183, 187, 189, 191, 194, 197, 201, 208, 214, 216, 219, 222, 226, 229, 244, + 258, 270, 273, 277, 280, 283, 286, 290, 293 +}; +static RE_UINT8 script_extensions_table_5[] = { + 5, 0, 2, 0, 7, 77, 0, 7, 54, 0, 7, 2, 0, 10, 106, 11, + 12, 107, 0, 10, 11, 12, 0, 156, 10, 15, 99, 103, 106, 109, 11, 0, + 10, 11, 0, 10, 12, 107, 0, 10, 106, 0, 17, 16, 121, 19, 18, 23, + 2, 24, 20, 117, 21, 22, 123, 0, 17, 16, 121, 19, 18, 23, 2, 24, + 20, 21, 22, 123, 0, 17, 16, 128, 138, 137, 121, 19, 18, 23, 116, 24, + 131, 20, 120, 25, 63, 126, 21, 22, 123, 0, 17, 16, 128, 138, 137, 121, + 19, 18, 23, 43, 116, 24, 131, 20, 120, 25, 63, 126, 21, 22, 123, 0, + 16, 128, 113, 116, 0, 17, 115, 63, 0, 18, 119, 0, 19, 118, 0, 121, + 21, 0, 23, 131, 0, 115, 29, 44, 0, 30, 2, 0, 39, 38, 40, 37, + 0, 42, 64, 0, 17, 16, 121, 23, 0, 16, 0, 16, 121, 0, 17, 16, + 0, 16, 117, 0, 16, 23, 24, 20, 21, 22, 0, 16, 131, 0, 17, 16, + 121, 23, 131, 20, 22, 123, 0, 16, 121, 23, 0, 17, 0, 131, 0, 7, + 11, 0, 2, 42, 0, 16, 121, 2, 0, 3, 31, 56, 57, 58, 59, 0, + 3, 31, 56, 57, 58, 0, 56, 0, 3, 56, 0, 57, 58, 0, 56, 57, + 58, 0, 56, 2, 0, 16, 128, 19, 18, 118, 23, 113, 116, 24, 125, 131, + 120, 126, 123, 0, 16, 128, 19, 18, 118, 23, 113, 116, 125, 131, 120, 126, + 123, 0, 16, 128, 19, 18, 118, 113, 116, 125, 120, 126, 123, 0, 16, 21, + 0, 66, 2, 29, 0, 46, 68, 0, 10, 12, 0, 87, 72, 0, 87, 86, + 72, 0, 10, 6, 0, 151, 0 +}; + +int re_get_script_extensions(RE_UINT32 codepoint, RE_UINT8* scripts) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + int offset; + int count; -static RE_UINT8 re_decomposition_type_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, - 8, 9, 8, 8, 10, 11, 10, 12, 8, 9, 8, 8, 10, 11, 10, 9, - 8, 8, 8, 8, 13, 8, 8, 8, 8, 12, 8, 8, 14, 8, 10, 15, - 16, 8, 17, 8, 12, 8, 8, 8, 8, 12, 8, 8, 8, 8, 8, 15, - 12, 0, 0, 18, 19, 0, 0, 0, 0, 20, 20, 21, 8, 8, 8, 22, - 8, 13, 8, 8, 23, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, - 0, 13, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 24, 24, 25, 0, - 0, 0, 0, 0, 0, 0, 20, 5, 24, 25, 0, 0, 0, 0, 0, 0, - 9, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 26, 27, - 0, 21, 11, 22, 19, 0, 0, 0, 0, 0, 13, 8, 19, 0, 0, 0, - 0, 0, 13, 11, 28, 29, 0, 0, 0, 0, 0, 0, 30, 5, 31, 0, - 9, 18, 0, 11, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 9, 18, 0, 11, 0, 0, 0, 0, 0, 13, 0, 0, - 33, 0, 0, 0, 8, 13, 13, 8, 13, 8, 13, 8, 8, 12, 12, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 13, 11, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 34, 35, 0, 36, 0, 0, 0, 18, 0, 0, 0, - 0, 0, 32, 0, 32, 19, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, - 0, 0, 18, 19, 0, 0, 0, 9, 0, 0, 0, 0, 18, 27, 0, 0, - 0, 0, 0, 0, 0, 0, 10, 27, 0, 0, 37, 19, 0, 0, 0, 12, - 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 13, 19, 0, 0, 0, 0, - 0, 0, 19, 0, 0, 0, 0, 0, 19, 18, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 27, 11, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, - 18, 0, 0, 32, 27, 18, 0, 19, 0, 0, 32, 0, 18, 38, 17, 0, - 32, 0, 0, 0, 18, 0, 0, 32, 27, 18, 0, 19, 0, 0, 32, 0, - 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, - 0, 27, 36, 36, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 32, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 24, 24, 39, 24, - 24, 24, 24, 40, 24, 24, 24, 24, 41, 42, 43, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 0, 44, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 45, 0, - 8, 8, 8, 8, 8, 8, 12, 0, 8, 8, 8, 8, 8, 12, 8, 12, - 8, 12, 8, 12, 8, 8, 46, 46, 8, 8, 8, 8, 8, 8, 8, 12, - 8, 8, 8, 8, 8, 22, 8, 47, 21, 22, 8, 8, 8, 13, 8, 10, - 8, 8, 8, 8, 13, 22, 8, 48, 49, 50, 30, 0, 51, 3, 0, 0, - 0, 30, 0, 52, 3, 53, 0, 54, 0, 3, 5, 0, 0, 3, 0, 3, - 0, 0, 0, 0, 55, 24, 24, 24, 42, 42, 42, 43, 42, 42, 42, 56, - 0, 0, 35, 0, 0, 0, 0, 0, 57, 34, 58, 59, 59, 60, 61, 62, - 63, 64, 65, 66, 66, 67, 68, 59, 69, 61, 62, 0, 70, 70, 70, 70, - 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 71, 0, 0, 0, 13, 0, - 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, - 0, 19, 32, 19, 0, 0, 0, 0, 0, 36, 0, 72, 35, 0, 0, 0, - 32, 37, 32, 0, 0, 0, 0, 0, 36, 0, 0, 10, 12, 12, 12, 0, - 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, - 8, 0, 13, 12, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, - 73, 73, 73, 73, 73, 20, 20, 20, 20, 20, 20, 20, 20, 74, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 75, 0, 0, 0, 0, 0, - 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 76, - 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 20, 20, 20, 20, 20, 5, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 30, 0, 0, 0, 0, 36, 36, 36, 36, 36, - 36, 46, 32, 0, 9, 22, 33, 12, 0, 0, 0, 0, 0, 19, 3, 78, - 0, 0, 0, 0, 0, 37, 11, 79, 0, 0, 0, 0, 34, 20, 20, 20, - 20, 20, 20, 30, 4, 24, 24, 24, 20, 20, 20, 20, 20, 20, 20, 30, - 20, 73, 0, 0, 80, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 75, - 20, 20, 20, 81, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 82, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 20, 20, - 20, 20, 20, 20, 83, 81, 81, 81, 20, 20, 20, 20, 20, 20, 20, 84, - 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 24, - 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 12, 36, 10, 8, 11, - 36, 33, 13, 8, 8, 8, 8, 8, 8, 8, 8, 12, 8, 8, 8, 8, - 20, 30, 0, 0, 3, 20, 0, 46, 59, 59, 85, 8, 8, 11, 8, 36, - 9, 22, 8, 15, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 86, 86, 86, 87, 87, 87, 87, 88, 86, 87, 87, 89, 0, 0, 0, - 0, 0, 0, 0, 90, 91, 92, 93, 86, 88, 87, 86, 86, 86, 94, 88, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 97, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 99, 100, 100, 100, 100, 100, 101, 95, 95, - 95, 95, 95, 95, 102, 96, 96, 96, 96, 96, 96, 103, 98, 100, 100, 104, - 0, 0, 0, 0, 105, 98, 106, 107, 108, 106, 109, 106, 105, 97, 96, 106, - 97, 110, 111, 98, 112, 107, 113, 106, 96, 96, 96, 96, 96, 107, 114, 96, - 97, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 95, 115, - 0, 0, 0, 0, 116, 116, 117, 0, 0, 0, 0, 0, 116, 116, 116, 116, - 116, 118, 119, 20, 120, 121, 121, 121, 121, 120, 121, 0, 122, 123, 124, 124, - 125, 92, 126, 127, 91, 126, 128, 128, 128, 128, 127, 92, 126, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 127, 126, 127, 92, 129, - 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 132, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, - 133, 133, 133, 133, 133, 133, 133, 134, 135, 133, 135, 133, 135, 133, 135, 136, - 131, 137, 133, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 19, - 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, - 0, 0, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 36, - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 13, - 8, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 8, - 19, 0, 0, 0, 0, 0, 0, 0, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 138, 59, 59, 59, 59, 59, 59, 59, 59, 59, 138, - 139, 140, 61, 138, 59, 59, 66, 61, 59, 61, 59, 59, 59, 59, 59, 59, - 59, 66, 141, 61, 59, 138, 59, 138, 59, 59, 59, 59, 59, 59, 66, 141, - 59, 142, 143, 59, 138, 59, 59, 59, 59, 62, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 143, 59, 59, 59, 59, 140, 144, 61, 59, 141, 59, 145, 0, - 139, 146, 145, 61, 140, 144, 145, 145, 140, 144, 141, 59, 141, 59, 61, 142, - 59, 59, 66, 59, 59, 59, 59, 0, 61, 61, 66, 59, 59, 59, 59, 0, - 20, 20, 30, 0, 20, 20, 20, 20, 20, 20, 147, 75, 81, 81, 81, 81, - 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 4, 25, 0, 0, 0, 0, - 0, 0, 0, 0, 148, 0, 0, 0, 149, 0, 0, 0, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 0, 20, 20, 35, 0, 150, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -static RE_UINT8 re_decomposition_type_stage_4[] = { - 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 10, 0, 0, 0, 0, 2, - 0, 0, 10, 10, 2, 2, 0, 0, 2, 10, 10, 0, 17, 17, 17, 0, - 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 2, 2, 1, 1, 1, 2, - 2, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2, - 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, - 2, 2, 2, 1, 1, 2, 2, 0, 2, 2, 2, 0, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 1, 1, 0, 0, 2, 2, 2, 2, 0, 0, 0, - 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 2, 10, 10, 10, 0, - 10, 10, 0, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, - 0, 0, 0, 10, 1, 1, 2, 1, 0, 1, 0, 1, 1, 2, 1, 2, - 1, 1, 2, 0, 1, 1, 2, 2, 2, 2, 2, 4, 0, 4, 0, 0, - 0, 0, 0, 4, 2, 0, 2, 2, 2, 0, 2, 0, 10, 10, 0, 0, - 11, 0, 0, 0, 2, 2, 3, 2, 0, 2, 3, 3, 3, 3, 3, 3, - 0, 3, 2, 0, 0, 3, 3, 3, 3, 3, 0, 0, 10, 2, 10, 0, - 3, 0, 1, 0, 3, 0, 1, 1, 3, 3, 0, 3, 3, 2, 2, 2, - 2, 3, 0, 2, 3, 0, 0, 0, 17, 17, 17, 17, 0, 17, 0, 0, - 2, 2, 0, 2, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, 9, 0, - 11, 10, 0, 0, 13, 0, 0, 0, 2, 0, 1, 12, 0, 0, 1, 12, - 16, 9, 9, 9, 16, 16, 16, 16, 9, 9, 9, 16, 2, 16, 16, 16, - 2, 2, 2, 16, 3, 3, 1, 1, 8, 7, 8, 7, 5, 6, 8, 7, - 8, 7, 5, 6, 8, 7, 0, 0, 0, 0, 0, 8, 7, 5, 6, 8, - 7, 8, 7, 8, 7, 8, 8, 7, 5, 8, 7, 5, 8, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 6, - 6, 6, 6, 6, 6, 8, 8, 8, 8, 7, 7, 7, 7, 5, 5, 5, - 7, 8, 0, 0, 5, 7, 5, 5, 7, 5, 7, 7, 5, 5, 7, 7, - 5, 5, 7, 5, 5, 7, 7, 5, 7, 7, 5, 7, 5, 5, 5, 7, - 0, 0, 5, 5, 5, 7, 7, 7, 5, 7, 5, 7, 8, 0, 0, 0, - 12, 12, 12, 12, 12, 12, 0, 0, 12, 0, 0, 12, 12, 2, 2, 2, - 15, 15, 15, 0, 15, 15, 15, 15, 8, 6, 8, 0, 8, 0, 8, 6, - 8, 6, 8, 6, 8, 8, 7, 8, 7, 8, 7, 5, 6, 8, 7, 8, - 6, 8, 7, 5, 7, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, - 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, - 14, 0, 0, 0, 13, 13, 13, 0, 3, 0, 3, 3, 0, 0, 3, 0, - 0, 3, 3, 0, 3, 3, 3, 0, 3, 0, 3, 0, 0, 0, 3, 3, - 3, 0, 0, 3, 0, 3, 0, 3, 0, 0, 0, 3, 2, 2, 2, 9, - 16, 0, 0, 0, 16, 16, 16, 0, 9, 9, 0, 0, -}; + v = script_extensions_table_1[field_2]; + v = script_extensions_table_2[(v << 5) | field_1]; + v = script_extensions_table_3[(v << 5) | field_0]; + + if (v < 158) { + scripts[0] = v; -/* Decomposition_Type: 3868 bytes. */ - -RE_UINT32 re_get_decomposition_type(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_decomposition_type_stage_1[f] << 6; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_decomposition_type_stage_2[pos + f] << 3; - f = code >> 2; - code ^= f << 2; - pos = (RE_UINT32)re_decomposition_type_stage_3[pos + f] << 2; - value = re_decomposition_type_stage_4[pos + code]; - - return value; + return 1; + } + + offset = script_extensions_table_4[v - 158]; + count = 0; + + do { + scripts[count] = script_extensions_table_5[offset + count]; + ++count; + } while (script_extensions_table_5[offset + count] != 0); + + return count; } -/* East_Asian_Width. */ +/* Sentence_Break. */ +static RE_UINT8 re_sentence_break_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 19, 19, 13, 32, 19, 19, + 19, 33, 19, 19, 19, 19, 19, 19, 19, 19, 34, 35, 13, 13, 13, 13, + 13, 36, 13, 37, 19, 19, 19, 19, 19, 19, 19, 19, 38, 19, 19, 39, + 19, 19, 19, 19, 40, 41, 42, 19, 43, 19, 44, 45, 46, 47, 48, 19, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 49, 13, 13, 13, 50, 51, 13, + 13, 13, 13, 52, 13, 13, 13, 13, 13, 13, 53, 19, 19, 19, 54, 19, + 13, 13, 13, 13, 55, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 56, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19 +}; -static RE_UINT8 re_east_asian_width_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 7, 8, 9, - 10, 10, 10, 10, 10, 10, 11, 5, 12, 10, 10, 13, 10, 10, 10, 14, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, +static RE_UINT16 re_sentence_break_table_2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 8, 16, 17, 18, 19, 20, 21, 22, 23, 23, 23, 24, 25, 26, 27, 28, + 29, 30, 18, 8, 31, 8, 32, 8, 8, 33, 34, 18, 35, 36, 37, 38, + 39, 40, 41, 42, 40, 40, 43, 44, 45, 46, 47, 40, 40, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 72, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 55, 101, 102, 103, 55, 104, 105, 106, 107, 108, 109, 110, 55, + 40, 111, 112, 113, 114, 29, 115, 116, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 117, 40, 118, 119, 120, 40, 121, 40, 122, 123, 124, 29, 29, 125, + 98, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 126, 127, 40, 40, 128, 129, 130, 131, 132, 40, 133, 134, 135, + 136, 40, 40, 137, 138, 139, 40, 140, 141, 142, 143, 144, 40, 145, 146, 55, + 147, 40, 148, 149, 150, 151, 152, 55, 153, 133, 154, 155, 156, 157, 40, 158, + 40, 159, 160, 161, 162, 163, 164, 165, 18, 18, 18, 18, 18, 18, 23, 166, + 8, 8, 8, 8, 167, 8, 8, 8, 168, 169, 170, 171, 169, 172, 173, 174, + 175, 176, 177, 178, 179, 55, 180, 181, 182, 183, 184, 30, 185, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 186, 187, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 188, 30, 189, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 190, 191, 55, 55, 192, 193, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 194, 55, 195, 196, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 29, 197, 198, 199, 8, 8, 8, 200, 18, 201, 40, 202, 203, 204, 204, 23, + 205, 206, 207, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 208, 209, 98, 40, 210, 98, 40, 116, 211, 212, 40, 40, 213, 40, 55, 214, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 215, + 40, 40, 40, 40, 216, 55, 214, 217, 40, 40, 40, 40, 40, 40, 40, 40, + 218, 219, 8, 220, 221, 40, 40, 222, 223, 224, 8, 225, 226, 227, 228, 229, + 230, 231, 40, 232, 233, 133, 234, 235, 49, 236, 237, 215, 59, 238, 239, 240, + 40, 241, 242, 243, 40, 244, 245, 246, 247, 248, 249, 250, 18, 18, 40, 251, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 252, 253, 254, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 255, 40, 40, 256, 55, 257, 258, 259, 40, 40, 260, 261, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 262, 214, 40, 263, 40, 264, 265, + 266, 267, 268, 269, 40, 40, 40, 270, 271, 2, 272, 273, 274, 141, 275, 276, + 277, 278, 279, 55, 40, 40, 40, 280, 55, 55, 40, 281, 55, 55, 55, 282, + 55, 55, 55, 55, 215, 40, 283, 152, 40, 284, 285, 286, 287, 40, 288, 55, + 29, 289, 290, 40, 287, 291, 292, 293, 40, 294, 40, 295, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 203, 140, 264, 55, 55, 55, 55, + 296, 297, 140, 203, 141, 55, 55, 298, 140, 256, 55, 55, 40, 299, 55, 55, + 300, 301, 302, 215, 215, 55, 106, 303, 40, 140, 140, 304, 260, 55, 55, 55, + 40, 40, 305, 55, 29, 306, 18, 307, 40, 308, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 40, 309, 55, 55, 215, 310, 311, 55, 55, 214, 312, 203, + 156, 313, 314, 315, 156, 316, 317, 318, 156, 319, 320, 321, 156, 238, 322, 55, + 323, 324, 55, 55, 325, 326, 327, 328, 329, 330, 331, 332, 55, 55, 55, 55, + 40, 333, 334, 335, 40, 46, 336, 55, 55, 55, 55, 55, 40, 337, 338, 55, + 40, 46, 339, 55, 40, 340, 135, 55, 122, 341, 55, 55, 55, 55, 55, 55, + 40, 342, 55, 55, 55, 29, 18, 343, 344, 345, 346, 55, 55, 347, 348, 349, + 350, 351, 352, 40, 353, 55, 40, 137, 55, 55, 55, 55, 55, 55, 55, 55, + 354, 355, 356, 357, 358, 359, 55, 55, 360, 361, 362, 363, 364, 135, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 365, 55, 55, 55, 55, 55, 366, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 256, 55, 55, 55, + 40, 40, 40, 213, 40, 40, 40, 40, 40, 40, 295, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 367, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 368, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 137, 141, 369, 55, 55, 214, 370, 40, 371, 372, 373, 124, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 29, 18, 374, 55, 55, 55, 40, 40, 375, 23, 376, 55, 55, 377, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 378, + 40, 40, 40, 40, 40, 40, 140, 55, 305, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 141, 55, 379, 380, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 254, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 381, 382, 383, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 384, 385, 386, 55, 55, + 55, 55, 387, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 388, 389, 401, + 391, 402, 403, 404, 395, 405, 406, 407, 408, 409, 410, 197, 411, 412, 413, 414, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 23, 415, 23, 416, 417, 418, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 419, 420, 55, 55, 55, 55, 55, 55, 40, 421, 422, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 40, 423, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 424, 55, 29, 425, 426, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 427, 428, 429, 430, 431, 432, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 433, 434, 434, 435, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 436, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 437, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 287, 55, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 281, 40, 40, 40, 40, 40, 40, + 287, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 438, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 439, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 287, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 54, 55, 55, 55, 55, 55, + 440, 23, 23, 23, 55, 55, 55, 55, 23, 23, 23, 23, 23, 23, 23, 441, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55 +}; + +static RE_UINT8 re_sentence_break_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 1, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 4, 5, 0, 0, 0, 0, 5, 5, 5, 0, 0, 6, 6, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 0, 0, 0, 0, 4, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 0, 5, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 5, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 10, 5, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 10, 9, 10, 9, 10, 9, 10, 9, + 10, 9, 10, 9, 10, 9, 10, 9, 10, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 9, 10, 9, 10, 9, 10, 10, + 10, 9, 9, 10, 9, 10, 9, 9, 10, 9, 9, 9, 10, 10, 9, 9, + 9, 9, 10, 9, 9, 10, 9, 9, 9, 10, 10, 10, 9, 9, 10, 9, + 9, 10, 9, 10, 9, 10, 9, 9, 10, 9, 10, 10, 9, 10, 9, 9, + 10, 9, 9, 9, 10, 9, 10, 9, 9, 10, 10, 13, 9, 10, 10, 10, + 13, 13, 13, 13, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 10, 9, + 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 10, 9, 9, 10, 9, 10, 9, 9, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 10, 10, 10, 10, 10, 10, 9, 9, 10, 9, 9, 10, + 10, 9, 10, 9, 9, 9, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, + 10, 10, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 13, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 9, 10, 9, 10, 13, 0, 9, 10, 0, 0, 10, 10, 10, 10, 0, 9, + 0, 0, 0, 0, 0, 0, 9, 0, 9, 9, 9, 0, 9, 0, 9, 9, + 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, + 10, 10, 9, 9, 9, 10, 10, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 10, 10, 10, 10, 9, 10, 0, 9, 10, 9, 9, 10, 10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 9, 10, 0, 14, 14, 14, 14, 14, 14, 14, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 13, 0, 0, 0, 6, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 0, 0, 0, 0, 0, 0, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, + 0, 14, 14, 0, 14, 14, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 13, + 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 12, 0, 4, 4, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, 0, 13, 13, + 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 4, 13, 14, 14, 14, 14, 14, 14, 14, 12, 0, 14, + 14, 14, 14, 14, 14, 13, 13, 14, 14, 0, 14, 14, 14, 14, 13, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 13, 13, 0, 0, 13, + 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, + 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 13, 13, 0, 0, 6, 4, 13, 0, 0, 14, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 13, 14, 14, 14, 13, 14, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 13, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 14, 14, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, + 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 0, 13, 0, 0, 0, 13, 13, 13, 13, 0, 0, 14, 13, 14, 14, + 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 13, 13, 0, 13, + 13, 13, 14, 14, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, + 0, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 13, + 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 0, 13, 13, 0, 13, 13, 0, 13, 13, 0, 0, 14, 0, 14, 14, + 14, 14, 14, 0, 0, 0, 0, 14, 14, 0, 0, 14, 14, 14, 0, 0, + 0, 14, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 14, 14, 13, 13, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, + 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 0, 0, 14, 13, 14, 14, + 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 14, 14, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 14, 14, 14, 14, 14, + 0, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, + 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 13, 13, 0, 13, + 13, 13, 14, 14, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 13, 0, 13, 13, 13, 13, 13, 13, 0, 0, 0, 13, 13, + 13, 0, 13, 13, 13, 13, 0, 0, 0, 13, 13, 0, 13, 0, 13, 13, + 0, 0, 0, 13, 13, 0, 0, 0, 13, 13, 13, 0, 0, 0, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 14, 14, + 14, 14, 14, 0, 0, 0, 14, 14, 14, 0, 14, 14, 14, 14, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, + 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 13, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 0, 13, 13, 13, 0, 0, 0, 0, 0, + 13, 13, 14, 14, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, + 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 0, 0, 14, 13, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 13, 13, 14, 14, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, + 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 14, 13, 0, + 0, 0, 0, 0, 13, 13, 13, 14, 0, 0, 0, 0, 0, 0, 0, 13, + 13, 13, 14, 14, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, + 0, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 14, 0, 0, 0, 0, 14, + 14, 14, 14, 14, 14, 0, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 13, 13, 0, 13, 0, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 0, 0, + 13, 13, 13, 13, 13, 0, 13, 0, 14, 14, 14, 14, 14, 14, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 13, 13, 13, 13, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 14, 0, 14, 5, 5, 5, 5, 14, 14, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, + 14, 13, 14, 14, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 13, + 13, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 14, 14, 14, 14, 0, 0, + 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 0, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 0, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 0, + 13, 0, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 0, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 14, 14, 14, + 0, 0, 4, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 10, 10, 10, 10, 10, 10, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 4, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 5, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, + 13, 13, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 14, 14, 14, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, + 13, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 13, 0, 0, 0, 0, 13, 14, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 4, 0, 0, 0, 0, 6, 4, 0, 14, 14, 14, 12, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 4, 4, 4, 4, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 0, 0, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 4, 4, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 13, 13, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 4, 4, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 13, 13, + 13, 13, 13, 13, 14, 13, 13, 14, 14, 14, 13, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 9, 0, 9, 0, 9, 0, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 0, 10, 10, 9, 9, 9, 9, 9, 0, 10, 0, + 0, 0, 10, 10, 10, 0, 10, 10, 9, 9, 9, 9, 9, 0, 0, 0, + 10, 10, 10, 10, 0, 0, 10, 10, 9, 9, 9, 9, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 10, 10, 10, 0, 10, 10, 9, 9, 9, 9, 9, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 14, 14, 12, 12, + 0, 0, 0, 6, 6, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 7, 0, 0, 0, 11, 11, 12, 12, 12, 12, 12, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 4, 4, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 12, 12, 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 9, 0, 0, 10, 9, 9, 9, 10, 10, + 9, 9, 9, 10, 0, 9, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 9, 0, 9, 0, 9, 0, 9, 9, 9, 9, 0, 10, + 9, 9, 9, 9, 10, 13, 13, 13, 13, 10, 0, 0, 10, 10, 9, 9, + 0, 0, 0, 0, 0, 9, 10, 10, 10, 10, 0, 0, 0, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 9, 10, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 9, 10, 9, 9, 9, 10, 10, 9, 10, 9, 10, 9, 10, 9, 9, 9, + 9, 10, 9, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, + 9, 10, 9, 10, 10, 0, 0, 0, 0, 0, 0, 9, 10, 9, 10, 14, + 14, 14, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 0, 10, 0, 0, 0, 0, 0, 10, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 4, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 6, 4, 0, 0, 13, 13, 13, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, + 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, + 0, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 14, 14, 0, 0, 13, 13, 13, + 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 4, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 4, 4, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 13, 14, + 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 13, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 10, 10, 14, 14, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 0, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 10, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 9, 10, 9, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 13, 0, 0, 9, 10, 9, 10, 13, + 9, 10, 9, 10, 10, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 9, 9, 9, 9, 10, + 9, 9, 9, 9, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, 9, 10, + 0, 0, 9, 10, 9, 9, 9, 9, 10, 9, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 10, 13, 10, 10, 10, 13, 13, 13, 13, 13, + 13, 13, 14, 13, 13, 13, 14, 13, 13, 13, 13, 14, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 13, 13, 13, 13, 13, 13, 0, 0, 0, 13, 0, 13, 13, 14, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 0, 4, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 13, 13, 13, 13, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 4, 4, 4, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 13, 14, 14, 14, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 13, 14, 14, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14, + 13, 14, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, + 4, 4, 13, 13, 13, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, 0, + 0, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 4, 14, 14, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 13, 14, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 0, 13, 0, + 13, 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 5, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 6, 6, 0, 6, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 6, 6, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 7, 0, 0, 6, 4, 4, 6, 5, 5, 5, 5, 5, 5, 0, + 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 12, + 0, 4, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 6, 6, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 0, 0, 0, 0, 4, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 0, 5, 0, 5, + 5, 4, 5, 5, 6, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, + 0, 0, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, + 0, 0, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 0, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 13, 13, 13, 13, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 0, 0, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 0, 13, 13, 0, 0, 0, 13, 0, 0, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 0, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 13, 13, + 13, 14, 14, 14, 0, 14, 14, 0, 0, 0, 0, 0, 14, 14, 14, 14, + 13, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 0, 0, 14, 14, 14, 0, 0, 0, 0, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 14, 14, 0, 0, 0, + 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 4, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 12, 4, 4, + 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 4, 4, 4, 13, 14, 14, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 14, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 13, 13, 13, 13, 4, 4, 0, 0, 14, 14, 14, 14, 4, 14, 14, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 0, 13, 0, 4, 4, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 4, 4, 0, 4, 4, 0, 14, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 0, 13, 13, 13, 13, 0, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 4, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 0, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, + 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 0, 14, 14, 13, 14, 14, + 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 13, 13, 13, + 13, 13, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 4, 4, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 14, 13, + 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 13, 13, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, + 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 4, 4, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 13, 13, 13, 13, 14, 14, 0, 0, + 14, 4, 4, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 13, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 4, 4, 4, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, 0, 0, 13, 13, 13, 13, + 13, 13, 13, 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 0, 14, 14, 0, 0, 14, 14, 14, 14, 13, + 14, 13, 14, 14, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, + 14, 13, 0, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 14, 14, 14, 14, 0, + 0, 0, 4, 4, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 4, 4, 13, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 13, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 0, 14, 14, 0, 14, + 14, 14, 14, 14, 14, 14, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 0, + 14, 14, 0, 14, 14, 14, 14, 14, 13, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 14, 14, 14, 14, 4, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 14, 14, 14, 14, 14, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 4, 4, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 13, 13, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 14, + 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 14, + 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 0, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 14, 14, 4, + 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, + 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 14, 14, 14, 14, 14, + 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 0, 9, 9, + 0, 0, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 0, 10, 0, 10, 10, 10, + 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 9, 9, 0, 9, 9, 9, 9, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 16, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 17, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 17, -}; - -static RE_UINT8 re_east_asian_width_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 0, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 9, 9, 9, 27, 9, 9, 28, 9, 9, 9, 9, 9, 9, 29, 30, 31, - 32, 33, 34, 35, 36, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 37, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 38, 9, 9, 9, 9, 9, 9, - 9, 9, 39, 9, 9, 9, 9, 9, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 40, + 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 30, 30, 30, 30, 9, 9, 9, 9, 9, 9, 42, 9, 43, 44, + 10, 10, 10, 10, 10, 10, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, + 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 45, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 46, - 30, 30, 30, 30, 30, 47, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 30, 30, 48, 30, 30, 49, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 9, 10, 0, 0, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 0, 14, 14, 0, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 14, 14, 14, 14, 14, 14, 14, 13, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 13, 13, 0, 13, 0, 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 0, 13, 13, 13, 13, 0, 13, 0, 13, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 13, 0, 13, 0, 13, 0, 13, 13, 13, + 0, 13, 13, 0, 13, 0, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, + 0, 13, 13, 0, 13, 0, 0, 13, 13, 13, 13, 0, 13, 13, 13, 13, + 13, 13, 13, 0, 13, 13, 13, 13, 0, 13, 13, 13, 13, 0, 13, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 0, 13, 13, 13, 0, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 50, 51, 52, 53, 54, 9, 55, 56, 57, 58, 59, 60, 61, 62, 9, 63, - 9, 9, 64, 65, 66, 67, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 68, - 9, 9, 41, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 69, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, + 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +RE_UINT32 re_get_sentence_break(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_sentence_break_table_1[field_2]; + v = re_sentence_break_table_2[(v << 5) | field_1]; + v = re_sentence_break_table_3[(v << 5) | field_0]; + + return v; +} + +/* Sentence_Terminal. */ +static RE_UINT8 re_sentence_terminal_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 3, 9, 10, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 11, 12, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, + 3, 3, 14, 15, 16, 17, 18, 19, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 20, 21, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 22, + 3, 3, 3, 3, 3, 3, 23, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; -static RE_UINT8 re_east_asian_width_stage_3[] = { - 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 0, 0, 0, 0, 3, 4, 5, 6, 7, 0, 8, 9, 10, 11, 12, 13, - 14, 0, 15, 16, 17, 16, 18, 8, 19, 20, 21, 0, 17, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 22, 23, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 0, 0, 0, 0, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, - 0, 0, 29, 28, 30, 31, 29, 28, 30, 31, 0, 0, 0, 0, 0, 0, - 14, 0, 28, 28, 28, 28, 28, 28, 28, 28, 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, - 0, 0, 33, 34, 6, 0, 35, 36, 0, 0, 0, 0, 0, 0, 37, 38, - 39, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 41, 14, 36, 0, 42, 16, 0, 0, 0, 0, 43, 44, 28, 45, 28, 31, - 0, 14, 28, 31, 0, 0, 0, 31, 0, 0, 46, 0, 38, 0, 0, 0, - 12, 47, 48, 49, 50, 51, 52, 53, 0, 54, 55, 0, 56, 57, 0, 0, - 57, 0, 58, 14, 58, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 59, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 30, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 45, 28, 28, 28, 28, 45, 0, - 28, 28, 63, 0, 30, 31, 57, 53, 64, 65, 31, 0, 63, 38, 0, 66, - 67, 68, 69, 70, 0, 0, 0, 0, 71, 32, 72, 0, 73, 74, 0, 75, - 0, 0, 76, 17, 77, 59, 0, 78, 79, 80, 81, 28, 82, 83, 84, 85, - 86, 59, 0, 0, 0, 87, 0, 58, 0, 88, 89, 0, 0, 0, 17, 28, - 0, 0, 90, 0, 0, 0, 87, 75, 0, 0, 0, 0, 91, 92, 0, 0, - 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 95, 31, 0, 0, 0, 0, - 32, 32, 32, 96, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, 0, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 97, 0, 0, 0, 32, 72, - 98, 32, 32, 32, 32, 32, 32, 99, 100, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 99, 100, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 90, 32, 32, 32, 32, 32, 100, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 99, 32, 32, 32, 32, 32, 101, 32, 32, 32, 32, 72, 0, 32, 32, - 32, 32, 32, 99, 32, 32, 32, 32, 32, 28, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 102, 32, 32, 32, 32, 32, 32, 99, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 102, - 32, 32, 32, 32, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 32, 103, 0, 0, 32, 32, 32, 32, 104, 32, 99, 72, 0, 0, - 105, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 109, 110, 110, 110, 111, 112, 109, 0, 58, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 101, 0, - 32, 32, 32, 99, 0, 0, 0, 0, 0, 0, 101, 0, 113, 0, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, - 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, - 28, 115, 28, 28, 28, 116, 28, 28, 28, 28, 28, 28, 28, 31, 28, 28, - 28, 80, 117, 118, 28, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 101, 0, 32, 32, 32, 32, 32, 72, 32, 87, 103, 0, 97, 0, 0, 0, - 32, 32, 32, 32, 87, 90, 120, 32, 32, 32, 32, 32, 32, 32, 32, 121, - 32, 32, 72, 0, 32, 32, 32, 32, 32, 122, 72, 0, 32, 32, 123, 32, - 32, 32, 32, 32, 32, 32, 32, 99, 124, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, - 32, 32, 32, 32, 32, 32, 32, 97, 0, 126, 32, 32, 32, 0, 0, 127, - 0, 0, 66, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 32, 32, 32, 32, 32, 97, 114, 129, 0, 0, 94, 113, 101, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 72, 0, 0, - 0, 90, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 130, 131, - 32, 32, 32, 32, 132, 133, 32, 32, 32, 132, 32, 32, 32, 32, 32, 32, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 101, - 101, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 97, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 116, +static RE_UINT8 re_sentence_terminal_table_2[] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, 6, + 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, + 0, 16, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 24, 0, 0, 22, 0, 0, 25, 0, 0, 0, 0, 26, 0, + 0, 0, 27, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 30, 0, 0, 0, 0, 0, 1, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 33, 0, 0, 3, 34, 0, 0, 0, 35, 0, 0, 0, 36, 0, + 0, 37, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, + 0, 0, 40, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, + 0, 0, 43, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 45, 0, 44, 46, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_east_asian_width_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 0, 1, 5, 5, 1, 5, 5, 1, - 1, 0, 1, 0, 5, 1, 1, 5, 1, 1, 1, 1, 1, 0, 1, 1, - 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, - 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, - 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, - 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, - 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 1, 1, 1, 1, 0, - 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, - 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, - 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, - 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, - 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, - 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, - 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, - 0, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, - 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, - 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1, 0, - 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 3, 3, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, - 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 3, 1, 0, 0, 0, 0, 3, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, - 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 3, 1, 1, 1, 1, 1, - 1, 1, 3, 3, 1, 3, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, - 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 3, 3, 0, 3, - 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 5, 5, - 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, - 0, 0, 0, 3, 3, 0, 0, 0, 3, 0, 0, 0, 0, 3, 1, 1, - 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, - 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, - 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, - 3, 3, 3, 0, 3, 3, 3, 3, 0, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, - 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, - 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 3, 3, 3, 3, - 0, 0, 0, 0, 3, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, - 3, 3, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 3, 0, 0, 0, - 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, - 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 0, 0, - 3, 3, 0, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, +static RE_UINT8 re_sentence_terminal_table_3[] = { + 0, 0, 0, 0, 2, 64, 0, 128, 0, 2, 0, 0, 0, 0, 0, 192, + 0, 0, 16, 0, 7, 0, 0, 0, 0, 0, 0, 2, 0, 0, 128, 98, + 48, 0, 0, 0, 0, 12, 0, 0, 132, 1, 0, 0, 0, 64, 0, 0, + 0, 0, 96, 0, 8, 2, 0, 0, 0, 15, 0, 0, 0, 0, 0, 204, + 0, 0, 0, 24, 0, 0, 0, 48, 128, 3, 0, 0, 0, 64, 0, 16, + 4, 0, 0, 0, 0, 0, 0, 128, 0, 192, 0, 0, 0, 0, 136, 0, + 0, 0, 192, 0, 0, 128, 0, 0, 0, 3, 0, 0, 0, 0, 0, 224, + 0, 0, 3, 0, 0, 8, 0, 0, 0, 0, 196, 0, 2, 0, 0, 0, + 0, 0, 224, 3, 128, 1, 0, 0, 3, 0, 0, 0, 14, 0, 0, 0, + 96, 32, 0, 192, 0, 0, 0, 27, 0, 24, 0, 0, 12, 254, 255, 0, + 6, 0, 0, 0, 0, 0, 0, 112, 80, 0, 0, 0, 12, 0, 0, 0, + 0, 0, 128, 1, 0, 0, 32, 0, 16, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0 }; -/* East_Asian_Width: 3040 bytes. */ - -RE_UINT32 re_get_east_asian_width(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_east_asian_width_stage_1[f] << 5; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_east_asian_width_stage_2[pos + f] << 4; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_east_asian_width_stage_3[pos + f] << 3; - value = re_east_asian_width_stage_4[pos + code]; - - return value; -} +RE_UINT32 re_get_sentence_terminal(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* Joining_Group. */ + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_joining_group_stage_1[] = { - 0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; + v = re_sentence_terminal_table_1[field_2]; + v = re_sentence_terminal_table_2[(v << 5) | field_1]; + v = re_sentence_terminal_table_3[(v << 2) | field_0]; -static RE_UINT8 re_joining_group_stage_2[] = { - 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + return (v >> offset) & 0x1; +} + +/* Soft_Dotted. */ +static RE_UINT8 re_soft_dotted_table_1[] = { + 0, 1, 2, 2, 2, 2, 2, 3, 4, 2, 2, 5, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; -static RE_UINT8 re_joining_group_stage_3[] = { +static RE_UINT8 re_soft_dotted_table_2[] = { + 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 0, 14, 15, 0, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, + 0, 12, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_joining_group_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 45, 0, 3, 3, 43, 3, 45, 3, 4, 41, 4, 4, 13, 13, 13, 6, - 6, 31, 31, 35, 35, 33, 33, 39, 39, 1, 1, 11, 11, 55, 55, 55, - 0, 9, 29, 19, 22, 24, 26, 16, 43, 45, 45, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 29, - 0, 3, 3, 3, 0, 3, 43, 43, 45, 4, 4, 4, 4, 4, 4, 4, - 4, 13, 13, 13, 13, 13, 13, 13, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 31, 31, 31, 31, 31, 31, 31, 31, 31, 35, 35, 35, 33, 33, 39, - 1, 9, 9, 9, 9, 9, 9, 29, 29, 11, 38, 11, 19, 19, 19, 11, - 11, 11, 11, 11, 11, 22, 22, 22, 22, 26, 26, 26, 26, 56, 21, 13, - 41, 17, 17, 14, 43, 43, 43, 43, 43, 43, 43, 43, 55, 47, 55, 43, - 45, 45, 46, 46, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 31, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 33, 1, 0, 0, 21, - 2, 0, 5, 12, 12, 7, 7, 15, 44, 50, 18, 42, 42, 48, 49, 20, - 23, 25, 27, 36, 10, 8, 28, 32, 34, 30, 7, 37, 40, 5, 12, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, - 4, 4, 4, 4, 4, 4, 4, 13, 13, 6, 6, 31, 35, 1, 1, 1, - 9, 9, 11, 11, 11, 24, 24, 26, 26, 26, 22, 31, 31, 35, 13, 13, - 35, 31, 13, 3, 3, 55, 55, 45, 43, 43, 54, 54, 13, 35, 35, 19, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, - 4, 4, 13, 39, 9, 29, 22, 24, 45, 45, 31, 43, 57, 0, 6, 33, - 11, 58, 31, 1, 19, 0, 4, 4, 4, 31, 45, 86, 87, 88, 0, 0, - 59, 61, 61, 65, 65, 62, 0, 83, 0, 85, 85, 0, 0, 66, 80, 84, - 68, 68, 68, 69, 63, 81, 70, 71, 77, 60, 60, 73, 73, 76, 74, 74, - 74, 75, 0, 0, 78, 0, 0, 0, 0, 0, 0, 72, 64, 79, 82, 67, - 0, 0, 100, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 100, 0, 101, 0, - 101, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 18, 0, 19, 20, 0, 21, 0, 22, 23, 0, 24, 0, 17, 18, + 0, 19, 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Joining_Group: 788 bytes. */ - -RE_UINT32 re_get_joining_group(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_joining_group_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_joining_group_stage_2[pos + f] << 5; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_joining_group_stage_3[pos + f] << 4; - value = re_joining_group_stage_4[pos + code]; - - return value; -} - -/* Joining_Type. */ - -static RE_UINT8 re_joining_type_stage_1[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 6, - 7, 8, 4, 9, 4, 4, 10, 4, 4, 4, 4, 11, 4, 12, 13, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 14, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +static RE_UINT8 re_soft_dotted_table_3[] = { + 0, 0, 0, 0, 0, 6, 0, 0, 0, 128, 0, 0, 0, 2, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 32, 0, 0, 4, 0, 0, 0, 8, 0, + 0, 0, 64, 1, 4, 0, 0, 0, 0, 0, 64, 0, 16, 1, 0, 0, + 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, + 0, 0, 0, 16, 12, 0, 0, 0, 0, 0, 192, 0, 0, 12, 0, 0, + 0, 0, 0, 192, 0, 0, 12, 0, 192, 0, 0, 0, 0, 0, 0, 12, + 0, 192, 0, 0 }; -static RE_UINT8 re_joining_type_stage_2[] = { - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, - 0, 0, 4, 0, 0, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 23, 25, 26, 27, 28, 29, - 30, 31, 26, 32, 33, 34, 0, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, 50, 51, - 52, 53, 54, 0, 55, 0, 0, 0, 56, 57, 58, 0, 59, 60, 61, 62, - 63, 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 67, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 69, 0, 70, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, - 72, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 0, 0, 0, 0, - 77, 78, 0, 79, 80, 81, 82, 83, 84, 85, 86, 87, 0, 0, 0, 88, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 70, 0, 0, 0, 91, - 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 94, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 96, 0, 0, 97, 0, - 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 99, 100, 0, 0, - 101, 102, 103, 0, 104, 105, 106, 107, 108, 0, 0, 109, 33, 110, 0, 0, - 111, 112, 113, 114, 0, 0, 115, 116, 117, 118, 119, 0, 120, 0, 0, 0, - 121, 0, 0, 0, 0, 0, 0, 122, 123, 124, 125, 0, 0, 0, 0, 0, - 126, 0, 127, 0, 128, 129, 130, 0, 0, 0, 0, 131, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 134, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 136, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 138, 139, 0, 0, 140, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 141, 142, 143, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 144, 0, 0, 0, 134, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 146, 147, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 149, 2, 0, 0, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_soft_dotted(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_joining_type_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, - 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 2, 2, 2, 2, 6, - 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 9, 10, 11, 12, - 13, 14, 2, 2, 0, 15, 16, 12, 12, 17, 17, 18, 12, 12, 12, 12, - 19, 20, 21, 22, 22, 23, 0, 24, 0, 25, 26, 27, 12, 28, 2, 2, - 2, 29, 12, 30, 12, 31, 32, 18, 0, 0, 0, 0, 33, 2, 34, 0, - 0, 35, 12, 12, 12, 36, 37, 38, 0, 0, 33, 39, 40, 41, 0, 0, - 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, 0, 0, 12, 48, 49, 50, - 0, 0, 3, 2, 39, 2, 2, 2, 51, 0, 0, 0, 0, 0, 0, 52, - 5, 53, 5, 0, 54, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 56, - 57, 1, 0, 0, 54, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 56, - 60, 61, 55, 0, 0, 0, 62, 0, 63, 53, 0, 0, 54, 0, 0, 64, - 55, 0, 0, 0, 0, 0, 0, 65, 57, 1, 58, 0, 54, 0, 0, 0, - 66, 0, 0, 0, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 0, 0, - 67, 0, 0, 0, 0, 0, 0, 33, 68, 69, 70, 0, 54, 0, 0, 0, - 58, 71, 0, 0, 54, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 72, - 57, 1, 0, 0, 54, 0, 0, 0, 0, 66, 73, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 74, 51, 25, 75, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 74, 76, 0, 77, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 78, 55, 0, 0, 0, 0, 0, 0, 5, 75, - 79, 80, 2, 5, 2, 2, 2, 76, 58, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 80, 81, 82, 0, 0, 0, 83, 34, 0, 57, 0, - 84, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, - 0, 0, 85, 0, 0, 0, 85, 0, 0, 0, 54, 0, 0, 0, 54, 0, - 0, 0, 0, 0, 0, 0, 86, 77, 58, 5, 37, 1, 0, 0, 0, 0, - 87, 88, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 89, - 90, 12, 12, 12, 12, 91, 0, 0, 0, 0, 0, 0, 92, 34, 66, 45, - 0, 0, 25, 93, 0, 0, 0, 0, 0, 0, 58, 75, 94, 76, 3, 22, - 0, 0, 0, 0, 0, 0, 2, 75, 37, 0, 0, 0, 0, 0, 95, 8, - 66, 0, 0, 0, 0, 3, 37, 0, 4, 0, 0, 0, 96, 97, 0, 0, - 0, 0, 0, 0, 58, 98, 4, 0, 0, 0, 0, 0, 0, 99, 100, 0, - 0, 0, 101, 2, 81, 53, 56, 4, 2, 2, 2, 2, 2, 2, 2, 39, - 0, 102, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 76, 64, 0, 0, - 0, 0, 2, 2, 2, 2, 34, 0, 0, 0, 0, 0, 0, 25, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 2, 2, 2, 2, - 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 101, 77, 0, 0, 0, 33, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 104, 105, 0, 0, 70, 0, 0, 0, - 12, 12, 12, 12, 12, 12, 106, 0, 71, 0, 0, 0, 2, 2, 4, 25, - 0, 0, 0, 0, 33, 77, 0, 0, 25, 2, 4, 0, 0, 0, 0, 0, - 51, 0, 0, 0, 0, 0, 107, 108, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 109, 82, 0, 105, 56, 0, 0, 0, 0, 0, 56, - 0, 0, 0, 0, 0, 0, 110, 68, 55, 0, 0, 0, 0, 71, 58, 0, - 0, 0, 0, 0, 1, 53, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, - 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 34, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 33, 51, 111, 99, 0, 0, 0, 0, 0, 92, - 112, 113, 114, 115, 116, 117, 0, 0, 118, 119, 120, 0, 0, 121, 0, 0, - 122, 12, 12, 12, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 12, - 125, 2, 126, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 2, - 75, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0, 0, 0, 0, 127, 59, - 51, 0, 0, 0, 25, 40, 76, 0, 0, 0, 0, 0, 0, 0, 105, 0, - 4, 0, 0, 0, 0, 0, 33, 75, 0, 57, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 128, 58, 0, 0, 0, 25, 3, 51, 0, 0, - 34, 0, 0, 0, 33, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 73, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 129, - 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 86, - 34, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 131, - 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 6, 0, - 0, 0, 0, 80, 133, 37, 0, 0, 0, 0, 0, 0, 0, 25, 2, 59, - 0, 0, 99, 54, 34, 0, 0, 0, 5, 51, 0, 0, 0, 0, 3, 134, - 25, 0, 109, 45, 0, 0, 0, 0, 0, 64, 75, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 75, 6, 0, 0, 64, 2, 2, 64, 135, 0, - 0, 0, 0, 0, 0, 0, 109, 136, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, - 0, 0, 0, 0, 0, 0, 2, 34, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 0, 75, 0, 0, 25, 0, 0, 0, 0, 0, 0, - 0, 25, 51, 0, 0, 0, 0, 0, 0, 0, 0, 70, 37, 0, 0, 0, - 0, 0, 0, 0, 25, 4, 3, 2, 137, 37, 0, 0, 0, 96, 0, 0, - 85, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 75, 3, - 2, 2, 2, 2, 2, 76, 1, 0, 56, 0, 0, 3, 5, 2, 0, 0, - 75, 2, 2, 138, 139, 51, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, - 0, 0, 75, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, - 140, 37, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 2, 2, 2, 2, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_joining_type_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, - 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 5, 0, 5, 5, 0, 5, - 5, 5, 5, 0, 5, 0, 0, 0, 2, 0, 3, 3, 3, 3, 2, 3, - 2, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, - 3, 2, 2, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 2, 2, - 5, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 3, 3, 0, 3, 5, 5, - 5, 5, 5, 5, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 3, 3, - 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, - 3, 5, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 2, - 3, 2, 3, 2, 3, 2, 2, 3, 5, 5, 5, 0, 0, 3, 2, 2, - 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, - 2, 3, 2, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 5, 5, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 5, 5, 5, 0, 5, 5, 5, 5, 5, 0, 0, - 3, 2, 2, 2, 2, 2, 3, 3, 2, 3, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 2, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, - 2, 0, 2, 2, 2, 2, 0, 3, 2, 3, 3, 0, 0, 0, 0, 0, - 2, 2, 3, 3, 3, 0, 3, 2, 2, 3, 3, 2, 2, 0, 2, 2, - 2, 3, 2, 2, 2, 2, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 5, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, - 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, - 0, 5, 5, 0, 0, 0, 0, 5, 5, 0, 0, 5, 5, 5, 0, 0, - 5, 5, 0, 0, 0, 5, 0, 0, 0, 5, 5, 5, 5, 5, 0, 5, - 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 0, 0, 5, - 0, 0, 5, 0, 0, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, - 5, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5, 5, 5, 5, 0, 0, - 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 5, 0, 0, - 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5, 0, - 0, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, - 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 5, 5, 5, 5, 5, 5, 0, 5, 5, - 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, - 0, 5, 5, 0, 0, 5, 5, 0, 5, 5, 0, 0, 0, 0, 5, 5, - 0, 0, 5, 0, 0, 5, 5, 0, 0, 0, 5, 5, 5, 0, 0, 0, - 0, 0, 0, 0, 5, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 1, 5, 5, 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 5, 2, 2, 5, 2, 0, 0, 0, 0, 0, - 5, 5, 5, 0, 0, 0, 0, 5, 5, 0, 0, 5, 0, 0, 0, 0, - 5, 0, 5, 0, 0, 5, 5, 5, 0, 0, 0, 0, 5, 0, 5, 5, - 0, 0, 5, 5, 5, 5, 0, 0, 5, 5, 0, 5, 5, 5, 0, 0, - 5, 5, 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, - 0, 0, 0, 5, 0, 1, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0, - 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, - 2, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 5, - 5, 5, 0, 0, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, - 5, 0, 5, 5, 5, 0, 0, 5, 0, 5, 5, 5, 0, 5, 5, 0, - 2, 2, 2, 2, 2, 3, 0, 3, 0, 3, 3, 0, 0, 4, 3, 3, - 3, 3, 3, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 3, 2, 2, - 2, 3, 0, 0, 3, 5, 5, 0, 0, 0, 0, 2, 2, 2, 2, 3, - 2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 2, 2, 3, 2, 3, 3, - 2, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 2, 2, 0, - 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 5, 5, 5, 5, - 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 5, 5, - 5, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, - 5, 5, 0, 0, 5, 0, 5, 5, 5, 0, 5, 0, 0, 0, 0, 5, - 5, 0, 5, 5, 0, 0, 0, 0, 5, 5, 5, 0, 0, 5, 0, 5, - 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 5, - 5, 0, 0, 5, 5, 5, 5, 0, 5, 0, 5, 5, 0, 5, 5, 0, - 0, 0, 5, 0, 5, 5, 0, 5, 5, 5, 5, 0, 0, 5, 5, 5, - 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5, 5, - 2, 2, 2, 2, 5, 5, 5, 5, -}; + v = re_soft_dotted_table_1[field_2]; + v = re_soft_dotted_table_2[(v << 5) | field_1]; + v = re_soft_dotted_table_3[(v << 2) | field_0]; -/* Joining_Type: 3560 bytes. */ - -RE_UINT32 re_get_joining_type(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_joining_type_stage_1[f] << 6; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_joining_type_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_joining_type_stage_3[pos + f] << 3; - value = re_joining_type_stage_4[pos + code]; - - return value; + return (v >> offset) & 0x1; } -/* Line_Break. */ - -static RE_UINT8 re_line_break_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 10, 17, 5, 18, 10, 10, 19, 10, 20, 21, 22, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 24, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, -}; - -static RE_UINT8 re_line_break_stage_2[] = { - 0, 1, 2, 2, 2, 3, 4, 5, 2, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 2, 2, 2, 2, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 2, 51, 2, 2, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 2, 2, 2, 70, 2, 2, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 86, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 87, 79, 79, 79, 79, 79, 79, 79, 79, 88, 2, 2, 89, 90, 2, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 100, - 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, - 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, - 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, - 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, - 102, 103, 104, 105, 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, 102, 107, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 79, 79, 79, 79, 110, 111, 2, 2, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 109, 122, 123, 124, 2, 125, 126, 109, 2, 2, 127, 109, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 109, 139, 109, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 109, 149, 150, 109, 151, 152, 153, 154, 109, - 155, 156, 109, 157, 158, 159, 109, 109, 160, 161, 162, 163, 109, 164, 109, 165, - 2, 2, 2, 2, 2, 2, 2, 166, 167, 2, 168, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 2, 2, 2, 2, 169, 170, 171, 2, 172, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 2, 2, 2, 173, 174, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 2, 2, 2, 2, 175, 176, 177, 178, 109, 109, 109, 109, 179, 180, 181, 182, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 183, - 79, 79, 79, 79, 79, 184, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 79, 79, 185, 79, 79, 186, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 187, 188, 109, 109, 109, 109, 109, 109, - 2, 189, 190, 191, 192, 193, 194, 109, 195, 196, 197, 2, 2, 198, 2, 199, - 2, 2, 2, 2, 200, 201, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 202, 109, 203, 109, 109, 204, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 2, 205, 206, 109, 109, 109, 109, 109, 207, 208, 209, 109, 210, 211, 109, 109, - 79, 79, 212, 213, 79, 79, 79, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 228, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 228, - 229, 109, 230, 231, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, -}; - -static RE_UINT16 re_line_break_stage_3[] = { - 0, 1, 0, 0, 2, 3, 4, 5, 6, 6, 6, 7, 6, 6, 6, 8, - 9, 0, 0, 0, 10, 11, 12, 13, 6, 6, 14, 6, 6, 6, 14, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 14, 15, 16, 17, 6, 6, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 19, 20, 0, 6, 21, - 22, 23, 6, 6, 24, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 25, 26, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 27, 6, 6, 6, 28, 27, 6, 6, 6, 6, - 6, 29, 30, 0, 0, 0, 0, 31, 32, 33, 34, 34, 34, 35, 36, 33, - 6, 37, 0, 38, 6, 6, 6, 6, 6, 25, 0, 0, 4, 39, 40, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 41, 42, 42, 43, 4, 44, - 6, 45, 46, 6, 6, 6, 0, 0, 0, 47, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 48, 0, 49, 33, 4, 44, 6, 6, 6, 25, 50, 51, - 6, 6, 48, 52, 53, 54, 6, 28, 6, 6, 6, 55, 6, 56, 33, 33, - 33, 33, 33, 33, 6, 6, 57, 58, 33, 33, 59, 0, 52, 0, 0, 0, - 50, 6, 6, 6, 6, 6, 6, 60, 0, 0, 61, 6, 62, 4, 6, 6, - 63, 64, 65, 6, 6, 66, 67, 68, 69, 70, 71, 72, 73, 4, 74, 75, - 76, 77, 65, 6, 6, 66, 78, 79, 80, 81, 82, 83, 84, 4, 85, 33, - 76, 45, 24, 6, 6, 66, 86, 68, 87, 88, 89, 33, 73, 4, 90, 91, - 76, 64, 65, 6, 6, 66, 86, 68, 69, 81, 92, 72, 73, 4, 6, 33, - 93, 94, 95, 96, 97, 94, 6, 98, 99, 100, 101, 33, 84, 4, 6, 102, - 103, 57, 66, 6, 6, 66, 6, 104, 105, 100, 106, 56, 73, 4, 107, 6, - 108, 57, 66, 6, 6, 66, 109, 68, 105, 100, 106, 110, 73, 4, 111, 33, - 112, 57, 66, 6, 6, 6, 6, 113, 105, 114, 115, 6, 73, 4, 6, 116, - 117, 6, 28, 118, 6, 6, 24, 119, 28, 120, 121, 0, 84, 4, 122, 33, - 123, 124, 124, 124, 124, 124, 124, 125, 124, 126, 4, 127, 33, 33, 33, 33, - 128, 129, 124, 124, 130, 124, 124, 131, 132, 131, 4, 133, 33, 33, 33, 33, - 134, 135, 136, 26, 4, 44, 137, 138, 6, 27, 6, 6, 6, 139, 30, 140, - 141, 142, 0, 30, 0, 0, 0, 143, 144, 57, 145, 146, 33, 33, 33, 33, - 124, 124, 124, 124, 124, 124, 124, 124, 4, 147, 124, 124, 124, 124, 124, 124, - 124, 124, 4, 148, 6, 6, 6, 6, 45, 149, 6, 6, 6, 6, 6, 6, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 151, 151, 151, 151, - 151, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 95, 28, 95, 6, 6, 6, 6, - 6, 95, 6, 6, 6, 6, 95, 28, 95, 6, 28, 6, 6, 6, 6, 6, - 6, 6, 95, 6, 6, 6, 6, 6, 6, 6, 6, 153, 154, 6, 6, 139, - 6, 6, 6, 155, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 58, 58, - 156, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 156, 6, 6, 157, 6, 6, 6, 6, 6, 6, 6, 6, 6, 158, 6, 89, - 6, 57, 159, 33, 6, 6, 160, 33, 6, 6, 161, 33, 6, 57, 162, 33, - 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 163, 164, 4, 165, 6, 155, - 166, 167, 4, 165, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 89, - 168, 6, 6, 6, 6, 169, 6, 6, 6, 6, 6, 6, 6, 6, 58, 33, - 6, 6, 6, 28, 0, 170, 0, 170, 171, 4, 124, 124, 124, 131, 172, 33, - 124, 124, 124, 124, 124, 173, 124, 124, 124, 174, 4, 175, 6, 6, 6, 6, - 6, 6, 176, 177, 124, 124, 124, 124, 124, 124, 124, 178, 124, 124, 124, 179, - 4, 165, 4, 165, 124, 131, 0, 180, 33, 33, 33, 33, 33, 33, 33, 33, - 103, 6, 6, 6, 6, 6, 181, 0, 103, 182, 4, 183, 156, 25, 50, 139, - 184, 6, 6, 6, 61, 185, 4, 44, 6, 6, 6, 6, 48, 0, 170, 22, - 6, 6, 6, 6, 181, 0, 0, 186, 4, 187, 4, 44, 6, 6, 6, 188, - 6, 89, 6, 6, 6, 6, 6, 189, 6, 33, 190, 0, 0, 191, 192, 193, - 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 194, - 6, 6, 58, 58, 6, 6, 6, 6, 58, 58, 6, 195, 6, 6, 6, 58, - 6, 6, 6, 6, 6, 6, 57, 6, 57, 6, 196, 109, 6, 6, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 0, 212, 213, - 214, 215, 6, 139, 216, 217, 218, 219, 217, 217, 0, 0, 0, 0, 220, 33, - 221, 116, 222, 6, 223, 224, 6, 6, 6, 6, 225, 226, 227, 228, 227, 229, - 6, 230, 227, 229, 6, 6, 6, 6, 6, 6, 231, 6, 6, 6, 6, 6, - 232, 233, 234, 235, 236, 237, 238, 225, 6, 239, 240, 6, 241, 242, 6, 6, - 242, 6, 243, 244, 243, 6, 6, 14, 6, 6, 6, 6, 6, 245, 6, 6, - 6, 246, 240, 247, 6, 248, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 249, 6, - 6, 6, 6, 6, 28, 33, 33, 33, 6, 56, 33, 33, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 250, - 227, 227, 227, 227, 227, 227, 227, 227, 227, 228, 227, 227, 227, 227, 251, 6, - 227, 227, 252, 6, 253, 229, 242, 225, 254, 255, 229, 6, 252, 14, 6, 6, - 256, 257, 258, 259, 6, 6, 6, 260, 261, 6, 6, 6, 262, 263, 6, 264, - 6, 6, 6, 265, 6, 6, 6, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 6, 6, 6, 6, 6, 6, 6, 6, 14, 277, 278, 279, 280, 227, - 227, 227, 228, 6, 6, 6, 6, 6, 281, 6, 6, 6, 282, 279, 6, 6, - 283, 284, 284, 285, 6, 6, 6, 6, 6, 6, 6, 246, 6, 6, 6, 286, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 287, 229, 6, 6, 196, 6, - 6, 6, 58, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 28, 6, 6, 6, 6, 6, 28, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 176, 288, 289, - 6, 6, 6, 6, 45, 149, 6, 6, 6, 6, 6, 6, 6, 290, 291, 71, - 6, 6, 28, 33, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, 0, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 33, 33, 33, 33, 33, 33, - 267, 267, 267, 302, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 303, 33, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 304, 33, 33, 33, 267, 303, - 305, 279, 306, 307, 267, 308, 309, 310, 311, 312, 267, 267, 313, 267, 267, 267, - 314, 315, 316, 317, 318, 312, 267, 267, 313, 267, 267, 267, 314, 315, 319, 320, - 321, 267, 267, 267, 267, 267, 322, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 323, 267, 267, 267, 267, 267, 324, 267, 267, 267, 267, 303, 33, 325, 325, - 267, 267, 267, 323, 267, 267, 267, 267, 267, 227, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 6, 6, 6, 6, 6, 6, 6, 6, - 267, 267, 326, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 327, 267, 267, 267, 267, 267, 267, 323, 33, 6, 6, 6, 6, 6, 188, - 6, 328, 6, 6, 4, 329, 33, 33, 6, 6, 6, 6, 6, 176, 190, 185, - 6, 6, 6, 48, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 330, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 331, 33, 33, 33, 33, 33, 290, 6, - 332, 333, 6, 6, 25, 182, 6, 334, 6, 6, 6, 6, 6, 6, 335, 33, - 26, 6, 6, 6, 6, 6, 181, 0, 336, 337, 4, 165, 0, 0, 26, 338, - 4, 44, 6, 6, 48, 339, 6, 6, 176, 0, 170, 290, 150, 150, 150, 340, - 50, 6, 6, 6, 6, 6, 25, 0, 341, 342, 4, 343, 124, 124, 4, 344, - 6, 6, 6, 6, 6, 61, 180, 33, 333, 345, 4, 346, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 124, 347, 33, 33, 348, 6, 25, 349, 33, - 350, 350, 350, 33, 28, 28, 6, 6, 6, 6, 6, 6, 6, 33, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 25, 351, 4, 165, - 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, - 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, - 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, - 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, - 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, - 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, - 353, 353, 352, 353, 353, 354, 353, 353, 353, 352, 353, 353, 354, 353, 353, 353, - 353, 352, 353, 353, 355, 33, 151, 151, 356, 357, 152, 152, 152, 152, 152, 358, - 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 28, 33, 360, 361, 34, 362, 363, 364, 365, 34, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 155, 33, 360, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 366, 33, 33, 6, 6, 6, 6, 6, 6, - 6, 6, 118, 6, 6, 6, 6, 6, 6, 33, 33, 33, 33, 33, 6, 367, - 0, 0, 368, 369, 0, 0, 370, 284, 371, 372, 373, 374, 323, 375, 57, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 376, - 377, 378, 267, 379, 267, 267, 267, 380, 267, 267, 267, 381, 382, 325, 383, 267, - 267, 267, 267, 384, 267, 267, 267, 323, 385, 385, 385, 386, 387, 28, 33, 388, - 6, 109, 6, 6, 28, 6, 6, 389, 6, 58, 6, 58, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 56, - 390, 6, 6, 6, 6, 6, 391, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 28, 6, 182, 89, 33, 33, 33, 33, 33, 6, 6, 6, 6, 6, 392, - 6, 6, 6, 139, 6, 6, 6, 6, 6, 6, 89, 33, 40, 6, 6, 182, - 6, 6, 6, 6, 182, 393, 6, 6, 6, 56, 6, 6, 6, 6, 48, 394, - 6, 6, 6, 395, 6, 6, 6, 6, 182, 6, 396, 33, 33, 33, 33, 33, - 6, 6, 6, 58, 4, 165, 6, 6, 6, 6, 182, 6, 6, 6, 6, 182, - 6, 6, 6, 6, 6, 33, 6, 6, 6, 6, 6, 6, 182, 290, 33, 33, - 6, 6, 6, 6, 6, 6, 28, 33, 6, 6, 58, 33, 6, 33, 33, 33, - 58, 66, 6, 6, 6, 6, 45, 397, 6, 6, 395, 6, 6, 6, 6, 6, - 6, 6, 6, 28, 290, 6, 33, 33, 33, 33, 33, 33, 6, 6, 398, 360, - 6, 6, 6, 399, 6, 6, 6, 400, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 22, 6, 6, 118, 6, 6, 6, 6, 6, - 401, 402, 109, 27, 6, 6, 58, 80, 6, 89, 403, 89, 6, 6, 6, 6, - 6, 6, 6, 6, 33, 33, 33, 33, 6, 6, 6, 6, 404, 360, 405, 33, - 6, 6, 6, 6, 6, 6, 58, 406, 6, 6, 58, 6, 6, 6, 56, 6, - 6, 6, 155, 407, 33, 27, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 89, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 56, 33, 6, 6, 6, 6, 6, 6, 56, 118, - 6, 6, 6, 6, 181, 33, 4, 165, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 6, 28, - 6, 6, 6, 6, 6, 33, 6, 6, 48, 0, 40, 155, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 28, 33, - 184, 6, 6, 6, 6, 6, 6, 0, 140, 396, 118, 6, 408, 4, 33, 71, - 184, 6, 6, 6, 6, 6, 0, 409, 410, 149, 6, 6, 6, 89, 4, 165, - 184, 6, 6, 6, 176, 0, 411, 4, 412, 33, 6, 6, 6, 6, 413, 33, - 184, 6, 6, 6, 6, 6, 25, 0, 414, 415, 4, 416, 27, 6, 139, 33, - 6, 6, 24, 6, 6, 181, 0, 417, 33, 33, 33, 33, 33, 33, 33, 33, - 28, 418, 6, 45, 6, 419, 6, 6, 6, 6, 6, 176, 0, 394, 4, 165, - 112, 64, 65, 6, 6, 66, 86, 420, 69, 81, 101, 393, 421, 422, 422, 33, - 6, 6, 6, 6, 6, 6, 142, 0, 423, 424, 4, 425, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 0, 0, 50, 33, 4, 165, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 176, 336, 0, 426, 427, 403, 345, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 0, 0, 428, 33, 4, 165, 429, 430, 33, 33, - 6, 6, 6, 6, 6, 25, 0, 89, 4, 165, 33, 33, 33, 33, 33, 33, - 124, 124, 124, 431, 124, 173, 4, 432, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 181, 0, 433, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 6, 6, 6, 6, 6, 6, 6, 6, 4, 44, 56, 290, - 33, 33, 33, 33, 6, 118, 6, 6, 6, 6, 61, 434, 435, 33, 33, 33, - 61, 184, 6, 6, 6, 6, 25, 436, 437, 33, 61, 50, 6, 6, 6, 6, - 6, 438, 0, 439, 440, 33, 33, 33, 6, 6, 6, 6, 6, 6, 6, 89, - 6, 66, 6, 6, 6, 176, 180, 0, 441, 33, 4, 44, 6, 139, 442, 6, - 6, 6, 434, 0, 0, 30, 180, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 28, 24, 6, 6, 6, 6, 443, 444, 445, 33, 4, 165, 45, 66, 6, 6, - 6, 446, 194, 89, 4, 165, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 447, 89, - 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 6, 448, 449, 6, 155, 450, - 6, 6, 6, 155, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 28, 451, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 182, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 452, 6, 6, 6, 6, - 453, 454, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 455, - 6, 6, 6, 6, 6, 28, 456, 457, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 282, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 28, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 89, 6, 6, 6, 28, 4, 458, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 6, 58, 459, 33, - 6, 6, 6, 6, 6, 6, 140, 460, 461, 33, 4, 462, 24, 6, 6, 393, - 6, 6, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 463, 464, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 465, 61, 0, 0, 0, 0, 0, - 0, 71, 184, 6, 33, 33, 33, 33, 33, 33, 33, 33, 466, 33, 33, 33, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 33, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 324, 33, - 267, 267, 267, 323, 33, 33, 33, 33, 33, 33, 467, 33, 468, 33, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 303, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 56, 6, 139, - 6, 89, 6, 469, 170, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 58, 33, - 6, 6, 6, 6, 28, 27, 6, 6, 6, 6, 6, 6, 142, 470, 0, 0, - 471, 50, 6, 6, 6, 472, 6, 6, 6, 6, 6, 6, 6, 89, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 473, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 182, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 28, 33, 6, 6, 6, 89, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 57, 6, 6, 6, 6, 6, - 6, 6, 6, 57, 474, 475, 6, 476, 109, 6, 6, 6, 6, 6, 6, 6, - 45, 189, 57, 57, 6, 6, 6, 477, 478, 118, 66, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 58, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 479, 4, 4, 4, 4, 4, 4, - 0, 0, 0, 0, 0, 0, 423, 25, 0, 0, 0, 0, 0, 103, 480, 6, - 481, 482, 33, 59, 30, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 180, 0, 0, 483, 484, 394, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 139, 423, 58, 4, 343, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 6, 6, 6, 6, 6, 181, 4, 485, - 6, 6, 6, 6, 6, 6, 6, 6, 64, 6, 180, 33, 33, 33, 33, 33, - 6, 6, 6, 6, 6, 6, 6, 6, 181, 433, 4, 486, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 27, 6, - 6, 6, 6, 6, 6, 487, 488, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 27, 6, 6, 6, 6, 6, 6, 58, 33, 33, 33, 33, 33, 33, 33, 33, - 109, 6, 6, 6, 489, 27, 490, 491, 492, 493, 489, 195, 489, 490, 490, 83, - 6, 24, 6, 182, 494, 24, 6, 182, 33, 33, 33, 33, 33, 33, 155, 33, - 227, 495, 227, 227, 227, 496, 227, 227, 227, 227, 227, 227, 227, 497, 227, 227, - 227, 227, 227, 227, 227, 495, 267, 267, 267, 267, 267, 267, 498, 499, 499, 499, - 500, 267, 267, 501, 267, 267, 502, 503, 504, 505, 267, 267, 267, 267, 267, 506, - 267, 267, 267, 267, 267, 267, 267, 267, 507, 508, 509, 267, 510, 508, 508, 511, - 512, 513, 514, 267, 515, 516, 517, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 264, 267, 518, 6, 266, 267, 519, 6, 6, 520, 267, 267, 267, 267, 521, 522, - 267, 267, 523, 267, 267, 267, 267, 267, 267, 267, 249, 524, 267, 267, 249, 520, - 267, 267, 267, 267, 267, 267, 267, 267, 525, 526, 6, 6, 6, 6, 527, 528, - 267, 267, 267, 267, 529, 267, 530, 267, 509, 531, 267, 267, 267, 267, 267, 267, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 524, 267, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 266, 267, 267, 267, 267, 267, - 6, 524, 6, 6, 6, 6, 6, 6, 6, 267, 6, 520, 6, 6, 6, 6, - 6, 267, 6, 6, 6, 532, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 6, 533, 267, 508, 534, 267, 508, 535, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 536, 537, 267, 525, 538, 539, 267, 267, 267, 267, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 524, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 304, - 82, 33, 33, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 33, +/* Terminal_Punctuation. */ +static RE_UINT8 re_terminal_punctuation_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, + 15, 9, 16, 17, 18, 19, 20, 21, 9, 22, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, + 9, 9, 9, 9, 9, 9, 26, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; -static RE_UINT8 re_line_break_stage_4[] = { - 16, 16, 16, 16, 16, 16, 16, 16, 16, 18, 22, 20, 20, 21, 16, 16, - 19, 6, 3, 12, 9, 10, 12, 3, 1, 36, 12, 9, 8, 15, 8, 7, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 12, 12, 12, 6, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 9, 36, 12, 12, - 12, 12, 12, 1, 18, 2, 12, 16, 16, 16, 16, 16, 16, 29, 16, 16, - 4, 1, 10, 9, 9, 9, 12, 25, 25, 12, 25, 3, 12, 18, 12, 12, - 10, 9, 25, 25, 17, 12, 25, 25, 25, 25, 25, 3, 25, 25, 25, 1, - 12, 12, 12, 12, 12, 12, 12, 25, 17, 25, 25, 25, 17, 25, 12, 12, - 25, 12, 12, 12, 12, 12, 12, 12, 25, 25, 25, 25, 12, 25, 12, 17, - 16, 16, 16, 16, 16, 16, 16, 4, 16, 16, 16, 16, 4, 4, 4, 4, - 4, 4, 4, 16, 16, 16, 16, 16, 0, 0, 12, 12, 12, 12, 8, 12, - 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 0, 12, 0, 12, 12, - 12, 12, 0, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, - 16, 16, 12, 12, 12, 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 0, 12, 8, 18, 0, 0, 12, 12, 9, - 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 18, 16, - 12, 16, 16, 12, 16, 16, 6, 16, 0, 0, 0, 0, 0, 0, 0, 0, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, 0, 0, 0, 37, - 37, 37, 37, 12, 12, 0, 0, 0, 12, 10, 10, 10, 8, 8, 12, 12, - 16, 16, 16, 6, 16, 0, 6, 6, 11, 11, 10, 11, 11, 12, 12, 12, - 16, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 6, 12, 16, 16, - 16, 16, 16, 16, 16, 12, 12, 16, 16, 12, 16, 16, 16, 16, 12, 12, - 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, - 12, 16, 12, 12, 12, 12, 12, 12, 16, 16, 16, 0, 0, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 16, 16, 16, 12, 0, 0, 0, 0, 0, 0, - 16, 16, 16, 16, 12, 12, 12, 12, 8, 6, 12, 0, 0, 16, 9, 9, - 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 0, 0, 12, 16, 16, 16, 0, 0, 12, 0, - 12, 12, 12, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 0, 12, 12, - 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, - 12, 12, 16, 16, 16, 12, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, - 12, 12, 16, 16, 18, 18, 11, 11, 12, 16, 16, 16, 0, 12, 12, 12, - 12, 12, 12, 12, 12, 0, 0, 12, 12, 0, 0, 12, 12, 12, 12, 12, - 12, 0, 12, 12, 12, 12, 12, 12, 12, 0, 12, 0, 0, 0, 12, 12, - 12, 12, 0, 0, 16, 12, 16, 16, 16, 16, 16, 16, 16, 0, 0, 16, - 16, 0, 0, 16, 16, 16, 12, 0, 0, 0, 0, 0, 0, 0, 0, 16, - 0, 0, 0, 0, 12, 12, 0, 12, 12, 12, 16, 16, 0, 0, 11, 11, - 12, 12, 10, 10, 12, 12, 12, 12, 12, 10, 12, 9, 12, 12, 16, 0, - 0, 16, 16, 16, 0, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 12, - 12, 0, 12, 12, 0, 12, 12, 0, 12, 12, 0, 0, 16, 0, 16, 16, - 16, 16, 16, 0, 0, 0, 0, 16, 16, 0, 0, 16, 16, 16, 0, 0, - 0, 16, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 0, 12, 0, - 0, 0, 0, 0, 0, 0, 11, 11, 16, 16, 12, 12, 12, 16, 12, 0, - 12, 0, 12, 12, 0, 12, 12, 12, 16, 16, 16, 16, 16, 16, 0, 16, - 16, 16, 0, 16, 16, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 12, 9, 0, 0, 0, 0, 0, 0, 0, 12, 16, 16, 16, 16, 16, 16, - 0, 0, 0, 0, 0, 0, 16, 16, 0, 0, 16, 12, 0, 12, 12, 12, - 12, 12, 12, 0, 0, 0, 12, 12, 12, 0, 12, 12, 12, 12, 0, 0, - 0, 12, 12, 0, 12, 0, 12, 12, 0, 0, 0, 12, 12, 0, 0, 0, - 12, 12, 0, 0, 0, 0, 16, 16, 16, 16, 16, 0, 0, 0, 16, 16, - 16, 0, 16, 16, 16, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 16, - 12, 9, 12, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 12, 12, 12, - 12, 12, 0, 0, 0, 12, 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, - 0, 0, 0, 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 17, - 12, 16, 16, 16, 17, 12, 12, 12, 12, 12, 12, 12, 0, 12, 12, 12, - 0, 0, 0, 0, 0, 0, 12, 0, 0, 12, 12, 0, 0, 0, 0, 0, - 16, 16, 16, 16, 0, 12, 12, 12, 12, 12, 12, 16, 16, 12, 16, 16, - 16, 0, 16, 16, 16, 16, 12, 12, 0, 0, 0, 0, 12, 12, 12, 16, - 12, 10, 12, 12, 12, 12, 12, 12, 0, 0, 16, 16, 0, 12, 12, 12, - 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, 0, 0, - 0, 0, 16, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 0, 16, 0, - 0, 0, 16, 16, 12, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 9, - 24, 24, 24, 24, 24, 24, 24, 12, 11, 11, 18, 18, 0, 0, 0, 0, - 0, 24, 24, 0, 24, 0, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24, - 24, 24, 24, 24, 0, 24, 0, 24, 24, 24, 24, 24, 24, 24, 0, 0, - 24, 24, 24, 24, 24, 0, 24, 0, 11, 11, 0, 0, 24, 24, 24, 24, - 12, 17, 17, 17, 17, 12, 17, 17, 4, 17, 17, 18, 4, 6, 6, 6, - 6, 6, 4, 12, 6, 12, 12, 12, 12, 12, 12, 12, 18, 16, 12, 16, - 12, 16, 1, 2, 1, 2, 16, 16, 12, 12, 12, 12, 12, 0, 0, 0, - 16, 16, 16, 16, 16, 16, 16, 18, 16, 16, 16, 16, 16, 18, 16, 16, - 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 16, 16, 0, 18, 18, - 12, 12, 12, 12, 12, 12, 16, 12, 17, 17, 18, 17, 12, 12, 12, 12, - 12, 4, 4, 0, 0, 0, 0, 0, 11, 11, 18, 18, 12, 12, 12, 12, - 11, 11, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 12, 0, 0, - 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, - 33, 33, 33, 33, 33, 33, 33, 33, 12, 12, 12, 0, 0, 16, 16, 16, - 12, 18, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, - 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 2, 0, 0, 0, - 12, 12, 12, 18, 18, 18, 12, 12, 12, 12, 16, 16, 16, 0, 0, 0, - 12, 12, 16, 16, 16, 18, 18, 0, 12, 12, 16, 16, 0, 0, 0, 0, - 12, 0, 16, 16, 0, 0, 0, 0, 24, 24, 24, 24, 18, 18, 5, 24, - 18, 12, 18, 9, 24, 24, 0, 0, 11, 11, 0, 0, 0, 0, 0, 0, - 12, 12, 6, 6, 18, 18, 17, 12, 6, 6, 12, 16, 16, 16, 4, 0, - 12, 12, 12, 12, 12, 16, 16, 12, 12, 16, 12, 0, 0, 0, 0, 0, - 16, 16, 16, 16, 0, 0, 0, 0, 12, 0, 0, 0, 6, 6, 11, 11, - 24, 24, 24, 24, 24, 0, 0, 0, 24, 24, 24, 24, 0, 0, 0, 0, - 24, 24, 0, 0, 0, 0, 0, 0, 11, 11, 24, 0, 0, 0, 24, 24, - 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 0, 0, 12, 12, - 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24, 24, 0, 0, 16, - 16, 16, 16, 16, 16, 16, 16, 0, 12, 12, 12, 12, 16, 16, 16, 16, - 12, 12, 12, 12, 0, 0, 0, 0, 11, 11, 18, 18, 12, 18, 18, 18, - 16, 16, 16, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 12, 12, - 0, 0, 0, 18, 18, 18, 18, 18, 11, 11, 0, 0, 0, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 18, 18, 12, 12, 12, 0, 0, 12, 12, 12, - 16, 16, 16, 12, 16, 16, 16, 16, 16, 12, 12, 12, 12, 16, 12, 12, - 12, 12, 12, 12, 16, 12, 12, 16, 16, 16, 12, 0, 0, 0, 0, 0, - 16, 16, 0, 16, 16, 16, 16, 16, 0, 12, 0, 12, 0, 12, 0, 12, - 12, 12, 12, 12, 0, 0, 12, 12, 0, 0, 12, 12, 12, 0, 12, 12, - 12, 12, 12, 12, 12, 17, 12, 0, 18, 18, 18, 18, 18, 18, 18, 4, - 18, 18, 18, 28, 16, 42, 16, 16, 18, 4, 18, 18, 26, 25, 25, 12, - 3, 3, 1, 3, 3, 3, 1, 3, 25, 25, 12, 12, 14, 14, 14, 18, - 20, 20, 16, 16, 16, 16, 16, 4, 10, 10, 10, 10, 10, 10, 10, 10, - 12, 3, 3, 25, 5, 5, 12, 12, 12, 12, 12, 12, 8, 1, 2, 5, - 5, 5, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18, 12, - 18, 18, 18, 18, 12, 18, 18, 18, 30, 12, 12, 12, 12, 0, 16, 16, - 12, 12, 0, 0, 25, 12, 12, 12, 12, 12, 12, 12, 12, 1, 2, 25, - 12, 25, 25, 25, 25, 12, 12, 12, 12, 12, 12, 12, 12, 1, 2, 0, - 9, 9, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 10, 9, 9, 9, 9, 10, 9, 9, 10, 9, - 16, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 10, 12, 25, 12, 12, - 12, 12, 12, 25, 12, 12, 9, 12, 12, 25, 25, 12, 12, 12, 12, 12, - 12, 12, 12, 25, 12, 12, 12, 12, 12, 12, 12, 12, 25, 25, 12, 12, - 12, 12, 12, 25, 12, 12, 25, 12, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 12, 12, 12, 12, 25, 25, 12, 12, 12, 12, 12, 12, - 12, 25, 12, 12, 0, 0, 0, 0, 12, 12, 25, 12, 25, 12, 12, 12, - 25, 12, 25, 25, 12, 12, 12, 25, 25, 12, 12, 25, 12, 12, 12, 25, - 12, 25, 9, 9, 12, 25, 12, 12, 12, 12, 25, 12, 12, 25, 25, 25, - 25, 12, 12, 25, 12, 25, 12, 25, 25, 25, 25, 25, 25, 12, 25, 12, - 12, 12, 12, 12, 25, 25, 25, 25, 25, 12, 12, 12, 25, 12, 12, 12, - 12, 12, 25, 12, 12, 12, 12, 12, 25, 25, 12, 12, 25, 25, 25, 25, - 12, 12, 25, 25, 12, 12, 25, 25, 12, 12, 12, 12, 12, 25, 12, 12, - 12, 25, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 14, - 1, 2, 1, 2, 12, 12, 12, 12, 12, 12, 13, 13, 12, 12, 12, 12, - 12, 1, 2, 12, 12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, - 25, 25, 25, 25, 25, 25, 25, 12, 25, 25, 25, 25, 25, 12, 12, 12, - 12, 12, 25, 25, 25, 25, 12, 12, 25, 25, 12, 25, 25, 25, 25, 25, - 25, 25, 12, 12, 12, 12, 25, 25, 25, 12, 12, 25, 12, 12, 25, 25, - 13, 13, 13, 13, 12, 25, 25, 12, 12, 25, 12, 12, 12, 12, 25, 25, - 12, 12, 12, 12, 13, 13, 25, 25, 13, 12, 13, 13, 13, 40, 13, 13, - 12, 13, 13, 13, 12, 12, 12, 12, 25, 12, 25, 12, 12, 12, 12, 12, - 25, 25, 12, 25, 25, 25, 12, 25, 13, 25, 25, 12, 25, 25, 12, 25, - 12, 12, 12, 12, 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 25, 25, - 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 25, 25, 25, 25, 13, 12, 13, 13, 13, 25, 13, 13, 25, 25, 25, - 13, 13, 25, 25, 13, 25, 25, 13, 13, 13, 12, 25, 12, 12, 12, 12, - 25, 25, 13, 25, 25, 25, 25, 25, 25, 13, 13, 13, 13, 13, 25, 13, - 13, 40, 13, 25, 25, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, - 13, 13, 40, 40, 40, 40, 12, 12, 12, 12, 12, 3, 3, 3, 3, 3, - 3, 12, 6, 6, 13, 12, 12, 12, 1, 2, 1, 2, 1, 2, 1, 2, - 1, 2, 1, 2, 1, 2, 25, 25, 12, 12, 12, 12, 12, 1, 2, 12, - 12, 12, 12, 12, 12, 12, 1, 2, 12, 12, 12, 1, 2, 1, 2, 1, - 2, 1, 2, 1, 2, 1, 2, 1, 2, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 1, 2, 12, 12, 12, 12, 12, 12, 12, 25, 25, 25, - 16, 16, 12, 12, 0, 0, 0, 0, 0, 6, 18, 18, 18, 12, 6, 18, - 0, 0, 0, 0, 0, 0, 0, 12, 18, 0, 0, 0, 0, 0, 0, 0, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 18, 18, - 18, 18, 18, 18, 18, 18, 12, 18, 1, 18, 12, 12, 3, 3, 12, 12, - 3, 3, 1, 2, 1, 2, 1, 2, 1, 2, 18, 18, 18, 18, 6, 12, - 18, 18, 12, 18, 18, 12, 12, 12, 12, 12, 26, 26, 18, 18, 18, 12, - 18, 18, 1, 18, 18, 18, 18, 18, 18, 18, 18, 12, 18, 12, 18, 18, - 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, - 13, 13, 13, 13, 13, 13, 0, 0, 18, 2, 2, 13, 13, 5, 13, 13, - 1, 2, 13, 13, 1, 2, 1, 2, 1, 2, 1, 2, 5, 1, 2, 2, - 13, 13, 16, 16, 16, 16, 16, 16, 13, 13, 13, 13, 13, 16, 13, 13, - 13, 13, 13, 5, 5, 13, 13, 13, 0, 38, 13, 38, 13, 38, 13, 38, - 13, 38, 13, 13, 13, 13, 13, 13, 13, 13, 13, 38, 13, 13, 13, 13, - 13, 13, 13, 38, 13, 38, 13, 38, 13, 13, 13, 13, 13, 13, 38, 13, - 13, 13, 13, 13, 13, 38, 38, 0, 0, 16, 16, 5, 5, 5, 5, 13, - 5, 38, 13, 38, 13, 38, 13, 38, 13, 13, 13, 13, 13, 38, 38, 13, - 13, 13, 13, 5, 38, 5, 5, 13, 0, 0, 0, 0, 0, 13, 13, 13, - 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, - 13, 13, 13, 0, 0, 0, 0, 0, 38, 38, 38, 38, 38, 38, 38, 38, - 13, 13, 13, 13, 13, 5, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, - 12, 12, 12, 12, 12, 18, 6, 18, 11, 11, 12, 12, 0, 0, 0, 0, - 16, 16, 12, 18, 18, 18, 18, 18, 0, 0, 12, 12, 12, 12, 12, 0, - 12, 12, 16, 12, 12, 12, 16, 12, 12, 12, 12, 16, 12, 12, 12, 12, - 10, 12, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 17, 17, 6, 6, - 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, - 12, 12, 12, 12, 17, 12, 12, 16, 16, 16, 16, 16, 16, 16, 18, 18, - 31, 31, 31, 31, 31, 0, 0, 0, 16, 12, 12, 12, 12, 12, 12, 18, - 18, 18, 12, 12, 12, 12, 0, 12, 11, 11, 0, 0, 0, 0, 12, 12, - 11, 11, 24, 24, 24, 24, 24, 0, 12, 12, 12, 12, 16, 16, 0, 0, - 11, 11, 0, 0, 12, 18, 18, 18, 24, 24, 24, 0, 0, 0, 0, 0, - 0, 0, 0, 24, 24, 24, 24, 24, 18, 18, 12, 12, 12, 16, 16, 0, - 0, 12, 12, 12, 12, 12, 12, 0, 16, 16, 16, 18, 16, 16, 0, 0, - 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 34, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 0, - 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, - 0, 0, 0, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 37, 16, 37, - 37, 12, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, - 37, 37, 37, 37, 37, 0, 37, 0, 37, 37, 0, 37, 37, 0, 37, 37, - 12, 12, 12, 12, 12, 12, 2, 1, 12, 12, 12, 12, 10, 12, 0, 0, - 8, 2, 2, 8, 8, 6, 6, 1, 2, 14, 0, 0, 0, 0, 0, 0, - 13, 13, 13, 13, 13, 1, 2, 1, 2, 1, 2, 1, 2, 13, 13, 1, - 2, 13, 13, 13, 13, 13, 13, 13, 2, 13, 2, 0, 5, 5, 6, 6, - 13, 1, 2, 1, 2, 1, 2, 13, 13, 9, 10, 13, 0, 0, 0, 0, - 12, 12, 12, 12, 12, 0, 0, 30, 0, 6, 13, 13, 9, 10, 13, 13, - 1, 2, 13, 13, 2, 13, 2, 13, 13, 13, 5, 5, 13, 13, 13, 6, - 13, 13, 13, 1, 13, 2, 13, 13, 13, 13, 13, 1, 13, 2, 13, 1, - 2, 2, 1, 2, 2, 5, 13, 38, 38, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 5, 5, 0, 0, 13, 13, 13, 13, 13, 13, - 0, 0, 13, 13, 13, 0, 0, 0, 10, 9, 13, 13, 13, 9, 9, 0, - 0, 16, 16, 16, 23, 25, 0, 0, 12, 12, 12, 0, 12, 12, 0, 12, - 18, 18, 18, 0, 0, 0, 0, 12, 12, 12, 12, 12, 0, 0, 0, 12, - 12, 12, 12, 12, 12, 16, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, - 16, 16, 16, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 0, 18, - 18, 12, 12, 12, 12, 12, 0, 0, 12, 0, 0, 0, 12, 0, 0, 12, - 12, 12, 12, 0, 12, 12, 0, 0, 12, 12, 12, 12, 0, 0, 0, 18, - 12, 12, 0, 0, 0, 0, 0, 12, 12, 16, 16, 16, 0, 16, 16, 0, - 0, 0, 0, 0, 16, 16, 16, 16, 18, 18, 18, 18, 18, 18, 18, 18, - 12, 12, 12, 12, 12, 16, 16, 0, 18, 18, 18, 18, 18, 18, 14, 0, - 0, 18, 18, 18, 18, 18, 18, 18, 0, 12, 12, 12, 12, 0, 0, 0, - 12, 12, 12, 12, 12, 12, 11, 11, 16, 16, 16, 12, 12, 12, 18, 18, - 18, 18, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 0, 11, 11, - 18, 18, 18, 18, 12, 16, 16, 0, 12, 12, 12, 16, 12, 17, 12, 0, - 16, 12, 12, 12, 12, 18, 18, 12, 18, 16, 16, 16, 16, 12, 0, 0, - 11, 11, 12, 17, 12, 18, 18, 18, 18, 18, 12, 18, 18, 12, 16, 0, - 12, 0, 12, 12, 12, 12, 0, 12, 12, 18, 0, 0, 0, 0, 0, 0, - 12, 12, 0, 16, 16, 12, 16, 16, 12, 12, 16, 16, 0, 0, 16, 16, - 16, 16, 16, 16, 16, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 12, - 12, 12, 12, 18, 18, 18, 18, 12, 11, 11, 0, 18, 0, 12, 16, 12, - 16, 17, 18, 18, 6, 6, 12, 12, 12, 18, 18, 18, 18, 18, 18, 18, - 16, 18, 18, 12, 12, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 0, 0, 0, 24, 24, 24, 0, 0, 24, 24, 24, - 11, 11, 24, 24, 18, 18, 18, 24, 16, 16, 16, 12, 0, 0, 0, 0, - 0, 0, 16, 16, 16, 16, 16, 16, 16, 12, 17, 12, 16, 0, 0, 0, - 16, 16, 12, 16, 16, 16, 16, 17, 12, 18, 18, 18, 18, 17, 12, 16, - 12, 12, 16, 16, 16, 16, 16, 16, 16, 16, 18, 18, 18, 12, 17, 17, - 17, 18, 18, 0, 0, 0, 0, 0, 12, 18, 18, 18, 18, 18, 0, 0, - 17, 6, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 0, - 0, 0, 16, 0, 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, 12, 16, - 12, 12, 16, 16, 16, 16, 16, 0, 12, 12, 12, 16, 16, 16, 16, 12, - 12, 12, 12, 12, 12, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, - 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 0, 0, 0, - 1, 1, 1, 2, 2, 2, 12, 12, 12, 12, 2, 12, 12, 12, 1, 2, - 1, 2, 12, 12, 12, 12, 12, 12, 12, 1, 2, 2, 12, 12, 12, 12, - 4, 4, 4, 4, 4, 4, 4, 1, 2, 0, 0, 0, 0, 0, 0, 0, - 11, 11, 0, 0, 0, 0, 18, 18, 16, 16, 16, 16, 16, 18, 0, 0, - 18, 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18, 12, 0, 0, - 11, 11, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18, - 18, 12, 12, 0, 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, 0, 16, - 5, 5, 5, 5, 0, 0, 0, 0, 38, 38, 38, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 38, 38, 38, 38, 12, 12, 0, 0, 12, 16, 16, 18, - 16, 16, 12, 12, 12, 16, 16, 16, 16, 16, 16, 12, 12, 16, 16, 16, - 12, 12, 16, 16, 16, 16, 12, 12, 12, 12, 16, 16, 16, 12, 0, 0, - 0, 0, 12, 0, 0, 12, 12, 0, 0, 12, 12, 12, 12, 0, 12, 12, - 12, 12, 0, 12, 0, 12, 12, 12, 12, 12, 0, 12, 12, 12, 12, 0, - 12, 12, 12, 12, 12, 0, 12, 0, 12, 12, 12, 12, 0, 0, 11, 11, - 12, 12, 12, 12, 12, 16, 12, 12, 12, 12, 12, 12, 16, 12, 12, 18, - 18, 18, 18, 12, 0, 0, 0, 0, 16, 0, 0, 16, 16, 16, 16, 16, - 16, 16, 0, 16, 16, 0, 16, 16, 11, 11, 0, 0, 0, 0, 0, 9, - 11, 11, 0, 0, 0, 0, 1, 1, 12, 12, 12, 12, 10, 12, 12, 12, - 10, 12, 12, 12, 12, 0, 0, 0, 0, 12, 12, 0, 12, 0, 0, 12, - 12, 12, 12, 0, 12, 12, 12, 12, 0, 12, 0, 12, 0, 0, 0, 0, - 0, 0, 12, 0, 0, 0, 0, 12, 0, 12, 0, 12, 0, 12, 12, 12, - 0, 12, 12, 12, 0, 12, 12, 12, 25, 25, 25, 25, 25, 13, 13, 13, - 25, 25, 25, 25, 25, 25, 12, 12, 25, 25, 12, 12, 12, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, - 13, 13, 13, 13, 13, 40, 13, 13, 13, 13, 13, 13, 12, 12, 13, 13, - 13, 13, 13, 13, 13, 12, 12, 13, 13, 13, 13, 13, 12, 13, 13, 13, - 13, 13, 40, 40, 40, 13, 13, 40, 13, 13, 40, 40, 40, 13, 13, 13, - 13, 13, 13, 41, 41, 41, 41, 41, 13, 13, 40, 40, 13, 13, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 40, 40, 40, 13, 13, 13, 40, 13, 13, 13, - 13, 40, 40, 40, 13, 40, 40, 40, 13, 13, 13, 13, 13, 13, 13, 40, - 13, 40, 13, 13, 13, 13, 13, 13, 12, 13, 12, 13, 12, 13, 13, 13, - 13, 13, 40, 13, 13, 13, 13, 12, 13, 12, 12, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 12, 13, 13, 12, 12, 12, 12, 12, 12, - 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 40, 40, 13, 13, - 13, 13, 40, 13, 13, 13, 13, 13, 40, 13, 13, 13, 13, 40, 40, 13, - 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 40, 40, 40, - 13, 13, 13, 40, 40, 40, 40, 40, 12, 12, 12, 12, 12, 12, 3, 3, - 3, 5, 5, 5, 12, 12, 12, 12, 13, 13, 13, 40, 13, 13, 13, 13, - 13, 13, 13, 13, 40, 40, 40, 13, 13, 13, 13, 13, 40, 13, 13, 13, - 12, 12, 12, 12, 12, 12, 13, 13, 12, 12, 12, 12, 13, 13, 13, 40, - 13, 13, 13, 13, 13, 13, 40, 13, 40, 40, 13, 13, 40, 40, 40, 13, - 13, 13, 13, 13, 13, 40, 40, 13, 40, 40, 13, 40, 13, 13, 13, 13, - 13, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 13, 13, +static RE_UINT8 re_terminal_punctuation_table_2[] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, + 6, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 9, + 0, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 0, 0, 0, 17, 0, 18, 0, 0, 0, 0, 19, 0, + 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 23, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 30, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 32, 0, 0, 33, 0, 0, 34, 0, 0, 0, 0, 26, 0, + 0, 0, 35, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 38, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 39, 0, 0, 0, 0, 0, 1, 0, 0, 40, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 41, 0, + 0, 0, 42, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 0, 0, 0, 43, 0, 44, 0, 0, 45, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, + 0, 0, 47, 0, 0, 24, 48, 0, 0, 0, 49, 0, 0, 0, 50, 0, + 0, 51, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 57, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 49, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 33, 0, 0, 0, 61, 0, 62, 63, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Line_Break: 12816 bytes. */ - -RE_UINT32 re_get_line_break(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_line_break_stage_1[f] << 5; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_line_break_stage_2[pos + f] << 4; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_line_break_stage_3[pos + f] << 3; - value = re_line_break_stage_4[pos + code]; - - return value; -} - -/* Numeric_Type. */ - -static RE_UINT8 re_numeric_type_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 8, - 15, 16, 17, 8, 18, 19, 8, 8, 8, 8, 8, 8, 8, 8, 8, 20, - 21, 22, 23, 24, 25, 8, 8, 8, 8, 8, 8, 8, 8, 26, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 27, 8, 28, 29, 30, 8, - 31, 32, 8, 8, 33, 34, 8, 35, 8, 8, 8, 8, 36, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 37, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +static RE_UINT8 re_terminal_punctuation_table_3[] = { + 0, 0, 0, 0, 2, 80, 0, 140, 0, 0, 0, 64, 128, 0, 0, 0, + 0, 2, 0, 0, 8, 0, 0, 0, 0, 16, 0, 200, 0, 0, 16, 0, + 255, 23, 0, 0, 0, 0, 0, 3, 0, 0, 255, 127, 48, 0, 0, 0, + 0, 0, 0, 12, 0, 225, 7, 0, 0, 12, 0, 0, 254, 1, 0, 0, + 0, 64, 0, 0, 0, 56, 0, 0, 0, 0, 96, 0, 0, 0, 112, 4, + 60, 3, 0, 0, 0, 15, 0, 0, 0, 0, 0, 236, 0, 0, 0, 248, + 0, 0, 0, 192, 0, 0, 0, 48, 128, 3, 0, 0, 0, 64, 0, 16, + 2, 208, 0, 0, 6, 0, 0, 0, 0, 224, 0, 0, 0, 0, 248, 0, + 0, 0, 192, 0, 0, 192, 0, 0, 0, 128, 0, 0, 0, 0, 0, 224, + 0, 0, 0, 128, 0, 0, 3, 0, 0, 8, 0, 0, 0, 0, 247, 0, + 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 128, 0, 0, 0, 63, 0, + 0, 0, 0, 252, 0, 0, 0, 30, 0, 0, 224, 3, 128, 63, 0, 0, + 3, 0, 0, 0, 14, 0, 0, 0, 96, 32, 0, 192, 0, 0, 0, 31, + 0, 56, 0, 12, 60, 254, 255, 0, 0, 0, 0, 112, 80, 0, 0, 0, + 12, 0, 0, 0, 0, 0, 0, 24, 0, 0, 2, 0, 0, 0, 128, 1, + 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 128, 3, 16, 0, 0, 0, + 128, 7, 0, 0 }; -static RE_UINT8 re_numeric_type_stage_2[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 0, 1, 1, 1, 4, - 1, 1, 1, 1, 1, 5, 1, 6, 1, 5, 1, 5, 1, 7, 1, 8, - 1, 9, 1, 5, 1, 10, 1, 5, 1, 11, 1, 11, 12, 1, 1, 1, - 1, 4, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 1, 1, 1, 15, - 11, 1, 1, 1, 1, 16, 1, 17, 1, 1, 18, 1, 1, 11, 0, 1, - 1, 18, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 19, 20, 1, 1, 21, 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 23, 24, 25, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 27, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 28, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 29, 1, 1, 1, 1, 1, 30, 1, 31, 32, 33, 1, 1, 1, 1, 1, - 34, 1, 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 38, 39, 40, 41, 37, 42, 1, 1, - 1, 1, 1, 1, 43, 44, 1, 1, 1, 1, 1, 1, 1, 45, 1, 46, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 1, 1, 1, 1, - 1, 1, 1, 48, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 49, 1, 50, 51, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 52, 1, 53, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 54, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 56, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 52, 1, 1, 1, 1, 1, 1, - 1, 1, 55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 58, 1, 42, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 59, 60, 1, 61, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 62, 1, 1, 1, 1, - 63, 1, 1, 11, 4, 1, 1, 64, 1, 11, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 65, 66, 67, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 1, 1, - 1, 1, 1, 1, 68, 69, 70, 1, 1, 1, 1, 71, 72, 73, 1, 74, - 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 75, 76, 77, 78, 1, 79, 80, 1, 81, 82, 83, 1, 84, 85, 1, - 1, 1, 1, 86, 0, 1, 1, 1, 1, 87, 1, 1, 88, 89, 1, 1, - 1, 90, 1, 0, 91, 1, 1, 92, 1, 1, 1, 0, 1, 1, 1, 1, - 1, 11, 1, 11, 1, 1, 1, 1, 1, 11, 1, 4, 93, 1, 1, 1, - 1, 1, 1, 94, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 95, 1, 1, 1, 11, 3, 1, 1, 1, 1, 1, 1, 1, 1, 96, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 97, 98, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 99, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 100, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 101, 1, 102, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 103, - 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 104, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 105, 106, 1, 107, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 108, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 109, 110, 1, 111, 59, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 36, 1, 112, 1, 1, 1, 1, 113, 114, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 115, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 116, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 117, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 115, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; +RE_UINT32 re_get_terminal_punctuation(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -static RE_UINT8 re_numeric_type_stage_3[] = { - 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 1, 2, 0, 0, - 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, - 0, 0, 0, 0, 5, 1, 6, 7, 0, 0, 0, 0, 5, 1, 8, 0, - 0, 0, 0, 0, 5, 1, 9, 0, 0, 0, 0, 0, 5, 1, 0, 10, - 0, 0, 0, 10, 5, 1, 11, 12, 0, 0, 1, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 13, 14, 0, 0, 0, 0, 0, 0, 15, 16, 17, - 0, 0, 0, 0, 0, 18, 12, 0, 0, 0, 0, 0, 1, 2, 11, 7, - 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 19, 0, 0, 0, 0, - 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, - 22, 21, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, - 23, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 24, 25, 26, - 11, 22, 24, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, - 0, 0, 0, 0, 0, 0, 30, 31, 22, 32, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 35, 0, 0, 0, 36, 7, 0, 9, - 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 7, 0, 0, - 0, 11, 36, 11, 0, 0, 0, 0, 11, 7, 0, 0, 0, 0, 36, 11, - 34, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 39, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, - 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, - 0, 42, 43, 0, 0, 0, 0, 35, 12, 0, 0, 35, 0, 12, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, 42, 0, 0, 0, 0, 0, 0, 0, - 44, 0, 0, 0, 0, 45, 0, 0, 46, 42, 0, 0, 0, 0, 0, 0, - 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 41, 41, 0, 0, 0, 0, 0, 0, 0, 39, - 0, 0, 0, 0, 0, 0, 0, 18, 0, 48, 12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 44, 0, 42, 0, 0, 0, 0, 0, 0, - 0, 0, 39, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, - 0, 0, 0, 0, 0, 44, 38, 0, 0, 0, 0, 0, 41, 0, 0, 0, - 44, 42, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 44, 0, - 0, 0, 0, 0, 18, 11, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, - 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 0, 0, 0, 38, 38, 12, - 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 50, 0, 0, 0, 0, 34, - 35, 11, 11, 11, 11, 11, 14, 0, 11, 11, 11, 11, 11, 11, 11, 12, - 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 11, 11, 14, - 0, 0, 0, 0, 14, 0, 0, 0, 41, 39, 0, 0, 0, 0, 0, 0, - 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 36, - 0, 0, 0, 0, 35, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, - 0, 0, 18, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, - 11, 11, 8, 11, 11, 11, 11, 11, 55, 12, 0, 0, 0, 0, 0, 56, - 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, - 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 0, 0, 36, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 22, 24, 11, 10, - 0, 0, 0, 57, 10, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, - 0, 0, 58, 59, 60, 1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, - 0, 0, 1, 2, 36, 11, 17, 0, 0, 0, 0, 0, 0, 0, 1, 61, - 0, 0, 0, 0, 1, 13, 9, 0, 0, 0, 1, 13, 11, 17, 0, 0, - 11, 11, 17, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 10, 0, 0, 0, 0, 1, 62, 7, 0, 0, 0, - 11, 11, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 14, 0, - 0, 0, 0, 0, 11, 11, 11, 12, 0, 5, 1, 1, 1, 1, 1, 1, - 35, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 11, - 11, 11, 11, 11, 11, 63, 47, 0, 36, 11, 11, 11, 11, 64, 11, 49, - 22, 65, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, - 38, 42, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 34, - 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, - 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -static RE_UINT8 re_numeric_type_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, - 0, 2, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 3, - 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 0, 0, 0, 3, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 2, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 1, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, - 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, - 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, - 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, - 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, - 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 0, 0, 0, 0, - 3, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, 2, 2, 2, 1, 1, 0, 0, 0, -}; + v = re_terminal_punctuation_table_1[field_2]; + v = re_terminal_punctuation_table_2[(v << 5) | field_1]; + v = re_terminal_punctuation_table_3[(v << 2) | field_0]; -/* Numeric_Type: 3232 bytes. */ - -RE_UINT32 re_get_numeric_type(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_numeric_type_stage_1[f] << 5; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_numeric_type_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_numeric_type_stage_3[pos + f] << 3; - value = re_numeric_type_stage_4[pos + code]; - - return value; + return (v >> offset) & 0x1; } -/* Numeric_Value. */ - -static RE_UINT8 re_numeric_value_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 8, - 15, 16, 17, 8, 18, 19, 8, 8, 8, 8, 8, 8, 8, 8, 8, 20, - 21, 22, 23, 24, 25, 8, 8, 8, 8, 8, 8, 8, 8, 26, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 27, 8, 28, 29, 30, 8, - 31, 32, 8, 8, 33, 34, 8, 35, 8, 8, 8, 8, 36, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 37, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +/* Unified_Ideograph. */ +static RE_UINT8 re_unified_ideograph_table_1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 6, 7, 1, + 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_numeric_value_stage_2[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 0, 1, 1, 1, 4, - 1, 1, 1, 1, 1, 5, 1, 6, 1, 5, 1, 5, 1, 7, 1, 8, - 1, 9, 1, 5, 1, 10, 1, 5, 1, 11, 1, 11, 12, 1, 1, 1, - 1, 4, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 1, 1, 1, 15, - 11, 1, 1, 1, 1, 16, 1, 17, 1, 1, 18, 1, 1, 11, 0, 1, - 1, 18, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 19, 4, 1, 1, 20, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 22, 23, 24, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 26, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 28, 1, 1, 1, 1, 1, 29, 1, 30, 31, 32, 1, 1, 1, 1, 1, - 33, 1, 34, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 37, 38, 39, 40, 41, 42, 1, 1, - 1, 1, 1, 1, 43, 44, 1, 1, 1, 1, 1, 1, 1, 45, 1, 46, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 1, 1, 1, 1, - 1, 1, 1, 48, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 49, 1, 50, 51, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 52, 1, 53, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 54, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 56, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 57, 1, 1, 1, 1, 1, 1, - 1, 1, 58, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 59, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 60, 1, 61, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 62, 63, 1, 64, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 65, 1, 1, 1, 1, - 66, 1, 1, 11, 4, 1, 1, 67, 1, 11, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 68, 69, 70, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 1, 1, - 1, 1, 1, 1, 71, 72, 73, 1, 1, 1, 1, 74, 75, 76, 1, 77, - 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 78, 79, 80, 81, 1, 82, 83, 1, 84, 85, 86, 1, 87, 88, 1, - 1, 1, 1, 89, 0, 1, 1, 1, 1, 90, 1, 1, 91, 92, 1, 1, - 1, 93, 1, 0, 94, 1, 1, 95, 1, 1, 1, 0, 1, 1, 1, 1, - 1, 11, 1, 11, 1, 1, 1, 1, 1, 11, 1, 4, 96, 1, 1, 1, - 1, 1, 1, 97, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 98, 1, 1, 1, 11, 3, 1, 1, 1, 1, 1, 1, 1, 1, 99, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 100, 101, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 102, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 103, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 104, 1, 105, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 106, - 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 107, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 108, 109, 1, 110, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 111, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 112, 113, 1, 114, 115, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 116, 1, 117, 1, 1, 1, 1, 118, 119, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 120, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 121, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 122, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 123, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 124, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +static RE_UINT8 re_unified_ideograph_table_2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 5, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, + 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_numeric_value_stage_3[] = { - 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 1, 2, 0, 0, - 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, - 0, 0, 0, 0, 5, 6, 7, 8, 0, 0, 0, 0, 5, 6, 9, 0, - 0, 0, 0, 0, 5, 6, 10, 0, 0, 0, 0, 0, 5, 6, 0, 11, - 0, 0, 0, 12, 5, 6, 13, 14, 0, 0, 1, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 15, 16, 0, 0, 0, 0, 0, 0, 17, 18, 19, - 0, 0, 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, 1, 2, 1, 2, - 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 1, 22, 0, 0, 0, 0, - 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 2, - 0, 0, 24, 25, 26, 27, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 26, 30, 31, 32, 33, 26, 30, 34, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 35, 36, 37, 0, 0, 0, 0, 0, 0, 38, 39, - 26, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, - 43, 0, 0, 0, 17, 2, 0, 44, 0, 0, 45, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 26, 46, 0, 0, 0, 47, 48, 49, 0, 0, 0, 0, - 26, 46, 0, 0, 0, 0, 50, 51, 52, 0, 0, 0, 0, 0, 0, 0, - 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, - 0, 55, 0, 0, 0, 0, 0, 0, 56, 57, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 58, 0, 0, 0, 0, 0, 59, 60, 0, 0, 0, 0, 61, - 62, 0, 0, 63, 0, 64, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 65, 0, 66, 0, 0, 0, 0, 0, 0, 0, - 67, 0, 0, 0, 0, 68, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, - 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 73, 73, 0, 0, 0, 0, 0, 0, 0, 74, - 0, 0, 0, 0, 0, 0, 0, 75, 0, 76, 77, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 78, 0, 79, 0, 0, 0, 0, 0, 0, - 0, 0, 80, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, - 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, - 0, 0, 0, 0, 0, 86, 53, 0, 0, 0, 0, 0, 0, 0, 77, 0, - 0, 0, 0, 0, 87, 0, 0, 0, 88, 89, 0, 0, 0, 0, 0, 90, - 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 38, 92, 0, 0, - 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 1, 2, 0, 0, 1, 2, - 0, 0, 0, 0, 0, 94, 95, 77, 0, 0, 0, 0, 0, 0, 96, 0, - 0, 0, 97, 0, 0, 0, 0, 98, 99, 6, 47, 100, 101, 102, 103, 0, - 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 18, 113, 114, 0, 0, 0, 0, 115, 0, 0, 0, - 116, 117, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, - 0, 0, 0, 119, 0, 0, 0, 120, 0, 0, 0, 0, 99, 121, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 123, 124, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 125, 26, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 0, 0, 0, 0, 0, 135, 0, 0, 0, 136, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 133, 0, 0, 0, 133, - 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, - 0, 0, 0, 0, 26, 126, 139, 140, 0, 0, 0, 141, 142, 0, 0, 0, - 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 144, 145, 146, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, 1, 2, 17, 18, 147, 0, - 0, 0, 0, 0, 0, 0, 1, 148, 0, 0, 0, 0, 1, 18, 149, 0, - 0, 0, 1, 150, 145, 151, 0, 0, 152, 153, 154, 0, 0, 0, 0, 0, - 6, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 0, 0, - 0, 0, 1, 168, 169, 0, 0, 0, 1, 170, 171, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 170, 172, 0, 0, 0, 0, 0, 26, 126, 173, 174, - 0, 5, 6, 1, 175, 176, 177, 6, 99, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 18, 113, 178, 179, 180, 181, 182, 183, 0, - 17, 18, 113, 178, 179, 184, 39, 185, 186, 187, 0, 0, 0, 0, 0, 0, - 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, - 0, 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, - 0, 0, 0, 0, 0, 74, 0, 0, 192, 70, 0, 70, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 193, 0, 194, 0, 0, 0, 57, 0, 0, 0, 0, - 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, - 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, - 0, 0, 196, 0, 0, 0, 0, 0, +static RE_UINT8 re_unified_ideograph_table_3[] = { + 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 31, 0, 192, 26, 128, + 154, 3, 0, 0, 255, 255, 255, 63, 255, 255, 31, 0, 3, 0, 255, 255, + 1, 0, 0, 0, 255, 7, 0, 0 }; -static RE_UINT8 re_numeric_value_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 2, 37, 39, 41, 43, 45, 47, 49, - 51, 53, 0, 0, 0, 0, 0, 0, 0, 0, 39, 41, 0, 0, 0, 0, - 0, 37, 0, 0, 22, 27, 32, 0, 0, 0, 0, 0, 0, 0, 2, 37, - 39, 41, 43, 45, 47, 49, 51, 53, 0, 0, 0, 0, 12, 16, 20, 22, - 32, 60, 0, 0, 0, 0, 0, 0, 0, 0, 22, 27, 32, 12, 16, 20, - 54, 99, 108, 0, 0, 0, 0, 0, 2, 37, 39, 41, 37, 39, 41, 0, - 4, 7, 9, 11, 14, 18, 21, 0, 54, 99, 108, 22, 27, 32, 12, 16, - 20, 0, 0, 0, 0, 0, 0, 0, 51, 53, 27, 38, 40, 42, 44, 46, - 48, 50, 52, 1, 0, 0, 0, 0, 0, 37, 39, 41, 43, 45, 47, 49, - 51, 53, 54, 64, 74, 84, 94, 95, 96, 97, 98, 99, 117, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 61, 62, 63, 0, 0, 0, 0, 0, 0, 0, - 51, 53, 37, 0, 0, 0, 0, 0, 2, 0, 0, 0, 43, 45, 47, 49, - 17, 15, 14, 23, 31, 21, 25, 29, 33, 19, 34, 16, 24, 30, 35, 37, - 37, 39, 41, 43, 45, 47, 49, 51, 53, 54, 55, 56, 94, 99, 103, 108, - 108, 112, 117, 0, 0, 47, 94, 121, 126, 2, 0, 0, 0, 0, 0, 0, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 37, 39, 41, 43, - 45, 47, 49, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 61, 62, 63, 64, 0, 0, 0, 0, 0, 0, 2, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 37, 39, 41, 43, 45, 47, 49, 51, 53, 54, 2, - 0, 0, 0, 0, 0, 0, 37, 39, 41, 43, 45, 47, 49, 51, 53, 54, - 53, 54, 37, 39, 41, 43, 45, 47, 49, 51, 53, 54, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 54, 64, 74, 0, 0, 0, 0, 0, 0, 0, 37, 39, 41, 43, 0, 0, - 53, 54, 0, 0, 0, 0, 0, 0, 54, 64, 74, 84, 94, 95, 96, 97, - 0, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 0, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, - 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, - 37, 0, 0, 49, 0, 0, 0, 117, 0, 41, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, - 0, 0, 0, 0, 45, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 140, - 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, - 41, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, - 0, 39, 0, 51, 0, 47, 0, 0, 0, 54, 0, 108, 64, 74, 0, 0, - 0, 0, 0, 0, 84, 0, 0, 0, 0, 41, 41, 41, 41, 0, 0, 0, - 0, 0, 0, 43, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, - 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 64, - 0, 0, 0, 0, 37, 39, 41, 0, 39, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 51, 0, 0, 0, - 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, - 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 99, 0, - 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 117, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 39, 0, 0, 108, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 99, 0, 0, 0, - 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 41, 43, 45, 47, 49, 51, 53, 2, 22, 27, 32, 12, 16, 20, 0, 0, - 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 47, 0, 47, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 0, 0, 0, 0, - 22, 27, 37, 45, 94, 103, 112, 121, 45, 54, 94, 99, 103, 108, 112, 45, - 54, 94, 99, 103, 108, 117, 121, 54, 37, 37, 37, 39, 39, 39, 39, 45, - 54, 54, 54, 54, 54, 74, 94, 94, 94, 94, 99, 101, 103, 103, 103, 103, - 103, 108, 112, 45, 94, 27, 27, 31, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 22, 0, 0, 0, 0, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 0, 0, 0, 0, 37, 45, 54, 94, 0, 0, 0, 0, - 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, - 0, 37, 39, 54, 64, 99, 0, 0, 37, 39, 41, 54, 64, 99, 108, 117, - 0, 37, 39, 41, 43, 45, 54, 64, 39, 41, 43, 43, 45, 54, 64, 99, - 0, 0, 0, 37, 45, 54, 64, 99, 0, 0, 0, 0, 0, 0, 37, 54, - 64, 99, 39, 41, 0, 0, 0, 0, 0, 0, 0, 0, 36, 27, 0, 0, - 53, 54, 64, 74, 84, 94, 95, 96, 0, 0, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 129, 130, 132, 133, 134, 135, 136, 13, 19, - 22, 23, 26, 27, 28, 31, 32, 34, 37, 39, 41, 43, 54, 64, 99, 108, - 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 94, 0, - 0, 0, 0, 0, 0, 37, 54, 64, 0, 37, 39, 41, 43, 54, 64, 99, - 0, 0, 37, 45, 54, 94, 99, 108, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 27, 22, 23, 31, 0, 0, 0, 0, 0, 0, 37, 39, 41, - 43, 45, 54, 64, 74, 99, 27, 0, 0, 37, 54, 64, 99, 0, 0, 0, - 0, 0, 37, 39, 41, 43, 45, 47, 49, 51, 53, 54, 64, 74, 84, 94, - 95, 96, 97, 98, 99, 108, 2, 37, 96, 97, 98, 99, 108, 0, 0, 0, - 51, 53, 54, 64, 0, 0, 0, 0, 96, 97, 98, 0, 0, 0, 0, 0, - 51, 53, 37, 39, 41, 43, 45, 47, 95, 96, 97, 98, 99, 0, 0, 0, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 14, 16, 18, 20, 21, - 22, 27, 27, 32, 3, 0, 0, 0, 41, 43, 45, 47, 49, 51, 53, 43, - 45, 47, 49, 51, 53, 37, 39, 41, 43, 45, 47, 49, 51, 53, 37, 39, - 41, 43, 45, 39, 41, 41, 43, 45, 47, 49, 51, 53, 37, 39, 41, 41, - 43, 45, 128, 131, 37, 39, 41, 41, 43, 45, 41, 41, 43, 43, 43, 43, - 47, 49, 49, 49, 51, 51, 53, 53, 53, 53, 39, 41, 43, 45, 47, 37, - 39, 41, 43, 43, 45, 45, 39, 41, 37, 39, 23, 31, 34, 23, 31, 16, - 22, 19, 22, 22, 27, 23, 31, 84, 94, 43, 45, 47, 49, 51, 53, 0, - 51, 53, 0, 54, 99, 117, 137, 140, 141, 142, 0, 0, 0, 0, 0, 0, - 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 37, 39, 41, 0, - 60, 61, 62, 63, 0, 0, 0, 0, 97, 98, 37, 39, 41, 43, 45, 37, - 45, 0, 0, 0, 0, 0, 0, 0, 51, 53, 2, 37, 39, 41, 43, 45, - 47, 49, 51, 53, 2, 37, 39, 41, 43, 45, 47, 49, 51, 53, 2, 37, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 126, 138, 139, 37, 39, 41, 43, 45, - 47, 49, 51, 53, 0, 22, 27, 32, 0, 37, 39, 117, 126, 0, 0, 0, - 120, 121, 122, 123, 124, 125, 0, 39, 102, 104, 109, 117, 27, 19, 0, 0, - 2, 2, 37, 39, 41, 43, 45, 47, 49, 51, 53, 2, 2, 0, 0, 0, - 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, - 0, 0, 43, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, - 53, 0, 0, 0, 0, 0, 0, 0, +RE_UINT32 re_get_unified_ideograph(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_unified_ideograph_table_1[field_2]; + v = re_unified_ideograph_table_2[(v << 5) | field_1]; + v = re_unified_ideograph_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} + +/* Uppercase. */ +static RE_UINT8 re_uppercase_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, + 2, 10, 2, 11, 2, 2, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 14, 2, 2, 2, 2, 15, 2, 16, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static RE_UINT8 re_uppercase_table_2[] = { + 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, + 3, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, + 18, 19, 0, 3, 20, 3, 21, 3, 3, 22, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 25, + 0, 0, 0, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 28, 3, 3, 3, 29, 30, 31, 32, 0, 33, 34, 35, + 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 19, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 40, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 41, 0, 42, 3, 3, 3, 43, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 44, 45, 0, 0, 0, 0, 46, 3, 47, 48, 49, 50, 51, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 18, 52, 0, 0, 0, 26, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 18, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 56, 57, 58, 59, 60, 26, 61, 62, 63, 64, 65, 66, 55, 56, 57, + 58, 67, 25, 26, 61, 58, 68, 69, 70, 71, 40, 41, 26, 72, 73, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 74, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 75, 75, 61, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -/* Numeric_Value: 4336 bytes. */ - -RE_UINT32 re_get_numeric_value(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_numeric_value_stage_1[f] << 5; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_numeric_value_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_numeric_value_stage_3[pos + f] << 3; - value = re_numeric_value_stage_4[pos + code]; - - return value; +static RE_UINT8 re_uppercase_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 255, 255, 127, 127, 85, 85, 85, 85, + 85, 85, 85, 170, 170, 84, 85, 85, 85, 85, 85, 43, 214, 206, 219, 177, + 213, 210, 174, 17, 144, 164, 170, 74, 85, 85, 210, 85, 85, 85, 5, 108, + 122, 85, 0, 0, 0, 0, 69, 128, 64, 215, 254, 255, 251, 15, 0, 0, + 0, 128, 28, 85, 85, 85, 144, 230, 255, 255, 255, 255, 255, 255, 0, 0, + 1, 84, 85, 85, 171, 42, 85, 85, 85, 85, 254, 255, 255, 255, 127, 0, + 191, 32, 0, 0, 255, 255, 63, 0, 0, 0, 255, 255, 255, 255, 255, 231, + 85, 85, 21, 64, 0, 255, 0, 63, 0, 255, 0, 255, 0, 63, 0, 170, + 0, 255, 0, 0, 0, 0, 0, 15, 0, 15, 0, 15, 0, 31, 0, 15, + 132, 56, 39, 62, 80, 61, 15, 192, 32, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 192, 255, 255, 127, 0, 0, 157, 234, 37, 192, 5, 40, 4, 0, + 85, 21, 0, 0, 85, 85, 85, 5, 84, 85, 84, 85, 85, 85, 0, 106, + 85, 40, 69, 85, 85, 125, 95, 85, 244, 2, 0, 0, 0, 0, 32, 0, + 255, 0, 0, 0, 255, 255, 15, 0, 255, 255, 7, 0, 255, 255, 255, 3, + 0, 0, 240, 255, 255, 63, 0, 0, 0, 255, 255, 255, 3, 0, 0, 208, + 100, 222, 63, 0, 255, 3, 0, 0, 176, 231, 223, 31, 0, 0, 0, 123, + 95, 252, 1, 0, 0, 240, 255, 255, 63, 0, 0, 0, 3, 0, 0, 240, + 1, 0, 0, 0, 252, 255, 255, 7, 0, 0, 0, 240, 255, 255, 31, 0, + 255, 1, 0, 0, 0, 4, 0, 0, 3, 0, 0, 0, 255, 3, 255, 255 +}; + +RE_UINT32 re_get_uppercase(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_uppercase_table_1[field_2]; + v = re_uppercase_table_2[(v << 5) | field_1]; + v = re_uppercase_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; } -/* Bidi_Mirrored. */ +/* Variation_Selector. */ +RE_UINT32 re_get_variation_selector(RE_UINT32 codepoint) { + if (0x180B <= codepoint && codepoint <= 0x180D) + return 1; + if (0xFE00 <= codepoint && codepoint <= 0xFE0F) + return 1; + if (0x0E0100 <= codepoint && codepoint <= 0x0E01EF) + return 1; + + return 0; +} -static RE_UINT8 re_bidi_mirrored_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, +/* White_Space. */ +static RE_UINT8 re_white_space_table_1[] = { + 0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -static RE_UINT8 re_bidi_mirrored_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, - 4, 5, 1, 6, 7, 8, 1, 9, 10, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +static RE_UINT8 re_white_space_table_2[] = { + 0, 1, 2, 2, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; -static RE_UINT8 re_bidi_mirrored_stage_3[] = { - 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, - 6, 7, 8, 3, 3, 9, 3, 3, 10, 11, 12, 13, 14, 3, 3, 3, - 3, 3, 3, 3, 3, 15, 3, 16, 3, 3, 3, 3, 3, 3, 17, 18, - 19, 20, 21, 22, 3, 3, 3, 23, 24, 3, 3, 3, 3, 3, 3, 3, - 25, 3, 3, 3, 3, 3, 3, 3, 3, 26, 3, 3, 27, 28, 3, 3, - 3, 3, 3, 29, 30, 31, 32, 33, +static RE_UINT8 re_white_space_table_3[] = { + 0, 62, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, + 255, 7, 0, 0, 0, 131, 0, 0, 0, 0, 0, 128 }; -static RE_UINT8 re_bidi_mirrored_stage_4[] = { - 0, 0, 0, 0, 0, 3, 0, 80, 0, 0, 0, 40, 0, 0, 0, 40, - 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 24, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 96, 0, 0, 0, 0, 0, 0, 96, - 0, 96, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 30, 63, 98, 188, 87, 248, 15, 250, 255, 31, 60, 128, 245, 207, 255, 255, - 255, 159, 7, 1, 204, 255, 255, 193, 0, 62, 195, 255, 255, 63, 255, 255, - 0, 15, 0, 0, 3, 6, 0, 0, 0, 0, 0, 0, 0, 255, 63, 0, - 121, 59, 120, 112, 252, 255, 0, 0, 248, 255, 255, 249, 253, 255, 0, 1, - 63, 194, 55, 31, 58, 3, 240, 51, 0, 252, 255, 223, 83, 122, 48, 112, - 0, 0, 128, 1, 48, 188, 25, 254, 255, 255, 255, 255, 207, 191, 255, 255, - 255, 255, 127, 80, 124, 112, 136, 47, 0, 0, 0, 0, 0, 0, 0, 64, - 60, 54, 0, 48, 255, 3, 0, 0, 0, 255, 243, 15, 0, 0, 0, 0, - 0, 0, 0, 126, 48, 0, 0, 0, 0, 3, 0, 80, 0, 0, 0, 40, - 0, 0, 0, 168, 13, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, - 0, 0, 32, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, -}; +RE_UINT32 re_get_white_space(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* Bidi_Mirrored: 572 bytes. */ - -RE_UINT32 re_get_bidi_mirrored(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_bidi_mirrored_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_bidi_mirrored_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_bidi_mirrored_stage_3[pos + f] << 6; - pos += code; - value = (re_bidi_mirrored_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* Indic_Positional_Category. */ + v = re_white_space_table_1[field_2]; + v = re_white_space_table_2[(v << 5) | field_1]; + v = re_white_space_table_3[(v << 2) | field_0]; -static RE_UINT8 re_indic_positional_category_stage_1[] = { - 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + return (v >> offset) & 0x1; +} + +/* Word. */ +static RE_UINT8 re_word_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 15, 13, 16, 17, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 18, 10, 10, 10, 10, 10, 10, 10, 10, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, 13, 31, 10, 10, + 10, 32, 10, 10, 10, 10, 10, 10, 10, 10, 33, 34, 13, 13, 13, 13, + 13, 35, 13, 36, 10, 10, 10, 10, 10, 10, 10, 10, 37, 10, 10, 38, + 10, 10, 10, 10, 39, 40, 41, 10, 42, 10, 43, 44, 45, 10, 46, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 47, 13, 13, 13, 48, 49, 13, + 13, 13, 13, 50, 13, 13, 13, 13, 13, 13, 51, 10, 10, 10, 52, 10, + 13, 13, 13, 13, 53, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 54, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; -static RE_UINT8 re_indic_positional_category_stage_2[] = { +static RE_UINT16 re_word_table_2[] = { + 0, 1, 2, 3, 0, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 7, 8, 6, 6, 6, 9, 10, 11, 6, 12, + 6, 6, 6, 6, 11, 6, 6, 6, 6, 13, 14, 6, 15, 16, 17, 18, + 19, 6, 6, 20, 6, 6, 21, 22, 23, 6, 24, 6, 6, 25, 6, 26, + 6, 27, 28, 29, 0, 30, 31, 11, 6, 6, 6, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 42, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 52, 6, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 0, 69, 70, 71, 0, 72, 73, 74, 75, 76, 77, 78, 0, + 6, 6, 79, 6, 80, 6, 81, 82, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 83, 6, 84, 85, 86, 6, 87, 6, 88, 0, 89, 6, 6, 90, + 66, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 91, 3, 6, 6, 92, 93, 94, 95, 96, 6, 6, 97, 98, + 99, 6, 6, 100, 6, 101, 6, 102, 103, 104, 105, 106, 6, 107, 108, 0, + 28, 6, 103, 109, 108, 110, 111, 0, 6, 6, 112, 113, 6, 6, 6, 95, + 6, 114, 115, 80, 116, 88, 117, 67, 6, 6, 6, 6, 6, 6, 6, 118, + 6, 6, 6, 6, 6, 6, 6, 6, 90, 6, 119, 80, 6, 120, 121, 122, + 123, 124, 125, 126, 127, 0, 23, 128, 129, 130, 131, 6, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 133, 6, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 6, 10, 11, 9, 6, 12, 13, 5, 14, 15, 4, 16, 17, 18, 0, - 19, 20, 21, 4, 5, 14, 22, 4, 23, 24, 25, 4, 26, 0, 27, 28, - 0, 29, 30, 0, 0, 31, 32, 0, 33, 34, 0, 35, 36, 37, 38, 0, - 0, 39, 40, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 43, 43, 44, 44, 0, 45, 46, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 48, 49, 0, - 50, 0, 51, 52, 0, 0, 0, 0, 53, 54, 55, 56, 57, 58, 0, 59, - 0, 60, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 134, 103, 6, 6, 6, 6, 135, 6, 81, 6, 136, 137, 138, 138, 6, + 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 140, 141, 66, 6, 142, 66, 6, 82, 143, 13, 6, 6, 144, 6, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 77, + 6, 6, 6, 6, 145, 0, 23, 80, 6, 6, 6, 6, 6, 6, 6, 6, + 146, 147, 6, 148, 6, 6, 6, 25, 149, 150, 6, 6, 151, 6, 152, 153, + 6, 154, 6, 95, 6, 6, 155, 156, 6, 157, 95, 77, 6, 6, 158, 103, + 6, 137, 159, 160, 6, 6, 161, 162, 163, 164, 82, 79, 6, 6, 6, 165, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 166, 167, 28, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 157, 6, 6, 168, 0, 169, 170, 171, 6, 6, 25, 172, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 80, 23, 6, 173, 6, 174, 175, + 89, 176, 177, 178, 6, 6, 6, 77, 1, 2, 3, 105, 6, 103, 179, 0, + 180, 181, 182, 0, 6, 6, 6, 67, 0, 0, 6, 94, 0, 0, 0, 183, + 0, 0, 0, 0, 77, 6, 128, 111, 6, 184, 101, 67, 80, 6, 185, 0, + 6, 6, 6, 6, 80, 79, 186, 28, 6, 187, 6, 188, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 137, 102, 174, 0, 0, 0, 0, + 189, 190, 102, 137, 103, 0, 0, 191, 102, 168, 0, 0, 6, 192, 0, 0, + 193, 194, 0, 77, 77, 0, 74, 195, 6, 102, 102, 196, 25, 0, 0, 0, + 6, 6, 132, 0, 6, 196, 6, 196, 6, 197, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 198, 0, 0, 77, 110, 128, 0, 0, 23, 199, 137, + 6, 6, 195, 200, 6, 67, 23, 201, 6, 30, 202, 203, 6, 6, 204, 0, + 205, 206, 0, 0, 207, 116, 6, 208, 33, 209, 210, 211, 0, 0, 0, 0, + 6, 6, 212, 213, 6, 6, 214, 0, 0, 0, 0, 0, 6, 215, 216, 0, + 6, 6, 217, 0, 6, 100, 98, 0, 88, 112, 0, 0, 0, 0, 0, 0, + 6, 67, 0, 0, 0, 6, 6, 218, 219, 220, 221, 0, 0, 222, 223, 224, + 6, 103, 110, 6, 225, 0, 6, 100, 0, 0, 0, 0, 0, 0, 0, 0, + 226, 5, 227, 228, 173, 229, 0, 0, 230, 231, 197, 232, 233, 98, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 234, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 168, 0, 0, 0, + 6, 6, 6, 144, 6, 6, 6, 6, 6, 6, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 65, 66, 0, 0, 67, 68, 69, 70, 0, 71, 72, 0, 1, 73, 74, 75, - 0, 76, 77, 78, 0, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 82, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 100, 103, 98, 0, 0, 23, 106, 6, 137, 221, 235, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 6, 0, 0, 0, 0, 6, 6, 236, 6, 237, 0, 0, 238, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 114, + 6, 6, 6, 6, 6, 6, 102, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 103, 0, 239, 202, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 28, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 240, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 243, 244, 0, 0, + 0, 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 30, 6, 246, 247, 248, 6, 249, 250, 251, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 252, 253, 82, 30, 30, 134, 134, 226, 226, 254, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 255, 6, 256, 257, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 259, 260, 0, 0, 0, 0, 0, 0, 6, 261, 262, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 168, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 263, 0, 6, 6, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 85, 86, 87, 0, 57, 88, 0, 0, 89, 90, 91, 92, 57, 93, 94, 0, - 0, 95, 0, 0, 0, 0, 96, 97, 23, 98, 99, 100, 0, 0, 0, 0, - 0, 101, 102, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 105, 106, 0, - 0, 107, 108, 0, 0, 109, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, - 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 114, - 115, 116, 117, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 119, 0, 0, 120, 121, 0, 0, 0, 122, 123, 0, 124, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_indic_positional_category_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, - 10, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 4, 12, 13, 14, 0, 15, 0, 0, - 10, 0, 0, 0, 0, 0, 0, 16, 17, 0, 0, 0, 0, 0, 0, 0, - 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 23, 22, 0, 0, - 4, 24, 25, 26, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 27, 28, - 0, 0, 0, 0, 0, 0, 0, 29, 4, 12, 30, 31, 0, 32, 0, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, - 34, 35, 36, 37, 0, 15, 0, 0, 6, 38, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 27, 6, 39, 40, 23, 0, 41, 0, 0, - 42, 43, 44, 23, 0, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 19, 47, 48, 49, 36, 37, 0, 15, 0, 0, - 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 15, 50, 51, 52, 53, - 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 54, 28, 55, 0, - 56, 57, 28, 58, 0, 0, 0, 0, 0, 0, 0, 0, 54, 28, 59, 60, - 56, 61, 28, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, - 0, 0, 0, 0, 0, 63, 64, 65, 0, 0, 0, 0, 66, 67, 68, 1, - 69, 70, 0, 71, 72, 72, 71, 72, 72, 72, 72, 72, 72, 72, 72, 60, - 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 15, 74, 75, 76, 77, 78, - 0, 0, 0, 0, 0, 33, 62, 10, 79, 80, 81, 82, 83, 38, 0, 0, - 84, 85, 81, 86, 0, 0, 33, 87, 0, 0, 0, 0, 88, 60, 0, 0, - 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 89, 76, 90, - 91, 92, 93, 28, 94, 0, 0, 64, 95, 96, 6, 0, 97, 81, 98, 0, - 0, 0, 0, 0, 81, 99, 100, 81, 101, 0, 82, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 19, 102, 0, 0, 0, 0, 0, 0, 103, 76, 55, - 104, 93, 105, 106, 107, 28, 28, 108, 28, 101, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 109, 110, 111, 112, 101, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 5, 28, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, - 114, 115, 113, 62, 0, 0, 0, 0, 0, 2, 46, 116, 46, 0, 0, 0, - 0, 117, 118, 5, 28, 119, 0, 0, 0, 0, 0, 0, 58, 120, 121, 72, - 122, 123, 124, 22, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, - 0, 0, 0, 0, 38, 0, 0, 0, 16, 16, 19, 0, 0, 0, 0, 0, - 15, 126, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 81, 81, 81, 81, 127, 0, 0, 0, 0, 0, 0, - 28, 28, 28, 28, 23, 0, 0, 19, 0, 0, 128, 62, 0, 0, 0, 0, - 0, 128, 129, 59, 46, 0, 0, 0, 0, 0, 0, 0, 19, 50, 130, 131, - 132, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, - 0, 0, 83, 133, 134, 135, 0, 0, 19, 0, 0, 136, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 136, 0, 0, 0, 0, 109, 137, 138, 139, - 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 141, 0, 142, 0, 0, - 15, 54, 143, 26, 0, 0, 0, 0, 144, 145, 0, 59, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 146, 0, 147, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 28, 72, 121, 58, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 148, 149, 18, 0, 58, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 9, 150, 146, 38, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 15, 151, 72, 152, - 101, 0, 153, 60, 0, 0, 0, 0, 0, 0, 0, 48, 154, 109, 0, 16, - 0, 0, 0, 0, 0, 0, 0, 19, 148, 5, 146, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 128, 79, 6, 155, 13, 156, 0, 15, 0, 0, - 33, 27, 28, 38, 28, 38, 0, 0, 0, 0, 0, 0, 0, 157, 72, 121, - 158, 159, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 148, 72, 160, 161, - 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 151, 62, 163, 164, - 60, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 48, 72, 149, 165, - 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 166, 121, 164, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 167, 50, 168, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 148, 59, 28, 18, 0, 0, 0, 0, 0, 157, 72, 27, 81, - 60, 169, 0, 0, 0, 0, 0, 0, 170, 28, 171, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 5, 172, 55, 0, 0, 0, 0, 170, 1, 4, 0, - 0, 0, 10, 72, 72, 173, 38, 0, 0, 0, 0, 15, 9, 55, 28, 164, - 0, 0, 0, 0, 10, 72, 72, 72, 72, 72, 114, 72, 174, 175, 0, 0, - 0, 0, 0, 0, 83, 171, 16, 94, 176, 177, 0, 0, 0, 0, 0, 0, - 0, 0, 33, 178, 179, 147, 0, 0, 0, 0, 0, 0, 19, 180, 0, 0, -}; - -static RE_UINT8 re_indic_positional_category_stage_4[] = { - 0, 0, 0, 0, 5, 5, 5, 1, 0, 0, 5, 1, 6, 0, 1, 2, - 1, 6, 6, 6, 6, 5, 5, 5, 5, 1, 1, 1, 1, 6, 2, 1, - 0, 5, 6, 5, 5, 5, 6, 6, 0, 0, 6, 6, 0, 5, 1, 1, - 6, 0, 0, 2, 2, 0, 0, 4, 4, 6, 0, 0, 0, 0, 0, 1, - 0, 0, 5, 0, 0, 5, 5, 1, 1, 6, 6, 0, 0, 0, 0, 5, - 5, 0, 0, 5, 5, 6, 0, 0, 0, 6, 0, 0, 5, 5, 0, 0, - 6, 5, 0, 5, 5, 8, 0, 1, 1, 6, 0, 0, 0, 0, 5, 5, - 5, 5, 5, 5, 6, 0, 1, 5, 9, 0, 0, 4, 10, 6, 0, 0, - 0, 0, 5, 8, 0, 0, 1, 1, 5, 1, 1, 0, 0, 0, 2, 2, - 2, 0, 4, 4, 4, 5, 0, 0, 5, 0, 0, 0, 1, 0, 5, 5, - 7, 0, 5, 5, 0, 5, 6, 0, 8, 1, 1, 1, 1, 0, 5, 8, - 8, 0, 8, 8, 0, 1, 1, 0, 5, 5, 1, 1, 5, 0, 1, 1, - 1, 1, 1, 6, 6, 0, 2, 2, 1, 1, 5, 5, 6, 0, 6, 0, - 1, 2, 9, 2, 4, 10, 4, 1, 1, 5, 1, 1, 6, 6, 6, 0, - 3, 3, 3, 3, 3, 1, 0, 5, 5, 5, 5, 0, 6, 6, 6, 5, - 6, 0, 0, 0, 3, 0, 0, 0, 6, 6, 0, 0, 0, 6, 0, 6, - 0, 5, 0, 0, 0, 0, 1, 2, 0, 6, 5, 7, 6, 6, 7, 7, - 7, 7, 5, 5, 5, 7, 5, 5, 6, 0, 5, 5, 0, 6, 6, 6, - 6, 6, 6, 6, 0, 0, 6, 0, 1, 5, 5, 6, 6, 2, 5, 5, - 5, 5, 5, 6, 1, 0, 5, 1, 0, 6, 6, 0, 6, 0, 1, 1, - 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 5, 5, 5, - 0, 0, 6, 1, 2, 5, 5, 1, 1, 6, 0, 1, 1, 5, 0, 0, - 0, 0, 5, 6, 0, 0, 1, 5, 6, 6, 9, 10, 4, 2, 2, 2, - 4, 4, 5, 1, 1, 5, 5, 5, 5, 5, 0, 5, 5, 5, 6, 1, - 1, 8, 8, 5, 1, 1, 6, 1, 1, 6, 5, 6, 1, 3, 3, 3, - 1, 1, 3, 1, 1, 0, 0, 0, 6, 2, 1, 5, 0, 2, 6, 1, - 0, 1, 5, 1, 5, 6, 6, 5, 6, 1, 2, 2, 2, 2, 2, 5, - 5, 0, 0, 6, 5, 1, 5, 5, 6, 6, 6, 11, 7, 13, 2, 2, - 4, 4, 5, 8, 5, 5, 1, 0, 0, 1, 6, 6, 5, 6, 2, 1, - 1, 5, 1, 5, 1, 1, 1, 2, 2, 9, 1, 1, 2, 2, 5, 6, - 14, 6, 6, 6, 6, 6, 5, 5, 5, 1, 14, 14, 14, 14, 14, 14, - 14, 0, 0, 0, 5, 0, 0, 1, 1, 6, 5, 1, 6, 5, 0, 0, - 0, 0, 0, 6, 6, 6, 5, 6, 6, 6, 2, 2, 5, 6, 1, 12, - 11, 0, 0, 0, 5, 6, 5, 2, 2, 5, 6, 1, 2, 6, 6, 0, - 5, 1, 0, 0, 6, 3, 3, 5, 5, 3, 1, 3, 3, 1, 5, 5, - 0, 0, 0, 2, 6, 5, 2, 1, 0, 1, 0, 0, 6, 1, 1, 0, - 0, 14, 6, 6, 0, 5, 14, 0, 5, 6, 6, 0, 1, 5, 1, 0, - 1, 2, 1, 6, 6, 5, 5, 1, 2, 5, 7, 7, 2, 1, 6, 6, - 5, 5, 5, 8, 0, 6, 6, 5, 5, 5, 8, 8, 1, 0, 0, 2, - 4, 1, 0, 0, 0, 1, 2, 1, 1, 1, 6, 5, 5, 1, 6, 0, - 6, 2, 5, 9, 4, 1, 4, 5, 5, 1, 6, 6, 2, 9, 4, 10, - 5, 5, 1, 6, 1, 5, 1, 6, 1, 5, 2, 1, 0, 6, 0, 5, - 6, 6, 2, 5, 2, 0, 0, 0, 0, 5, 6, 6, 5, 5, 6, 0, - 5, 1, 0, 6, 6, 6, 5, 1, 6, 2, 6, 5, 1, 5, 5, 0, - 5, 5, 6, 5, 6, 0, 0, 6, 1, 1, 1, 0, 5, 5, 0, 1, - 6, 2, 1, 0, -}; - -/* Indic_Positional_Category: 2852 bytes. */ - -RE_UINT32 re_get_indic_positional_category(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_indic_positional_category_stage_1[f] << 6; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_indic_positional_category_stage_2[pos + f] << 3; - f = code >> 2; - code ^= f << 2; - pos = (RE_UINT32)re_indic_positional_category_stage_3[pos + f] << 2; - value = re_indic_positional_category_stage_4[pos + code]; - - return value; -} - -/* Indic_Syllabic_Category. */ - -static RE_UINT8 re_indic_syllabic_category_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_indic_syllabic_category_stage_2[] = { - 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 19, 20, - 2, 2, 21, 22, 23, 24, 25, 26, 27, 28, 2, 29, 2, 2, 2, 2, - 30, 31, 2, 2, 2, 2, 2, 2, 2, 2, 2, 32, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 33, 34, 35, 36, 37, 38, 2, 39, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 40, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 41, 42, 43, 44, 45, 46, 47, 2, 48, 49, 2, 50, 51, 52, 53, 2, - 54, 2, 2, 55, 56, 57, 2, 2, 58, 59, 60, 61, 2, 62, 2, 2, -}; - -static RE_UINT8 re_indic_syllabic_category_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 248, 264, 265, 266, 267, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 79, 79, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 8, 8, 8, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 12, - 13, 13, 13, 14, 15, 16, 10, 10, 17, 18, 2, 2, 19, 8, 10, 10, - 20, 21, 8, 22, 22, 9, 10, 10, 10, 10, 23, 10, 24, 25, 26, 12, - 13, 27, 27, 28, 0, 29, 0, 30, 17, 18, 2, 2, 26, 0, 0, 31, - 32, 21, 33, 34, 22, 9, 10, 10, 10, 10, 23, 10, 23, 35, 26, 36, - 37, 29, 27, 38, 39, 0, 40, 24, 0, 18, 2, 2, 41, 42, 0, 0, - 32, 21, 8, 43, 43, 9, 10, 10, 10, 10, 23, 10, 23, 40, 26, 12, - 13, 44, 44, 38, 0, 0, 0, 0, 17, 18, 2, 2, 0, 0, 45, 46, - 32, 21, 8, 22, 22, 9, 10, 10, 10, 10, 23, 10, 23, 40, 26, 12, - 13, 27, 27, 38, 0, 47, 0, 30, 17, 18, 2, 2, 48, 0, 0, 0, - 49, 21, 33, 19, 50, 51, 35, 23, 52, 53, 54, 25, 10, 10, 26, 47, - 37, 47, 55, 38, 0, 29, 0, 0, 0, 18, 2, 2, 0, 0, 0, 0, - 7, 56, 8, 50, 50, 9, 10, 10, 10, 10, 23, 10, 10, 10, 26, 57, - 13, 55, 55, 38, 0, 58, 54, 0, 17, 18, 2, 2, 0, 0, 0, 0, - 7, 21, 8, 50, 50, 9, 10, 10, 10, 10, 23, 10, 10, 40, 26, 12, - 13, 55, 55, 38, 0, 58, 0, 59, 17, 18, 2, 2, 60, 0, 0, 0, - 7, 21, 8, 50, 50, 9, 10, 10, 10, 10, 10, 10, 10, 10, 61, 62, - 13, 55, 55, 63, 0, 64, 0, 34, 17, 18, 2, 2, 0, 0, 65, 66, - 67, 21, 8, 8, 8, 33, 25, 10, 10, 10, 10, 10, 30, 10, 10, 48, - 10, 54, 68, 29, 13, 69, 13, 13, 0, 18, 2, 2, 47, 0, 0, 0, - 40, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 54, 13, 13, 70, 0, - 13, 44, 71, 72, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 35, 23, 54, 10, 10, 10, 10, 10, 10, 73, 10, 54, 13, 13, 74, 75, - 13, 76, 71, 77, 2, 2, 3, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 78, 79, 0, - 10, 10, 40, 10, 10, 10, 10, 10, 10, 10, 10, 53, 16, 13, 13, 80, - 81, 82, 83, 84, 85, 85, 86, 85, 85, 85, 85, 85, 85, 85, 85, 87, - 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, 89, 8, 90, 13, 13, 91, 92, 93, - 2, 2, 94, 95, 96, 17, 97, 98, 99, 100, 101, 102, 103, 104, 10, 10, - 105, 106, 71, 107, 2, 2, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 110, 10, 10, 23, 11, 111, 0, 0, 110, 10, 10, 10, 11, 111, 0, 0, - 110, 10, 10, 10, 11, 0, 0, 0, 110, 10, 10, 23, 112, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, 113, 8, 8, 8, 8, 47, 13, 13, - 13, 80, 114, 115, 116, 0, 0, 117, 2, 2, 3, 0, 0, 0, 0, 0, - 118, 10, 10, 10, 10, 10, 10, 54, 13, 13, 119, 0, 120, 121, 122, 0, - 0, 18, 2, 2, 10, 10, 10, 10, 123, 124, 124, 125, 126, 127, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 13, 13, 13, 13, - 128, 121, 129, 0, 2, 2, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 131, 13, 0, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 89, 110, 132, 133, 134, 135, 13, 13, 13, 13, 136, 137, 138, - 2, 2, 3, 0, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 139, 140, 8, 8, 110, 10, 10, 10, 10, 10, 10, 10, 10, 141, 13, 13, - 13, 142, 10, 0, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 143, 8, 144, 10, 10, 10, 10, 10, 145, 13, 146, 147, 2, 2, 148, 149, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 150, 13, 13, 151, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 152, 13, 128, 121, 153, 0, 0, - 2, 2, 3, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 154, 155, 155, 155, 156, 0, 0, 0, 65, 157, 158, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 0, - 0, 0, 0, 160, 161, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, 0, - 5, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 164, 165, 166, 10, 10, 10, 10, 10, 131, 13, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 10, 167, 168, 169, 170, 10, 171, 0, 0, 0, - 172, 8, 8, 8, 144, 10, 10, 10, 10, 10, 10, 10, 10, 173, 13, 13, - 13, 174, 0, 0, 2, 2, 3, 0, 155, 155, 155, 155, 175, 0, 0, 176, - 2, 2, 177, 10, 10, 10, 10, 10, 167, 124, 178, 129, 10, 10, 10, 10, - 10, 131, 13, 179, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 181, 8, 9, 110, 10, 10, 10, 10, 10, 10, 10, 10, 182, 13, 13, 183, - 184, 0, 0, 0, 2, 2, 3, 0, 10, 185, 10, 10, 2, 2, 177, 54, - 8, 144, 10, 10, 10, 10, 10, 10, 10, 10, 103, 13, 186, 187, 0, 0, - 121, 121, 121, 188, 2, 2, 3, 0, 10, 10, 10, 10, 40, 189, 190, 102, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 106, - 191, 0, 0, 0, 0, 0, 0, 0, 144, 10, 131, 13, 0, 192, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 96, 193, 10, 194, 121, 195, 13, 37, 196, 2, 2, 3, 0, - 103, 58, 0, 80, 10, 40, 40, 10, 10, 10, 10, 10, 10, 26, 197, 198, - 2, 2, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 200, 201, 8, 8, 110, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, - 13, 202, 0, 0, 203, 204, 204, 204, 204, 205, 2, 2, 0, 0, 0, 206, - 207, 8, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 208, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 207, 110, 10, 10, 10, 10, 10, 10, 10, 131, 13, 13, 209, 210, 2, 2, - 0, 211, 0, 0, 124, 212, 10, 10, 10, 10, 10, 10, 182, 0, 0, 0, - 207, 8, 8, 8, 9, 10, 10, 10, 10, 10, 10, 10, 131, 13, 13, 13, - 213, 0, 214, 76, 2, 2, 3, 0, 215, 2, 2, 2, 2, 199, 0, 0, - 8, 8, 10, 10, 30, 10, 10, 10, 10, 10, 10, 13, 13, 216, 0, 217, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 54, 23, 30, 10, 10, 10, 30, 10, 10, 53, 0, 8, 8, 144, 10, - 10, 10, 10, 10, 10, 10, 10, 166, 13, 13, 218, 0, 2, 2, 3, 0, - 7, 21, 8, 22, 22, 9, 10, 10, 10, 10, 23, 10, 23, 40, 219, 12, - 13, 27, 27, 38, 0, 29, 0, 220, 17, 221, 155, 163, 155, 163, 0, 0, - 8, 8, 8, 144, 10, 10, 10, 10, 10, 10, 10, 10, 10, 103, 13, 13, - 222, 223, 0, 0, 2, 2, 3, 224, 0, 0, 0, 0, 0, 0, 0, 0, - 21, 8, 8, 110, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 225, - 226, 227, 0, 0, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 8, 144, 10, 10, 10, 10, 10, 10, 10, 131, 13, 109, 13, 228, - 229, 0, 0, 0, 0, 0, 8, 109, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 8, 144, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 230, - 76, 0, 0, 0, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 144, 10, 10, 10, 10, 10, 10, 10, 166, 231, 13, 232, 53, 0, - 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10, 10, 10, 10, 10, 10, 54, 233, 13, 13, 234, 0, 2, 2, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 144, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 225, 235, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 19, 144, 10, 10, 10, 10, - 10, 10, 10, 10, 103, 13, 47, 80, 236, 76, 0, 0, 0, 0, 0, 0, - 237, 13, 238, 10, 10, 10, 10, 10, 10, 10, 10, 10, 239, 240, 241, 242, - 0, 243, 0, 0, 237, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 244, 245, 121, 121, 246, 247, 248, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 50, 144, 10, 10, 10, 10, 10, 10, 10, 131, 13, 37, 13, 228, - 227, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 199, 25, 10, 10, 10, - 10, 10, 10, 10, 249, 85, 85, 85, 85, 85, 86, 85, 13, 250, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 33, 43, 10, 10, 10, 10, 10, 10, 10, 10, 10, 103, 37, 251, 44, - 252, 253, 0, 0, 2, 2, 3, 0, 8, 43, 50, 10, 10, 10, 10, 10, - 10, 10, 11, 37, 44, 254, 0, 0, 2, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 255, 37, 0, 0, -}; - -static RE_UINT8 re_indic_syllabic_category_stage_4[] = { - 0, 0, 0, 0, 0, 11, 0, 0, 34, 34, 34, 34, 34, 34, 0, 0, - 11, 0, 0, 0, 0, 0, 29, 29, 0, 0, 0, 11, 1, 1, 1, 2, - 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 12, 9, 9, - 4, 3, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 0, 27, 27, 0, - 0, 9, 9, 9, 8, 8, 9, 9, 0, 0, 34, 34, 0, 0, 8, 8, - 11, 1, 1, 2, 0, 8, 8, 8, 8, 0, 0, 8, 12, 0, 12, 12, - 12, 0, 12, 0, 0, 0, 12, 12, 12, 12, 0, 0, 9, 0, 0, 9, - 9, 5, 13, 0, 0, 0, 0, 9, 12, 12, 0, 12, 1, 0, 29, 0, - 0, 1, 1, 2, 8, 8, 8, 0, 0, 0, 0, 8, 0, 12, 12, 0, - 4, 0, 9, 9, 9, 9, 9, 0, 9, 5, 0, 0, 0, 27, 0, 0, - 0, 12, 12, 12, 1, 26, 11, 11, 0, 20, 0, 0, 8, 8, 0, 8, - 9, 9, 0, 9, 0, 12, 27, 27, 27, 4, 4, 4, 0, 0, 9, 9, - 0, 12, 0, 0, 0, 0, 1, 23, 8, 0, 8, 8, 8, 12, 0, 0, - 0, 0, 0, 12, 12, 0, 0, 0, 12, 12, 12, 0, 9, 0, 9, 9, - 1, 8, 8, 8, 0, 3, 9, 9, 0, 9, 9, 0, 0, 0, 12, 0, - 0, 14, 14, 0, 12, 12, 12, 6, 6, 3, 9, 9, 9, 5, 16, 0, - 13, 13, 13, 9, 0, 0, 13, 13, 13, 13, 13, 13, 0, 0, 1, 2, - 0, 0, 5, 0, 9, 0, 9, 0, 9, 9, 6, 0, 25, 25, 25, 25, - 30, 1, 6, 0, 0, 12, 0, 12, 9, 9, 6, 9, 20, 20, 0, 0, - 9, 0, 0, 0, 0, 1, 0, 0, 0, 29, 0, 29, 0, 4, 0, 0, - 9, 9, 1, 2, 9, 9, 1, 1, 6, 3, 0, 0, 22, 22, 22, 22, - 22, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 0, 0, 0, - 0, 0, 29, 0, 12, 8, 8, 8, 8, 8, 8, 9, 9, 9, 1, 25, - 2, 7, 6, 20, 20, 20, 20, 12, 34, 34, 0, 11, 0, 0, 11, 0, - 12, 12, 8, 8, 9, 9, 12, 12, 12, 12, 20, 20, 20, 12, 9, 25, - 25, 12, 12, 9, 9, 25, 25, 25, 25, 25, 12, 12, 12, 9, 9, 9, - 9, 12, 12, 12, 12, 12, 20, 9, 9, 9, 9, 25, 25, 25, 12, 25, - 34, 34, 25, 25, 9, 9, 0, 0, 8, 8, 8, 12, 6, 0, 0, 0, - 12, 0, 9, 9, 12, 12, 12, 8, 9, 28, 28, 29, 18, 30, 29, 29, - 29, 6, 7, 29, 3, 29, 0, 0, 11, 12, 12, 12, 9, 19, 19, 19, - 21, 21, 1, 21, 21, 21, 21, 21, 21, 21, 9, 29, 12, 12, 12, 10, - 10, 10, 10, 10, 10, 10, 0, 0, 24, 24, 24, 24, 24, 0, 0, 0, - 9, 21, 21, 21, 25, 25, 0, 0, 34, 34, 34, 0, 12, 12, 12, 9, - 12, 20, 20, 19, 21, 21, 17, 19, 19, 19, 19, 0, 7, 9, 9, 9, - 1, 25, 25, 25, 25, 25, 6, 29, 29, 0, 0, 29, 1, 1, 1, 18, - 2, 8, 8, 8, 4, 9, 9, 9, 5, 12, 12, 12, 1, 18, 2, 8, - 8, 8, 12, 12, 12, 19, 19, 19, 9, 9, 6, 7, 19, 19, 12, 12, - 34, 34, 3, 12, 12, 12, 21, 21, 8, 8, 4, 9, 21, 21, 6, 6, - 19, 19, 9, 9, 1, 1, 29, 4, 27, 27, 27, 0, 27, 27, 27, 27, - 27, 27, 0, 0, 27, 14, 14, 27, 27, 27, 11, 0, 0, 0, 0, 29, - 31, 32, 0, 0, 11, 11, 11, 11, 29, 0, 0, 0, 27, 0, 0, 0, - 8, 8, 9, 8, 8, 8, 5, 12, 12, 12, 12, 1, 12, 12, 10, 10, - 10, 10, 12, 12, 12, 12, 10, 19, 19, 12, 12, 12, 12, 19, 12, 1, - 1, 2, 8, 8, 20, 9, 9, 9, 5, 1, 0, 0, 27, 27, 1, 1, - 0, 0, 8, 9, 34, 34, 12, 12, 10, 10, 10, 25, 9, 9, 9, 21, - 21, 21, 21, 6, 1, 1, 18, 2, 12, 12, 12, 4, 9, 20, 20, 20, - 5, 0, 0, 0, 12, 9, 0, 12, 9, 9, 9, 20, 20, 20, 20, 0, - 21, 21, 0, 0, 11, 11, 11, 0, 0, 0, 12, 25, 24, 25, 24, 0, - 0, 2, 7, 0, 12, 8, 12, 12, 12, 12, 12, 21, 21, 21, 21, 9, - 25, 6, 0, 0, 4, 4, 4, 0, 0, 0, 0, 7, 34, 0, 0, 0, - 1, 1, 2, 14, 14, 8, 8, 8, 9, 9, 5, 0, 0, 0, 35, 35, - 35, 35, 35, 35, 35, 35, 34, 34, 0, 0, 0, 33, 1, 1, 2, 8, - 9, 5, 4, 0, 9, 9, 9, 7, 6, 0, 34, 34, 12, 9, 9, 0, - 10, 12, 12, 12, 5, 3, 15, 15, 0, 29, 4, 9, 0, 34, 34, 34, - 1, 5, 4, 26, 0, 0, 27, 0, 9, 4, 6, 0, 12, 12, 0, 4, - 0, 0, 1, 1, 0, 0, 27, 27, 9, 9, 5, 1, 1, 2, 4, 3, - 0, 0, 29, 1, 9, 9, 9, 1, 1, 2, 5, 4, 3, 0, 0, 0, - 1, 1, 2, 5, 4, 0, 0, 0, 9, 1, 2, 5, 2, 9, 9, 9, - 9, 9, 5, 4, 0, 20, 20, 20, 9, 9, 9, 6, 2, 5, 4, 0, - 5, 3, 0, 0, 8, 9, 9, 9, 9, 9, 9, 12, 12, 12, 12, 29, - 6, 1, 1, 1, 1, 2, 15, 20, 20, 20, 20, 11, 0, 11, 0, 7, - 15, 15, 15, 15, 15, 15, 21, 21, 21, 21, 1, 2, 26, 7, 0, 0, - 0, 3, 0, 0, 0, 0, 19, 19, 9, 1, 1, 0, 0, 0, 9, 0, - 1, 2, 4, 9, 6, 7, 16, 20, 9, 1, 2, 7, 12, 12, 11, 9, -}; - -/* Indic_Syllabic_Category: 3496 bytes. */ - -RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_indic_syllabic_category_stage_1[f] << 6; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_indic_syllabic_category_stage_2[pos + f] << 5; - f = code >> 2; - code ^= f << 2; - pos = (RE_UINT32)re_indic_syllabic_category_stage_3[pos + f] << 2; - value = re_indic_syllabic_category_stage_4[pos + code]; - - return value; -} - -/* Emoji. */ - -static RE_UINT8 re_emoji_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_emoji_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 1, -}; - -static RE_UINT8 re_emoji_stage_3[] = { - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 4, 1, 1, 5, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 8, - 1, 1, 1, 9, 1, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 1, - 1, 1, 1, 1, 19, 1, 1, 1, 1, 1, 1, 1, 20, 21, 1, 1, - 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 1, 1, 1, 1, 1, - 24, 1, 1, 25, 1, 26, 27, 28, 29, 30, 1, 1, 31, 32, 33, 34, - 32, 32, 32, 35, 36, 37, 38, 39, 32, 40, 32, 41, 1, 1, 1, 42, - 1, 1, 1, 1, 43, 44, 45, 46, 1, 47, 48, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_emoji_stage_4[] = { - 0, 0, 0, 0, 8, 4, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 2, - 0, 0, 240, 3, 0, 6, 0, 0, 0, 0, 0, 12, 0, 1, 0, 0, - 0, 128, 0, 0, 0, 254, 15, 7, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 64, 0, 1, 0, 0, 0, 0, 0, 0, 120, - 31, 64, 50, 33, 77, 196, 0, 7, 5, 255, 15, 128, 105, 1, 0, 200, - 0, 0, 252, 26, 3, 12, 3, 96, 48, 193, 26, 0, 0, 6, 191, 39, - 36, 191, 84, 32, 2, 1, 24, 0, 144, 80, 184, 0, 24, 0, 0, 0, - 0, 0, 224, 0, 2, 0, 1, 128, 0, 0, 0, 0, 0, 0, 48, 0, - 224, 0, 0, 24, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 32, 0, 0, 128, 2, 0, 0, 0, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 192, 0, 64, 254, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 192, 255, 255, 255, 6, 0, 0, 4, 0, 128, 252, 7, - 0, 0, 3, 0, 0, 0, 0, 0, 255, 255, 255, 255, 243, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 206, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 185, 255, 255, 255, 255, 255, 255, 255, 255, 191, - 255, 255, 255, 255, 255, 255, 255, 63, 0, 126, 255, 255, 255, 128, 249, 7, - 128, 60, 97, 0, 48, 1, 6, 16, 28, 0, 14, 112, 10, 129, 8, 252, - 255, 255, 0, 0, 0, 0, 0, 0, 63, 248, 39, 0, 63, 26, 249, 7, - 0, 0, 0, 0, 255, 15, 0, 0, 0, 224, 255, 255, 255, 255, 255, 247, - 191, 255, 255, 255, 255, 255, 123, 252, 255, 255, 255, 255, 231, 199, 255, 255, - 255, 231, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 15, 7, - 7, 0, 63, 0, 0, 0, 0, 0, -}; - -/* Emoji: 652 bytes. */ - -RE_UINT32 re_get_emoji(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_emoji_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_emoji_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_emoji_stage_3[pos + f] << 6; - pos += code; - value = (re_emoji_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 80, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 94, 6, 6, 6, 6, 6, 6, + 80, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 269, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 111, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 89, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_word_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 135, 254, 255, 255, 7, + 0, 4, 32, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, + 31, 80, 0, 0, 255, 255, 223, 188, 64, 215, 255, 255, 251, 255, 255, 255, + 255, 255, 191, 255, 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 254, 255, + 255, 255, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, 0, 0, 255, 7, + 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159, 0, 0, 255, 255, + 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 63, 36, 255, 63, 0, 0, + 255, 255, 255, 15, 255, 7, 0, 0, 255, 255, 223, 255, 255, 0, 248, 255, + 207, 255, 254, 255, 239, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176, + 207, 255, 3, 80, 238, 135, 249, 255, 255, 253, 109, 211, 135, 57, 2, 94, + 192, 255, 63, 0, 238, 191, 251, 255, 255, 253, 237, 243, 191, 59, 1, 0, + 207, 255, 0, 254, 238, 159, 249, 255, 159, 57, 224, 176, 207, 255, 2, 0, + 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, 192, 255, 0, 0, + 255, 223, 253, 255, 255, 253, 255, 227, 223, 61, 96, 7, 207, 255, 0, 0, + 239, 223, 253, 255, 255, 253, 239, 243, 223, 61, 96, 64, 207, 255, 6, 0, + 223, 125, 240, 128, 207, 255, 0, 252, 238, 255, 127, 252, 255, 255, 251, 47, + 127, 132, 95, 255, 192, 255, 12, 0, 254, 255, 255, 255, 255, 255, 255, 7, + 255, 127, 255, 3, 214, 247, 255, 255, 175, 255, 255, 63, 95, 63, 255, 243, + 1, 0, 0, 3, 255, 3, 160, 194, 255, 254, 255, 255, 255, 31, 254, 255, + 223, 255, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, 255, 3, 255, 255, + 255, 255, 255, 63, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, + 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, + 255, 255, 255, 231, 255, 255, 0, 0, 255, 255, 63, 63, 255, 159, 255, 255, + 255, 199, 255, 1, 255, 223, 31, 0, 255, 255, 31, 0, 255, 255, 15, 0, + 255, 223, 13, 0, 255, 255, 143, 48, 255, 3, 0, 0, 0, 56, 255, 3, + 255, 255, 255, 1, 255, 7, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, + 255, 15, 255, 15, 192, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, + 255, 3, 255, 3, 255, 255, 255, 159, 128, 0, 255, 255, 1, 0, 0, 0, + 255, 15, 255, 3, 0, 248, 15, 0, 255, 255, 255, 0, 255, 227, 255, 255, + 255, 1, 255, 255, 0, 0, 247, 255, 255, 255, 255, 251, 63, 63, 255, 170, + 255, 255, 223, 95, 220, 31, 207, 15, 255, 31, 220, 31, 0, 48, 0, 0, + 0, 0, 0, 128, 1, 0, 16, 0, 0, 0, 2, 128, 0, 0, 255, 31, + 255, 255, 1, 0, 132, 252, 47, 62, 80, 189, 255, 243, 224, 67, 0, 0, + 255, 1, 0, 0, 0, 0, 192, 255, 255, 127, 255, 255, 31, 248, 15, 0, + 255, 128, 0, 128, 255, 255, 127, 0, 127, 127, 127, 127, 0, 128, 0, 0, + 224, 0, 0, 0, 254, 255, 62, 31, 255, 255, 127, 230, 224, 255, 255, 255, + 255, 127, 0, 0, 255, 31, 0, 0, 255, 31, 255, 255, 255, 15, 0, 0, + 255, 255, 247, 191, 0, 0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, + 252, 7, 0, 0, 0, 0, 224, 255, 255, 16, 0, 0, 63, 0, 255, 3, + 255, 255, 255, 232, 255, 63, 255, 255, 1, 128, 255, 3, 255, 63, 255, 3, + 255, 255, 127, 252, 7, 0, 0, 56, 255, 255, 124, 0, 126, 126, 126, 0, + 127, 127, 255, 255, 255, 55, 255, 3, 15, 0, 255, 255, 127, 248, 255, 255, + 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, + 0, 0, 248, 255, 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 15, + 255, 255, 24, 0, 0, 224, 0, 0, 0, 0, 223, 255, 252, 252, 252, 28, + 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 0, 0, 0, 32, + 0, 224, 255, 255, 15, 255, 62, 0, 255, 255, 15, 255, 255, 0, 255, 255, + 15, 0, 0, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, + 255, 255, 255, 192, 111, 240, 239, 254, 255, 255, 63, 135, 127, 0, 0, 0, + 255, 255, 7, 0, 255, 0, 255, 3, 255, 27, 3, 0, 31, 0, 0, 0, + 192, 255, 0, 128, 255, 1, 255, 3, 240, 0, 255, 255, 255, 255, 79, 0, + 31, 222, 255, 23, 255, 255, 251, 255, 255, 255, 255, 64, 127, 189, 255, 191, + 255, 7, 255, 3, 255, 253, 237, 251, 159, 57, 129, 224, 207, 31, 31, 0, + 255, 7, 255, 195, 3, 0, 0, 0, 191, 0, 255, 3, 255, 255, 63, 255, + 1, 0, 0, 63, 17, 0, 255, 3, 255, 3, 0, 128, 127, 242, 111, 255, + 255, 255, 191, 249, 15, 0, 255, 3, 255, 252, 255, 255, 255, 255, 255, 252, + 27, 0, 0, 0, 255, 255, 255, 35, 255, 253, 255, 255, 1, 0, 255, 3, + 0, 0, 252, 255, 255, 254, 127, 0, 127, 251, 255, 255, 255, 255, 127, 180, + 191, 253, 255, 255, 255, 127, 251, 1, 0, 0, 1, 0, 248, 255, 255, 224, + 255, 135, 255, 255, 255, 128, 255, 255, 27, 0, 3, 0, 0, 0, 7, 0, + 255, 7, 255, 31, 255, 1, 255, 99, 224, 227, 7, 248, 231, 15, 0, 0, + 0, 60, 0, 0, 28, 0, 0, 0, 255, 255, 255, 223, 100, 222, 255, 235, + 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, + 63, 255, 255, 255, 253, 255, 255, 247, 247, 207, 255, 255, 255, 255, 127, 248, + 255, 31, 32, 0, 16, 0, 0, 248, 254, 255, 0, 0, 127, 255, 255, 249, + 219, 7, 0, 0, 255, 31, 255, 63, 255, 67, 0, 0, 31, 0, 127, 0, + 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, + 238, 251, 255, 15, 3, 0, 255, 255 +}; + +RE_UINT32 re_get_word(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_word_table_1[field_2]; + v = re_word_table_2[(v << 5) | field_1]; + v = re_word_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; } -/* Emoji_Presentation. */ - -static RE_UINT8 re_emoji_presentation_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, +/* Word_Break. */ +static RE_UINT8 re_word_break_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 13, 14, 15, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 16, 10, 10, 10, 10, 10, 10, 10, 10, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 10, 10, 13, 29, 10, 10, + 10, 30, 10, 10, 10, 10, 10, 10, 10, 10, 31, 32, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 33, 10, 10, 34, + 10, 10, 10, 10, 35, 36, 37, 10, 38, 10, 39, 40, 41, 10, 42, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 43, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 +}; + +static RE_UINT16 re_word_break_table_2[] = { + 0, 1, 2, 3, 4, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 8, 7, 9, 9, 9, 10, 11, 12, 7, 13, + 7, 7, 7, 7, 14, 7, 7, 7, 7, 15, 16, 7, 17, 18, 19, 20, + 21, 7, 22, 23, 7, 7, 24, 25, 26, 27, 28, 7, 7, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 53, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 36, 79, 80, 36, 36, 81, 82, 36, 83, 84, 85, 86, 87, 88, 89, 36, + 36, 90, 91, 92, 93, 7, 94, 95, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 96, 7, 97, 98, 99, 7, 100, 7, 101, 36, 102, 7, 7, 103, + 104, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 105, 106, 7, 7, 107, 108, 109, 110, 111, 36, 112, 113, 114, + 115, 7, 7, 116, 117, 118, 7, 119, 120, 121, 62, 36, 36, 36, 122, 36, + 123, 36, 124, 125, 126, 127, 128, 36, 129, 130, 131, 132, 133, 134, 7, 135, + 7, 136, 137, 138, 139, 140, 141, 142, 7, 7, 7, 7, 7, 7, 9, 143, + 7, 7, 7, 7, 7, 7, 7, 7, 103, 7, 144, 138, 7, 145, 146, 147, + 148, 149, 150, 151, 152, 36, 127, 153, 154, 155, 156, 7, 157, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 158, 7, 159, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 160, 120, 7, 7, 7, 7, 161, 7, 94, 7, 162, 163, 164, 164, 9, + 36, 165, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 166, 167, 36, 36, 168, 169, 169, 170, 171, 15, 7, 7, 172, 7, 36, 173, + 36, 36, 36, 36, 36, 36, 173, 174, 169, 169, 175, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 176, 36, 177, 138, 7, 7, 7, 7, 7, 7, 7, 7, + 178, 179, 7, 180, 181, 7, 7, 182, 183, 7, 7, 7, 7, 7, 184, 185, + 186, 187, 7, 188, 189, 130, 190, 191, 30, 192, 193, 194, 40, 195, 196, 197, + 7, 198, 199, 200, 36, 201, 202, 203, 204, 205, 7, 206, 7, 7, 7, 207, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 208, 209, 210, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 211, 212, 213, 7, 7, 214, 215, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 138, 177, 7, 216, 7, 217, 218, + 219, 220, 221, 222, 7, 7, 7, 223, 224, 2, 3, 225, 226, 120, 227, 228, + 229, 230, 231, 36, 7, 7, 7, 232, 36, 36, 7, 233, 36, 36, 36, 234, + 36, 36, 36, 36, 194, 7, 235, 128, 7, 236, 237, 238, 138, 7, 239, 36, + 7, 7, 7, 7, 138, 240, 241, 210, 7, 242, 7, 243, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 163, 119, 217, 36, 36, 36, 36, + 244, 245, 119, 163, 120, 36, 36, 246, 119, 247, 36, 36, 7, 8, 36, 36, + 248, 249, 36, 194, 194, 36, 85, 250, 7, 119, 119, 251, 214, 36, 36, 36, + 7, 7, 157, 36, 7, 251, 7, 251, 7, 252, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 7, 253, 36, 36, 194, 254, 255, 36, 36, 177, 256, 163, + 133, 257, 258, 259, 133, 260, 261, 262, 133, 263, 264, 265, 133, 195, 266, 36, + 267, 268, 36, 36, 269, 139, 270, 271, 272, 273, 274, 275, 36, 36, 36, 36, + 7, 276, 277, 278, 7, 27, 279, 36, 36, 36, 36, 36, 7, 280, 281, 36, + 7, 27, 282, 36, 7, 283, 114, 36, 284, 285, 36, 36, 36, 36, 36, 36, + 7, 286, 36, 36, 36, 7, 7, 287, 288, 289, 290, 36, 36, 291, 292, 293, + 294, 295, 296, 7, 297, 36, 7, 116, 36, 36, 36, 36, 36, 36, 36, 36, + 298, 299, 300, 301, 302, 303, 36, 36, 304, 305, 306, 307, 308, 114, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 309, 36, 36, 36, 36, 36, 310, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 247, 36, 36, 36, + 7, 7, 7, 172, 7, 7, 7, 7, 7, 7, 243, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 311, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 312, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 116, 120, 114, 36, 36, 177, 313, 7, 314, 315, 316, 102, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 7, 7, 36, 36, 36, 36, 7, 7, 317, 9, 318, 36, 36, 319, + 320, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 321, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 322, 323, 324, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 325, 326, 327, 36, 36, + 36, 36, 328, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 37, 7, 329, 330, 331, 7, 332, 333, 334, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 335, 336, 95, 37, 37, 160, 160, 298, 298, 337, 338, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 9, 339, 9, 340, 341, 342, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 343, 344, 36, 36, 36, 36, 36, 36, 7, 345, 346, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 7, 347, 36, 36, 36, 36, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 7, 348, 36, 7, 7, 349, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 331, 350, 351, 352, 353, 354, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 177, 206, 206, 159, 36, 36, 355, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 356, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 122, + 357, 9, 9, 9, 36, 36, 36, 36, 9, 9, 9, 9, 9, 9, 9, 358, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36 }; -static RE_UINT8 re_emoji_presentation_stage_2[] = { +static RE_UINT8 re_word_break_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 5, 0, 0, 0, 0, 6, 0, 0, 0, 0, 7, 0, 8, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 7, 0, 0, 0, 0, + 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 12, + 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 11, 0, 10, 0, 0, 11, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 11, 11, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 11, 11, 11, 11, 11, 0, 11, 11, 0, 0, 11, 11, 11, 11, 7, 11, + 0, 0, 0, 0, 0, 0, 11, 10, 11, 11, 11, 0, 11, 0, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 0, 11, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 7, 11, 0, 0, 0, 0, 0, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, + 0, 14, 14, 0, 14, 14, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, + 15, 15, 15, 11, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 13, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 7, 0, 11, 11, + 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 11, 14, 14, 14, 14, 14, 14, 14, 13, 0, 14, + 14, 14, 14, 14, 14, 11, 11, 14, 14, 0, 14, 14, 14, 14, 11, 11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 0, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, + 11, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 11, 11, 0, 0, 7, 0, 11, 0, 0, 14, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 11, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 11, 14, 14, 14, 11, 14, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 11, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 11, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, + 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 0, 0, 0, 11, 11, 11, 11, 0, 0, 14, 11, 14, 14, + 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 11, 11, 0, 11, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 14, 0, + 0, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 11, + 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 0, 11, 11, 0, 11, 11, 0, 0, 14, 0, 14, 14, + 14, 14, 14, 0, 0, 0, 0, 14, 14, 0, 0, 14, 14, 14, 0, 0, + 0, 14, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 14, 14, 11, 11, 11, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, + 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 0, 11, 11, 11, 11, 11, 0, 0, 14, 11, 14, 14, + 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 14, 14, 14, 14, 14, 14, + 0, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, + 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 11, 11, 0, 11, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 11, 0, 11, 11, 11, 11, 11, 11, 0, 0, 0, 11, 11, + 11, 0, 11, 11, 11, 11, 0, 0, 0, 11, 11, 0, 11, 0, 11, 11, + 0, 0, 0, 11, 11, 0, 0, 0, 11, 11, 11, 0, 0, 0, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 14, 14, + 14, 14, 14, 0, 0, 0, 14, 14, 14, 0, 14, 14, 14, 14, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 11, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 0, 11, 11, 11, 0, 0, 0, 0, 0, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 0, 0, 14, 11, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 11, 0, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 11, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 14, 11, 0, + 0, 0, 0, 0, 11, 11, 11, 14, 0, 0, 0, 0, 0, 0, 0, 11, + 11, 11, 14, 14, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, + 0, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 14, 0, 0, 0, 0, 14, + 14, 14, 14, 14, 14, 0, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 14, 0, 14, 0, 0, 0, 0, 14, 14, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 0, 14, 14, 11, 11, 11, 11, 11, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, + 14, 0, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 0, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 14, 14, 0, 0, + 11, 11, 11, 11, 11, 11, 0, 11, 0, 0, 0, 0, 0, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 0, + 11, 0, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 14, 14, 14, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 0, 0, + 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 11, 11, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 11, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 13, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 11, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 11, 11, 11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 14, 11, 11, + 11, 11, 11, 11, 14, 11, 11, 14, 14, 14, 11, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, + 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 11, 0, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, + 0, 0, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 0, 0, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 0, 14, 16, 13, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 10, 2, 2, 13, 13, 13, 13, 13, 12, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, + 12, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, 0, 11, 0, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 11, 0, 0, 0, 11, 11, 11, 11, 11, 0, 0, + 0, 0, 0, 0, 11, 0, 11, 0, 11, 0, 11, 11, 11, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 0, 0, 0, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 14, + 14, 14, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, + 0, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 11, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 17, 17, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, + 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, + 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 14, 11, 11, 11, 14, 11, 11, 11, 11, 14, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 11, 11, 11, 11, 11, 11, 0, 0, 0, 11, 0, 11, 11, 14, + 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 14, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 0, 14, 14, 14, 0, 0, 14, 14, 0, 0, 0, 0, 0, 14, 14, + 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, + 0, 0, 11, 11, 11, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 0, + 0, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 15, 14, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 15, 0, + 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 7, 0, 0, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, + 7, 0, 8, 0, 7, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 13, + 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 7, 0, 8, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 14, 14, + 0, 0, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, + 0, 0, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 0, 0, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 11, 11, 0, 0, 0, 11, 0, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 0, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, + 11, 14, 14, 14, 0, 14, 14, 0, 0, 0, 0, 0, 14, 14, 14, 14, + 11, 11, 11, 11, 0, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 0, 14, 14, 14, 0, 0, 0, 0, 14, + 11, 11, 11, 11, 11, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 14, 14, 0, 0, 0, + 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 11, 14, 14, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 14, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 11, 11, 11, 11, 0, 0, 0, 0, 14, 14, 14, 14, 0, 14, 14, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 0, 11, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 14, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 11, 11, 11, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 0, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, + 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 0, 11, 11, 11, 11, 11, 0, 14, 14, 11, 14, 14, + 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 11, 11, 11, + 11, 11, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 14, 11, + 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, -}; - -static RE_UINT8 re_emoji_presentation_stage_3[] = { + 14, 14, 14, 14, 11, 11, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, + 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 14, 14, 0, 0, + 14, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 4, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 14, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 17, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 20, 0, 0, 21, - 22, 23, 24, 0, 0, 0, 0, 0, 25, 26, 25, 27, 28, 25, 29, 30, - 25, 31, 32, 25, 25, 25, 25, 33, 25, 34, 35, 36, 37, 18, 0, 38, - 25, 25, 39, 0, 25, 25, 40, 41, 0, 0, 0, 0, 0, 0, 0, 42, - 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 25, 47, 48, 25, - 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_emoji_presentation_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 12, 0, 30, 9, 0, 0, 0, 0, 96, - 0, 0, 48, 0, 0, 255, 15, 0, 0, 0, 0, 128, 0, 0, 8, 0, - 2, 12, 0, 96, 48, 64, 16, 0, 0, 4, 44, 36, 32, 12, 0, 0, - 0, 1, 0, 0, 0, 80, 184, 0, 0, 0, 224, 0, 0, 0, 1, 128, - 0, 0, 0, 24, 0, 0, 33, 0, 16, 0, 0, 0, 0, 128, 0, 0, - 0, 64, 254, 7, 192, 255, 255, 255, 2, 0, 0, 4, 0, 128, 124, 7, - 0, 0, 3, 0, 255, 255, 255, 255, 1, 224, 191, 255, 255, 255, 255, 223, - 255, 255, 15, 0, 255, 135, 15, 0, 255, 255, 17, 255, 255, 255, 255, 127, - 253, 255, 255, 255, 255, 255, 255, 159, 255, 255, 255, 63, 0, 120, 255, 255, - 255, 0, 0, 4, 0, 0, 96, 0, 0, 0, 0, 248, 255, 255, 0, 0, - 63, 16, 39, 0, 0, 24, 240, 7, 255, 15, 0, 0, 0, 224, 255, 255, - 255, 255, 255, 247, 191, 255, 255, 255, 255, 255, 123, 252, 231, 199, 255, 255, - 255, 231, 255, 255, 0, 0, 15, 7, 7, 0, 63, 0, -}; - -/* Emoji_Presentation: 544 bytes. */ - -RE_UINT32 re_get_emoji_presentation(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_emoji_presentation_stage_1[f] << 5; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_emoji_presentation_stage_2[pos + f] << 4; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_emoji_presentation_stage_3[pos + f] << 5; - pos += code; - value = (re_emoji_presentation_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Emoji_Modifier. */ - -static RE_UINT8 re_emoji_modifier_stage_1[] = { - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -}; - -static RE_UINT8 re_emoji_modifier_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -}; - -static RE_UINT8 re_emoji_modifier_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_emoji_modifier_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, -}; - -/* Emoji_Modifier: 130 bytes. */ - -RE_UINT32 re_get_emoji_modifier(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_emoji_modifier_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_emoji_modifier_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_emoji_modifier_stage_3[pos + f] << 7; - pos += code; - value = (re_emoji_modifier_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Emoji_Modifier_Base. */ - -static RE_UINT8 re_emoji_modifier_base_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_emoji_modifier_base_stage_2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, -}; - -static RE_UINT8 re_emoji_modifier_base_stage_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 0, 0, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 14, 0, 14, 14, 0, 0, 14, 14, 14, 14, 11, + 14, 11, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, + 14, 11, 0, 11, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, - 0, 6, 7, 0, 0, 8, 9, 0, 0, 10, 11, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_emoji_modifier_base_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 60, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 156, 28, 0, 0, 0, 0, 0, 0, - 204, 255, 1, 0, 192, 255, 255, 17, 238, 128, 2, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 48, 4, 0, 0, 97, 0, 0, 0, 0, 0, - 224, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 112, 0, - 1, 16, 0, 0, 0, 0, 0, 0, 0, 128, 0, 255, 64, 0, 255, 115, - 0, 0, 0, 0, 0, 0, 96, 11, 0, 224, 254, 63, 0, 0, 0, 0, -}; - -/* Emoji_Modifier_Base: 324 bytes. */ - -RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_emoji_modifier_base_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_emoji_modifier_base_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_emoji_modifier_base_stage_3[pos + f] << 6; - pos += code; - value = (re_emoji_modifier_base_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Emoji_Component. */ - -static RE_UINT8 re_emoji_component_stage_1[] = { - 0, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_emoji_component_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 5, 1, - 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_emoji_component_stage_3[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 6, - 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 8, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_emoji_component_stage_4[] = { - 0, 0, 0, 0, 8, 4, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, - 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, - 0, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -}; - -/* Emoji_Component: 340 bytes. */ - -RE_UINT32 re_get_emoji_component(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_emoji_component_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_emoji_component_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_emoji_component_stage_3[pos + f] << 6; - pos += code; - value = (re_emoji_component_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Extended_Pictographic. */ - -static RE_UINT8 re_extended_pictographic_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_extended_pictographic_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 1, 5, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 8, 9, -}; - -static RE_UINT8 re_extended_pictographic_stage_3[] = { - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 11, 14, 14, 14, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 11, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 3, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 6, 0, 7, 8, - 0, 0, 0, 9, 0, 0, 10, 11, 12, 13, 14, 13, 15, 16, 17, 0, - 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 19, 20, 0, 0, - 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, - 13, 13, 13, 13, 23, 24, 25, 26, 27, 28, 13, 13, 13, 13, 13, 29, - 13, 13, 13, 13, 30, 31, 13, 13, 13, 32, 13, 13, 0, 33, 0, 34, - 35, 36, 37, 13, 38, 39, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 30, -}; - -static RE_UINT8 re_extended_pictographic_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 2, 0, 0, 240, 3, 0, 6, 0, 0, - 0, 0, 0, 12, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 0, 254, 15, 7, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 64, 0, 1, 0, 0, 0, 0, 0, 0, 120, - 191, 255, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 63, 0, 255, 255, 255, 255, 255, 255, 63, 255, 87, 32, 2, 1, 24, 0, - 144, 80, 184, 0, 248, 0, 0, 0, 0, 0, 224, 0, 2, 0, 1, 128, - 0, 0, 0, 0, 0, 0, 48, 0, 224, 0, 0, 24, 0, 0, 0, 0, - 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32, - 0, 0, 128, 2, 0, 0, 0, 0, 0, 224, 0, 0, 0, 128, 0, 0, - 0, 0, 0, 0, 0, 240, 3, 192, 0, 64, 254, 7, 0, 224, 255, 255, - 255, 255, 255, 255, 63, 0, 0, 0, 254, 255, 0, 4, 0, 128, 252, 247, - 0, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 7, - 255, 255, 255, 255, 255, 255, 255, 63, 192, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, - 0, 0, 224, 255, 255, 255, 255, 255, 0, 240, 0, 0, 0, 0, 0, 0, - 0, 255, 0, 252, 0, 0, 0, 0, 0, 255, 0, 0, 0, 192, 255, 255, - 0, 240, 255, 255, 255, 255, 255, 247, 191, 255, 255, 255, 255, 255, 255, 255, -}; - -/* Extended_Pictographic: 596 bytes. */ - -RE_UINT32 re_get_extended_pictographic(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_extended_pictographic_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_extended_pictographic_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_extended_pictographic_stage_3[pos + f] << 6; - pos += code; - value = (re_extended_pictographic_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* NFD_Quick_Check. */ - -static RE_UINT8 re_nfd_quick_check_stage_1[] = { - 0, 1, 2, 3, 4, 1, 1, 5, 1, 1, 1, 6, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static RE_UINT8 re_nfd_quick_check_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 9, 5, 10, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 12, 5, 5, 5, 5, 5, 5, 5, 5, 13, 5, - 5, 5, 5, 5, 14, 15, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 17, 5, -}; - -static RE_UINT8 re_nfd_quick_check_stage_3[] = { - 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 7, 8, 9, - 10, 11, 0, 12, 0, 0, 0, 0, 13, 0, 0, 14, 0, 0, 0, 0, - 0, 0, 0, 0, 15, 16, 0, 17, 18, 19, 0, 0, 0, 20, 21, 22, - 0, 23, 0, 24, 0, 22, 0, 25, 0, 0, 0, 0, 0, 26, 27, 0, - 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 31, 31, 32, 33, 34, 35, 36, 37, - 38, 0, 0, 0, 39, 0, 40, 41, 42, 43, 44, 45, 46, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, - 0, 48, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 51, 0, - 0, 0, 0, 0, 31, 31, 31, 31, 52, 53, 31, 54, 55, 56, 0, 0, - 0, 0, 57, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, - 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 62, 63, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 31, 31, 31, 31, 31, 31, 31, 31, 65, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_nfd_quick_check_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 191, 255, 126, 62, 191, 255, 126, 190, - 255, 255, 252, 255, 63, 255, 241, 126, 248, 241, 243, 255, 63, 255, 255, 127, - 0, 0, 0, 0, 3, 128, 1, 0, 0, 224, 255, 223, 207, 255, 49, 255, - 255, 255, 255, 207, 192, 255, 15, 0, 27, 0, 0, 0, 0, 0, 16, 64, - 224, 215, 1, 0, 0, 252, 1, 0, 0, 124, 24, 0, 0, 0, 0, 0, - 139, 112, 0, 2, 0, 0, 0, 2, 0, 0, 139, 112, 0, 0, 192, 0, - 6, 0, 207, 252, 252, 252, 63, 3, 0, 0, 0, 0, 124, 0, 0, 0, - 5, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 18, 0, - 0, 0, 0, 255, 0, 0, 0, 0, 0, 24, 0, 176, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 78, 0, 0, 0, 0, - 0, 25, 0, 48, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 28, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 129, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, - 8, 32, 132, 16, 0, 2, 104, 1, 2, 0, 8, 32, 132, 16, 0, 2, - 0, 0, 0, 0, 64, 0, 0, 0, 64, 85, 4, 0, 0, 0, 0, 40, - 11, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 11, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 3, - 255, 255, 63, 63, 255, 255, 255, 255, 63, 63, 255, 170, 255, 255, 255, 63, - 255, 255, 255, 255, 255, 255, 223, 95, 222, 255, 207, 239, 255, 255, 220, 63, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 12, 0, 0, - 0, 0, 0, 12, 0, 64, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, - 16, 18, 0, 0, 80, 0, 0, 0, 146, 2, 0, 0, 5, 224, 51, 3, - 51, 3, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 15, 60, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 80, 85, 85, 165, 2, 219, 54, 0, 0, 16, 64, 0, 80, 85, 85, - 165, 2, 219, 54, 0, 0, 144, 71, 255, 255, 255, 255, 15, 0, 0, 0, - 255, 63, 229, 127, 101, 252, 255, 255, 255, 255, 255, 255, 255, 63, 255, 255, - 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 160, 0, 252, 127, 95, - 219, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 192, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 12, - 0, 0, 0, 192, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, - 1, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 0, 0, 0, 0, -}; - -/* NFD_Quick_Check: 996 bytes. */ - -RE_UINT32 re_get_nfd_quick_check(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 14; - code = ch ^ (f << 14); - pos = (RE_UINT32)re_nfd_quick_check_stage_1[f] << 4; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_nfd_quick_check_stage_2[pos + f] << 4; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_nfd_quick_check_stage_3[pos + f] << 6; - pos += code; - value = (re_nfd_quick_check_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* NFC_Quick_Check. */ - -static RE_UINT8 re_nfc_quick_check_stage_1[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, - 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static RE_UINT8 re_nfc_quick_check_stage_2[] = { - 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 4, 5, 6, 0, 7, 8, 9, 10, 8, 11, 0, 0, 12, 13, - 14, 0, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 19, - 20, 0, 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 0, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 0, 14, 14, 0, 14, + 14, 14, 14, 14, 14, 14, 11, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 0, 11, 11, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 0, + 14, 14, 0, 14, 14, 14, 14, 14, 11, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, + 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 14, + 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 14, + 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 11, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 25, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 29, 30, 0, 0, 0, 8, 0, 0, 31, 0, 32, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 14, 14, 0, + 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, + 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 25, 25, 25, 25, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_nfc_quick_check_stage_3[] = { + 0, 0, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 10, 11, - 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 18, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 20, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 22, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 24, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 17, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 10, 0, 29, 30, 31, - 29, 0, 26, 27, 28, 10, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 0, - 0, 0, 0, 0, 0, 33, 33, 33, 35, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, - 0, 0, 0, 0, 0, 0, 0, 19, 0, 39, 26, 26, 26, 40, 0, 38, - 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 11, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, - 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 45, 46, 47, 48, 49, 15, 15, 15, 15, 15, 15, 15, 45, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 41, 0, 0, 0, 0, - 0, 0, 0, 50, 0, 49, 47, 51, 52, 47, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 53, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 56, 31, 0, 0, 0, 0, 0, 0, 0, - 15, 15, 15, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_nfc_quick_check_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2, - 2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 2, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, - 2, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 2, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 2, 2, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, - 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2, - 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, - 0, 2, 2, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, - 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, - 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 2, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 1, -}; - -/* NFC_Quick_Check: 1592 bytes. */ - -RE_UINT32 re_get_nfc_quick_check(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_nfc_quick_check_stage_1[f] << 5; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_nfc_quick_check_stage_2[pos + f] << 4; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_nfc_quick_check_stage_3[pos + f] << 3; - value = re_nfc_quick_check_stage_4[pos + code]; - - return value; -} - -/* NFKD_Quick_Check. */ - -static RE_UINT8 re_nfkd_quick_check_stage_1[] = { - 0, 1, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 2, 2, 7, 8, - 2, 2, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 0, 0, 11, 0, 0, 11, 11, 0, 0, 11, 11, 11, 11, 0, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 11, 11, 11, + 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 0, 0, 11, 11, 11, + 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 0, + 11, 11, 11, 11, 11, 0, 11, 0, 0, 0, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, + 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 0, 14, 14, 0, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 11, 11, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 14, 14, 14, 14, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 11, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 11, 11, 0, 11, 0, 0, 11, 0, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 0, 11, 11, 11, 11, 0, 11, 0, 11, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, 0, 11, 0, 11, 0, 11, 0, 11, 11, 11, + 0, 11, 11, 0, 11, 0, 0, 11, 0, 11, 0, 11, 0, 11, 0, 11, + 0, 11, 11, 0, 11, 0, 0, 11, 11, 11, 11, 0, 11, 11, 11, 11, + 11, 11, 11, 0, 11, 11, 11, 11, 0, 11, 11, 11, 11, 0, 11, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 0, 11, 11, 11, 0, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_nfkd_quick_check_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 17, 18, 19, - 20, 21, 22, 23, 24, 7, 7, 7, 7, 7, 25, 7, 26, 27, 28, 29, - 30, 31, 32, 33, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 34, 35, 7, 7, 7, 36, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 37, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 33, 38, 39, 33, 40, 41, 42, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 43, 44, 7, 45, 46, 47, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 48, 7, 7, 49, 50, 51, 52, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 53, 7, - 7, 54, 55, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 33, 33, 56, 7, 7, 7, 7, 7, -}; +RE_UINT32 re_get_word_break(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; -static RE_UINT8 re_nfkd_quick_check_stage_3[] = { - 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, - 11, 12, 0, 0, 0, 13, 14, 15, 0, 0, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 0, 28, 0, 0, 0, - 0, 29, 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 33, 0, 0, 0, 34, 0, 0, 35, 36, 0, 0, 0, 0, 0, - 0, 0, 37, 0, 38, 0, 39, 0, 0, 0, 40, 0, 0, 0, 41, 0, - 0, 0, 39, 0, 0, 0, 42, 0, 0, 43, 0, 0, 0, 43, 44, 0, - 45, 0, 46, 47, 48, 49, 0, 0, 0, 50, 0, 0, 0, 0, 0, 51, - 52, 53, 54, 0, 0, 0, 0, 0, 0, 55, 56, 57, 58, 59, 0, 0, - 59, 59, 59, 59, 60, 59, 59, 61, 62, 59, 63, 64, 59, 65, 66, 67, - 68, 69, 70, 71, 72, 40, 0, 0, 73, 74, 75, 59, 76, 77, 78, 0, - 79, 80, 81, 82, 83, 84, 0, 85, 0, 86, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 59, 59, 59, 59, 87, 45, 0, 0, 88, 0, 0, 51, 0, - 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 0, 0, 43, 59, 59, 59, 59, 59, 59, 91, 0, - 92, 93, 94, 95, 96, 94, 95, 97, 0, 98, 59, 59, 99, 0, 0, 0, - 100, 59, 101, 100, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 103, - 0, 0, 104, 0, 0, 0, 0, 0, 59, 59, 59, 59, 59, 105, 0, 0, - 106, 107, 59, 108, 59, 59, 61, 0, 109, 110, 111, 59, 59, 112, 113, 59, - 59, 64, 114, 59, 4, 59, 115, 116, 117, 114, 118, 119, 59, 59, 59, 120, - 121, 59, 59, 59, 59, 100, 122, 123, 0, 0, 0, 0, 124, 125, 0, 0, - 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 129, 0, 0, - 0, 0, 130, 15, 0, 58, 92, 0, 59, 59, 65, 59, 131, 132, 133, 59, - 134, 135, 136, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 7, 59, 59, - 59, 59, 59, 59, 59, 59, 137, 59, 133, 138, 139, 140, 141, 142, 0, 0, - 143, 144, 145, 39, 102, 0, 0, 0, 146, 60, 147, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 0, 0, 0, 0, -}; + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; -static RE_UINT8 re_nfkd_quick_check_stage_4[] = { - 0, 0, 0, 0, 1, 133, 60, 119, 191, 255, 126, 62, 191, 255, 126, 190, - 255, 255, 252, 255, 63, 255, 253, 254, 249, 243, 243, 255, 63, 255, 255, 255, - 3, 128, 1, 0, 240, 255, 255, 223, 207, 255, 63, 255, 255, 255, 255, 207, - 192, 255, 15, 0, 0, 0, 255, 1, 0, 0, 0, 63, 31, 0, 0, 0, - 27, 0, 0, 0, 0, 0, 16, 68, 240, 215, 1, 0, 0, 252, 1, 0, - 0, 124, 127, 0, 0, 0, 55, 2, 139, 112, 0, 2, 0, 0, 0, 2, - 0, 0, 139, 112, 0, 0, 192, 0, 6, 0, 207, 252, 252, 252, 63, 3, - 128, 0, 0, 0, 124, 0, 0, 0, 0, 0, 224, 1, 5, 0, 8, 0, - 0, 2, 18, 0, 0, 0, 0, 255, 0, 24, 0, 176, 0, 0, 72, 0, - 0, 0, 0, 78, 0, 25, 0, 48, 0, 0, 16, 0, 0, 28, 0, 0, - 0, 1, 0, 0, 129, 13, 0, 0, 0, 0, 0, 116, 0, 0, 8, 0, - 0, 0, 0, 48, 0, 16, 0, 0, 8, 32, 132, 16, 0, 2, 232, 3, - 2, 0, 8, 32, 132, 16, 0, 2, 64, 0, 0, 0, 0, 0, 0, 16, - 64, 85, 4, 0, 0, 0, 0, 40, 11, 0, 0, 0, 0, 112, 255, 247, - 255, 191, 255, 255, 255, 7, 0, 1, 0, 0, 0, 248, 255, 255, 255, 255, - 255, 255, 255, 15, 255, 255, 255, 3, 255, 255, 63, 63, 63, 63, 255, 170, - 255, 255, 255, 63, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127, - 255, 7, 130, 0, 112, 128, 216, 80, 128, 3, 128, 128, 0, 0, 243, 255, - 255, 127, 255, 31, 239, 254, 111, 62, 87, 189, 251, 251, 225, 3, 255, 255, - 0, 2, 0, 12, 0, 64, 0, 0, 0, 224, 0, 0, 16, 18, 0, 0, - 80, 176, 1, 0, 146, 2, 0, 0, 5, 224, 51, 3, 51, 3, 0, 0, - 0, 240, 0, 0, 15, 60, 0, 0, 0, 6, 0, 0, 255, 7, 0, 0, - 0, 0, 112, 0, 0, 128, 0, 0, 0, 0, 0, 128, 255, 255, 63, 0, - 1, 0, 0, 0, 0, 0, 64, 7, 0, 80, 85, 85, 165, 2, 219, 54, - 0, 0, 16, 216, 0, 0, 144, 199, 0, 0, 254, 255, 255, 127, 252, 255, - 255, 255, 255, 127, 255, 0, 255, 255, 0, 0, 1, 0, 0, 0, 0, 3, - 0, 0, 0, 240, 15, 0, 0, 0, 255, 63, 229, 127, 101, 252, 255, 255, - 255, 63, 255, 255, 127, 0, 248, 160, 255, 255, 127, 95, 219, 255, 255, 255, - 255, 255, 3, 0, 0, 0, 248, 255, 0, 0, 255, 255, 255, 0, 0, 0, - 0, 0, 255, 31, 0, 0, 255, 3, 159, 255, 247, 255, 127, 15, 215, 255, - 255, 255, 255, 31, 254, 255, 255, 255, 252, 252, 252, 28, 127, 127, 0, 0, - 0, 0, 0, 20, 0, 8, 0, 0, 0, 192, 0, 0, 0, 24, 0, 0, - 0, 0, 0, 88, 0, 0, 0, 12, 0, 0, 0, 192, 255, 255, 255, 223, - 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, - 95, 252, 253, 255, 255, 207, 255, 255, 150, 254, 247, 10, 132, 234, 150, 170, - 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 255, 7, 255, 255, - 255, 127, 255, 255, 255, 255, 0, 0, 7, 0, 255, 255, 255, 1, 3, 0, -}; + v = re_word_break_table_1[field_2]; + v = re_word_break_table_2[(v << 5) | field_1]; + v = re_word_break_table_3[(v << 5) | field_0]; -/* NFKD_Quick_Check: 1504 bytes. */ - -RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_nfkd_quick_check_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_nfkd_quick_check_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_nfkd_quick_check_stage_3[pos + f] << 5; - pos += code; - value = (re_nfkd_quick_check_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; + return v; } -/* NFKC_Quick_Check. */ - -static RE_UINT8 re_nfkc_quick_check_stage_1[] = { - 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 6, - 4, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 9, 10, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +/* XDigit. */ +static RE_UINT8 re_xdigit_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 10, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, + 8, 12, 8, 13, 14, 15, 16, 17, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 18, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 19, 8, 8, 20, 8, 21, 8, 8, 8, 22, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; -static RE_UINT8 re_nfkc_quick_check_stage_2[] = { - 0, 0, 1, 0, 2, 3, 0, 4, 0, 0, 5, 6, 7, 8, 9, 10, - 0, 0, 0, 0, 0, 0, 11, 0, 0, 12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 13, 14, 15, 16, 17, 18, 0, 0, 15, 19, 15, 20, - 0, 21, 0, 22, 15, 20, 0, 23, 24, 0, 24, 25, 26, 27, 28, 0, - 29, 0, 0, 30, 0, 31, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, - 0, 0, 0, 0, 35, 36, 37, 0, 0, 0, 38, 0, 0, 39, 40, 41, - 42, 43, 44, 0, 45, 46, 47, 0, 48, 0, 0, 0, 49, 0, 0, 0, - 0, 50, 51, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 26, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 57, 24, 51, 51, 51, 58, - 59, 0, 60, 61, 62, 51, 63, 0, 64, 65, 51, 51, 51, 51, 51, 51, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 66, 0, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 51, 51, 51, 51, 69, 70, 51, 71, 72, 73, 74, 75, - 51, 51, 51, 51, 76, 77, 78, 79, 80, 81, 51, 82, 83, 51, 84, 85, - 0, 0, 86, 0, 87, 0, 0, 0, 0, 0, 0, 0, 15, 20, 0, 0, - 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 90, 91, 92, 0, 0, 0, 0, 0, 0, 0, 0, - 51, 93, 94, 95, 96, 97, 51, 51, 51, 51, 98, 51, 51, 51, 51, 99, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 103, 104, 105, 0, 106, 107, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 51, 51, 51, 51, 51, 51, 51, 51, 108, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_xdigit_table_2[] = { + 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, + 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, + 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; -static RE_UINT8 re_nfkc_quick_check_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, - 0, 0, 0, 0, 0, 0, 5, 6, 1, 7, 0, 0, 0, 0, 0, 6, - 8, 9, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 11, 1, - 0, 0, 0, 12, 9, 0, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 0, 0, 0, 0, 0, 22, 23, 24, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 26, 7, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 27, 0, 0, 0, 28, 1, 0, 0, 0, 0, 0, 0, 0, 29, - 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, - 0, 0, 31, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, - 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 34, 35, 0, 0, 0, 0, - 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, - 36, 0, 37, 0, 0, 0, 0, 0, 0, 38, 0, 31, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 35, 0, 0, 0, 0, - 0, 22, 0, 0, 0, 0, 0, 0, 39, 40, 41, 22, 0, 7, 42, 43, - 7, 0, 39, 40, 41, 22, 0, 7, 0, 0, 0, 0, 0, 30, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 44, 45, 46, 0, - 0, 0, 0, 0, 0, 45, 45, 45, 47, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 49, 11, 50, - 11, 51, 11, 11, 11, 52, 0, 1, 0, 0, 0, 53, 11, 11, 11, 11, - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, - 0, 0, 0, 0, 0, 0, 0, 42, 43, 56, 39, 42, 39, 42, 0, 57, - 11, 52, 58, 0, 49, 6, 59, 60, 6, 43, 6, 6, 0, 0, 61, 11, - 11, 25, 11, 9, 0, 1, 0, 0, 62, 63, 64, 65, 66, 67, 68, 68, - 69, 43, 11, 11, 11, 11, 11, 11, 0, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 0, 0, 70, 0, 0, - 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 52, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, - 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 11, 11, 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 71, 52, - 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 0, 63, 11, 11, 25, 73, 11, 0, 0, 0, 0, - 11, 11, 11, 25, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 25, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 43, - 0, 0, 0, 8, 0, 0, 0, 0, 11, 12, 74, 25, 75, 73, 11, 11, - 11, 11, 11, 11, 11, 12, 11, 11, 11, 11, 11, 43, 0, 0, 0, 0, - 25, 0, 53, 76, 11, 11, 25, 77, 78, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 43, 0, 0, 0, 53, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 12, 0, 0, 11, 11, 11, 11, 11, 11, - 11, 11, 73, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 11, 9, - 0, 0, 11, 43, 0, 0, 11, 11, 79, 11, 50, 11, 25, 80, 81, 11, - 11, 11, 11, 11, 11, 11, 11, 9, 63, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 25, 73, 73, 73, 82, 25, 25, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 31, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 83, 0, 0, 0, 0, 0, 31, 0, 0, - 0, 0, 0, 84, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, - 1, 0, 0, 0, 0, 0, 0, 0, 11, 11, 85, 11, 11, 11, 11, 11, - 11, 11, 11, 85, 86, 87, 11, 88, 62, 11, 11, 11, 11, 11, 11, 11, - 51, 89, 85, 85, 11, 11, 11, 90, 77, 73, 91, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 12, 11, 11, 11, 11, 92, 11, 11, 11, 11, 11, 11, - 62, 11, 11, 11, 93, 63, 50, 94, 41, 56, 93, 54, 93, 50, 50, 95, - 11, 68, 11, 80, 96, 68, 11, 80, 11, 52, 11, 11, 11, 25, 11, 11, - 11, 11, 0, 0, 0, 82, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 52, 0, 11, 11, 11, 11, 11, 80, 11, 1, 43, 0, 0, 0, 0, 0, - 11, 11, 11, 12, 0, 0, 0, 0, +static RE_UINT8 re_xdigit_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 255, 3, 0, 0, + 192, 255, 0, 0, 255, 3, 255, 3, 0, 0, 192, 255, 0, 192, 255, 255, + 255, 255, 255, 255 }; -static RE_UINT8 re_nfkc_quick_check_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2, - 2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 2, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, - 2, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 2, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 1, 1, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, - 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, - 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, - 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, - 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, - 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, - 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, - 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, - 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, - 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 2, 2, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, - 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, - 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, - 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, - 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, - 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, - 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, - 0, 1, 1, 1, 0, 1, 1, 1, -}; +RE_UINT32 re_get_xdigit(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* NFKC_Quick_Check: 2688 bytes. */ - -RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_nfkc_quick_check_stage_1[f] << 6; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_nfkc_quick_check_stage_2[pos + f] << 3; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_nfkc_quick_check_stage_3[pos + f] << 3; - value = re_nfkc_quick_check_stage_4[pos + code]; - - return value; -} + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; -/* Alphanumeric. */ + v = re_xdigit_table_1[field_2]; + v = re_xdigit_table_2[(v << 5) | field_1]; + v = re_xdigit_table_3[(v << 2) | field_0]; -static RE_UINT8 re_alphanumeric_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 21, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 23, 24, 5, 25, 26, + return (v >> offset) & 0x1; +} + +/* XID_Continue. */ +static RE_UINT8 re_xid_continue_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 12, 12, + 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 17, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 9, 9, 12, 30, 9, 9, + 9, 31, 9, 9, 9, 9, 9, 9, 9, 9, 32, 33, 12, 12, 12, 12, + 12, 34, 12, 35, 9, 9, 9, 9, 9, 9, 9, 9, 36, 9, 9, 37, + 9, 9, 9, 9, 38, 39, 40, 9, 41, 9, 42, 43, 9, 9, 44, 9, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 45, 12, 12, 12, 46, 47, 12, + 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 49, 9, 9, 9, 50, 9, + 12, 12, 12, 12, 51, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -16224,715 +25950,263 @@ static RE_UINT8 re_alphanumeric_stage_1[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 52, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; -static RE_UINT8 re_alphanumeric_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 32, 31, 31, 31, 31, 31, 31, 31, 33, 34, 35, 31, - 36, 37, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39, - 1, 1, 1, 1, 40, 1, 41, 42, 43, 44, 45, 46, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 47, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 48, 49, 1, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 1, 59, 60, 61, 62, 63, 64, 65, 31, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 31, 78, 79, 80, 31, - 1, 1, 1, 81, 82, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 84, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 85, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 86, 87, 31, 31, 88, 89, - 1, 1, 1, 1, 1, 1, 1, 90, 1, 1, 91, 31, 31, 31, 31, 31, - 1, 92, 93, 31, 31, 31, 31, 31, 31, 31, 31, 31, 94, 31, 31, 31, - 31, 31, 31, 31, 95, 96, 97, 98, 31, 31, 31, 31, 31, 31, 31, 31, - 99, 100, 101, 31, 31, 31, 31, 31, 102, 103, 31, 31, 31, 31, 104, 31, - 31, 105, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 1, 1, 106, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 107, 108, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 109, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 110, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 111, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_alphanumeric_stage_3[] = { - 0, 0, 0, 1, 2, 3, 2, 3, 0, 0, 4, 5, 6, 7, 6, 7, +static RE_UINT16 re_xid_continue_table_2[] = { + 0, 1, 2, 3, 0, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 7, 8, 6, 6, 6, 9, 10, 11, 6, 12, + 6, 6, 6, 6, 13, 6, 6, 6, 6, 14, 15, 6, 16, 17, 18, 19, + 20, 6, 6, 21, 6, 6, 22, 23, 24, 6, 25, 6, 6, 26, 6, 27, + 6, 28, 29, 30, 0, 31, 32, 11, 6, 6, 6, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 43, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 53, 6, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 0, 70, 71, 72, 0, 73, 74, 75, 76, 77, 78, 79, 0, + 6, 6, 80, 6, 81, 6, 82, 83, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 84, 6, 85, 86, 87, 6, 88, 6, 89, 90, 91, 6, 6, 92, + 67, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 93, 3, 6, 6, 94, 95, 96, 97, 98, 6, 6, 99, 100, + 101, 6, 6, 102, 6, 103, 6, 104, 105, 106, 107, 108, 6, 109, 110, 0, + 29, 6, 105, 111, 112, 113, 114, 0, 6, 6, 115, 116, 6, 6, 6, 97, + 6, 117, 118, 81, 119, 89, 120, 68, 6, 6, 6, 6, 6, 6, 6, 121, + 6, 6, 6, 6, 6, 6, 6, 6, 92, 6, 122, 81, 6, 123, 124, 125, + 0, 126, 127, 128, 129, 0, 129, 130, 131, 132, 133, 6, 134, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 135, 105, 6, 6, 6, 6, 136, 6, 82, 6, 137, 138, 139, 139, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 140, 141, 67, 6, 142, 67, 6, 83, 143, 14, 6, 6, 144, 6, 0, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 9, 10, 0, - 0, 0, 0, 0, 11, 0, 0, 12, 13, 6, 14, 6, 6, 6, 6, 15, - 6, 6, 6, 6, 6, 6, 6, 6, 16, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 2, 6, 17, 6, 6, 18, 0, 0, 19, 20, 6, 21, 22, - 0, 3, 6, 6, 6, 23, 24, 6, 6, 6, 6, 6, 6, 25, 26, 27, - 0, 6, 6, 6, 28, 6, 6, 6, 6, 6, 6, 9, 6, 6, 3, 29, - 6, 30, 31, 0, 6, 18, 3, 0, 0, 0, 6, 32, 0, 33, 34, 6, - 6, 6, 6, 35, 36, 37, 38, 2, 39, 40, 41, 42, 43, 44, 38, 45, - 46, 40, 41, 47, 48, 49, 50, 51, 52, 14, 41, 53, 54, 55, 38, 56, - 57, 40, 41, 53, 58, 59, 38, 60, 61, 62, 63, 24, 64, 65, 50, 0, - 66, 67, 41, 68, 69, 70, 38, 0, 66, 67, 41, 71, 69, 72, 38, 73, - 66, 67, 6, 74, 75, 76, 38, 77, 78, 79, 6, 80, 81, 82, 50, 83, - 2, 6, 6, 3, 84, 1, 0, 0, 85, 6, 86, 87, 88, 89, 0, 0, - 55, 0, 1, 0, 23, 6, 31, 2, 90, 23, 6, 31, 0, 0, 0, 0, - 6, 6, 6, 91, 1, 6, 6, 6, 6, 92, 6, 6, 93, 6, 6, 94, - 6, 6, 6, 6, 95, 96, 6, 6, 95, 6, 6, 97, 98, 7, 6, 6, - 6, 98, 6, 6, 6, 3, 0, 0, 6, 0, 6, 6, 6, 6, 6, 99, - 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 27, 6, 2, 3, 6, 6, 6, 6, 100, 18, - 36, 101, 6, 101, 6, 101, 36, 102, 6, 6, 6, 38, 18, 103, 1, 0, - 0, 1, 6, 6, 6, 6, 6, 18, 6, 6, 3, 6, 6, 6, 6, 51, - 6, 104, 105, 18, 50, 6, 92, 106, 6, 6, 105, 6, 1, 1, 0, 0, - 6, 105, 6, 6, 6, 104, 2, 106, 1, 1, 107, 0, 0, 0, 0, 0, - 6, 6, 6, 108, 109, 1, 0, 0, 6, 6, 89, 6, 6, 6, 15, 9, - 6, 6, 6, 110, 68, 6, 6, 92, 18, 6, 6, 74, 0, 0, 111, 112, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 113, 106, - 6, 99, 6, 6, 99, 114, 6, 92, 6, 6, 6, 115, 116, 117, 31, 116, - 0, 0, 0, 0, 0, 0, 0, 118, 0, 31, 0, 0, 0, 0, 0, 0, - 119, 120, 121, 89, 122, 0, 6, 6, 18, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 6, 6, 1, 0, - 6, 6, 104, 6, 6, 104, 6, 6, 6, 6, 6, 6, 6, 6, 123, 83, - 6, 6, 93, 6, 6, 6, 124, 0, 6, 110, 125, 125, 125, 125, 6, 6, - 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 127, 0, 128, 129, 2, 6, 6, 6, 6, 130, 2, 6, 6, 6, 6, 94, - 131, 6, 6, 2, 6, 6, 6, 6, 104, 0, 6, 3, 0, 0, 0, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 51, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 31, 0, 0, 0, 0, 6, 6, 92, - 31, 6, 105, 0, 6, 6, 104, 132, 6, 6, 6, 6, 6, 6, 6, 0, - 0, 113, 133, 6, 6, 6, 6, 6, 134, 6, 6, 6, 135, 0, 0, 113, - 15, 6, 136, 0, 6, 6, 6, 101, 6, 6, 6, 6, 137, 1, 0, 138, - 6, 6, 3, 6, 6, 22, 6, 31, 6, 6, 6, 139, 126, 1, 6, 104, - 6, 6, 6, 110, 92, 1, 6, 79, 6, 6, 6, 104, 140, 141, 6, 142, - 143, 144, 125, 6, 6, 94, 136, 6, 6, 6, 6, 6, 6, 6, 3, 1, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 101, 6, 145, 6, 6, 105, - 6, 6, 6, 6, 6, 6, 92, 6, 6, 6, 6, 6, 6, 1, 0, 0, - 110, 146, 41, 147, 148, 6, 6, 6, 6, 6, 6, 9, 0, 149, 6, 6, - 6, 6, 6, 92, 0, 6, 6, 6, 6, 133, 6, 6, 136, 0, 0, 105, - 0, 0, 0, 0, 0, 0, 0, 150, 6, 6, 6, 6, 6, 6, 6, 31, - 0, 1, 2, 3, 2, 3, 50, 6, 6, 6, 6, 104, 151, 152, 0, 0, - 35, 6, 7, 153, 92, 92, 0, 0, 6, 6, 6, 6, 6, 6, 6, 3, - 0, 0, 0, 0, 6, 6, 6, 106, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 31, 6, 6, 6, 55, 0, 0, - 6, 6, 28, 6, 3, 6, 6, 3, 6, 92, 6, 6, 154, 155, 0, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 92, 1, 6, 6, 154, 6, 105, - 6, 6, 136, 6, 6, 6, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 110, 6, 51, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 156, 6, 6, 157, 6, 51, 6, 110, 6, 104, 0, 0, 0, 0, 6, 158, - 6, 51, 6, 1, 0, 0, 0, 0, 6, 6, 6, 159, 0, 0, 0, 0, - 160, 161, 6, 51, 0, 0, 6, 31, 6, 31, 0, 0, 23, 6, 106, 0, - 6, 6, 6, 51, 6, 51, 6, 22, 6, 9, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 18, 0, 0, 0, 6, 6, 6, 22, 6, 6, 6, 22, - 6, 6, 136, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 31, 107, 6, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 110, - 6, 6, 6, 6, 51, 0, 50, 0, 133, 6, 6, 18, 0, 6, 18, 1, - 6, 6, 6, 162, 163, 6, 6, 164, 6, 6, 6, 6, 165, 166, 0, 0, - 6, 14, 6, 167, 0, 0, 0, 0, 168, 19, 18, 6, 6, 6, 18, 1, - 39, 40, 41, 53, 58, 169, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 170, 171, 0, 0, 6, 6, 6, 6, 172, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 173, 0, 174, 0, 0, - 6, 6, 6, 104, 175, 1, 0, 0, 6, 6, 6, 176, 1, 0, 0, 0, - 6, 74, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 18, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 1, 126, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 6, 6, 30, 177, 0, - 6, 6, 6, 178, 0, 6, 6, 6, 6, 179, 0, 0, 6, 6, 6, 18, - 41, 6, 6, 125, 55, 1, 0, 133, 6, 133, 23, 110, 0, 0, 0, 0, - 180, 6, 6, 181, 182, 1, 183, 6, 104, 184, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 110, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 104, 0, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 18, 6, 104, 1, 0, 0, 0, 0, 0, 0, 6, 92, 0, - 6, 6, 6, 0, 101, 1, 149, 185, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 21, 6, 6, 6, 124, 6, 0, 0, 0, 0, 186, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 136, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 22, - 6, 104, 0, 0, 0, 22, 187, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 105, - 6, 6, 6, 6, 6, 6, 3, 31, 18, 188, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 150, 6, 6, 6, 36, 189, 190, 108, 6, 6, 6, - 191, 192, 6, 193, 194, 67, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 195, 6, 67, 94, 6, 94, - 6, 150, 6, 150, 104, 6, 104, 6, 41, 6, 41, 6, 196, 6, 6, 6, - 7, 134, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 31, 198, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 105, 1, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 106, 0, 0, 0, - 6, 6, 6, 6, 199, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 108, 6, 200, 201, 202, 203, 204, 205, 206, 105, 207, 105, 0, 0, 0, 0, - 0, 0, 0, 6, 1, 6, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 110, 0, 0, - 6, 6, 6, 106, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 92, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 55, 0, - 6, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_alphanumeric_stage_4[] = { - 0, 0, 255, 3, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, - 195, 255, 3, 0, 31, 80, 32, 0, 223, 188, 64, 215, 251, 255, 191, 255, - 3, 252, 127, 2, 255, 1, 255, 191, 182, 0, 255, 135, 7, 0, 255, 254, - 255, 195, 239, 31, 254, 225, 255, 159, 0, 224, 48, 4, 255, 252, 255, 31, - 223, 63, 240, 255, 248, 3, 255, 239, 255, 223, 225, 255, 207, 255, 239, 159, - 249, 255, 255, 253, 197, 227, 159, 89, 128, 176, 3, 16, 238, 135, 109, 195, - 135, 25, 2, 94, 192, 255, 63, 0, 238, 191, 237, 227, 191, 27, 1, 0, - 0, 30, 238, 159, 159, 25, 192, 176, 2, 0, 236, 199, 61, 214, 24, 199, - 199, 29, 129, 0, 239, 223, 253, 255, 255, 227, 223, 29, 96, 7, 239, 227, - 96, 64, 6, 0, 255, 231, 223, 93, 240, 128, 0, 252, 236, 255, 127, 252, - 251, 47, 127, 128, 95, 255, 12, 0, 127, 32, 214, 247, 175, 255, 255, 59, - 95, 32, 255, 243, 3, 255, 127, 249, 255, 63, 191, 32, 255, 247, 255, 61, - 127, 61, 61, 127, 61, 255, 63, 63, 255, 199, 15, 0, 13, 0, 128, 16, - 255, 127, 255, 15, 31, 0, 128, 0, 239, 255, 239, 15, 127, 0, 0, 222, - 111, 4, 128, 255, 255, 170, 223, 95, 220, 31, 207, 15, 2, 128, 132, 252, - 47, 62, 80, 189, 224, 67, 31, 120, 255, 128, 127, 127, 0, 128, 224, 0, - 254, 3, 62, 31, 127, 224, 224, 255, 240, 143, 252, 255, 255, 249, 124, 0, - 255, 0, 47, 0, 252, 232, 247, 255, 5, 0, 0, 56, 60, 0, 126, 126, - 126, 0, 127, 248, 248, 224, 127, 95, 219, 255, 248, 255, 223, 255, 252, 252, - 252, 28, 255, 183, 15, 255, 62, 0, 63, 253, 191, 145, 55, 0, 255, 192, - 111, 240, 239, 254, 199, 255, 112, 0, 71, 0, 30, 0, 255, 23, 159, 64, - 127, 189, 129, 224, 187, 7, 255, 131, 179, 0, 63, 127, 0, 63, 17, 0, - 63, 1, 26, 0, 231, 127, 255, 32, 127, 251, 127, 180, 203, 0, 191, 253, - 123, 1, 255, 224, 11, 0, 240, 0, 255, 67, 100, 222, 255, 235, 191, 231, - 223, 223, 255, 123, 95, 252, 63, 255, 247, 207, 219, 7, 128, 63, 143, 8, - 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 238, 251, -}; - -/* Alphanumeric: 2912 bytes. */ - -RE_UINT32 re_get_alphanumeric(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_alphanumeric_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_alphanumeric_stage_2[pos + f] << 4; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_alphanumeric_stage_3[pos + f] << 4; - pos += code; - value = (re_alphanumeric_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Any. */ - -RE_UINT32 re_get_any(RE_UINT32 ch) { - return 1; -} - -/* Blank. */ - -static RE_UINT8 re_blank_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_blank_stage_2[] = { - 0, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_blank_stage_3[] = { - 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, - 3, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_blank_stage_4[] = { - 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 78, + 6, 6, 6, 6, 145, 0, 24, 81, 6, 6, 6, 6, 6, 6, 6, 6, + 146, 147, 6, 148, 6, 6, 6, 26, 149, 150, 6, 6, 151, 6, 152, 153, + 6, 154, 6, 97, 6, 6, 155, 156, 6, 157, 97, 78, 6, 6, 158, 105, + 6, 138, 159, 160, 6, 6, 161, 162, 163, 164, 83, 80, 6, 6, 6, 165, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 166, 167, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 157, 6, 6, 168, 0, 169, 170, 171, 6, 6, 26, 172, 6, + 6, 6, 81, 173, 6, 6, 6, 6, 6, 81, 24, 6, 174, 6, 175, 1, + 91, 176, 177, 178, 6, 6, 6, 78, 1, 2, 3, 107, 6, 105, 179, 0, + 180, 181, 182, 0, 6, 6, 6, 68, 0, 0, 6, 96, 0, 0, 0, 183, + 0, 0, 0, 0, 78, 6, 184, 114, 6, 185, 103, 68, 81, 6, 186, 0, + 6, 6, 6, 6, 81, 80, 187, 29, 6, 188, 6, 189, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 138, 104, 175, 0, 0, 0, 0, + 190, 191, 104, 138, 105, 0, 0, 192, 104, 168, 0, 0, 6, 193, 0, 0, + 194, 195, 0, 78, 78, 0, 75, 196, 6, 104, 104, 197, 26, 0, 0, 0, + 6, 6, 134, 0, 6, 197, 6, 197, 6, 198, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 199, 0, 0, 78, 200, 184, 0, 0, 24, 201, 138, + 6, 6, 196, 202, 6, 68, 24, 203, 6, 31, 204, 205, 6, 6, 206, 0, + 207, 208, 0, 0, 209, 119, 6, 210, 34, 211, 212, 213, 0, 0, 0, 0, + 6, 6, 214, 215, 6, 6, 216, 0, 0, 0, 0, 0, 6, 217, 218, 0, + 6, 6, 219, 0, 6, 102, 100, 0, 89, 115, 0, 0, 0, 0, 0, 0, + 6, 68, 0, 0, 0, 6, 6, 220, 221, 222, 223, 0, 0, 224, 225, 226, + 6, 105, 200, 6, 227, 0, 6, 102, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 5, 229, 230, 174, 231, 0, 0, 232, 233, 198, 234, 235, 100, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 236, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 168, 0, 0, 0, + 6, 6, 6, 144, 6, 6, 6, 6, 6, 6, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 7, 0, 0, 0, 128, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, -}; - -/* Blank: 218 bytes. */ - -RE_UINT32 re_get_blank(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_blank_stage_1[f] << 5; - f = code >> 10; - code ^= f << 10; - pos = (RE_UINT32)re_blank_stage_2[pos + f] << 3; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_blank_stage_3[pos + f] << 7; - pos += code; - value = (re_blank_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Graph. */ - -static RE_UINT8 re_graph_stage_1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 7, 7, 7, 14, - 15, 16, 17, 18, 19, 13, 20, 13, 21, 13, 13, 13, 13, 22, 7, 7, - 23, 24, 13, 13, 13, 13, 25, 26, 13, 13, 27, 28, 29, 30, 31, 32, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 33, 7, 34, 35, 7, 36, 7, 7, 7, 37, 13, 38, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 39, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, -}; - -static RE_UINT8 re_graph_stage_2[] = { - 0, 1, 2, 2, 2, 2, 3, 4, 2, 2, 5, 6, 7, 2, 8, 9, - 10, 11, 2, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 2, 25, 2, 2, 26, 27, 28, 29, 2, 2, 2, 2, 2, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 2, 43, 2, 2, 44, 45, - 46, 47, 2, 48, 2, 2, 2, 2, 49, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 50, 51, 52, 53, 54, 55, 56, 57, 2, 58, - 59, 60, 61, 62, 63, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 64, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 65, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 66, 2, 2, 67, 68, 2, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 78, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 2, 2, 2, 2, 80, 81, 82, 83, 2, 2, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 79, 94, 95, 96, 2, 97, 98, 79, 2, 2, 99, 79, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 79, 111, 79, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 79, 121, 122, 79, 123, 124, 125, 126, 79, - 127, 128, 79, 129, 130, 131, 79, 79, 132, 133, 134, 135, 79, 136, 79, 137, - 2, 2, 2, 2, 2, 2, 2, 138, 139, 2, 140, 79, 79, 79, 79, 79, - 2, 2, 2, 2, 2, 2, 2, 2, 141, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 2, 2, 2, 2, 142, 79, 79, 79, - 2, 2, 2, 2, 143, 144, 145, 146, 79, 79, 79, 79, 147, 148, 149, 150, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 68, - 2, 2, 2, 2, 2, 151, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 2, 2, 152, 2, 2, 153, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 154, 155, 79, 79, 79, 79, 79, 79, - 2, 156, 157, 158, 159, 160, 161, 79, 162, 163, 164, 2, 2, 165, 2, 166, - 2, 2, 2, 2, 2, 167, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 168, 79, 169, 79, 79, 170, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 2, 171, 172, 79, 79, 79, 79, 79, 173, 174, 175, 79, 176, 177, 79, 79, - 178, 179, 180, 181, 182, 79, 2, 2, 2, 2, 2, 2, 2, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 192, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 193, 2, - 194, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 195, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 196, 79, 79, 79, 79, 79, 79, 79, 79, - 2, 2, 2, 2, 197, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 198, 79, 2, 65, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 199, -}; - -static RE_UINT8 re_graph_stage_3[] = { - 0, 0, 1, 2, 2, 2, 2, 3, 0, 0, 1, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, - 5, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 7, 2, 2, - 8, 1, 2, 2, 9, 2, 10, 11, 2, 12, 2, 2, 2, 2, 2, 2, - 13, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, 14, 2, 2, 2, 8, - 2, 2, 15, 3, 2, 16, 17, 0, 0, 0, 2, 18, 0, 19, 2, 2, - 20, 21, 22, 23, 24, 25, 26, 3, 27, 21, 22, 28, 29, 30, 31, 32, - 33, 6, 22, 34, 35, 36, 26, 37, 38, 21, 22, 34, 39, 40, 26, 9, - 41, 42, 43, 44, 45, 46, 31, 17, 12, 47, 22, 48, 49, 50, 26, 51, - 12, 47, 22, 52, 49, 53, 26, 54, 55, 47, 2, 2, 56, 57, 26, 2, - 58, 59, 2, 60, 61, 62, 31, 63, 1, 2, 2, 10, 2, 64, 0, 0, - 65, 2, 66, 15, 67, 68, 0, 0, 2, 2, 2, 2, 69, 2, 70, 1, - 2, 69, 2, 12, 12, 17, 0, 0, 2, 2, 2, 2, 71, 2, 2, 2, - 2, 2, 2, 2, 72, 73, 2, 2, 72, 2, 2, 74, 75, 76, 2, 2, - 2, 75, 2, 2, 2, 8, 2, 70, 2, 77, 2, 2, 2, 2, 2, 78, - 1, 70, 2, 2, 2, 2, 2, 79, 12, 11, 2, 32, 2, 80, 12, 81, - 2, 2, 2, 2, 2, 15, 77, 77, 3, 77, 2, 2, 2, 2, 2, 79, - 2, 2, 17, 2, 2, 2, 2, 82, 2, 3, 64, 64, 83, 2, 15, 11, - 2, 2, 64, 2, 77, 84, 2, 2, 2, 85, 2, 2, 2, 3, 2, 86, - 77, 77, 15, 3, 0, 0, 0, 0, 2, 2, 2, 2, 64, 2, 2, 70, - 2, 2, 2, 2, 2, 2, 2, 87, 2, 2, 2, 88, 48, 2, 2, 2, - 79, 2, 2, 8, 9, 2, 2, 17, 2, 2, 2, 2, 2, 2, 2, 89, - 2, 78, 2, 2, 78, 90, 2, 15, 2, 2, 2, 91, 91, 92, 2, 93, - 94, 2, 95, 2, 2, 3, 91, 96, 3, 70, 2, 2, 0, 2, 2, 36, - 64, 2, 2, 2, 2, 2, 2, 2, 2, 2, 32, 0, 17, 0, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 26, 2, 97, 2, 2, 2, 2, 2, 2, - 2, 2, 3, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 98, - 2, 2, 71, 2, 2, 2, 99, 100, 2, 32, 101, 101, 101, 101, 2, 2, - 2, 2, 2, 2, 2, 0, 0, 0, 2, 89, 2, 2, 2, 2, 2, 80, - 2, 2, 2, 2, 2, 82, 0, 64, 1, 2, 2, 2, 1, 2, 2, 2, - 2, 7, 2, 2, 2, 2, 2, 2, 102, 2, 2, 1, 2, 2, 2, 2, - 3, 2, 2, 17, 2, 2, 80, 2, 2, 3, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 82, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, - 70, 2, 2, 2, 32, 2, 2, 2, 2, 2, 64, 0, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 9, 2, 2, 2, 2, 103, 0, 0, 51, - 2, 2, 64, 77, 2, 2, 2, 9, 2, 2, 2, 2, 104, 77, 2, 2, - 2, 2, 2, 2, 2, 105, 2, 70, 2, 2, 2, 2, 13, 44, 2, 3, - 2, 2, 2, 32, 15, 68, 2, 2, 2, 2, 2, 2, 106, 94, 2, 32, - 107, 108, 101, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 15, 77, - 2, 2, 80, 2, 109, 2, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, 2, 77, 0, 0, - 32, 110, 2, 111, 112, 2, 2, 2, 2, 2, 2, 2, 14, 19, 2, 2, - 2, 2, 2, 2, 0, 2, 2, 2, 2, 113, 2, 2, 9, 0, 0, 15, - 2, 77, 2, 2, 2, 114, 115, 91, 2, 2, 2, 2, 2, 2, 2, 86, - 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 116, 117, 101, 118, - 119, 2, 76, 120, 15, 15, 0, 0, 2, 2, 2, 2, 2, 2, 2, 17, - 121, 2, 2, 122, 2, 2, 2, 2, 3, 64, 36, 0, 0, 2, 2, 15, - 2, 70, 2, 2, 2, 36, 2, 64, 2, 2, 123, 2, 17, 2, 2, 17, - 2, 13, 2, 2, 124, 82, 0, 0, 2, 15, 77, 2, 2, 124, 2, 64, - 2, 2, 9, 2, 2, 2, 105, 0, 2, 2, 2, 32, 2, 82, 9, 0, - 125, 2, 2, 126, 2, 127, 2, 2, 2, 3, 51, 0, 0, 0, 2, 128, - 2, 129, 2, 130, 0, 0, 0, 0, 2, 2, 2, 131, 2, 113, 2, 2, - 132, 133, 2, 134, 79, 79, 2, 2, 2, 2, 0, 0, 2, 2, 109, 32, - 2, 2, 2, 135, 2, 97, 2, 136, 2, 137, 138, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 79, 0, 0, 0, 2, 2, 2, 106, 2, 2, 2, 139, - 2, 2, 9, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, - 2, 2, 9, 2, 2, 77, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, - 2, 2, 2, 2, 15, 113, 2, 140, 2, 2, 2, 2, 141, 2, 79, 77, - 2, 2, 2, 91, 32, 2, 2, 32, 2, 2, 2, 2, 15, 2, 1, 11, - 2, 6, 2, 3, 0, 0, 0, 0, 142, 13, 77, 2, 2, 2, 17, 77, - 20, 21, 22, 143, 39, 144, 145, 11, 2, 2, 2, 2, 2, 146, 0, 0, - 2, 2, 2, 2, 9, 77, 0, 0, 2, 2, 2, 97, 2, 15, 0, 0, - 2, 2, 2, 2, 11, 77, 70, 0, 2, 2, 2, 79, 77, 0, 0, 0, - 2, 8, 64, 2, 0, 0, 0, 0, 2, 2, 2, 64, 0, 0, 0, 0, - 0, 0, 2, 2, 2, 2, 2, 147, 0, 0, 4, 2, 2, 4, 11, 0, - 2, 2, 2, 2, 9, 2, 2, 2, 2, 2, 106, 0, 2, 2, 2, 79, - 22, 2, 2, 76, 82, 2, 70, 2, 2, 113, 69, 32, 0, 0, 0, 0, - 148, 2, 2, 149, 9, 77, 150, 2, 3, 151, 77, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 79, 0, 0, 0, 0, 2, 2, 2, 152, - 2, 77, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 3, 11, - 2, 2, 2, 2, 80, 0, 0, 0, 2, 2, 3, 79, 0, 0, 0, 0, - 2, 2, 2, 2, 32, 0, 0, 0, 2, 2, 2, 79, 2, 3, 44, 0, - 0, 0, 0, 0, 0, 2, 15, 82, 2, 2, 2, 2, 82, 89, 6, 153, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, - 2, 17, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 10, 2, 2, 2, - 99, 2, 0, 0, 0, 0, 80, 0, 2, 2, 2, 2, 2, 2, 2, 106, - 2, 3, 0, 0, 0, 106, 154, 2, 2, 2, 2, 2, 2, 2, 2, 64, - 2, 2, 2, 2, 2, 2, 17, 70, 79, 68, 80, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 82, 2, 2, 7, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 79, 0, 2, 2, 2, 2, 82, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 80, 2, 2, 2, 2, 2, 32, 2, 79, - 2, 2, 2, 2, 2, 91, 2, 2, 2, 12, 155, 146, 156, 2, 2, 2, - 157, 158, 2, 159, 160, 47, 2, 2, 2, 2, 97, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 85, 2, 2, 2, 64, 94, 1, 0, 0, 0, 0, 0, - 76, 161, 162, 0, 0, 0, 0, 0, 2, 2, 70, 15, 44, 0, 0, 0, - 0, 0, 0, 0, 2, 2, 2, 130, 2, 2, 2, 2, 163, 32, 0, 0, - 2, 2, 2, 2, 64, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 2, 2, 2, 11, 0, 0, 0, 0, 1, 2, 2, 15, 0, 0, 0, 0, - 156, 2, 164, 165, 166, 167, 168, 169, 89, 64, 170, 64, 0, 0, 0, 14, - 2, 2, 64, 2, 2, 2, 2, 2, 2, 80, 3, 1, 1, 1, 2, 82, - 70, 2, 2, 2, 2, 2, 70, 2, 2, 2, 70, 0, 0, 0, 31, 2, - 106, 2, 2, 64, 79, 14, 82, 0, 2, 2, 2, 2, 2, 82, 70, 17, - 2, 2, 2, 2, 2, 2, 2, 80, 2, 2, 2, 2, 2, 79, 64, 0, - 64, 2, 2, 2, 9, 77, 2, 2, 9, 2, 15, 0, 0, 0, 0, 0, - 119, 2, 2, 2, 2, 2, 2, 171, 2, 2, 172, 2, 8, 2, 2, 2, - 2, 2, 2, 2, 2, 80, 15, 173, 106, 82, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 32, 0, 0, 2, 2, 2, 11, 2, 2, 2, 2, - 2, 15, 2, 2, 2, 2, 2, 2, 2, 2, 14, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 36, 0, 2, 15, 0, 0, 0, 0, 0, 0, - 174, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, -}; - -static RE_UINT8 re_graph_stage_4[] = { - 0, 0, 254, 255, 255, 255, 255, 127, 255, 252, 240, 215, 251, 255, 127, 254, - 255, 231, 255, 0, 255, 135, 31, 0, 255, 223, 255, 191, 3, 0, 255, 63, - 255, 79, 255, 7, 223, 63, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243, - 159, 121, 128, 176, 207, 255, 238, 135, 109, 211, 135, 57, 2, 94, 192, 255, - 127, 0, 238, 191, 237, 243, 191, 59, 1, 0, 3, 254, 238, 159, 159, 57, - 192, 176, 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, 253, 255, - 255, 227, 223, 61, 96, 7, 128, 255, 239, 243, 96, 64, 6, 0, 239, 223, - 223, 253, 240, 255, 236, 255, 127, 252, 251, 47, 127, 132, 95, 255, 28, 0, - 255, 15, 214, 247, 175, 255, 95, 63, 255, 243, 255, 254, 255, 31, 191, 32, - 255, 61, 127, 61, 61, 127, 61, 255, 127, 255, 255, 3, 63, 63, 255, 1, - 15, 0, 13, 0, 63, 0, 241, 255, 255, 199, 255, 207, 255, 159, 15, 240, - 255, 248, 255, 251, 255, 170, 223, 255, 207, 239, 220, 127, 0, 248, 255, 124, - 243, 255, 63, 255, 15, 254, 255, 128, 1, 128, 127, 127, 224, 255, 124, 0, - 63, 192, 15, 128, 7, 0, 126, 126, 126, 0, 127, 248, 248, 224, 127, 95, - 219, 255, 252, 255, 247, 255, 127, 15, 252, 252, 252, 28, 0, 62, 255, 239, - 255, 183, 135, 255, 143, 255, 15, 224, 15, 255, 63, 253, 191, 145, 191, 255, - 55, 248, 255, 143, 255, 131, 255, 240, 111, 240, 239, 254, 63, 135, 63, 254, - 7, 255, 3, 30, 0, 254, 7, 252, 0, 128, 3, 32, 127, 189, 237, 251, - 129, 224, 207, 31, 255, 235, 7, 128, 127, 251, 127, 180, 191, 253, 251, 1, - 3, 128, 255, 224, 240, 0, 100, 222, 239, 255, 191, 231, 223, 223, 255, 123, - 95, 252, 255, 249, 219, 7, 159, 255, 150, 254, 247, 10, 132, 234, 150, 170, - 150, 247, 247, 94, 238, 251, 123, 252, 231, 199, 15, 7, 2, 0, -}; - -/* Graph: 3150 bytes. */ - -RE_UINT32 re_get_graph(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 11; - code = ch ^ (f << 11); - pos = (RE_UINT32)re_graph_stage_1[f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_graph_stage_2[pos + f] << 3; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_graph_stage_3[pos + f] << 4; - pos += code; - value = (re_graph_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Print. */ - -static RE_UINT8 re_print_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 5, 9, - 10, 11, 12, 13, 14, 15, 16, 5, 17, 15, 15, 18, 15, 19, 20, 21, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 23, 24, 5, 25, 26, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 28, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 28, -}; - -static RE_UINT8 re_print_stage_2[] = { - 0, 1, 1, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 1, 15, 16, 1, 1, 17, 18, 19, 20, 21, 22, 23, 24, 1, 25, - 26, 27, 1, 1, 28, 1, 1, 1, 1, 1, 1, 29, 30, 31, 32, 33, - 34, 35, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, - 1, 1, 1, 1, 39, 1, 40, 41, 42, 43, 44, 45, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 46, 47, 47, 47, 47, 47, 47, 47, 47, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 48, 49, 1, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 1, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 47, 79, 80, 81, 82, - 1, 1, 1, 83, 84, 85, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 1, 1, 1, 1, 86, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 1, 1, 87, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 1, 1, 88, 89, 47, 47, 90, 91, - 1, 1, 1, 1, 1, 1, 1, 92, 1, 1, 93, 47, 47, 47, 47, 47, - 1, 94, 95, 47, 47, 47, 47, 47, 47, 47, 47, 47, 96, 47, 47, 47, - 97, 98, 99, 100, 101, 102, 103, 104, 1, 1, 105, 47, 47, 47, 47, 47, - 106, 107, 108, 47, 47, 47, 47, 47, 109, 110, 47, 47, 111, 112, 113, 47, - 114, 115, 116, 1, 1, 1, 117, 118, 119, 120, 121, 47, 47, 47, 47, 47, - 1, 1, 1, 1, 1, 1, 122, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 123, 124, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 125, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 126, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 1, 1, 127, 47, 47, 47, 47, 47, - 128, 38, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 129, -}; - -static RE_UINT8 re_print_stage_3[] = { - 0, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 4, 5, 1, 1, 1, 6, 7, 1, 8, 1, 9, 10, - 11, 1, 1, 1, 1, 1, 1, 1, 12, 1, 13, 1, 1, 14, 1, 15, - 1, 16, 17, 18, 0, 19, 20, 1, 1, 1, 1, 1, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 30, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 40, 44, 45, 46, 47, 1, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 0, 57, 58, 59, 0, 1, 1, 60, 61, 62, 11, 63, 0, - 1, 1, 1, 1, 1, 1, 64, 1, 1, 1, 65, 1, 66, 67, 68, 1, - 69, 1, 15, 70, 71, 1, 1, 72, 1, 1, 1, 1, 70, 1, 1, 73, - 74, 75, 76, 77, 1, 1, 78, 79, 80, 1, 1, 73, 1, 81, 1, 82, - 2, 83, 84, 85, 1, 86, 87, 1, 88, 1, 2, 89, 79, 16, 0, 0, - 1, 1, 86, 70, 1, 1, 1, 90, 1, 91, 92, 1, 93, 15, 9, 94, - 1, 1, 1, 1, 1, 1, 1, 95, 72, 1, 96, 78, 1, 97, 98, 99, - 1, 100, 1, 101, 102, 1, 103, 104, 1, 1, 1, 1, 86, 1, 1, 1, - 1, 105, 18, 1, 1, 1, 1, 1, 1, 1, 1, 106, 107, 1, 1, 1, - 1, 108, 2, 1, 1, 1, 1, 109, 1, 64, 1, 110, 75, 111, 111, 1, - 1, 1, 112, 0, 95, 1, 1, 76, 1, 1, 1, 1, 1, 1, 82, 113, - 1, 1, 54, 1, 7, 1, 1, 1, 114, 6, 1, 1, 108, 94, 1, 115, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 82, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 112, 1, 1, 1, 1, 116, 1, 117, 1, - 1, 118, 1, 1, 1, 1, 1, 119, 1, 1, 1, 1, 1, 1, 120, 121, - 1, 122, 1, 119, 1, 1, 123, 1, 1, 1, 124, 70, 1, 1, 125, 2, - 1, 75, 126, 1, 1, 1, 127, 75, 128, 129, 1, 9, 1, 1, 1, 130, - 1, 1, 1, 1, 1, 115, 131, 56, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 132, 1, 1, 71, 0, 133, 134, 135, 1, 1, 1, 136, 1, - 1, 1, 103, 1, 137, 1, 138, 139, 71, 1, 140, 141, 1, 1, 1, 89, - 54, 1, 1, 1, 1, 2, 142, 143, 144, 145, 146, 0, 1, 1, 1, 94, - 147, 148, 1, 1, 149, 150, 103, 78, 0, 0, 0, 0, 70, 1, 104, 56, - 1, 151, 81, 94, 152, 1, 153, 0, 1, 1, 1, 1, 78, 154, 155, 56, - 1, 9, 1, 156, 0, 0, 0, 0, 1, 75, 82, 138, 0, 0, 0, 0, - 157, 158, 159, 1, 2, 160, 0, 161, 162, 163, 0, 0, 1, 164, 137, 1, - 165, 166, 167, 1, 1, 0, 1, 168, 1, 169, 107, 170, 171, 172, 0, 0, - 1, 1, 173, 0, 1, 174, 1, 175, 1, 176, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 1, 9, 71, 0, 0, 0, 0, 75, - 1, 1, 177, 178, 1, 1, 179, 180, 1, 97, 117, 75, 1, 1, 132, 181, - 182, 2, 0, 0, 183, 154, 1, 184, 21, 185, 186, 187, 0, 0, 0, 0, - 1, 1, 188, 0, 1, 1, 176, 0, 0, 0, 0, 0, 1, 107, 78, 0, - 1, 1, 189, 190, 1, 73, 191, 0, 15, 86, 0, 0, 0, 0, 0, 0, - 1, 56, 0, 0, 0, 1, 1, 192, 0, 0, 0, 0, 0, 100, 3, 193, - 1, 1, 9, 1, 1, 194, 1, 73, 195, 196, 197, 116, 137, 198, 0, 0, - 199, 200, 176, 201, 202, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, - 0, 0, 0, 0, 0, 0, 1, 203, 1, 1, 1, 1, 71, 0, 0, 0, - 1, 1, 1, 204, 1, 1, 1, 1, 1, 1, 205, 0, 0, 0, 0, 0, - 1, 206, 0, 0, 0, 0, 0, 0, 1, 1, 105, 0, 0, 0, 0, 0, - 1, 73, 2, 207, 0, 0, 103, 208, 1, 1, 209, 210, 112, 0, 0, 0, - 0, 0, 1, 1, 94, 0, 0, 0, 1, 1, 211, 1, 212, 0, 0, 205, - 1, 1, 1, 1, 1, 1, 1, 119, 1, 1, 1, 1, 1, 1, 1, 174, - 2, 0, 213, 214, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 56, - 1, 1, 1, 215, 216, 205, 0, 0, 1, 1, 1, 1, 1, 1, 1, 82, - 1, 217, 1, 1, 1, 1, 1, 173, 1, 1, 218, 0, 0, 0, 0, 76, - 1, 1, 75, 73, 0, 0, 0, 0, 1, 1, 97, 1, 11, 219, 220, 1, - 221, 222, 223, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 224, 1, 1, - 1, 1, 1, 1, 1, 1, 225, 1, 1, 1, 1, 1, 226, 227, 0, 0, - 228, 229, 0, 0, 0, 0, 0, 0, 1, 230, 207, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 163, 1, 1, 1, 1, 1, 1, 231, 0, - 1, 1, 232, 0, 0, 0, 0, 0, 0, 0, 0, 233, 1, 234, 0, 0, - 54, 78, 0, 0, 0, 0, 0, 0, 220, 235, 236, 237, 238, 239, 0, 240, - 1, 86, 1, 1, 76, 241, 242, 82, 116, 1, 1, 116, 1, 190, 0, 243, - 244, 56, 245, 218, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 82, 246, - 1, 1, 1, 76, 1, 1, 73, 118, 86, 1, 176, 1, 9, 247, 0, 0, - 144, 1, 1, 248, 1, 249, 13, 1, 1, 1, 76, 250, 251, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 75, 0, 1, 234, 1, 1, 1, 1, 1, 1, - 78, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 252, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 150, 78, 0, 0, 0, 0, 0, 0, 0, - 253, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 78, -}; - -static RE_UINT8 re_print_stage_4[] = { - 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 252, - 240, 215, 255, 255, 251, 255, 255, 255, 255, 255, 254, 255, 255, 255, 127, 254, - 255, 231, 254, 255, 255, 0, 255, 255, 255, 135, 31, 0, 255, 255, 255, 223, - 255, 191, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 255, 231, - 255, 63, 255, 127, 255, 255, 255, 79, 255, 7, 0, 0, 255, 255, 223, 63, - 0, 0, 248, 255, 239, 159, 249, 255, 255, 253, 197, 243, 159, 121, 128, 176, - 207, 255, 255, 127, 238, 135, 249, 255, 255, 253, 109, 211, 135, 57, 2, 94, - 192, 255, 127, 0, 238, 191, 251, 255, 255, 253, 237, 243, 191, 59, 1, 0, - 207, 255, 3, 254, 238, 159, 249, 255, 159, 57, 192, 176, 207, 255, 255, 0, - 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, 192, 255, 255, 7, - 255, 223, 253, 255, 255, 253, 255, 227, 223, 61, 96, 7, 207, 255, 128, 255, - 255, 253, 239, 243, 223, 61, 96, 64, 207, 255, 6, 0, 239, 223, 253, 255, - 223, 253, 240, 255, 207, 255, 255, 255, 236, 255, 127, 252, 255, 255, 251, 47, - 127, 132, 95, 255, 192, 255, 28, 0, 254, 255, 255, 255, 255, 255, 255, 135, - 255, 255, 255, 15, 214, 247, 255, 255, 175, 255, 255, 63, 95, 63, 255, 243, - 255, 254, 255, 255, 255, 31, 254, 255, 255, 255, 255, 254, 255, 223, 255, 7, - 191, 32, 255, 255, 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, - 61, 255, 127, 255, 255, 255, 61, 255, 255, 255, 255, 31, 255, 255, 255, 3, - 255, 255, 63, 63, 255, 255, 255, 1, 255, 223, 31, 0, 255, 255, 127, 0, - 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 255, 63, 255, 3, 255, 3, - 255, 127, 255, 3, 255, 7, 255, 255, 255, 255, 63, 0, 255, 15, 255, 15, - 241, 255, 255, 255, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 199, - 255, 255, 255, 207, 255, 255, 255, 159, 255, 255, 15, 240, 255, 255, 255, 248, - 255, 227, 255, 255, 255, 1, 255, 255, 255, 255, 255, 7, 255, 255, 255, 251, - 63, 63, 255, 170, 255, 255, 223, 255, 223, 255, 207, 239, 255, 255, 220, 127, - 255, 252, 255, 255, 223, 255, 243, 255, 255, 127, 255, 31, 0, 0, 255, 255, - 255, 255, 1, 0, 127, 0, 0, 0, 255, 255, 207, 255, 255, 255, 63, 255, - 255, 127, 255, 255, 255, 255, 15, 254, 255, 128, 1, 128, 127, 127, 127, 127, - 255, 255, 0, 0, 0, 0, 255, 15, 224, 255, 255, 255, 15, 0, 255, 255, - 255, 31, 255, 255, 127, 0, 255, 255, 255, 15, 0, 0, 255, 255, 255, 0, - 124, 0, 0, 0, 0, 0, 128, 255, 255, 15, 255, 3, 63, 192, 255, 3, - 255, 255, 15, 128, 255, 191, 255, 195, 255, 63, 255, 243, 7, 0, 0, 248, - 126, 126, 126, 0, 127, 127, 255, 255, 255, 63, 255, 3, 127, 248, 255, 255, - 255, 63, 255, 255, 127, 0, 248, 224, 255, 255, 127, 95, 219, 255, 255, 255, - 3, 0, 248, 255, 255, 255, 252, 255, 255, 0, 0, 0, 0, 0, 255, 63, - 255, 255, 247, 255, 127, 15, 223, 255, 252, 252, 252, 28, 127, 127, 0, 62, - 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 135, 255, 255, 255, - 255, 255, 143, 255, 255, 127, 255, 15, 1, 0, 0, 0, 15, 224, 255, 255, - 255, 255, 255, 191, 15, 255, 63, 0, 255, 3, 255, 255, 255, 255, 15, 255, - 15, 128, 0, 0, 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 191, 255, - 128, 255, 0, 0, 255, 255, 55, 248, 255, 255, 255, 143, 255, 255, 255, 131, - 255, 255, 255, 240, 111, 240, 239, 254, 255, 255, 63, 135, 255, 1, 255, 1, - 127, 248, 127, 0, 255, 255, 63, 254, 255, 255, 7, 255, 255, 255, 3, 30, - 0, 254, 0, 0, 255, 1, 0, 0, 255, 255, 7, 0, 255, 255, 7, 252, - 255, 0, 255, 3, 255, 63, 252, 255, 255, 255, 0, 128, 3, 32, 255, 255, - 255, 1, 255, 3, 254, 255, 31, 0, 255, 255, 251, 255, 127, 189, 255, 191, - 255, 7, 255, 3, 255, 253, 237, 251, 159, 57, 129, 224, 207, 31, 31, 0, - 255, 255, 255, 235, 31, 0, 255, 3, 255, 31, 0, 0, 255, 3, 0, 0, - 255, 255, 7, 128, 31, 0, 0, 0, 7, 0, 0, 0, 255, 253, 255, 255, - 255, 255, 127, 255, 63, 0, 255, 255, 255, 254, 127, 0, 127, 251, 255, 255, - 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251, 1, 255, 255, 3, 128, - 255, 127, 31, 0, 15, 0, 0, 0, 255, 127, 255, 1, 255, 195, 0, 0, - 255, 63, 63, 0, 63, 0, 255, 251, 251, 255, 255, 224, 255, 135, 255, 255, - 255, 128, 255, 255, 0, 0, 7, 0, 240, 0, 255, 255, 255, 7, 255, 31, - 255, 1, 255, 243, 127, 254, 255, 255, 63, 0, 0, 0, 100, 222, 255, 235, - 239, 255, 255, 255, 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, - 63, 255, 255, 255, 255, 207, 255, 255, 255, 15, 0, 248, 254, 255, 0, 0, - 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 255, 63, 159, 255, 127, 0, - 255, 15, 255, 195, 0, 0, 254, 255, 255, 255, 31, 0, 150, 254, 247, 10, - 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, - 0, 0, 3, 0, 255, 127, 254, 255, 254, 255, 254, 255, 192, 255, 255, 255, - 7, 0, 255, 255, 255, 1, 3, 0, 255, 31, 255, 7, 255, 63, 0, 0, - 255, 255, 123, 252, 231, 199, 255, 255, 255, 63, 15, 7, 7, 0, 63, 0, - 3, 0, 255, 255, 2, 0, 0, 0, + 6, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 102, 105, 100, 0, 0, 24, 108, 6, 138, 223, 237, 91, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 6, 0, 0, 0, 0, 6, 6, 238, 6, 239, 0, 0, 240, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 117, + 6, 6, 6, 6, 6, 6, 104, 0, 134, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 105, 0, 241, 204, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 242, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 0, 0, + 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 31, 6, 248, 249, 250, 6, 251, 252, 253, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 254, 255, 83, 31, 31, 135, 135, 228, 228, 256, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 257, 6, 258, 259, 260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 261, 262, 0, 0, 0, 0, 0, 0, 6, 263, 264, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 168, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 265, 0, 6, 6, 115, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 250, 266, 267, 268, 269, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 81, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 96, 6, 6, 6, 6, 6, 6, + 81, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 271, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 114, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 91, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_xid_continue_table_3[] = { + 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 135, 254, 255, 255, 7, + 0, 4, 160, 4, 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, + 31, 80, 0, 0, 255, 255, 223, 184, 192, 215, 255, 255, 251, 255, 255, 255, + 255, 255, 191, 255, 251, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, + 255, 1, 254, 255, 255, 255, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, + 0, 0, 255, 7, 255, 195, 255, 255, 255, 255, 239, 159, 255, 253, 255, 159, + 0, 0, 255, 255, 255, 231, 255, 255, 255, 255, 3, 0, 255, 255, 63, 36, + 255, 63, 0, 0, 255, 255, 255, 15, 255, 7, 0, 0, 255, 255, 223, 255, + 255, 0, 248, 255, 207, 255, 254, 255, 239, 159, 249, 255, 255, 253, 197, 243, + 159, 121, 128, 176, 207, 255, 3, 80, 238, 135, 249, 255, 255, 253, 109, 211, + 135, 57, 2, 94, 192, 255, 63, 0, 238, 191, 251, 255, 255, 253, 237, 243, + 191, 59, 1, 0, 207, 255, 0, 254, 238, 159, 249, 255, 159, 57, 224, 176, + 207, 255, 2, 0, 236, 199, 61, 214, 24, 199, 255, 195, 199, 61, 129, 0, + 192, 255, 0, 0, 255, 223, 253, 255, 255, 253, 255, 227, 223, 61, 96, 7, + 207, 255, 0, 0, 239, 223, 253, 255, 255, 253, 239, 243, 223, 61, 96, 64, + 207, 255, 6, 0, 223, 125, 240, 128, 207, 255, 0, 252, 238, 255, 127, 252, + 255, 255, 251, 47, 127, 132, 95, 255, 192, 255, 12, 0, 254, 255, 255, 255, + 255, 255, 255, 7, 255, 127, 255, 3, 214, 247, 255, 255, 175, 255, 255, 63, + 95, 63, 255, 243, 1, 0, 0, 3, 255, 3, 160, 194, 255, 254, 255, 255, + 255, 31, 254, 255, 223, 255, 255, 254, 255, 255, 255, 31, 64, 0, 0, 0, + 255, 3, 255, 255, 255, 255, 255, 63, 191, 32, 255, 255, 255, 255, 255, 247, + 255, 61, 127, 61, 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, + 255, 255, 61, 255, 255, 255, 255, 231, 0, 254, 3, 0, 255, 255, 0, 0, + 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, 255, 223, 31, 0, + 255, 255, 31, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 143, 48, + 255, 3, 0, 0, 0, 56, 255, 3, 255, 255, 255, 1, 255, 7, 255, 255, + 255, 255, 63, 0, 255, 255, 255, 127, 255, 15, 255, 15, 192, 255, 255, 255, + 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 255, 7, 255, 255, 255, 159, + 255, 3, 255, 3, 128, 0, 255, 191, 1, 0, 0, 0, 255, 15, 255, 3, + 0, 248, 15, 0, 255, 255, 255, 0, 255, 227, 255, 255, 255, 1, 255, 255, + 0, 0, 247, 255, 255, 255, 255, 251, 63, 63, 255, 170, 255, 255, 223, 95, + 220, 31, 207, 15, 255, 31, 220, 31, 0, 0, 0, 128, 1, 0, 16, 0, + 0, 0, 2, 128, 0, 0, 255, 31, 226, 255, 1, 0, 132, 252, 47, 63, + 80, 253, 255, 243, 224, 67, 0, 0, 255, 1, 0, 0, 255, 127, 255, 255, + 31, 248, 15, 0, 255, 128, 0, 128, 255, 255, 127, 0, 127, 127, 127, 127, + 224, 0, 0, 0, 254, 255, 62, 31, 255, 255, 127, 230, 224, 255, 255, 255, + 255, 127, 0, 0, 255, 31, 0, 0, 255, 31, 255, 255, 255, 15, 0, 0, + 255, 255, 240, 191, 0, 0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, + 252, 7, 0, 0, 0, 0, 224, 255, 255, 16, 0, 0, 63, 0, 255, 3, + 255, 255, 255, 232, 255, 63, 255, 255, 1, 128, 255, 3, 255, 63, 255, 3, + 255, 255, 127, 252, 7, 0, 0, 56, 255, 255, 124, 0, 126, 126, 126, 0, + 127, 127, 255, 255, 255, 55, 255, 3, 15, 0, 255, 255, 127, 248, 255, 255, + 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, 219, 255, 255, 255, + 0, 0, 248, 255, 240, 255, 255, 255, 255, 255, 252, 255, 255, 0, 0, 0, + 255, 255, 24, 0, 0, 224, 0, 0, 0, 0, 138, 170, 252, 252, 252, 28, + 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 0, 0, 0, 32, + 255, 255, 1, 0, 0, 224, 255, 255, 15, 255, 62, 0, 255, 255, 15, 255, + 255, 0, 255, 255, 15, 0, 0, 0, 63, 253, 255, 255, 255, 255, 191, 145, + 255, 255, 55, 0, 255, 255, 255, 192, 111, 240, 239, 254, 255, 255, 63, 135, + 127, 0, 0, 0, 255, 255, 7, 0, 255, 0, 255, 3, 255, 27, 3, 0, + 128, 0, 255, 255, 31, 0, 0, 0, 192, 255, 0, 128, 255, 1, 255, 3, + 240, 0, 255, 255, 255, 255, 79, 0, 31, 222, 255, 23, 255, 255, 251, 255, + 255, 255, 255, 64, 127, 189, 255, 191, 255, 7, 255, 3, 255, 253, 237, 251, + 159, 57, 129, 224, 207, 31, 31, 0, 255, 7, 255, 195, 3, 0, 0, 0, + 191, 0, 255, 3, 255, 255, 63, 255, 1, 0, 0, 63, 17, 0, 255, 3, + 255, 3, 0, 128, 127, 242, 111, 255, 255, 255, 191, 249, 15, 0, 255, 3, + 255, 252, 255, 255, 255, 255, 255, 252, 27, 0, 0, 0, 255, 255, 255, 35, + 255, 253, 255, 255, 1, 0, 255, 3, 0, 0, 252, 255, 255, 254, 127, 0, + 127, 251, 255, 255, 255, 255, 127, 180, 191, 253, 255, 255, 255, 127, 251, 1, + 0, 0, 1, 0, 248, 255, 255, 224, 255, 135, 255, 255, 255, 128, 255, 255, + 27, 0, 3, 0, 0, 0, 7, 0, 255, 7, 255, 31, 255, 1, 255, 99, + 224, 227, 7, 248, 231, 15, 0, 0, 0, 60, 0, 0, 28, 0, 0, 0, + 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, + 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, + 247, 207, 255, 255, 255, 255, 127, 248, 255, 31, 32, 0, 16, 0, 0, 248, + 254, 255, 0, 0, 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 255, 63, + 255, 67, 0, 0, 31, 0, 127, 0, 150, 254, 247, 10, 132, 234, 150, 170, + 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, 3, 0, 255, 255 }; -/* Print: 2792 bytes. */ - -RE_UINT32 re_get_print(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_print_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_print_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_print_stage_3[pos + f] << 5; - pos += code; - value = (re_print_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} +RE_UINT32 re_get_xid_continue(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; -/* Word. */ + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_xid_continue_table_1[field_2]; + v = re_xid_continue_table_2[(v << 5) | field_1]; + v = re_xid_continue_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} -static RE_UINT8 re_word_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 21, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 23, 24, 5, 25, 26, +/* XID_Start. */ +static RE_UINT8 re_xid_start_table_1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 12, 12, + 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 14, 12, 15, 16, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 17, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 9, 9, 12, 30, 9, 9, + 9, 31, 9, 9, 9, 9, 9, 9, 9, 9, 32, 33, 12, 12, 12, 12, + 12, 34, 12, 35, 9, 9, 9, 9, 9, 9, 9, 9, 36, 9, 9, 37, + 9, 9, 9, 9, 9, 38, 9, 9, 39, 9, 40, 41, 9, 9, 9, 9, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 42, 12, 12, 12, 43, 44, 12, + 12, 12, 12, 45, 12, 12, 12, 12, 12, 12, 46, 9, 9, 9, 47, 9, + 12, 12, 12, 12, 48, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -16944,339 +26218,8 @@ static RE_UINT8 re_word_stage_1[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 27, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static RE_UINT8 re_word_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 32, 31, 31, 31, 31, 31, 31, 31, 33, 34, 35, 31, - 36, 37, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39, - 1, 1, 1, 1, 40, 1, 41, 42, 43, 44, 45, 46, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 47, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 48, 49, 1, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 1, 59, 60, 61, 62, 63, 64, 65, 31, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 31, 78, 79, 80, 31, - 1, 1, 1, 81, 82, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 84, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 85, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 86, 87, 31, 31, 88, 89, - 1, 1, 1, 1, 1, 1, 1, 90, 1, 1, 91, 31, 31, 31, 31, 31, - 1, 92, 93, 31, 31, 31, 31, 31, 31, 31, 31, 31, 94, 31, 31, 31, - 31, 95, 96, 31, 97, 98, 99, 100, 31, 31, 101, 31, 31, 31, 31, 31, - 102, 103, 104, 31, 31, 31, 31, 31, 105, 106, 31, 31, 31, 31, 107, 31, - 31, 108, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 1, 1, 109, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 110, 111, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 112, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 113, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 114, 31, 31, 31, 31, 31, - 31, 39, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_word_stage_3[] = { - 0, 0, 0, 1, 2, 3, 2, 4, 0, 0, 5, 6, 7, 8, 7, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 0, - 7, 7, 7, 7, 7, 7, 7, 12, 13, 7, 14, 7, 7, 7, 7, 15, - 7, 7, 7, 7, 7, 7, 7, 7, 14, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 2, 7, 16, 7, 7, 17, 2, 7, 18, 19, 7, 3, 20, - 0, 4, 7, 7, 7, 7, 21, 7, 7, 7, 7, 7, 7, 22, 23, 24, - 0, 7, 7, 7, 25, 7, 7, 7, 7, 7, 7, 10, 7, 7, 7, 26, - 7, 7, 27, 0, 7, 28, 4, 0, 0, 0, 7, 29, 0, 30, 14, 7, - 7, 7, 7, 7, 7, 7, 31, 2, 22, 32, 23, 33, 34, 35, 31, 36, - 37, 32, 23, 38, 39, 40, 41, 42, 43, 14, 23, 44, 45, 46, 31, 47, - 48, 32, 23, 44, 49, 50, 31, 51, 52, 53, 54, 21, 55, 56, 41, 0, - 57, 58, 23, 59, 60, 61, 31, 0, 62, 58, 23, 63, 60, 64, 31, 65, - 62, 58, 7, 7, 66, 67, 31, 68, 69, 70, 7, 71, 72, 73, 41, 74, - 2, 7, 7, 4, 75, 1, 0, 0, 76, 7, 77, 27, 78, 79, 0, 0, - 46, 80, 1, 81, 82, 7, 83, 2, 84, 82, 7, 83, 85, 0, 0, 0, - 7, 7, 7, 7, 1, 7, 7, 7, 7, 27, 7, 7, 86, 7, 7, 87, - 7, 7, 7, 7, 88, 89, 7, 7, 88, 7, 7, 90, 91, 8, 7, 7, - 7, 91, 7, 7, 7, 25, 0, 0, 7, 0, 7, 7, 7, 7, 7, 92, - 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 24, 7, 2, 4, 7, 7, 7, 7, 93, 17, - 57, 94, 7, 94, 7, 95, 57, 96, 7, 7, 7, 7, 7, 97, 1, 0, - 98, 1, 7, 7, 7, 7, 7, 17, 7, 7, 4, 7, 7, 7, 7, 42, - 7, 75, 28, 28, 41, 7, 27, 94, 7, 7, 28, 7, 1, 1, 0, 0, - 7, 28, 7, 7, 7, 75, 7, 24, 1, 1, 99, 75, 0, 0, 0, 0, - 7, 7, 7, 7, 28, 1, 100, 95, 7, 7, 7, 7, 7, 7, 7, 95, - 7, 7, 7, 101, 59, 7, 7, 27, 17, 7, 7, 25, 0, 102, 7, 4, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 103, - 7, 92, 7, 7, 92, 104, 7, 27, 7, 7, 7, 105, 106, 107, 83, 106, - 108, 0, 0, 109, 46, 110, 0, 111, 0, 83, 0, 0, 0, 7, 7, 46, - 112, 113, 114, 79, 115, 0, 7, 7, 17, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 7, 7, 1, 0, - 7, 7, 75, 7, 7, 75, 7, 7, 7, 7, 7, 7, 7, 7, 116, 95, - 7, 7, 86, 7, 7, 7, 117, 109, 7, 118, 119, 119, 119, 119, 7, 7, - 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 120, 0, 2, 121, 2, 7, 7, 7, 7, 122, 2, 7, 7, 7, 7, 87, - 123, 7, 7, 2, 7, 7, 7, 7, 75, 0, 7, 4, 0, 0, 0, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 42, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 83, 0, 0, 0, 0, 7, 7, 27, - 83, 7, 28, 0, 7, 7, 7, 124, 7, 7, 7, 7, 7, 7, 7, 10, - 0, 125, 126, 7, 7, 7, 7, 7, 127, 7, 7, 7, 128, 0, 0, 125, - 7, 7, 101, 0, 7, 7, 7, 95, 7, 7, 7, 7, 42, 1, 7, 129, - 7, 7, 27, 7, 7, 95, 7, 83, 7, 7, 7, 7, 130, 1, 7, 75, - 7, 7, 7, 118, 27, 1, 7, 70, 7, 7, 7, 7, 20, 98, 7, 128, - 131, 132, 119, 7, 7, 87, 101, 7, 7, 7, 7, 7, 7, 7, 133, 1, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 95, 7, 134, 7, 7, 28, - 7, 7, 7, 7, 7, 7, 27, 7, 7, 7, 7, 7, 7, 1, 0, 0, - 118, 135, 23, 136, 137, 7, 7, 7, 7, 7, 7, 10, 0, 30, 7, 7, - 7, 7, 7, 27, 0, 7, 7, 7, 7, 126, 7, 7, 101, 0, 0, 28, - 7, 0, 7, 138, 139, 0, 0, 84, 7, 7, 7, 7, 7, 7, 7, 83, - 0, 1, 2, 3, 2, 4, 41, 7, 7, 7, 7, 75, 140, 141, 0, 0, - 142, 7, 8, 143, 27, 27, 0, 0, 7, 7, 7, 7, 7, 7, 7, 4, - 0, 0, 0, 0, 7, 7, 7, 94, 0, 0, 0, 0, 0, 0, 0, 144, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 83, 7, 7, 7, 46, 46, 0, - 7, 7, 139, 7, 4, 7, 7, 4, 7, 27, 7, 7, 145, 146, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 27, 1, 7, 7, 145, 7, 28, - 7, 7, 101, 7, 7, 7, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 118, 7, 42, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 147, 7, 7, 148, 7, 42, 7, 118, 7, 75, 0, 0, 0, 0, 7, 149, - 7, 42, 7, 1, 0, 0, 0, 0, 7, 7, 7, 150, 0, 0, 0, 0, - 151, 152, 7, 153, 0, 0, 7, 83, 7, 83, 0, 0, 82, 7, 118, 0, - 7, 7, 7, 42, 7, 42, 7, 20, 7, 10, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 17, 0, 0, 0, 7, 7, 7, 20, 7, 7, 7, 20, - 7, 7, 101, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 83, 99, 7, 7, 46, 0, 0, 0, 0, 0, 0, 0, 0, 7, 118, - 7, 7, 7, 7, 118, 0, 41, 109, 7, 7, 7, 4, 0, 7, 17, 1, - 7, 7, 7, 84, 154, 7, 7, 155, 7, 7, 7, 7, 156, 157, 0, 0, - 7, 14, 7, 158, 0, 0, 0, 0, 159, 18, 17, 7, 7, 7, 4, 1, - 22, 32, 23, 160, 49, 161, 162, 94, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 4, 21, 0, 0, 7, 7, 7, 7, 163, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 164, 46, 165, 0, 0, - 7, 7, 7, 7, 166, 1, 0, 0, 7, 7, 7, 17, 1, 0, 0, 0, - 7, 25, 28, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 4, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 1, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 7, 7, 167, 168, 0, - 7, 7, 7, 75, 99, 7, 7, 7, 7, 169, 0, 0, 7, 7, 7, 17, - 23, 7, 7, 8, 46, 1, 0, 126, 7, 126, 82, 118, 0, 0, 0, 0, - 170, 7, 7, 171, 101, 1, 172, 7, 75, 173, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 118, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 75, 0, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 17, 7, 75, 1, 0, 0, 0, 0, 0, 0, 7, 27, 94, - 7, 7, 7, 118, 95, 1, 30, 174, 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 3, 7, 7, 7, 117, 7, 0, 0, 0, 0, 175, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 101, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 20, - 7, 75, 0, 0, 0, 20, 176, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 28, - 7, 7, 7, 7, 7, 7, 4, 83, 17, 177, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 178, 179, 180, 0, 181, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 84, 7, 7, 7, 57, 183, 184, 185, 7, 7, 7, - 186, 187, 7, 188, 189, 58, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 164, 7, 58, 87, 7, 87, - 7, 84, 7, 84, 75, 7, 75, 7, 23, 7, 23, 7, 190, 7, 7, 7, - 7, 7, 7, 134, 7, 7, 83, 191, 110, 100, 2, 0, 0, 0, 0, 0, - 8, 127, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 83, 27, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 1, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 94, 118, 0, 0, - 7, 7, 7, 7, 28, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 185, 7, 194, 195, 196, 197, 198, 199, 103, 28, 200, 28, 0, 0, 0, 0, - 0, 0, 0, 7, 1, 7, 1, 7, 1, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 118, 0, 0, - 7, 7, 7, 94, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 27, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 46, 0, - 7, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_word_stage_4[] = { - 0, 0, 255, 3, 254, 255, 255, 135, 255, 7, 0, 4, 32, 4, 255, 255, - 127, 255, 195, 255, 3, 0, 31, 80, 223, 188, 64, 215, 251, 255, 191, 255, - 127, 2, 255, 1, 255, 191, 182, 0, 7, 0, 255, 195, 239, 159, 255, 253, - 255, 159, 255, 231, 63, 36, 255, 63, 255, 15, 223, 63, 248, 255, 207, 255, - 249, 255, 197, 243, 159, 121, 128, 176, 3, 80, 238, 135, 109, 211, 135, 57, - 2, 94, 192, 255, 63, 0, 238, 191, 237, 243, 191, 59, 1, 0, 0, 254, - 238, 159, 159, 57, 192, 176, 2, 0, 236, 199, 61, 214, 24, 199, 199, 61, - 129, 0, 255, 223, 253, 255, 255, 227, 223, 61, 96, 7, 239, 223, 239, 243, - 96, 64, 6, 0, 223, 125, 240, 128, 0, 252, 236, 255, 127, 252, 251, 47, - 127, 132, 95, 255, 12, 0, 255, 127, 214, 247, 175, 255, 95, 63, 255, 243, - 0, 3, 160, 194, 255, 254, 255, 31, 223, 255, 64, 0, 191, 32, 255, 247, - 255, 61, 127, 61, 61, 127, 61, 255, 63, 63, 255, 199, 31, 0, 15, 0, - 13, 0, 143, 48, 0, 56, 128, 0, 0, 248, 255, 0, 247, 255, 255, 251, - 255, 170, 223, 95, 220, 31, 207, 15, 0, 48, 0, 128, 16, 0, 2, 128, - 132, 252, 47, 62, 80, 189, 224, 67, 31, 248, 255, 128, 127, 0, 127, 127, - 224, 0, 62, 31, 127, 230, 224, 255, 247, 191, 128, 255, 252, 255, 255, 249, - 124, 0, 255, 232, 1, 128, 126, 126, 126, 0, 255, 55, 127, 248, 248, 224, - 127, 95, 219, 255, 24, 0, 0, 224, 252, 252, 252, 28, 255, 239, 255, 183, - 0, 32, 15, 255, 62, 0, 63, 253, 191, 145, 55, 0, 255, 192, 111, 240, - 239, 254, 63, 135, 112, 0, 79, 0, 31, 30, 255, 23, 255, 64, 127, 189, - 237, 251, 129, 224, 207, 31, 191, 0, 63, 255, 0, 63, 17, 0, 255, 252, - 27, 0, 255, 35, 127, 251, 127, 180, 191, 253, 251, 1, 255, 224, 11, 0, - 240, 0, 255, 99, 224, 227, 7, 248, 231, 15, 0, 60, 28, 0, 100, 222, - 255, 235, 239, 255, 191, 231, 223, 223, 255, 123, 95, 252, 247, 207, 32, 0, - 219, 7, 255, 67, 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, - 238, 251, -}; - -/* Word: 2962 bytes. */ - -RE_UINT32 re_get_word(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_word_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_word_stage_2[pos + f] << 4; - f = code >> 4; - code ^= f << 4; - pos = (RE_UINT32)re_word_stage_3[pos + f] << 4; - pos += code; - value = (re_word_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* XDigit. */ - -static RE_UINT8 re_xdigit_stage_1[] = { - 0, 1, 1, 1, 1, 2, 1, 3, 4, 1, 1, 5, 1, 1, 6, 7, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_xdigit_stage_2[] = { - 0, 1, 1, 2, 3, 4, 4, 5, 6, 1, 1, 7, 8, 9, 10, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 11, 12, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, - 1, 1, 15, 1, 1, 1, 16, 1, 17, 18, 19, 20, 21, 1, 22, 1, - 1, 1, 1, 1, 1, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 24, 1, 1, 1, 1, - 25, 18, 1, 1, 26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_xdigit_stage_3[] = { - 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 3, 2, 0, 2, 2, 2, 4, 2, 2, 2, 2, 2, 5, 2, 5, - 2, 5, 2, 5, 2, 5, 2, 5, 2, 6, 2, 6, 3, 2, 2, 2, - 2, 4, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, - 6, 2, 2, 2, 2, 7, 2, 6, 2, 2, 8, 2, 2, 6, 0, 2, - 2, 8, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 6, 4, 2, 2, 9, 2, 6, 2, 2, 2, 2, 2, 0, - 2, 2, 2, 2, 10, 11, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 0, 2, 2, 2, 2, 5, 2, 0, 12, 2, 2, 6, - 2, 2, 2, 0, 2, 2, 2, 2, 2, 6, 2, 6, 2, 2, 2, 2, - 2, 6, 2, 4, 0, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, - 2, 6, 2, 2, 2, 6, 3, 2, 2, 3, 2, 2, 2, 6, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 13, 2, 2, 2, 2, 2, 4, 2, 2, - 2, 2, 2, 2, 2, 6, 2, 2, -}; - -static RE_UINT8 re_xdigit_stage_4[] = { - 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 3, 0, 0, - 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 0, 0, - 0, 0, 255, 3, 0, 0, 0, 0, 192, 255, 0, 0, 0, 0, 0, 0, - 255, 3, 255, 3, 0, 0, 0, 0, 0, 0, 255, 3, 0, 0, 255, 3, - 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 255, 0, 192, 255, 255, 255, 255, 255, 255, -}; - -/* XDigit: 592 bytes. */ - -RE_UINT32 re_get_xdigit(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_xdigit_stage_1[f] << 4; - f = code >> 9; - code ^= f << 9; - pos = (RE_UINT32)re_xdigit_stage_2[pos + f] << 3; - f = code >> 6; - code ^= f << 6; - pos = (RE_UINT32)re_xdigit_stage_3[pos + f] << 6; - pos += code; - value = (re_xdigit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Posix_Digit. */ - -static RE_UINT8 re_posix_digit_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_posix_digit_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_posix_digit_stage_3[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_posix_digit_stage_4[] = { - 0, 0, 0, 0, 0, 0, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -/* Posix_Digit: 130 bytes. */ - -RE_UINT32 re_get_posix_digit(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_posix_digit_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_posix_digit_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_posix_digit_stage_3[pos + f] << 7; - pos += code; - value = (re_posix_digit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Posix_AlNum. */ - -static RE_UINT8 re_posix_alnum_stage_1[] = { - 0, 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 5, 5, 8, 9, 10, - 11, 12, 13, 14, 15, 9, 16, 5, 17, 9, 9, 18, 9, 19, 20, 21, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 23, 24, 5, 25, 26, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -17291,1529 +26234,1580 @@ static RE_UINT8 re_posix_alnum_stage_1[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; -static RE_UINT8 re_posix_alnum_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 28, - 29, 30, 31, 31, 32, 31, 31, 31, 31, 31, 31, 31, 33, 34, 35, 31, - 36, 37, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39, - 1, 1, 1, 1, 40, 1, 41, 42, 43, 44, 45, 46, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 47, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 48, 49, 1, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 1, 59, 60, 61, 62, 63, 64, 65, 31, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 31, 78, 79, 80, 31, - 1, 1, 1, 81, 82, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 84, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 1, 1, 85, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 86, 87, 31, 31, 88, 89, - 1, 1, 1, 1, 1, 1, 1, 90, 1, 1, 91, 31, 31, 31, 31, 31, - 1, 92, 93, 31, 31, 31, 31, 31, 31, 31, 31, 31, 94, 31, 31, 31, - 31, 31, 31, 31, 95, 96, 97, 98, 31, 31, 31, 31, 31, 31, 31, 31, - 99, 100, 101, 31, 31, 31, 31, 31, 102, 103, 31, 31, 31, 31, 104, 31, - 31, 105, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 1, 1, 1, 1, 1, 1, 106, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 107, 108, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 109, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 110, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 1, 1, 111, 31, 31, 31, 31, 31, -}; - -static RE_UINT8 re_posix_alnum_stage_3[] = { - 0, 1, 2, 2, 0, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 6, 7, 0, 0, 8, 9, 10, 11, 5, 12, - 5, 5, 5, 5, 13, 5, 5, 5, 5, 14, 15, 5, 16, 17, 18, 19, - 20, 5, 21, 22, 5, 5, 23, 24, 25, 5, 26, 5, 5, 27, 28, 29, - 30, 31, 32, 33, 0, 34, 35, 36, 5, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 49, 53, 54, 55, 56, 57, 0, - 58, 59, 60, 61, 58, 62, 63, 64, 58, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 0, 75, 76, 77, 0, 78, 0, 79, 80, 81, 82, 0, 0, - 5, 83, 25, 5, 84, 5, 85, 86, 5, 5, 87, 5, 88, 89, 90, 5, - 91, 5, 73, 0, 92, 5, 5, 93, 72, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 94, 2, 5, 5, 95, 96, 97, 97, 98, 5, 99, 100, 0, - 0, 5, 5, 32, 5, 101, 5, 102, 103, 104, 25, 105, 5, 106, 107, 0, - 108, 5, 103, 109, 0, 110, 0, 0, 5, 111, 112, 0, 5, 113, 5, 114, - 5, 115, 116, 117, 118, 65, 0, 119, 5, 5, 5, 5, 5, 5, 0, 120, - 93, 5, 121, 117, 5, 122, 123, 124, 0, 0, 0, 125, 126, 0, 0, 0, - 127, 128, 129, 5, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 130, 5, 107, 5, 131, 103, 5, 5, 5, 5, 132, - 5, 85, 5, 133, 115, 134, 134, 5, 0, 135, 0, 0, 0, 0, 0, 0, - 136, 137, 72, 5, 138, 72, 5, 86, 139, 14, 5, 5, 140, 73, 0, 25, - 5, 5, 5, 5, 5, 102, 0, 0, 5, 5, 5, 5, 5, 5, 5, 92, - 5, 5, 5, 5, 31, 0, 25, 117, 141, 142, 5, 143, 5, 5, 5, 92, - 144, 145, 5, 5, 146, 5, 147, 144, 148, 149, 5, 97, 5, 5, 150, 151, - 28, 101, 152, 82, 5, 153, 135, 154, 5, 115, 155, 156, 5, 103, 157, 158, - 159, 160, 86, 161, 5, 5, 5, 33, 5, 5, 5, 5, 5, 162, 163, 108, - 5, 5, 5, 164, 5, 5, 165, 0, 166, 167, 168, 5, 5, 27, 169, 5, - 5, 117, 25, 5, 170, 5, 149, 171, 0, 0, 0, 172, 5, 5, 5, 82, - 0, 2, 2, 173, 5, 103, 174, 0, 175, 176, 177, 0, 5, 5, 5, 73, - 0, 0, 5, 178, 0, 0, 0, 0, 0, 0, 0, 0, 82, 5, 179, 0, - 5, 26, 101, 73, 117, 5, 180, 0, 5, 5, 5, 5, 117, 25, 181, 108, - 5, 161, 5, 61, 0, 0, 0, 0, 5, 115, 102, 149, 0, 0, 0, 0, - 182, 183, 102, 115, 103, 0, 0, 184, 102, 165, 0, 0, 5, 185, 0, 0, - 186, 102, 0, 82, 82, 0, 79, 187, 5, 102, 102, 152, 27, 0, 0, 0, - 5, 5, 16, 0, 5, 152, 5, 152, 5, 149, 0, 0, 0, 0, 0, 0, - 82, 188, 189, 0, 0, 0, 0, 115, 5, 5, 189, 0, 145, 32, 25, 16, - 5, 152, 190, 191, 5, 5, 192, 0, 193, 194, 0, 0, 195, 118, 5, 16, - 40, 49, 196, 61, 0, 0, 0, 0, 5, 5, 197, 0, 5, 5, 198, 0, - 0, 0, 0, 0, 5, 199, 200, 0, 5, 103, 201, 0, 5, 202, 0, 0, - 65, 33, 0, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 5, 5, 203, - 0, 0, 0, 0, 0, 204, 30, 205, 5, 206, 25, 5, 207, 0, 5, 32, - 208, 209, 78, 210, 170, 211, 0, 0, 212, 213, 214, 215, 216, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 115, 5, 5, 5, 5, 165, 0, 0, 0, - 5, 5, 5, 140, 5, 5, 5, 5, 5, 5, 61, 0, 0, 0, 0, 0, - 5, 140, 0, 0, 0, 0, 0, 0, 5, 5, 217, 0, 0, 0, 0, 0, - 5, 32, 103, 0, 0, 0, 25, 155, 5, 92, 61, 218, 92, 0, 0, 0, - 0, 0, 5, 5, 0, 0, 0, 0, 5, 5, 219, 5, 220, 0, 0, 221, - 5, 5, 5, 5, 5, 5, 5, 222, 5, 5, 5, 5, 5, 5, 5, 152, - 103, 0, 223, 224, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 108, - 5, 5, 5, 225, 226, 0, 0, 0, 5, 5, 227, 5, 228, 229, 230, 5, - 231, 232, 233, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 234, 235, 86, - 227, 227, 131, 131, 208, 208, 236, 0, 237, 238, 0, 0, 0, 0, 0, 0, - 5, 239, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 241, - 5, 5, 5, 5, 5, 5, 187, 0, 5, 5, 242, 0, 0, 0, 0, 0, - 230, 243, 244, 245, 246, 247, 0, 0, 0, 25, 248, 248, 107, 0, 0, 0, - 5, 5, 5, 5, 5, 5, 115, 0, 5, 178, 5, 5, 5, 5, 5, 5, - 117, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 249, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 78, 117, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_posix_alnum_stage_4[] = { - 0, 0, 0, 0, 0, 0, 255, 3, 254, 255, 255, 7, 0, 4, 32, 4, - 255, 255, 127, 255, 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, - 32, 0, 0, 0, 0, 0, 223, 188, 64, 215, 255, 255, 251, 255, 255, 255, - 255, 255, 191, 255, 3, 252, 255, 255, 255, 255, 254, 255, 255, 255, 127, 2, - 255, 1, 0, 0, 0, 0, 255, 191, 182, 0, 255, 255, 255, 135, 7, 0, - 0, 0, 255, 7, 255, 255, 255, 254, 0, 192, 255, 255, 255, 255, 239, 31, - 254, 225, 0, 156, 0, 0, 255, 255, 0, 224, 255, 255, 255, 255, 3, 0, - 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 255, 252, 255, 31, 0, 0, - 255, 255, 255, 1, 255, 7, 0, 0, 255, 255, 223, 63, 0, 0, 240, 255, - 248, 3, 255, 255, 255, 255, 255, 239, 255, 223, 225, 255, 15, 0, 254, 255, - 239, 159, 249, 255, 255, 253, 197, 227, 159, 89, 128, 176, 15, 0, 3, 16, - 238, 135, 249, 255, 255, 253, 109, 195, 135, 25, 2, 94, 0, 0, 63, 0, - 238, 191, 251, 255, 255, 253, 237, 227, 191, 27, 1, 0, 15, 0, 0, 30, - 238, 159, 249, 255, 159, 25, 192, 176, 15, 0, 2, 0, 236, 199, 61, 214, - 24, 199, 255, 195, 199, 29, 129, 0, 239, 223, 253, 255, 255, 253, 255, 227, - 223, 29, 96, 7, 15, 0, 0, 0, 255, 253, 239, 227, 223, 29, 96, 64, - 15, 0, 6, 0, 255, 255, 255, 231, 223, 93, 240, 128, 15, 0, 0, 252, - 236, 255, 127, 252, 255, 255, 251, 47, 127, 128, 95, 255, 0, 0, 12, 0, - 254, 255, 255, 255, 255, 255, 255, 7, 127, 32, 0, 0, 214, 247, 255, 255, - 175, 255, 255, 59, 95, 32, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, - 255, 31, 254, 255, 3, 255, 255, 254, 255, 255, 255, 31, 255, 255, 127, 249, - 255, 255, 0, 60, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, - 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, - 255, 255, 0, 0, 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, - 255, 223, 15, 0, 255, 255, 15, 0, 255, 223, 13, 0, 255, 255, 207, 255, - 255, 1, 128, 16, 255, 7, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, - 255, 15, 255, 1, 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 0, 0, - 255, 255, 255, 15, 254, 255, 31, 0, 128, 0, 0, 0, 255, 255, 239, 255, - 239, 15, 0, 0, 255, 243, 0, 252, 191, 255, 3, 0, 255, 255, 127, 0, - 0, 224, 0, 252, 255, 255, 255, 63, 255, 1, 255, 255, 0, 222, 111, 4, - 128, 255, 31, 0, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, - 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 62, - 80, 189, 255, 243, 224, 67, 0, 0, 0, 0, 192, 255, 255, 127, 255, 255, - 31, 120, 12, 0, 255, 128, 0, 0, 127, 127, 127, 127, 0, 128, 0, 0, - 224, 0, 0, 0, 254, 3, 62, 31, 255, 255, 127, 224, 224, 255, 255, 255, - 255, 127, 0, 0, 255, 31, 255, 255, 0, 12, 0, 0, 255, 127, 240, 143, - 0, 0, 128, 255, 252, 255, 255, 255, 255, 249, 255, 255, 124, 0, 0, 0, - 191, 255, 255, 255, 255, 0, 0, 0, 47, 0, 0, 0, 0, 0, 252, 232, - 255, 255, 7, 0, 255, 255, 247, 255, 255, 255, 0, 124, 255, 63, 0, 0, - 255, 255, 127, 252, 5, 0, 0, 56, 255, 255, 60, 0, 126, 126, 126, 0, - 127, 127, 255, 255, 255, 0, 255, 255, 15, 0, 255, 255, 127, 248, 255, 255, - 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 224, 255, 253, 127, 95, - 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, 0, 0, 255, 15, - 0, 0, 223, 255, 192, 255, 255, 255, 252, 252, 252, 28, 255, 239, 255, 255, - 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 31, 0, 255, 255, 1, 0, - 15, 255, 62, 0, 255, 255, 15, 255, 63, 253, 255, 255, 255, 255, 191, 145, - 255, 255, 55, 0, 255, 255, 255, 192, 111, 240, 239, 254, 31, 0, 0, 0, - 128, 0, 255, 255, 63, 0, 0, 0, 112, 0, 255, 255, 255, 255, 71, 0, - 30, 0, 0, 20, 255, 255, 251, 255, 255, 255, 159, 64, 127, 189, 255, 191, - 159, 25, 129, 224, 187, 7, 0, 128, 179, 0, 0, 0, 255, 255, 63, 127, - 0, 0, 0, 63, 17, 0, 0, 0, 255, 255, 63, 1, 0, 0, 0, 128, - 255, 252, 255, 255, 26, 0, 0, 0, 255, 255, 231, 127, 255, 255, 255, 32, - 255, 253, 255, 255, 255, 255, 127, 127, 0, 0, 252, 255, 255, 254, 127, 0, - 127, 251, 255, 255, 255, 255, 127, 180, 203, 0, 0, 0, 191, 253, 255, 255, - 255, 127, 123, 1, 127, 0, 0, 0, 248, 255, 255, 224, 255, 135, 255, 255, - 255, 128, 255, 255, 11, 0, 0, 0, 255, 255, 255, 0, 0, 0, 7, 0, - 240, 0, 255, 255, 255, 7, 255, 31, 255, 1, 255, 67, 255, 255, 223, 255, - 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, 191, 231, 223, 223, - 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, 253, 255, 255, 247, - 247, 15, 0, 0, 127, 255, 255, 249, 219, 7, 0, 0, 255, 31, 128, 63, - 0, 64, 0, 0, 255, 15, 0, 0, 143, 8, 0, 0, 150, 254, 247, 10, - 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, 238, 251, 255, 15, - 255, 3, 255, 255, 3, 0, 255, 255, -}; - -/* Posix_AlNum: 2600 bytes. */ - -RE_UINT32 re_get_posix_alnum(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 12; - code = ch ^ (f << 12); - pos = (RE_UINT32)re_posix_alnum_stage_1[f] << 4; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_posix_alnum_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_posix_alnum_stage_3[pos + f] << 5; - pos += code; - value = (re_posix_alnum_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Posix_Punct. */ - -static RE_UINT8 re_posix_punct_stage_1[] = { - 0, 1, 2, 3, 3, 4, 3, 5, 6, 7, 3, 8, 3, 9, 10, 11, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, -}; - -static RE_UINT8 re_posix_punct_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 1, 1, 17, 18, 1, 19, 20, 21, 22, 23, 24, 25, 1, 1, 26, - 27, 28, 29, 29, 30, 29, 29, 31, 29, 29, 29, 32, 33, 34, 35, 36, - 37, 38, 39, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 40, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 41, 1, 42, 43, 44, 45, 46, 47, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 48, 1, 49, 50, 51, - 1, 52, 1, 53, 1, 54, 1, 1, 55, 56, 57, 58, 1, 1, 1, 59, - 60, 61, 62, 1, 63, 64, 65, 66, 67, 68, 69, 1, 70, 1, 71, 72, - 1, 1, 1, 1, 73, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 74, 75, 1, 1, 76, 68, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 77, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 78, 79, 80, 81, 1, 1, 82, 83, 29, 29, 84, 1, 1, 1, 1, 1, - 1, 85, 86, 1, 1, 1, 1, 1, 1, 87, 1, 1, 88, 89, 90, 1, - 91, 92, 93, 29, 29, 29, 94, 95, 96, 97, 98, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_posix_punct_stage_3[] = { - 0, 1, 2, 3, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 8, 9, 0, 0, 10, - 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 12, 0, 13, 14, 15, 16, - 17, 0, 0, 18, 0, 0, 19, 20, 21, 0, 0, 0, 0, 0, 0, 22, - 0, 23, 14, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 25, - 0, 0, 0, 10, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 28, - 0, 0, 0, 29, 30, 0, 0, 0, 0, 0, 31, 32, 0, 0, 0, 33, - 0, 34, 35, 0, 0, 0, 0, 0, 36, 37, 0, 0, 38, 39, 40, 0, - 0, 0, 41, 0, 39, 0, 0, 42, 0, 0, 0, 43, 44, 0, 0, 0, - 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 48, - 0, 49, 0, 0, 0, 0, 50, 0, 51, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 52, 0, 0, 0, 39, 53, 39, 0, 0, 0, 0, 54, 0, 0, - 0, 0, 12, 55, 0, 0, 0, 56, 0, 57, 0, 39, 0, 0, 58, 0, - 0, 0, 0, 0, 0, 59, 60, 61, 62, 63, 64, 65, 66, 53, 0, 0, - 67, 68, 69, 0, 70, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 71, 51, 0, 56, 72, 0, 0, 53, 53, 53, 72, 73, 53, 53, 53, - 53, 53, 53, 74, 75, 53, 53, 53, 0, 0, 0, 0, 0, 0, 0, 76, - 0, 0, 0, 27, 0, 0, 0, 0, 53, 77, 78, 0, 79, 53, 53, 80, - 53, 53, 53, 53, 53, 53, 72, 81, 82, 83, 0, 0, 47, 45, 0, 42, - 0, 0, 0, 0, 84, 0, 53, 85, 64, 86, 87, 53, 86, 88, 53, 53, - 0, 0, 0, 0, 0, 0, 53, 53, 0, 0, 0, 0, 62, 53, 71, 39, - 89, 0, 0, 90, 0, 0, 0, 91, 92, 93, 0, 0, 94, 0, 0, 0, - 0, 95, 0, 96, 0, 0, 97, 98, 0, 97, 34, 0, 0, 0, 99, 0, - 0, 0, 56, 100, 0, 0, 39, 26, 0, 0, 42, 0, 0, 0, 0, 101, - 0, 102, 0, 0, 0, 103, 93, 0, 0, 39, 0, 0, 0, 0, 0, 104, - 44, 62, 105, 106, 0, 0, 0, 0, 1, 2, 2, 107, 0, 0, 0, 108, - 109, 110, 0, 111, 112, 45, 62, 113, 0, 0, 0, 0, 34, 0, 27, 0, - 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 5, 114, 0, 0, 0, 0, - 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 115, 34, 0, 0, 116, 117, - 0, 111, 0, 0, 118, 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, - 0, 0, 120, 0, 0, 121, 93, 0, 0, 0, 85, 122, 0, 0, 123, 0, - 0, 124, 0, 0, 0, 102, 0, 0, 0, 0, 125, 0, 0, 0, 126, 0, - 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 128, 129, 0, 0, 0, 0, - 0, 56, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 11, 0, 34, 71, 0, 130, 109, 0, 0, - 0, 0, 131, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, - 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 0, 134, 0, 0, 0, 0, - 0, 0, 0, 97, 0, 0, 0, 135, 0, 110, 136, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, - 53, 53, 53, 53, 53, 53, 53, 72, 53, 139, 53, 140, 141, 142, 53, 43, - 53, 53, 143, 0, 0, 0, 0, 0, 53, 53, 92, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 144, 42, 135, 135, 31, 31, 102, 102, 145, 0, - 0, 137, 0, 146, 147, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 39, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 148, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 26, 53, 150, 53, 53, 80, 151, 152, 72, - 62, 78, 41, 153, 86, 129, 0, 154, 155, 156, 157, 107, 0, 0, 0, 0, - 53, 53, 53, 53, 53, 53, 72, 158, 53, 53, 53, 80, 53, 53, 159, 160, - 150, 53, 161, 53, 63, 21, 0, 0, 162, 53, 53, 163, 53, 164, 165, 53, - 53, 53, 80, 166, 167, 0, 0, 0, -}; - -static RE_UINT8 re_posix_punct_stage_4[] = { - 0, 0, 0, 0, 254, 255, 0, 252, 1, 0, 0, 248, 1, 0, 0, 120, - 254, 219, 211, 137, 0, 0, 128, 0, 60, 0, 252, 255, 224, 175, 255, 255, - 0, 0, 32, 64, 176, 0, 0, 0, 0, 0, 64, 0, 4, 0, 0, 0, - 0, 0, 0, 252, 0, 230, 0, 0, 0, 0, 0, 64, 73, 0, 0, 0, - 0, 0, 24, 0, 192, 255, 0, 200, 0, 60, 0, 0, 0, 0, 16, 64, - 0, 2, 0, 96, 255, 63, 0, 0, 0, 0, 192, 195, 0, 0, 255, 127, - 48, 0, 1, 0, 0, 0, 12, 44, 0, 0, 3, 0, 0, 0, 1, 0, - 0, 0, 248, 7, 0, 0, 128, 128, 16, 0, 0, 0, 0, 128, 0, 0, - 0, 0, 0, 2, 0, 0, 16, 0, 0, 0, 0, 128, 0, 128, 0, 12, - 254, 255, 255, 252, 0, 0, 80, 61, 32, 0, 0, 0, 0, 0, 0, 192, - 191, 223, 255, 7, 0, 252, 0, 0, 0, 0, 0, 8, 255, 1, 0, 0, - 0, 0, 255, 3, 1, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 24, - 0, 56, 0, 0, 0, 0, 96, 0, 0, 0, 112, 15, 255, 7, 0, 0, - 49, 0, 0, 0, 255, 255, 255, 255, 127, 63, 0, 0, 255, 7, 240, 31, - 0, 0, 0, 240, 0, 0, 0, 248, 255, 0, 8, 0, 0, 0, 0, 160, - 3, 224, 0, 224, 0, 224, 0, 96, 0, 0, 255, 255, 255, 0, 255, 255, - 255, 255, 255, 127, 0, 0, 0, 124, 0, 124, 0, 0, 123, 3, 208, 193, - 175, 66, 0, 12, 31, 188, 0, 0, 0, 12, 255, 255, 127, 0, 0, 0, - 255, 255, 63, 0, 0, 0, 240, 255, 255, 255, 207, 255, 255, 255, 63, 255, - 224, 7, 0, 222, 255, 127, 255, 255, 255, 255, 0, 0, 255, 255, 255, 251, - 255, 255, 15, 0, 0, 0, 255, 15, 30, 255, 255, 255, 1, 0, 193, 224, - 0, 0, 195, 255, 15, 0, 0, 0, 0, 252, 255, 255, 255, 0, 1, 0, - 255, 255, 1, 0, 0, 224, 0, 0, 0, 0, 8, 64, 0, 0, 252, 0, - 255, 255, 127, 0, 3, 0, 0, 0, 0, 6, 0, 0, 0, 15, 192, 3, - 0, 0, 240, 0, 0, 192, 0, 0, 0, 0, 0, 23, 254, 63, 0, 192, - 0, 0, 128, 3, 0, 8, 0, 0, 0, 2, 0, 0, 0, 0, 252, 255, - 0, 0, 0, 48, 255, 255, 247, 255, 127, 15, 0, 0, 63, 0, 0, 0, - 127, 127, 0, 48, 7, 0, 0, 0, 0, 0, 128, 255, 0, 0, 0, 254, - 255, 115, 255, 15, 255, 255, 255, 31, 0, 0, 128, 1, 0, 0, 255, 1, - 0, 1, 0, 0, 0, 0, 127, 0, 0, 0, 0, 30, 0, 0, 224, 3, - 128, 63, 0, 0, 0, 0, 0, 216, 0, 0, 48, 0, 224, 33, 0, 232, - 0, 0, 0, 63, 0, 248, 0, 40, 64, 0, 0, 0, 254, 255, 255, 0, - 14, 0, 0, 0, 255, 31, 0, 0, 0, 0, 0, 220, 62, 0, 0, 0, - 0, 0, 224, 255, 255, 255, 3, 128, 0, 0, 31, 0, 0, 0, 32, 0, - 48, 0, 0, 0, 0, 0, 128, 7, 0, 0, 0, 144, 127, 254, 255, 255, - 31, 28, 0, 0, 24, 240, 255, 255, 255, 195, 255, 255, 35, 0, 0, 0, - 2, 0, 0, 8, 8, 0, 0, 0, 0, 224, 223, 255, 239, 15, 0, 0, - 0, 16, 1, 0, 0, 64, 0, 0, 255, 15, 255, 255, 255, 127, 254, 255, - 254, 255, 254, 255, 0, 28, 0, 0, 192, 255, 255, 255, 7, 0, 255, 255, - 255, 255, 255, 15, 255, 1, 3, 0, 255, 31, 255, 7, 255, 255, 255, 1, - 255, 15, 0, 0, 255, 0, 255, 3, 255, 239, 255, 255, 255, 255, 123, 252, - 231, 199, 255, 255, 255, 231, 255, 255, 255, 63, 15, 7, 7, 0, 63, 0, -}; - -/* Posix_Punct: 1984 bytes. */ - -RE_UINT32 re_get_posix_punct(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_posix_punct_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_posix_punct_stage_2[pos + f] << 3; - f = code >> 5; - code ^= f << 5; - pos = (RE_UINT32)re_posix_punct_stage_3[pos + f] << 5; - pos += code; - value = (re_posix_punct_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* Posix_XDigit. */ - -static RE_UINT8 re_posix_xdigit_stage_1[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, -}; - -static RE_UINT8 re_posix_xdigit_stage_2[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_posix_xdigit_stage_3[] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static RE_UINT8 re_posix_xdigit_stage_4[] = { - 0, 0, 0, 0, 0, 0, 255, 3, 126, 0, 0, 0, 126, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -/* Posix_XDigit: 130 bytes. */ - -RE_UINT32 re_get_posix_xdigit(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - - f = ch >> 15; - code = ch ^ (f << 15); - pos = (RE_UINT32)re_posix_xdigit_stage_1[f] << 4; - f = code >> 11; - code ^= f << 11; - pos = (RE_UINT32)re_posix_xdigit_stage_2[pos + f] << 4; - f = code >> 7; - code ^= f << 7; - pos = (RE_UINT32)re_posix_xdigit_stage_3[pos + f] << 7; - pos += code; - value = (re_posix_xdigit_stage_4[pos >> 3] >> (pos & 0x7)) & 0x1; - - return value; -} - -/* All_Cases. */ - -static RE_UINT8 re_all_cases_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_all_cases_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 7, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 9, 10, 11, 12, - 6, 13, 6, 6, 14, 6, 6, 6, 6, 6, 6, 6, 15, 16, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 17, 18, 6, 6, 6, 19, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 20, 6, 6, 6, 21, - 6, 6, 6, 6, 22, 6, 6, 6, 6, 6, 6, 6, 23, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 24, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 25, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 26, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, -}; - -static RE_UINT8 re_all_cases_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, - 0, 0, 0, 0, 0, 0, 9, 0, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 18, 18, 18, 18, 18, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 21, 34, 18, 18, 35, 18, - 18, 18, 18, 18, 36, 18, 37, 38, 39, 18, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 18, 18, 18, 64, 65, - 66, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 18, 18, 18, - 77, 78, 18, 18, 18, 18, 18, 18, 79, 80, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 81, 82, 82, 82, 83, 0, 84, 85, 85, 85, - 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_xid_start_table_2[] = { + 0, 0, 1, 1, 0, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 6, 0, 0, 0, 7, 8, 9, 4, 10, + 4, 4, 4, 4, 11, 4, 4, 4, 4, 12, 13, 4, 14, 0, 15, 16, + 0, 4, 17, 18, 4, 4, 19, 20, 21, 22, 23, 4, 4, 24, 25, 26, + 27, 28, 29, 17, 0, 30, 31, 0, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 45, 49, 50, 51, 52, 46, 0, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 0, + 68, 69, 67, 0, 70, 71, 72, 0, 73, 0, 74, 75, 76, 0, 0, 0, + 4, 77, 78, 79, 80, 4, 81, 82, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 83, 4, 84, 85, 86, 4, 87, 4, 88, 0, 22, 4, 4, 89, + 68, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 90, 1, 4, 4, 91, 92, 93, 93, 94, 4, 95, 96, 0, + 0, 4, 4, 29, 4, 97, 4, 98, 99, 0, 15, 100, 4, 101, 102, 0, + 103, 4, 104, 0, 0, 105, 0, 0, 106, 95, 107, 0, 108, 109, 4, 110, + 4, 111, 112, 113, 114, 115, 0, 116, 4, 4, 4, 4, 4, 4, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 89, 4, 117, 113, 4, 118, 119, 120, + 0, 0, 0, 121, 122, 0, 0, 0, 123, 124, 125, 4, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 87, 87, 87, 88, 89, 90, 90, 90, 90, 90, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 94, + 4, 126, 99, 4, 4, 4, 4, 127, 4, 81, 4, 128, 103, 129, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 95, 96, 97, 97, 97, 97, 97, 98, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, - 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 101, 18, 18, 18, - 18, 18, 102, 103, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 104, 105, 93, 94, 104, 105, 104, 105, 93, 94, 106, 107, 104, 105, 108, 109, - 104, 105, 104, 105, 104, 105, 110, 111, 112, 113, 114, 115, 116, 117, 112, 118, - 0, 0, 0, 0, 119, 120, 121, 0, 0, 122, 0, 0, 123, 123, 124, 124, - 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 130, 131, 68, 4, 132, 68, 4, 82, 106, 12, 4, 4, 133, 4, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 126, 127, 127, 127, 128, 128, 128, 129, 0, 0, - 82, 82, 82, 82, 82, 83, 85, 85, 85, 85, 85, 86, 130, 131, 132, 133, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 37, 134, 135, 0, - 136, 136, 136, 136, 137, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 134, + 4, 4, 4, 4, 75, 0, 15, 113, 4, 4, 4, 4, 4, 4, 4, 4, + 135, 136, 4, 137, 113, 4, 4, 22, 138, 139, 4, 4, 140, 4, 141, 142, + 143, 144, 4, 95, 139, 95, 0, 145, 25, 146, 67, 134, 32, 147, 148, 149, + 4, 14, 150, 151, 4, 152, 153, 154, 155, 156, 82, 157, 4, 4, 4, 144, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 158, 159, 160, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 161, 4, 4, 162, 0, 163, 164, 165, 4, 4, 93, 166, 4, + 4, 4, 113, 32, 4, 4, 4, 4, 4, 113, 15, 4, 167, 4, 31, 168, + 0, 0, 0, 169, 4, 4, 4, 134, 0, 1, 1, 170, 113, 99, 171, 0, + 172, 173, 174, 0, 4, 4, 4, 88, 0, 0, 4, 104, 0, 0, 0, 0, + 0, 0, 0, 0, 134, 4, 175, 0, 4, 23, 176, 98, 113, 4, 177, 0, + 4, 4, 4, 4, 113, 15, 178, 160, 4, 179, 4, 111, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 103, 98, 31, 0, 0, 0, 0, + 180, 181, 98, 103, 99, 0, 0, 182, 98, 162, 0, 0, 4, 183, 0, 0, + 184, 98, 0, 134, 134, 0, 74, 185, 4, 98, 98, 147, 93, 0, 0, 0, + 4, 4, 14, 0, 4, 147, 4, 147, 4, 111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 186, 0, 0, 134, 187, 110, 0, 0, 15, 185, 103, + 108, 188, 0, 0, 108, 22, 15, 14, 108, 67, 189, 190, 108, 147, 191, 0, + 192, 193, 0, 0, 194, 114, 99, 0, 48, 45, 195, 56, 0, 0, 0, 0, + 4, 104, 196, 56, 4, 22, 197, 0, 0, 0, 0, 0, 4, 133, 198, 0, + 4, 22, 199, 0, 4, 200, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, + 4, 193, 0, 0, 0, 4, 4, 201, 202, 203, 204, 0, 0, 205, 175, 206, + 207, 208, 209, 4, 210, 0, 4, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 211, 133, 73, 212, 22, 0, 0, 0, 213, 175, 214, 215, 216, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 46, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 162, 0, 0, 0, + 4, 4, 4, 133, 4, 4, 4, 4, 4, 4, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 18, 139, 18, 18, 18, 102, 0, 0, - 18, 18, 18, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 78, 18, 78, 18, 18, 18, 18, 18, 18, 18, 0, 140, - 18, 141, 142, 18, 18, 143, 144, 18, 145, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 147, 147, - 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, 0, 0, 0, 0, 0, 0, - 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 11, 11, 4, 5, 15, 15, 8, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 29, 99, 0, 0, 0, 15, 217, 4, 22, 111, 218, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 149, 149, 149, 149, 149, 150, 150, 150, 150, 150, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 151, 150, 150, 150, 150, 152, + 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 219, 0, 166, 0, 0, 220, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 188, + 4, 4, 4, 4, 4, 4, 98, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 153, 153, 153, 153, 153, 153, 154, 0, 155, 155, 155, 155, 155, 155, 156, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 99, 0, 221, 222, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 160, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 223, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 11, 11, 11, 11, 15, 15, 15, 15, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 15, 15, 15, 15, + 4, 4, 30, 4, 225, 226, 227, 4, 228, 229, 230, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 231, 232, 82, 30, 30, 126, 126, 211, 211, 150, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 233, 234, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 193, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 185, 0, 4, 4, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 157, 157, 157, 157, 158, 159, 159, 159, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 227, 236, 237, 238, 239, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 113, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 104, 4, 4, 4, 4, 4, 4, + 113, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 241, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 73, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 17, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_all_cases_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, - 5, 6, 5, 7, 5, 5, 5, 5, 5, 5, 5, 8, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, - 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 11, - 5, 5, 5, 5, 5, 12, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 13, - 14, 15, 14, 15, 14, 15, 14, 15, 16, 17, 14, 15, 14, 15, 14, 15, - 0, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, - 15, 0, 14, 15, 14, 15, 14, 15, 18, 14, 15, 14, 15, 14, 15, 19, - 20, 21, 14, 15, 14, 15, 22, 14, 15, 23, 23, 14, 15, 0, 24, 25, - 26, 14, 15, 23, 27, 28, 29, 30, 14, 15, 31, 0, 29, 32, 33, 34, - 14, 15, 14, 15, 14, 15, 35, 14, 15, 35, 0, 0, 14, 15, 35, 14, - 15, 36, 36, 14, 15, 14, 15, 37, 14, 15, 0, 0, 14, 15, 0, 38, - 0, 0, 0, 0, 39, 40, 41, 39, 40, 41, 39, 40, 41, 14, 15, 14, - 15, 14, 15, 14, 15, 42, 14, 15, 0, 39, 40, 41, 14, 15, 43, 44, - 45, 0, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 0, 0, 0, 0, - 0, 0, 46, 14, 15, 47, 48, 49, 49, 14, 15, 50, 51, 52, 14, 15, - 53, 54, 55, 56, 57, 0, 58, 58, 0, 59, 0, 60, 61, 0, 0, 0, - 58, 62, 0, 63, 0, 64, 65, 0, 66, 67, 65, 68, 69, 0, 0, 67, - 0, 70, 71, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, - 74, 0, 75, 74, 0, 0, 0, 76, 74, 77, 78, 78, 79, 0, 0, 0, - 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 82, 0, - 0, 0, 0, 0, 0, 83, 0, 0, 14, 15, 14, 15, 0, 0, 14, 15, - 0, 0, 0, 33, 33, 33, 0, 84, 0, 0, 0, 0, 0, 0, 85, 0, - 86, 86, 86, 0, 87, 0, 88, 88, 89, 1, 90, 1, 1, 91, 1, 1, - 92, 93, 94, 1, 95, 1, 1, 1, 96, 97, 0, 98, 1, 1, 99, 1, - 1, 100, 1, 1, 101, 102, 102, 102, 103, 5, 104, 5, 5, 105, 5, 5, - 106, 107, 108, 5, 109, 5, 5, 5, 110, 111, 112, 113, 5, 5, 114, 5, - 5, 115, 5, 5, 116, 117, 117, 118, 119, 120, 0, 0, 0, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 0, 14, 15, 130, 14, 15, 0, 45, 45, 45, - 131, 131, 131, 131, 131, 131, 131, 131, 1, 1, 132, 1, 133, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 134, 1, 1, 135, 136, 1, 1, 1, 1, 1, - 1, 1, 137, 1, 1, 1, 1, 1, 5, 5, 138, 5, 139, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 140, 5, 5, 141, 142, 5, 5, 5, 5, 5, - 5, 5, 143, 5, 5, 5, 5, 5, 144, 144, 144, 144, 144, 144, 144, 144, - 14, 15, 145, 146, 14, 15, 14, 15, 14, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 14, 15, 14, 15, 14, 15, 147, 14, 15, 14, 15, 14, 15, 14, - 15, 14, 15, 14, 15, 14, 15, 148, 0, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, - 0, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 0, 151, 151, 151, 151, 151, 151, 151, 151, - 151, 151, 151, 151, 151, 151, 0, 151, 0, 0, 0, 0, 0, 151, 0, 0, - 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 0, 0, 152, 152, 152, - 153, 153, 153, 153, 153, 153, 153, 153, 118, 118, 118, 118, 118, 118, 0, 0, - 123, 123, 123, 123, 123, 123, 0, 0, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 0, 0, 0, 0, 0, 0, 0, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 0, 0, 163, 163, 163, 0, 164, 0, 0, 0, 165, 0, 0, - 0, 0, 0, 0, 0, 0, 166, 0, 167, 168, 14, 15, 14, 15, 14, 15, - 14, 15, 14, 15, 14, 15, 0, 0, 0, 0, 0, 169, 0, 0, 170, 0, - 118, 118, 118, 118, 118, 118, 118, 118, 123, 123, 123, 123, 123, 123, 123, 123, - 0, 118, 0, 118, 0, 118, 0, 118, 0, 123, 0, 123, 0, 123, 0, 123, - 171, 171, 172, 172, 172, 172, 173, 173, 174, 174, 175, 175, 176, 176, 0, 0, - 118, 118, 0, 177, 0, 0, 0, 0, 123, 123, 178, 178, 179, 0, 180, 0, - 0, 0, 0, 177, 0, 0, 0, 0, 181, 181, 181, 181, 179, 0, 0, 0, - 118, 118, 0, 182, 0, 0, 0, 0, 123, 123, 183, 183, 0, 0, 0, 0, - 118, 118, 0, 184, 0, 126, 0, 0, 123, 123, 185, 185, 130, 0, 0, 0, - 186, 186, 187, 187, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0, - 0, 0, 189, 190, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 0, 193, 193, 193, 193, 193, 193, 193, 193, - 194, 194, 194, 194, 194, 194, 194, 194, 0, 0, 0, 14, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 0, 0, 0, 0, 0, 0, - 14, 15, 197, 198, 199, 200, 201, 14, 15, 14, 15, 14, 15, 202, 203, 204, - 205, 0, 14, 15, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 206, 206, - 0, 0, 0, 14, 15, 14, 15, 0, 0, 0, 14, 15, 0, 0, 0, 0, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 0, 207, - 0, 0, 0, 0, 0, 207, 0, 0, 14, 15, 208, 209, 14, 15, 14, 15, - 0, 14, 15, 14, 15, 210, 14, 15, 0, 0, 0, 14, 15, 211, 0, 0, - 14, 15, 14, 15, 149, 0, 14, 15, 14, 15, 212, 213, 214, 215, 212, 0, - 216, 217, 218, 219, 14, 15, 14, 15, 0, 0, 14, 15, 150, 220, 221, 0, - 0, 0, 0, 222, 0, 0, 0, 0, 223, 223, 223, 223, 223, 223, 223, 223, - 0, 0, 0, 0, 0, 14, 15, 0, 224, 224, 224, 224, 224, 224, 224, 224, - 225, 225, 225, 225, 225, 225, 225, 225, 224, 224, 224, 224, 0, 0, 0, 0, - 225, 225, 225, 225, 0, 0, 0, 0, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 0, 0, 0, 0, 0, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 0, 0, 0, 0, 0, 226, 226, 226, 226, 226, 226, 226, 226, - 226, 226, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 0, 0, 0, 0, -}; +static RE_UINT8 re_xid_start_table_3[] = { + 0, 0, 0, 0, 254, 255, 255, 7, 0, 4, 32, 4, 255, 255, 127, 255, + 255, 255, 255, 255, 195, 255, 3, 0, 31, 80, 0, 0, 0, 0, 223, 184, + 64, 215, 255, 255, 251, 255, 255, 255, 255, 255, 191, 255, 3, 252, 255, 255, + 255, 255, 254, 255, 255, 255, 127, 2, 255, 1, 0, 0, 0, 0, 255, 255, + 255, 135, 7, 0, 255, 7, 0, 0, 0, 192, 254, 255, 255, 255, 47, 0, + 96, 192, 0, 156, 0, 0, 253, 255, 255, 255, 0, 0, 0, 224, 255, 255, + 63, 0, 2, 0, 0, 252, 255, 255, 255, 7, 48, 4, 255, 255, 63, 4, + 16, 1, 0, 0, 255, 255, 255, 1, 255, 255, 223, 255, 255, 0, 0, 0, + 240, 255, 255, 255, 255, 255, 255, 35, 0, 0, 1, 255, 3, 0, 254, 255, + 225, 159, 249, 255, 255, 253, 197, 35, 0, 64, 0, 176, 3, 0, 3, 16, + 224, 135, 249, 255, 255, 253, 109, 3, 0, 0, 0, 94, 0, 0, 28, 0, + 224, 191, 251, 255, 255, 253, 237, 35, 0, 0, 1, 0, 3, 0, 0, 2, + 224, 159, 249, 255, 0, 0, 0, 176, 3, 0, 2, 0, 232, 199, 61, 214, + 24, 199, 255, 3, 224, 223, 253, 255, 255, 253, 255, 35, 0, 0, 0, 7, + 3, 0, 0, 0, 225, 223, 253, 255, 255, 253, 239, 35, 0, 0, 0, 64, + 3, 0, 6, 0, 240, 223, 253, 255, 255, 255, 255, 39, 0, 64, 112, 128, + 3, 0, 0, 252, 224, 255, 127, 252, 255, 255, 251, 47, 127, 0, 0, 0, + 254, 255, 255, 255, 255, 255, 5, 0, 214, 247, 255, 255, 175, 255, 5, 32, + 95, 0, 0, 240, 1, 0, 0, 0, 255, 254, 255, 255, 255, 31, 0, 0, + 0, 31, 0, 0, 255, 7, 0, 128, 0, 0, 63, 60, 98, 192, 225, 255, + 3, 64, 0, 0, 191, 32, 255, 255, 255, 255, 255, 247, 255, 61, 127, 61, + 255, 61, 255, 255, 255, 255, 61, 127, 61, 255, 127, 255, 255, 255, 61, 255, + 255, 255, 255, 7, 255, 255, 63, 63, 255, 159, 255, 255, 255, 199, 255, 1, + 255, 223, 3, 0, 255, 255, 3, 0, 255, 223, 1, 0, 255, 255, 15, 0, + 0, 0, 128, 16, 255, 5, 255, 255, 255, 255, 63, 0, 255, 255, 255, 127, + 255, 63, 31, 0, 255, 15, 255, 255, 255, 3, 0, 0, 255, 255, 127, 0, + 255, 255, 31, 0, 128, 0, 0, 0, 224, 255, 255, 255, 224, 15, 0, 0, + 248, 255, 255, 255, 1, 192, 0, 252, 63, 0, 0, 0, 15, 0, 0, 0, + 0, 224, 0, 252, 255, 255, 255, 63, 255, 1, 255, 255, 255, 255, 255, 231, + 0, 222, 111, 4, 63, 63, 255, 170, 255, 255, 223, 95, 220, 31, 207, 15, + 255, 31, 220, 31, 0, 0, 2, 128, 0, 0, 255, 31, 132, 252, 47, 63, + 80, 253, 255, 243, 224, 67, 0, 0, 255, 127, 255, 255, 31, 120, 12, 0, + 255, 128, 0, 0, 127, 127, 127, 127, 224, 0, 0, 0, 254, 3, 62, 31, + 255, 255, 127, 224, 255, 127, 0, 0, 255, 255, 255, 31, 255, 31, 255, 255, + 0, 12, 0, 0, 255, 127, 0, 128, 0, 0, 128, 255, 252, 255, 255, 255, + 255, 249, 255, 255, 252, 7, 0, 0, 0, 0, 224, 255, 187, 247, 255, 255, + 7, 0, 0, 0, 0, 0, 252, 104, 63, 0, 255, 255, 255, 255, 7, 0, + 0, 128, 0, 0, 223, 255, 0, 124, 247, 15, 0, 0, 255, 255, 127, 196, + 255, 255, 98, 62, 5, 0, 0, 56, 255, 7, 28, 0, 126, 126, 126, 0, + 127, 127, 255, 255, 255, 3, 255, 255, 15, 0, 255, 255, 127, 248, 255, 255, + 255, 255, 255, 15, 255, 63, 255, 255, 255, 255, 255, 3, 127, 0, 248, 160, + 255, 253, 127, 95, 219, 255, 255, 255, 0, 0, 248, 255, 255, 255, 252, 255, + 0, 0, 255, 3, 0, 0, 138, 170, 192, 255, 255, 255, 252, 252, 252, 28, + 255, 239, 255, 255, 127, 255, 255, 183, 255, 63, 255, 63, 255, 255, 1, 0, + 255, 7, 255, 255, 15, 255, 62, 0, 255, 255, 15, 255, 255, 0, 255, 255, + 63, 253, 255, 255, 255, 255, 191, 145, 255, 255, 55, 0, 255, 255, 255, 192, + 1, 0, 239, 254, 31, 0, 0, 0, 255, 3, 3, 0, 128, 0, 255, 255, + 255, 255, 255, 0, 144, 0, 255, 255, 255, 255, 71, 0, 30, 0, 0, 20, + 255, 255, 251, 255, 255, 15, 0, 0, 127, 189, 255, 191, 0, 0, 1, 224, + 128, 7, 0, 128, 176, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, + 255, 7, 0, 1, 0, 0, 0, 128, 127, 242, 111, 255, 255, 255, 0, 128, + 2, 0, 0, 0, 255, 252, 255, 255, 10, 0, 0, 0, 1, 248, 255, 255, + 255, 255, 7, 4, 0, 0, 1, 240, 255, 3, 0, 32, 255, 253, 255, 255, + 0, 0, 252, 255, 127, 251, 255, 255, 64, 0, 0, 0, 191, 253, 255, 255, + 255, 3, 0, 1, 255, 63, 0, 0, 248, 255, 255, 224, 255, 7, 1, 0, + 11, 0, 0, 0, 0, 0, 7, 0, 240, 0, 255, 255, 255, 7, 255, 31, + 255, 1, 255, 3, 255, 255, 255, 223, 100, 222, 255, 235, 239, 255, 255, 255, + 191, 231, 223, 223, 255, 255, 255, 123, 95, 252, 253, 255, 63, 255, 255, 255, + 253, 255, 255, 247, 255, 31, 128, 63, 0, 64, 0, 0, 15, 8, 0, 0, + 150, 254, 247, 10, 132, 234, 150, 170, 150, 247, 247, 94, 255, 251, 255, 15, + 238, 251, 255, 15, 3, 0, 255, 255 +}; + +RE_UINT32 re_get_xid_start(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_xid_start_table_1[field_2]; + v = re_xid_start_table_2[(v << 5) | field_1]; + v = re_xid_start_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +} -/* All_Cases: 2544 bytes. */ - -static RE_AllCases re_all_cases_table[] = { - {{ 0, 0, 0}}, - {{ 32, 0, 0}}, - {{ 32, 232, 0}}, - {{ 32, 8415, 0}}, - {{ 32, 300, 0}}, - {{ -32, 0, 0}}, - {{ -32, 199, 0}}, - {{ -32, 8383, 0}}, - {{ -32, 268, 0}}, - {{ 743, 775, 0}}, - {{ 32, 8294, 0}}, - {{ 7615, 0, 0}}, - {{ -32, 8262, 0}}, - {{ 121, 0, 0}}, - {{ 1, 0, 0}}, - {{ -1, 0, 0}}, - {{ -199, 0, 0}}, - {{ -232, 0, 0}}, - {{ -121, 0, 0}}, - {{ -300, -268, 0}}, - {{ 195, 0, 0}}, - {{ 210, 0, 0}}, - {{ 206, 0, 0}}, - {{ 205, 0, 0}}, - {{ 79, 0, 0}}, - {{ 202, 0, 0}}, - {{ 203, 0, 0}}, - {{ 207, 0, 0}}, - {{ 97, 0, 0}}, - {{ 211, 0, 0}}, - {{ 209, 0, 0}}, - {{ 163, 0, 0}}, - {{ 213, 0, 0}}, - {{ 130, 0, 0}}, - {{ 214, 0, 0}}, - {{ 218, 0, 0}}, - {{ 217, 0, 0}}, - {{ 219, 0, 0}}, - {{ 56, 0, 0}}, - {{ 1, 2, 0}}, - {{ -1, 1, 0}}, - {{ -2, -1, 0}}, - {{ -79, 0, 0}}, - {{ -97, 0, 0}}, - {{ -56, 0, 0}}, - {{ -130, 0, 0}}, - {{ 10795, 0, 0}}, - {{ -163, 0, 0}}, - {{ 10792, 0, 0}}, - {{ 10815, 0, 0}}, - {{ -195, 0, 0}}, - {{ 69, 0, 0}}, - {{ 71, 0, 0}}, - {{ 10783, 0, 0}}, - {{ 10780, 0, 0}}, - {{ 10782, 0, 0}}, - {{ -210, 0, 0}}, - {{ -206, 0, 0}}, - {{ -205, 0, 0}}, - {{ -202, 0, 0}}, - {{ -203, 0, 0}}, - {{ 42319, 0, 0}}, - {{ 42315, 0, 0}}, - {{ -207, 0, 0}}, - {{ 42280, 0, 0}}, - {{ 42308, 0, 0}}, - {{ -209, 0, 0}}, - {{ -211, 0, 0}}, - {{ 10743, 0, 0}}, - {{ 42305, 0, 0}}, - {{ 10749, 0, 0}}, - {{ -213, 0, 0}}, - {{ -214, 0, 0}}, - {{ 10727, 0, 0}}, - {{ -218, 0, 0}}, - {{ 42307, 0, 0}}, - {{ 42282, 0, 0}}, - {{ -69, 0, 0}}, - {{ -217, 0, 0}}, - {{ -71, 0, 0}}, - {{ -219, 0, 0}}, - {{ 42261, 0, 0}}, - {{ 42258, 0, 0}}, - {{ 84, 116, 7289}}, - {{ 116, 0, 0}}, - {{ 38, 0, 0}}, - {{ 37, 0, 0}}, - {{ 64, 0, 0}}, - {{ 63, 0, 0}}, - {{ 7235, 0, 0}}, - {{ 32, 62, 0}}, - {{ 32, 96, 0}}, - {{ 32, 57, 92}}, - {{ -84, 32, 7205}}, - {{ 32, 86, 0}}, - {{ -743, 32, 0}}, - {{ 32, 54, 0}}, - {{ 32, 80, 0}}, - {{ 31, 32, 0}}, - {{ 32, 47, 0}}, - {{ 32, 7549, 0}}, - {{ -38, 0, 0}}, - {{ -37, 0, 0}}, - {{ 7219, 0, 0}}, - {{ -32, 30, 0}}, - {{ -32, 64, 0}}, - {{ -32, 25, 60}}, - {{ -116, -32, 7173}}, - {{ -32, 54, 0}}, - {{ -775, -32, 0}}, - {{ -32, 22, 0}}, - {{ -32, 48, 0}}, - {{ -31, 1, 0}}, - {{ -32, -1, 0}}, - {{ -32, 15, 0}}, - {{ -32, 7517, 0}}, - {{ -64, 0, 0}}, - {{ -63, 0, 0}}, - {{ 8, 0, 0}}, - {{ -62, -30, 0}}, - {{ -57, -25, 35}}, - {{ -47, -15, 0}}, - {{ -54, -22, 0}}, - {{ -8, 0, 0}}, - {{ -86, -54, 0}}, - {{ -80, -48, 0}}, - {{ 7, 0, 0}}, - {{ -116, 0, 0}}, - {{ -92, -60, -35}}, - {{ -96, -64, 0}}, - {{ -7, 0, 0}}, - {{ 80, 0, 0}}, - {{ 32, 6254, 0}}, - {{ 32, 6253, 0}}, - {{ 32, 6244, 0}}, - {{ 32, 6242, 0}}, - {{ 32, 6242, 6243}}, - {{ 32, 6236, 0}}, - {{ -32, 6222, 0}}, - {{ -32, 6221, 0}}, - {{ -32, 6212, 0}}, - {{ -32, 6210, 0}}, - {{ -32, 6210, 6211}}, - {{ -32, 6204, 0}}, - {{ -80, 0, 0}}, - {{ 1, 6181, 0}}, - {{ -1, 6180, 0}}, - {{ 15, 0, 0}}, - {{ -15, 0, 0}}, - {{ 48, 0, 0}}, - {{ -48, 0, 0}}, - {{ 7264, 0, 0}}, - {{ 3008, 0, 0}}, - {{ 38864, 0, 0}}, - {{ -6254, -6222, 0}}, - {{ -6253, -6221, 0}}, - {{ -6244, -6212, 0}}, - {{ -6242, -6210, 0}}, - {{ -6242, -6210, 1}}, - {{ -6243, -6211, -1}}, - {{ -6236, -6204, 0}}, - {{ -6181, -6180, 0}}, - {{ 35266, 35267, 0}}, - {{ -3008, 0, 0}}, - {{ 35332, 0, 0}}, - {{ 3814, 0, 0}}, - {{ 35384, 0, 0}}, - {{ 1, 59, 0}}, - {{ -1, 58, 0}}, - {{ -59, -58, 0}}, - {{ -7615, 0, 0}}, - {{ 74, 0, 0}}, - {{ 86, 0, 0}}, - {{ 100, 0, 0}}, - {{ 128, 0, 0}}, - {{ 112, 0, 0}}, - {{ 126, 0, 0}}, - {{ 9, 0, 0}}, - {{ -74, 0, 0}}, - {{ -9, 0, 0}}, - {{ -7289, -7205, -7173}}, - {{ -86, 0, 0}}, - {{ -7235, 0, 0}}, - {{ -100, 0, 0}}, - {{ -7219, 0, 0}}, - {{ -112, 0, 0}}, - {{ -128, 0, 0}}, - {{ -126, 0, 0}}, - {{ -7549, -7517, 0}}, - {{ -8415, -8383, 0}}, - {{ -8294, -8262, 0}}, - {{ 28, 0, 0}}, - {{ -28, 0, 0}}, - {{ 16, 0, 0}}, - {{ -16, 0, 0}}, - {{ 26, 0, 0}}, - {{ -26, 0, 0}}, - {{-10743, 0, 0}}, - {{ -3814, 0, 0}}, - {{-10727, 0, 0}}, - {{-10795, 0, 0}}, - {{-10792, 0, 0}}, - {{-10780, 0, 0}}, - {{-10749, 0, 0}}, - {{-10783, 0, 0}}, - {{-10782, 0, 0}}, - {{-10815, 0, 0}}, - {{ -7264, 0, 0}}, - {{-35266, 1, 0}}, - {{-35267, -1, 0}}, - {{-35332, 0, 0}}, - {{-42280, 0, 0}}, - {{-42308, 0, 0}}, - {{-42319, 0, 0}}, - {{-42315, 0, 0}}, - {{-42305, 0, 0}}, - {{-42258, 0, 0}}, - {{-42282, 0, 0}}, - {{-42261, 0, 0}}, - {{ 928, 0, 0}}, - {{-42307, 0, 0}}, - {{-35384, 0, 0}}, - {{ -928, 0, 0}}, - {{-38864, 0, 0}}, - {{ 40, 0, 0}}, - {{ -40, 0, 0}}, - {{ 34, 0, 0}}, - {{ -34, 0, 0}}, +/* All cases. */ +static RE_UINT8 re_all_cases_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, + 2, 11, 2, 12, 2, 2, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 14, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; -/* All_Cases: 2736 bytes. */ - -int re_get_all_cases(RE_UINT32 ch, RE_UINT32* codepoints) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - RE_AllCases* all_cases; - int count; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_all_cases_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_all_cases_stage_2[pos + f] << 5; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_all_cases_stage_3[pos + f] << 3; - value = re_all_cases_stage_4[pos + code]; - - all_cases = &re_all_cases_table[value]; - - codepoints[0] = ch; - count = 1; - - while (count < RE_MAX_CASES && all_cases->diffs[count - 1] != 0) { - codepoints[count] = (RE_UINT32)((RE_INT32)ch + all_cases->diffs[count - - 1]); - ++count; - } - - return count; +static RE_UINT8 re_all_cases_table_2[] = { + 0, 0, 1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 6, 14, 15, 16, 17, 0, 0, 0, 0, 0, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 6, 29, 6, 6, 30, 31, 32, 33, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 39, + 0, 0, 0, 0, 40, 36, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, + 6, 6, 6, 43, 44, 6, 6, 6, 45, 46, 47, 48, 46, 49, 50, 51, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 56, 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 59, 60, 61, 62, 6, 6, 6, 63, 34, 64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 66, 67, 0, 0, 0, 0, 68, 6, 69, 70, 71, 72, 73, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 0, 0, 0, 0, 0, + 79, 80, 81, 0, 0, 82, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 85, 86, 85, 86, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 88, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 89, 90, 91, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT8 re_all_cases_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 134, 1, 3, 1, 1, 1, 1, + 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, + 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 83, + 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 29, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 133, 15, 16, 16, 16, 16, 16, 16, 0, 23, 23, 25, 25, 23, 23, 27, + 27, 23, 23, 25, 25, 23, 23, 28, 28, 0, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 29, 23, 23, 25, 25, 23, 23, 136, + 53, 30, 16, 16, 16, 16, 30, 28, 28, 31, 32, 25, 25, 0, 33, 34, + 35, 23, 23, 36, 37, 47, 38, 38, 16, 16, 51, 0, 36, 39, 49, 40, + 16, 16, 16, 16, 16, 16, 41, 28, 28, 42, 0, 0, 16, 16, 41, 43, + 43, 44, 45, 25, 25, 23, 23, 46, 16, 16, 0, 0, 16, 16, 0, 48, + 0, 0, 0, 0, 155, 155, 24, 149, 149, 17, 156, 156, 26, 23, 23, 43, + 43, 23, 23, 25, 25, 23, 23, 28, 28, 23, 23, 25, 25, 33, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 150, 150, 18, 16, 16, 47, 48, 16, 16, 16, 16, 16, 16, 16, 16, + 49, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 50, 25, 25, 51, 52, 108, + 106, 23, 23, 53, 54, 55, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 106, 104, 107, 30, 30, 0, 31, 32, 0, 34, 0, 35, 112, 0, 0, 0, + 36, 113, 0, 37, 0, 110, 111, 0, 38, 38, 115, 101, 114, 0, 0, 36, + 0, 105, 39, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 103, 0, 0, + 41, 0, 120, 42, 0, 0, 0, 117, 41, 54, 44, 45, 55, 0, 0, 0, + 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 116, 0, + 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 0, 0, 16, 16, 0, 0, 0, 75, 76, 76, 0, 56, + 0, 0, 0, 0, 0, 0, 57, 0, 58, 59, 58, 0, 60, 0, 61, 62, + 0, 1, 6, 1, 1, 7, 1, 1, 8, 142, 10, 1, 145, 1, 1, 1, + 63, 64, 0, 151, 65, 65, 66, 65, 65, 67, 65, 65, 57, 58, 59, 58, + 0, 1, 6, 1, 1, 7, 1, 1, 8, 9, 10, 1, 11, 1, 1, 1, + 63, 64, 151, 19, 65, 65, 66, 65, 65, 67, 65, 65, 60, 61, 62, 71, + 138, 140, 0, 0, 0, 159, 157, 71, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 144, 158, 74, 56, 141, 139, 0, 28, 28, 74, 16, 16, 0, 75, 76, 76, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 1, 1, 12, 1, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 1, + 65, 68, 69, 65, 65, 65, 65, 65, 65, 65, 70, 65, 65, 65, 65, 65, + 1, 1, 12, 1, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 1, + 65, 68, 69, 65, 65, 65, 65, 65, 65, 65, 70, 65, 65, 65, 65, 65, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 16, 16, 20, 20, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 28, 23, 23, 25, 25, 23, 23, 28, 28, 23, 23, 25, 25, 23, 23, 28, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 78, 78, 78, 78, 78, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 78, 78, 78, 78, 78, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 80, 80, 80, 80, 80, 80, 0, 80, 0, 0, 0, 0, 0, 80, 0, 0, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 0, 82, 82, 82, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 81, 81, 81, 81, 81, 81, 0, 0, 81, 81, 81, 81, 81, 81, 0, 0, + 146, 147, 148, 161, 162, 163, 164, 152, 154, 0, 0, 0, 0, 0, 0, 0, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 102, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 153, 0, 0, 83, 0, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 0, 0, 81, 81, 81, 81, 81, 81, 0, 0, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 0, 0, 81, 81, 81, 81, 81, 81, 0, 0, + 0, 81, 0, 81, 0, 81, 0, 81, 0, 81, 0, 81, 0, 81, 0, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 84, 84, 85, 85, 86, 86, 87, 87, 90, 90, 88, 88, 75, 75, 0, 0, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 0, 28, 0, 0, 0, 0, 81, 81, 84, 84, 28, 0, 143, 0, + 0, 0, 0, 28, 0, 0, 0, 0, 85, 85, 86, 86, 28, 0, 0, 0, + 81, 81, 0, 0, 0, 0, 0, 0, 81, 81, 87, 87, 0, 0, 0, 0, + 81, 81, 0, 0, 0, 89, 0, 0, 81, 81, 88, 88, 89, 0, 0, 0, + 0, 0, 0, 28, 0, 0, 0, 0, 90, 90, 75, 75, 28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 160, 0, 0, 0, 135, 137, 0, 0, 0, 0, + 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 0, 0, 0, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 93, 93, 94, 94, 95, 95, 94, 94, 93, 93, + 96, 96, 97, 97, 96, 96, 98, 98, 57, 57, 99, 99, 57, 57, 98, 98, + 93, 93, 94, 94, 95, 95, 94, 94, 93, 93, 96, 96, 97, 97, 96, 96, + 98, 98, 57, 57, 99, 99, 57, 57, 98, 98, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, + 16, 16, 101, 102, 103, 50, 52, 28, 28, 23, 23, 25, 25, 104, 105, 106, + 107, 0, 16, 16, 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 108, 106, + 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 25, 25, 23, 23, 0, + 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 80, 80, 80, 80, 80, 0, 80, 0, 0, 0, 0, 0, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 154, 22, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, + 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 25, 25, 109, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 25, 25, 110, 0, 0, + 16, 16, 16, 16, 77, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 111, 112, 113, 114, 115, 0, + 116, 117, 118, 119, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 0, 16, 16, 77, 120, 121, 28, 28, 23, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 0, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 0, 0, 0, 0, 0, + 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, + 126, 126, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 128, 128, 128, 128, + 129, 129, 129, 129, 129, 129, 129, 129, 126, 126, 126, 126, 126, 126, 126, 126, + 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126, 126, 126, 126, 126, + 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128, + 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, + 126, 126, 126, 126, 0, 0, 0, 0, 129, 129, 129, 129, 129, 129, 129, 129, + 128, 128, 128, 128, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, + 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126, 0, 0, 0, 0, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 130, 130, 98, 98, 130, 130, 99, 99, 130, 130, 98, 98, 130, 130, 131, 131, + 130, 130, 98, 98, 130, 130, 99, 99, 130, 130, 98, 98, 130, 130, 132, 132, + 72, 72, 130, 130, 98, 98, 130, 130, 99, 99, 130, 130, 98, 98, 130, 130, + 131, 131, 130, 130, 98, 98, 130, 130, 99, 99, 130, 130, 98, 98, 130, 130, + 132, 132, 72, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_AllCases re_all_cases_table_4[] = { + { 0, 0, 0}, + { 32, 0, 0}, + { 32, 304, 0}, + { 32, 8490, 0}, + { 32, 383, 0}, + { 32, 8491, 0}, + { 32, 976, 0}, + { 32, 1013, 0}, + { 32, 977, 1012}, + { 252, 921, 8126}, + { 32, 1008, 0}, + { 777, 924, 0}, + { 32, 7296, 0}, + { 32, 7297, 0}, + { 32, 7298, 0}, + { 376, 0, 0}, + { 1, 0, 0}, + { 14, 456, 0}, + { 2, 498, 0}, + { 96, 962, 0}, + { 1, 7303, 0}, + { 1, 7835, 0}, + {47811, 42570, 0}, + { 3, 0, 0}, + { 2, 453, 0}, + { 7, 0, 0}, + { 6, 459, 0}, + { 127, 0, 0}, + { 15, 0, 0}, + { 391, 0, 0}, + { 978, 0, 0}, + { 991, 0, 0}, + { 989, 0, 0}, + { 83, 0, 0}, + { 982, 0, 0}, + { 971, 0, 0}, + { 1011, 0, 0}, + { 1015, 0, 0}, + { 1023, 0, 0}, + { 1007, 0, 0}, + { 1002, 0, 0}, + { 806, 0, 0}, + { 810, 0, 0}, + { 31, 0, 0}, + { 827, 0, 0}, + { 825, 0, 0}, + { 805, 0, 0}, + { 99, 0, 0}, + { 72, 0, 0}, + { 958, 0, 0}, + {11871, 0, 0}, + { 935, 0, 0}, + {11864, 0, 0}, + { 963, 0, 0}, + { 205, 0, 0}, + { 201, 0, 0}, + { 140, 0, 0}, + { 42, 0, 0}, + { 37, 0, 0}, + { 39, 0, 0}, + { 64, 0, 0}, + { 67, 0, 0}, + { 65, 0, 0}, + { 96, 982, 0}, + { 96, 1009, 0}, + { 96, 0, 0}, + { 96, 981, 0}, + { 96, 8486, 0}, + { 96, 7299, 0}, + { 96, 7300, 7301}, + { 96, 7302, 0}, + { 24, 0, 0}, + { 98, 0, 0}, + { 48, 0, 0}, + { 11, 0, 0}, + { 134, 0, 0}, + { 130, 0, 0}, + { 80, 0, 0}, + { 208, 0, 0}, + {15776, 0, 0}, + {15840, 0, 0}, + { 8, 0, 0}, + { 3136, 0, 0}, + { 7745, 0, 0}, + { 202, 0, 0}, + { 186, 0, 0}, + { 190, 0, 0}, + { 172, 0, 0}, + { 144, 0, 0}, + { 9, 0, 0}, + { 128, 0, 0}, + { 124, 0, 0}, + { 16, 0, 0}, + { 102, 0, 0}, + { 106, 0, 0}, + { 110, 0, 0}, + { 26, 0, 0}, + { 30, 0, 0}, + { 38, 0, 0}, + { 46, 0, 0}, + { 112, 0, 0}, + {11785, 0, 0}, + {12574, 0, 0}, + {11801, 0, 0}, + {11836, 0, 0}, + {11807, 0, 0}, + {11839, 0, 0}, + {11810, 0, 0}, + {11841, 0, 0}, + {47620, 0, 0}, + {42472, 0, 0}, + {42444, 0, 0}, + {42487, 0, 0}, + {42445, 0, 0}, + {42433, 0, 0}, + {42436, 0, 0}, + {42286, 0, 0}, + {42294, 0, 0}, + {42287, 0, 0}, + { 3296, 0, 0}, + {42311, 0, 0}, + {47688, 0, 0}, + {47312, 0, 0}, + {47152, 0, 0}, + {47184, 0, 0}, + {47216, 0, 0}, + { 40, 0, 0}, + { 56, 0, 0}, + { 88, 0, 0}, + { 104, 0, 0}, + { 34, 0, 0}, + { 62, 0, 0}, + { 94, 0, 0}, + { 345, 0, 0}, + { 32, 305, 0}, + { 8545, 107, 0}, + { 300, 115, 0}, + { 8686, 229, 0}, + { 66, 946, 0}, + { 96, 949, 0}, + { 73, 952, 1012}, + { 108, 952, 977}, + { 220, 953, 8126}, + { 7419, 921, 953}, + { 106, 954, 0}, + { 809, 956, 0}, + { 6290, 1074, 0}, + { 6293, 1076, 0}, + { 6300, 1086, 0}, + { 15, 457, 0}, + { 3, 499, 0}, + { 97, 963, 0}, + { 6373, 1123, 0}, + { 251, 7777, 0}, + {47810, 42571, 0}, + { 1, 454, 0}, + { 1, 460, 0}, + { 118, 960, 0}, + { 80, 961, 0}, + { 115, 966, 0}, + { 8847, 969, 0}, + { 6306, 1089, 0}, + { 6310, 1090, 7301}, + { 6311, 1090, 7300}, + { 6316, 1098, 0} +}; + +int re_get_all_cases(RE_UINT32 codepoint, RE_UINT32* cases) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_all_cases_table_1[field_2]; + v = re_all_cases_table_2[(v << 5) | field_1]; + v = re_all_cases_table_3[(v << 5) | field_0]; + + cases[0] = codepoint; + + if (re_all_cases_table_4[v].delta == 0) + return 1; + + cases[1] = codepoint ^ re_all_cases_table_4[v].delta; + + if (re_all_cases_table_4[v].others[0] == 0) + return 2; + + cases[2] = re_all_cases_table_4[v].others[0]; + + if (re_all_cases_table_4[v].others[1] == 0) + return 3; + + cases[3] = re_all_cases_table_4[v].others[1]; + + return 4; } -/* Simple_Case_Folding. */ +/* Simple case folding. */ +static RE_UINT8 re_simple_folding_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, + 2, 11, 2, 12, 2, 2, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 14, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; -static RE_UINT8 re_simple_case_folding_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, +static RE_UINT8 re_simple_folding_table_2[] = { + 0, 0, 1, 0, 0, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, + 4, 12, 13, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, + 20, 21, 0, 4, 22, 4, 23, 4, 4, 24, 25, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, + 0, 0, 0, 0, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 31, 4, 4, 4, 32, 33, 34, 35, 33, 36, 37, 38, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 40, 41, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 44, 45, 0, 46, 4, 4, 4, 47, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 48, 49, 0, 0, 0, 0, 50, 4, 51, 52, 53, 54, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 57, 58, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, + 60, 61, 0, 0, 0, 62, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 64, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_simple_case_folding_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 7, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 10, 11, - 6, 12, 6, 6, 13, 6, 6, 6, 6, 6, 6, 6, 14, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 15, 16, 6, 6, 6, 17, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 18, - 6, 6, 6, 6, 19, 6, 6, 6, 6, 6, 6, 6, 20, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 21, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 22, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 23, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +static RE_UINT8 re_simple_folding_table_3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 66, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 18, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 65, 0, 1, 0, 1, 0, 1, 0, 0, 3, 0, 5, 0, 3, 0, 49, + 0, 3, 0, 5, 0, 3, 0, 10, 0, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 67, 3, 0, 5, 0, 3, 0, 64, + 0, 78, 1, 0, 1, 0, 78, 10, 0, 81, 80, 5, 0, 0, 36, 79, + 77, 3, 0, 84, 85, 0, 86, 86, 1, 0, 0, 0, 84, 83, 0, 82, + 1, 0, 1, 0, 1, 0, 70, 10, 0, 71, 0, 0, 1, 0, 70, 17, + 0, 73, 72, 5, 0, 3, 0, 69, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 2, 3, 0, 9, 1, 0, 4, 5, 0, 3, 0, 17, + 0, 3, 0, 5, 0, 3, 0, 10, 0, 3, 0, 5, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 2, 1, 0, 1, 0, 41, 32, 1, 0, 1, 0, 1, 0, 1, 0, + 75, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 110, 5, 0, 74, 109, 0, + 0, 3, 0, 76, 60, 58, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 53, + 0, 0, 0, 0, 0, 0, 24, 0, 20, 22, 20, 0, 29, 0, 31, 30, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 39, 39, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 40, 44, 0, 0, 0, 12, 13, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 33, 26, 0, 0, 34, 29, 0, 10, 0, 8, 1, 0, 0, 52, 51, 51, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 10, 3, 0, 5, 0, 3, 0, 10, 0, 3, 0, 5, 0, 3, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 61, 61, 61, 61, 61, 61, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 113, 113, 113, 113, 113, 113, 0, 113, 0, 0, 0, 0, 0, 113, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 0, 0, + 89, 90, 91, 92, 93, 94, 95, 96, 130, 0, 0, 0, 0, 0, 0, 0, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 0, 0, 87, 87, 87, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 62, 0, 0, 98, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 6, 0, 6, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 59, 59, 10, 0, 97, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 56, 57, 57, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 54, 54, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 52, 52, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 99, 100, 0, 0, 0, 0, + 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 42, 42, 45, 45, 46, 46, 45, 45, 42, 42, + 15, 15, 16, 16, 15, 15, 21, 21, 24, 24, 25, 25, 24, 24, 21, 21, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 102, 111, 103, 0, 0, 10, 0, 3, 0, 5, 0, 106, 104, 107, + 105, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 108, 107, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 3, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 5, 0, 128, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 5, 0, 122, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 120, 123, 121, 118, 119, 0, + 114, 116, 115, 88, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 35, 117, 129, 10, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 0, 0, 0, 0, + 23, 23, 23, 23, 23, 23, 23, 23, 27, 27, 27, 27, 27, 27, 27, 27, + 23, 23, 23, 23, 23, 23, 23, 23, 37, 37, 37, 37, 37, 37, 37, 37, + 43, 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 37, 37, 37, 37, 37, 37, 37, 37, + 23, 23, 23, 23, 23, 23, 23, 23, 27, 27, 27, 27, 27, 27, 27, 27, + 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 19, 21, 21, 19, 19, 25, 25, 19, 19, 21, 21, 19, 19, 28, 28, + 19, 19, 21, 21, 19, 19, 25, 25, 19, 19, 21, 21, 19, 19, 38, 38, + 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_UINT16 re_simple_folding_table_4[] = { + 0, 1, 2, 3, 6, 7, 8, 9, + 11, 14, 15, 16, 19, 22, 24, 26, + 30, 31, 32, 34, 37, 38, 39, 40, + 42, 46, 48, 56, 62, 64, 65, 67, + 72, 74, 76, 80, 83, 88, 94, 96, + 98, 99, 102, 104, 105, 106, 110, 112, + 124, 127, 128, 130, 134, 140, 144, 172, + 186, 190, 201, 202, 205, 208, 250, 252, + 268, 345, 376, 391, 777, 805, 806, 810, + 825, 827, 935, 958, 963, 971, 978, 982, + 989, 991, 1002, 1007, 1011, 1015, 1023, 3136, + 3296, 6322, 6325, 6332, 6338, 6342, 6343, 6348, + 6372, 7175, 7745, 8513, 8654, 8943, 11785, 11801, + 11807, 11810, 11836, 11839, 11841, 11864, 11871, 12574, + 15776, 15840, 42286, 42287, 42294, 42311, 42433, 42436, + 42444, 42445, 42472, 42487, 47152, 47184, 47216, 47312, + 47620, 47688, 47811 +}; + +RE_UINT32 re_get_simple_case_folding(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_simple_folding_table_1[field_2]; + v = re_simple_folding_table_2[(v << 5) | field_1]; + v = re_simple_folding_table_3[(v << 5) | field_0]; + + return codepoint ^ re_simple_folding_table_4[v]; +} + +/* Full case folding. */ +static RE_UINT8 re_full_folding_table_1[] = { + 0, 1, 2, 2, 3, 2, 2, 4, 5, 6, 2, 7, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 9, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 2, 12, 2, 13, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; -static RE_UINT8 re_simple_case_folding_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 2, 2, 5, 5, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 7, 8, 8, 7, 6, 6, 6, 6, 6, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 8, 20, 6, 6, 21, 6, - 6, 6, 6, 6, 22, 6, 23, 24, 25, 6, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_full_folding_table_2[] = { + 0, 0, 1, 0, 0, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, + 4, 12, 13, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, + 20, 21, 0, 4, 22, 4, 23, 4, 4, 24, 25, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 27, 28, - 29, 30, 1, 2, 31, 32, 0, 0, 33, 34, 35, 6, 6, 6, 36, 37, - 38, 38, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, - 39, 7, 6, 6, 6, 6, 6, 6, 40, 41, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 42, 43, 43, 43, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 32, 4, 4, 4, 33, 34, 35, 36, 37, 38, 39, 40, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 45, 45, 45, 45, 46, 47, 0, 0, 0, 0, 0, 0, + 46, 47, 0, 48, 4, 4, 4, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 49, 50, 51, 51, 51, 51, 51, 52, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 53, 54, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 0, 55, 0, 48, 0, 55, 0, 55, 0, 48, 0, 56, 0, 55, 0, 0, - 0, 55, 0, 55, 0, 55, 0, 57, 0, 58, 0, 59, 0, 60, 0, 61, - 0, 0, 0, 0, 62, 63, 64, 0, 0, 0, 0, 0, 65, 65, 0, 0, - 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 50, 51, 0, 0, 0, 0, 52, 4, 53, 54, 55, 56, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 67, 68, 68, 68, 0, 0, 0, 0, 0, 0, - 43, 43, 43, 43, 43, 44, 0, 0, 0, 0, 0, 0, 69, 70, 71, 72, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 23, 73, 33, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 53, 0, 0, - 6, 6, 6, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 6, 7, 6, 6, 6, 6, 6, 6, 6, 0, 74, - 6, 75, 27, 6, 6, 76, 77, 6, 78, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 81, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 82, 82, 82, 82, 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, + 63, 64, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 84, 84, 84, 84, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static RE_UINT8 re_simple_case_folding_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, - 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 3, 0, 3, 0, 3, 0, - 0, 3, 0, 3, 0, 3, 0, 3, 4, 3, 0, 3, 0, 3, 0, 5, - 0, 6, 3, 0, 3, 0, 7, 3, 0, 8, 8, 3, 0, 0, 9, 10, - 11, 3, 0, 8, 12, 0, 13, 14, 3, 0, 0, 0, 13, 15, 0, 16, - 3, 0, 3, 0, 3, 0, 17, 3, 0, 17, 0, 0, 3, 0, 17, 3, - 0, 18, 18, 3, 0, 3, 0, 19, 3, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 20, 3, 0, 20, 3, 0, 20, 3, 0, 3, 0, 3, - 0, 3, 0, 3, 0, 0, 3, 0, 0, 20, 3, 0, 3, 0, 21, 22, - 23, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 24, 3, 0, 25, 26, 0, 0, 3, 0, 27, 28, 29, 3, 0, - 0, 0, 0, 0, 0, 30, 0, 0, 3, 0, 3, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 31, 0, - 32, 32, 32, 0, 33, 0, 34, 34, 1, 1, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 35, 36, 37, 0, 0, 0, 38, 39, 0, - 40, 41, 0, 0, 42, 43, 0, 3, 0, 44, 3, 0, 0, 23, 23, 23, - 45, 45, 45, 45, 45, 45, 45, 45, 3, 0, 0, 0, 0, 0, 0, 0, - 46, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, - 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 0, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 48, 0, 0, 0, 0, 0, 48, 0, 0, - 49, 49, 49, 49, 49, 49, 0, 0, 50, 51, 52, 53, 53, 54, 55, 56, - 57, 0, 0, 0, 0, 0, 0, 0, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 0, 0, 58, 58, 58, 3, 0, 3, 0, 3, 0, 0, 0, - 0, 0, 0, 59, 0, 0, 60, 0, 49, 49, 49, 49, 49, 49, 49, 49, - 0, 49, 0, 49, 0, 49, 0, 49, 49, 49, 61, 61, 62, 0, 63, 0, - 64, 64, 64, 64, 62, 0, 0, 0, 49, 49, 65, 65, 0, 0, 0, 0, - 49, 49, 66, 66, 44, 0, 0, 0, 67, 67, 68, 68, 62, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 71, 0, 0, 0, 0, - 0, 0, 72, 0, 0, 0, 0, 0, 73, 73, 73, 73, 73, 73, 73, 73, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 3, 0, 75, 76, 77, 0, 0, 3, - 0, 3, 0, 3, 0, 78, 79, 80, 81, 0, 3, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 82, 82, 0, 0, 0, 3, 0, 3, 0, 0, - 0, 3, 0, 3, 0, 83, 3, 0, 0, 0, 0, 3, 0, 84, 0, 0, - 3, 0, 85, 86, 87, 88, 85, 0, 89, 90, 91, 92, 3, 0, 3, 0, - 0, 0, 3, 0, 41, 93, 94, 0, 95, 95, 95, 95, 95, 95, 95, 95, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 0, 0, 0, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 0, 0, 0, -}; - -/* Simple_Case_Folding: 1848 bytes. */ - -static RE_INT32 re_simple_case_folding_table[] = { - 0, - 32, - 775, - 1, - -121, - -268, - 210, - 206, - 205, - 79, - 202, - 203, - 207, - 211, - 209, - 213, - 214, - 218, - 217, - 219, - 2, - -97, - -56, - -130, - 10795, - -163, - 10792, - -195, - 69, - 71, - 116, - 38, - 37, - 64, - 63, - 8, - -30, - -25, - -15, - -22, - -54, - -48, - -60, - -64, - -7, - 80, - 15, - 48, - 7264, - -8, - -6222, - -6221, - -6212, - -6210, - -6211, - -6204, - -6180, - 35267, - -3008, - -58, - -7615, - -74, - -9, - -7173, - -86, - -100, - -112, - -128, - -126, - -7517, - -8383, - -8262, - 28, - 16, - 26, - -10743, - -3814, - -10727, - -10780, - -10749, - -10783, - -10782, - -10815, - -35332, - -42280, - -42308, - -42319, - -42315, - -42305, - -42258, - -42282, - -42261, - 928, - -42307, - -35384, - -38864, - 40, - 34, -}; - -/* Simple_Case_Folding: 392 bytes. */ - -RE_UINT32 re_get_simple_case_folding(RE_UINT32 ch) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - RE_INT32 diff; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_simple_case_folding_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_simple_case_folding_stage_2[pos + f] << 5; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_simple_case_folding_stage_3[pos + f] << 3; - value = re_simple_case_folding_stage_4[pos + code]; - - diff = re_simple_case_folding_table[value]; - - return (RE_UINT32)((RE_INT32)ch + diff); -} - -/* Full_Case_Folding. */ - -static RE_UINT8 re_full_case_folding_stage_1[] = { - 0, 1, 2, 2, 2, 3, 2, 4, 5, 2, 2, 6, 2, 2, 2, 7, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static RE_UINT8 re_full_case_folding_stage_2[] = { - 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 7, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 10, 11, - 6, 12, 6, 6, 13, 6, 6, 6, 6, 6, 6, 6, 14, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 15, 16, 6, 6, 6, 17, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 18, 6, 6, 6, 19, - 6, 6, 6, 6, 20, 6, 6, 6, 6, 6, 6, 6, 21, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 22, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 23, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 24, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, -}; - -static RE_UINT8 re_full_case_folding_stage_3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 2, 2, 5, 6, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 8, 9, 9, 10, 7, 7, 7, 7, 7, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 9, 22, 7, 7, 23, 7, - 7, 7, 7, 7, 24, 7, 25, 26, 27, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 29, 30, - 31, 32, 33, 2, 34, 35, 36, 0, 37, 38, 39, 7, 7, 7, 40, 41, - 42, 42, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, - 43, 44, 7, 7, 7, 7, 7, 7, 45, 46, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 47, 48, 48, 48, 49, 0, 0, 0, 0, 0, - 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 51, 51, 51, 51, 52, 53, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 55, 56, 57, 57, 57, 57, 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 59, 60, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 0, 61, 0, 54, 0, 61, 0, 61, 0, 54, 62, 63, 0, 61, 0, 0, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 0, 0, 0, 0, 80, 81, 82, 0, 0, 0, 0, 0, 83, 83, 0, 0, - 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 85, 86, 86, 86, 0, 0, 0, 0, 0, 0, - 48, 48, 48, 48, 48, 49, 0, 0, 0, 0, 0, 0, 87, 88, 89, 90, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 25, 91, 37, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 92, 0, 0, - 7, 7, 7, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 44, 7, 44, 7, 7, 7, 7, 7, 7, 7, 0, 93, - 7, 94, 29, 7, 7, 95, 96, 7, 97, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 98, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static RE_UINT8 re_full_folding_table_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 101, 101, 101, 101, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 101, 101, 101, 101, 102, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 18, 18, 18, 18, 18, 80, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 103, 103, 103, 103, 103, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 105, 105, 105, 105, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static RE_UINT8 re_full_case_folding_stage_4[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 3, 4, 0, 4, 0, 4, 0, 4, 0, - 5, 0, 4, 0, 4, 0, 4, 0, 0, 4, 0, 4, 0, 4, 0, 4, - 0, 6, 4, 0, 4, 0, 4, 0, 7, 4, 0, 4, 0, 4, 0, 8, - 0, 9, 4, 0, 4, 0, 10, 4, 0, 11, 11, 4, 0, 0, 12, 13, - 14, 4, 0, 11, 15, 0, 16, 17, 4, 0, 0, 0, 16, 18, 0, 19, - 4, 0, 4, 0, 4, 0, 20, 4, 0, 20, 0, 0, 4, 0, 20, 4, - 0, 21, 21, 4, 0, 4, 0, 22, 4, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 23, 4, 0, 23, 4, 0, 23, 4, 0, 4, 0, 4, - 0, 4, 0, 4, 0, 0, 4, 0, 24, 23, 4, 0, 4, 0, 25, 26, - 27, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 28, 4, 0, 29, 30, 0, 0, 4, 0, 31, 32, 33, 4, 0, - 0, 0, 0, 0, 0, 34, 0, 0, 4, 0, 4, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 35, 0, - 36, 36, 36, 0, 37, 0, 38, 38, 39, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, - 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 0, 0, 0, 44, 45, 0, - 46, 47, 0, 0, 48, 49, 0, 4, 0, 50, 4, 0, 0, 27, 27, 27, - 51, 51, 51, 51, 51, 51, 51, 51, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 4, 0, 4, 0, 52, 4, 0, 4, 0, 4, 0, 4, - 0, 4, 0, 4, 0, 4, 0, 0, 0, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, - 0, 0, 0, 0, 0, 0, 0, 54, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 55, 0, 0, 0, 0, 0, 55, 0, 0, - 56, 56, 56, 56, 56, 56, 0, 0, 57, 58, 59, 60, 60, 61, 62, 63, - 64, 0, 0, 0, 0, 0, 0, 0, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 0, 0, 65, 65, 65, 4, 0, 4, 0, 4, 0, 66, 67, - 68, 69, 70, 71, 0, 0, 72, 0, 56, 56, 56, 56, 56, 56, 56, 56, - 73, 0, 74, 0, 75, 0, 76, 0, 0, 56, 0, 56, 0, 56, 0, 56, - 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, - 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, - 81, 81, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82, - 0, 0, 83, 84, 85, 0, 86, 87, 56, 56, 88, 88, 89, 0, 90, 0, - 0, 0, 91, 92, 93, 0, 94, 95, 96, 96, 96, 96, 97, 0, 0, 0, - 0, 0, 98, 99, 0, 0, 100, 101, 56, 56, 102, 102, 0, 0, 0, 0, - 0, 0, 103, 104, 105, 0, 106, 107, 56, 56, 108, 108, 50, 0, 0, 0, - 0, 0, 109, 110, 111, 0, 112, 113, 114, 114, 115, 115, 116, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, 118, 119, 0, 0, 0, 0, - 0, 0, 120, 0, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, 121, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, - 122, 122, 122, 122, 122, 122, 122, 122, 4, 0, 123, 124, 125, 0, 0, 4, - 0, 4, 0, 4, 0, 126, 127, 128, 129, 0, 4, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 130, 130, 0, 0, 0, 4, 0, 4, 0, 0, - 4, 0, 4, 0, 4, 0, 0, 0, 0, 4, 0, 4, 0, 131, 4, 0, - 0, 0, 0, 4, 0, 132, 0, 0, 4, 0, 133, 134, 135, 136, 133, 0, - 137, 138, 139, 140, 4, 0, 4, 0, 0, 0, 4, 0, 47, 141, 142, 0, - 143, 143, 143, 143, 143, 143, 143, 143, 144, 145, 146, 147, 148, 149, 150, 0, - 0, 0, 0, 151, 152, 153, 154, 155, 156, 156, 156, 156, 156, 156, 156, 156, - 156, 156, 156, 156, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 0, 0, 0, 0, 0, 157, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 0, 0, 0, 0, 0, 0, -}; - -/* Full_Case_Folding: 2048 bytes. */ - -static RE_FullCaseFolding re_full_case_folding_table[] = { - { 0, { 0, 0}}, - { 32, { 0, 0}}, - { 775, { 0, 0}}, - { -108, { 115, 0}}, - { 1, { 0, 0}}, - { -199, { 775, 0}}, - { 371, { 110, 0}}, - { -121, { 0, 0}}, - { -268, { 0, 0}}, - { 210, { 0, 0}}, - { 206, { 0, 0}}, - { 205, { 0, 0}}, - { 79, { 0, 0}}, - { 202, { 0, 0}}, - { 203, { 0, 0}}, - { 207, { 0, 0}}, - { 211, { 0, 0}}, - { 209, { 0, 0}}, - { 213, { 0, 0}}, - { 214, { 0, 0}}, - { 218, { 0, 0}}, - { 217, { 0, 0}}, - { 219, { 0, 0}}, - { 2, { 0, 0}}, - { -390, { 780, 0}}, - { -97, { 0, 0}}, - { -56, { 0, 0}}, - { -130, { 0, 0}}, - { 10795, { 0, 0}}, - { -163, { 0, 0}}, - { 10792, { 0, 0}}, - { -195, { 0, 0}}, - { 69, { 0, 0}}, - { 71, { 0, 0}}, - { 116, { 0, 0}}, - { 38, { 0, 0}}, - { 37, { 0, 0}}, - { 64, { 0, 0}}, - { 63, { 0, 0}}, - { 41, { 776, 769}}, - { 21, { 776, 769}}, - { 8, { 0, 0}}, - { -30, { 0, 0}}, - { -25, { 0, 0}}, - { -15, { 0, 0}}, - { -22, { 0, 0}}, - { -54, { 0, 0}}, - { -48, { 0, 0}}, - { -60, { 0, 0}}, - { -64, { 0, 0}}, - { -7, { 0, 0}}, - { 80, { 0, 0}}, - { 15, { 0, 0}}, - { 48, { 0, 0}}, - { -34, {1410, 0}}, - { 7264, { 0, 0}}, - { -8, { 0, 0}}, - { -6222, { 0, 0}}, - { -6221, { 0, 0}}, - { -6212, { 0, 0}}, - { -6210, { 0, 0}}, - { -6211, { 0, 0}}, - { -6204, { 0, 0}}, - { -6180, { 0, 0}}, - { 35267, { 0, 0}}, - { -3008, { 0, 0}}, - { -7726, { 817, 0}}, - { -7715, { 776, 0}}, - { -7713, { 778, 0}}, - { -7712, { 778, 0}}, - { -7737, { 702, 0}}, - { -58, { 0, 0}}, - { -7723, { 115, 0}}, - { -7051, { 787, 0}}, - { -7053, { 787, 768}}, - { -7055, { 787, 769}}, - { -7057, { 787, 834}}, - { -128, { 953, 0}}, - { -136, { 953, 0}}, - { -112, { 953, 0}}, - { -120, { 953, 0}}, - { -64, { 953, 0}}, - { -72, { 953, 0}}, - { -66, { 953, 0}}, - { -7170, { 953, 0}}, - { -7176, { 953, 0}}, - { -7173, { 834, 0}}, - { -7174, { 834, 953}}, - { -74, { 0, 0}}, - { -7179, { 953, 0}}, - { -7173, { 0, 0}}, - { -78, { 953, 0}}, - { -7180, { 953, 0}}, - { -7190, { 953, 0}}, - { -7183, { 834, 0}}, - { -7184, { 834, 953}}, - { -86, { 0, 0}}, - { -7189, { 953, 0}}, - { -7193, { 776, 768}}, - { -7194, { 776, 769}}, - { -7197, { 834, 0}}, - { -7198, { 776, 834}}, - { -100, { 0, 0}}, - { -7197, { 776, 768}}, - { -7198, { 776, 769}}, - { -7203, { 787, 0}}, - { -7201, { 834, 0}}, - { -7202, { 776, 834}}, - { -112, { 0, 0}}, - { -118, { 953, 0}}, - { -7210, { 953, 0}}, - { -7206, { 953, 0}}, - { -7213, { 834, 0}}, - { -7214, { 834, 953}}, - { -128, { 0, 0}}, - { -126, { 0, 0}}, - { -7219, { 953, 0}}, - { -7517, { 0, 0}}, - { -8383, { 0, 0}}, - { -8262, { 0, 0}}, - { 28, { 0, 0}}, - { 16, { 0, 0}}, - { 26, { 0, 0}}, - {-10743, { 0, 0}}, - { -3814, { 0, 0}}, - {-10727, { 0, 0}}, - {-10780, { 0, 0}}, - {-10749, { 0, 0}}, - {-10783, { 0, 0}}, - {-10782, { 0, 0}}, - {-10815, { 0, 0}}, - {-35332, { 0, 0}}, - {-42280, { 0, 0}}, - {-42308, { 0, 0}}, - {-42319, { 0, 0}}, - {-42315, { 0, 0}}, - {-42305, { 0, 0}}, - {-42258, { 0, 0}}, - {-42282, { 0, 0}}, - {-42261, { 0, 0}}, - { 928, { 0, 0}}, - {-42307, { 0, 0}}, - {-35384, { 0, 0}}, - {-38864, { 0, 0}}, - {-64154, { 102, 0}}, - {-64155, { 105, 0}}, - {-64156, { 108, 0}}, - {-64157, { 102, 105}}, - {-64158, { 102, 108}}, - {-64146, { 116, 0}}, - {-64147, { 116, 0}}, - {-62879, {1398, 0}}, - {-62880, {1381, 0}}, - {-62881, {1387, 0}}, - {-62872, {1398, 0}}, - {-62883, {1389, 0}}, - { 40, { 0, 0}}, - { 34, { 0, 0}}, -}; - -/* Full_Case_Folding: 1264 bytes. */ - -int re_get_full_case_folding(RE_UINT32 ch, RE_UINT32* codepoints) { - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; - RE_FullCaseFolding* case_folding; - int count; - - f = ch >> 13; - code = ch ^ (f << 13); - pos = (RE_UINT32)re_full_case_folding_stage_1[f] << 5; - f = code >> 8; - code ^= f << 8; - pos = (RE_UINT32)re_full_case_folding_stage_2[pos + f] << 5; - f = code >> 3; - code ^= f << 3; - pos = (RE_UINT32)re_full_case_folding_stage_3[pos + f] << 3; - value = re_full_case_folding_stage_4[pos + code]; - - case_folding = &re_full_case_folding_table[value]; - - codepoints[0] = (RE_UINT32)((RE_INT32)ch + case_folding->diff); - count = 1; - - while (count < RE_MAX_FOLDED && case_folding->codepoints[count - 1] != 0) { - codepoints[count] = case_folding->codepoints[count - 1]; - ++count; - } - - return count; + 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 18, 61, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 79, 0, 1, 0, 1, 0, 1, 0, 0, 3, 0, 5, 0, 3, 0, 51, + 0, 3, 0, 5, 0, 3, 0, 10, 0, 100, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 81, 3, 0, 5, 0, 3, 0, 77, + 0, 93, 1, 0, 1, 0, 93, 10, 0, 96, 95, 5, 0, 0, 37, 94, + 92, 3, 0, 99, 101, 0, 102, 102, 1, 0, 0, 0, 99, 98, 0, 97, + 1, 0, 1, 0, 1, 0, 85, 10, 0, 86, 0, 0, 1, 0, 85, 17, + 0, 88, 87, 5, 0, 3, 0, 84, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 2, 3, 0, 9, 1, 0, 4, 5, 0, 3, 0, 17, + 0, 3, 0, 5, 0, 3, 0, 10, 0, 3, 0, 5, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 82, 2, 1, 0, 1, 0, 42, 33, 1, 0, 1, 0, 1, 0, 1, 0, + 90, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 158, 5, 0, 89, 157, 0, + 0, 3, 0, 91, 72, 70, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 57, + 0, 0, 0, 0, 0, 0, 25, 0, 20, 22, 20, 0, 30, 0, 32, 31, + 24, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 40, 40, 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, + 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 41, 45, 0, 0, 0, 12, 13, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 34, 27, 0, 0, 35, 30, 0, 10, 0, 8, 1, 0, 0, 55, 54, 54, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 10, 3, 0, 5, 0, 3, 0, 10, 0, 3, 0, 5, 0, 3, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 73, 73, 73, 73, 73, 73, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 161, 161, 161, 161, 161, 161, 0, 161, 0, 0, 0, 0, 0, 161, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 0, 0, + 105, 106, 107, 108, 109, 110, 111, 112, 178, 0, 0, 0, 0, 0, 0, 0, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 0, 0, 103, 103, 103, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 146, 142, 144, 141, 145, 75, 0, 0, 143, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 0, 0, + 139, 0, 140, 0, 137, 0, 138, 0, 0, 6, 0, 6, 0, 6, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 53, 53, 53, 53, 53, 53, 53, 56, 56, 56, 56, 56, 56, 56, 56, + 62, 62, 62, 62, 62, 62, 62, 62, 64, 64, 64, 64, 64, 64, 64, 64, + 67, 67, 67, 67, 67, 67, 67, 67, 69, 69, 69, 69, 69, 69, 69, 69, + 0, 0, 68, 113, 118, 0, 116, 114, 6, 6, 71, 71, 117, 0, 115, 0, + 0, 0, 63, 135, 129, 0, 134, 133, 65, 65, 66, 66, 136, 0, 0, 0, + 0, 0, 130, 128, 0, 0, 132, 131, 6, 6, 60, 60, 0, 0, 0, 0, + 0, 0, 123, 122, 121, 0, 120, 119, 6, 6, 59, 59, 7, 0, 0, 0, + 0, 0, 58, 125, 125, 0, 127, 126, 52, 52, 55, 55, 124, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 147, 148, 0, 0, 0, 0, + 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 43, 43, 46, 46, 47, 47, 46, 46, 43, 43, + 15, 15, 16, 16, 15, 15, 21, 21, 25, 25, 26, 26, 25, 25, 21, 21, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 150, 159, 151, 0, 0, 10, 0, 3, 0, 5, 0, 154, 152, 155, + 153, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 156, 155, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 3, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 5, 0, 176, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 5, 0, 170, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 168, 171, 169, 166, 167, 0, + 162, 164, 163, 104, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 36, 165, 177, 10, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 182, 183, 180, 181, 179, 185, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 189, 186, 187, 190, 188, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, + 23, 23, 23, 23, 23, 23, 23, 23, 28, 28, 28, 28, 28, 28, 28, 28, + 23, 23, 23, 23, 23, 23, 23, 23, 38, 38, 38, 38, 38, 38, 38, 38, + 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 44, 44, 44, 44, 44, 44, 44, 44, 38, 38, 38, 38, 38, 38, 38, 38, + 23, 23, 23, 23, 23, 23, 23, 23, 28, 28, 28, 28, 28, 28, 28, 28, + 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 19, 21, 21, 19, 19, 26, 26, 19, 19, 21, 21, 19, 19, 29, 29, + 19, 19, 21, 21, 19, 19, 26, 26, 19, 19, 21, 21, 19, 19, 39, 39, + 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static RE_FullCaseFolding re_full_folding_table_4[] = { + { 0, 0, 0}, + { 1, 0, 0}, + { 2, 0, 0}, + { 3, 0, 0}, + { 6, 0, 0}, + { 7, 0, 0}, + { 8, 0, 0}, + { 9, 0, 0}, + { 11, 0, 0}, + { 14, 0, 0}, + { 15, 0, 0}, + { 16, 0, 0}, + { 19, 0, 0}, + { 22, 0, 0}, + { 24, 0, 0}, + { 26, 0, 0}, + { 30, 0, 0}, + { 31, 0, 0}, + { 32, 0, 0}, + { 34, 0, 0}, + { 37, 0, 0}, + { 38, 0, 0}, + { 39, 0, 0}, + { 40, 0, 0}, + { 41, 776, 769}, + { 42, 0, 0}, + { 46, 0, 0}, + { 48, 0, 0}, + { 56, 0, 0}, + { 62, 0, 0}, + { 64, 0, 0}, + { 65, 0, 0}, + { 67, 0, 0}, + { 72, 0, 0}, + { 74, 0, 0}, + { 76, 0, 0}, + { 80, 0, 0}, + { 83, 0, 0}, + { 88, 0, 0}, + { 94, 0, 0}, + { 96, 0, 0}, + { 98, 0, 0}, + { 99, 0, 0}, + { 102, 0, 0}, + { 104, 0, 0}, + { 105, 0, 0}, + { 106, 0, 0}, + { 110, 0, 0}, + { 112, 0, 0}, + { 117, 776, 769}, + { 124, 0, 0}, + { 127, 0, 0}, + { 128, 0, 0}, + { 128, 953, 0}, + { 130, 0, 0}, + { 134, 0, 0}, + { 136, 953, 0}, + { 140, 0, 0}, + { 142, 953, 0}, + { 144, 0, 0}, + { 172, 0, 0}, + { 172, 115, 0}, + { 176, 953, 0}, + { 182, 953, 0}, + { 184, 953, 0}, + { 186, 0, 0}, + { 190, 0, 0}, + { 192, 953, 0}, + { 194, 953, 0}, + { 200, 953, 0}, + { 201, 0, 0}, + { 202, 0, 0}, + { 205, 0, 0}, + { 208, 0, 0}, + { 226, 1410, 0}, + { 250, 0, 0}, + { 252, 0, 0}, + { 268, 0, 0}, + { 345, 0, 0}, + { 345, 775, 0}, + { 376, 0, 0}, + { 391, 0, 0}, + { 410, 780, 0}, + { 777, 0, 0}, + { 805, 0, 0}, + { 806, 0, 0}, + { 810, 0, 0}, + { 825, 0, 0}, + { 827, 0, 0}, + { 935, 0, 0}, + { 958, 0, 0}, + { 963, 0, 0}, + { 971, 0, 0}, + { 978, 0, 0}, + { 982, 0, 0}, + { 989, 0, 0}, + { 991, 0, 0}, + { 1002, 0, 0}, + { 1007, 0, 0}, + { 1011, 0, 0}, + { 1013, 110, 0}, + { 1015, 0, 0}, + { 1023, 0, 0}, + { 3136, 0, 0}, + { 3296, 0, 0}, + { 6322, 0, 0}, + { 6325, 0, 0}, + { 6332, 0, 0}, + { 6338, 0, 0}, + { 6342, 0, 0}, + { 6343, 0, 0}, + { 6348, 0, 0}, + { 6372, 0, 0}, + { 7170, 953, 0}, + { 7174, 834, 953}, + { 7175, 0, 0}, + { 7175, 834, 0}, + { 7181, 953, 0}, + { 7192, 953, 0}, + { 7202, 776, 834}, + { 7203, 834, 0}, + { 7205, 787, 0}, + { 7206, 776, 769}, + { 7207, 776, 768}, + { 7221, 953, 0}, + { 7226, 953, 0}, + { 7230, 834, 953}, + { 7231, 834, 0}, + { 7274, 776, 769}, + { 7274, 953, 0}, + { 7275, 776, 768}, + { 7278, 776, 834}, + { 7279, 834, 0}, + { 7280, 834, 953}, + { 7281, 834, 0}, + { 7284, 953, 0}, + { 7291, 953, 0}, + { 7313, 787, 769}, + { 7315, 787, 834}, + { 7317, 787, 0}, + { 7319, 787, 768}, + { 7904, 778, 0}, + { 7907, 776, 0}, + { 7917, 115, 0}, + { 7919, 778, 0}, + { 7931, 702, 0}, + { 7934, 817, 0}, + { 8513, 0, 0}, + { 8654, 0, 0}, + { 8943, 0, 0}, + {11785, 0, 0}, + {11801, 0, 0}, + {11807, 0, 0}, + {11810, 0, 0}, + {11836, 0, 0}, + {11839, 0, 0}, + {11841, 0, 0}, + {11864, 0, 0}, + {11871, 0, 0}, + {12574, 0, 0}, + {15776, 0, 0}, + {15840, 0, 0}, + {42286, 0, 0}, + {42287, 0, 0}, + {42294, 0, 0}, + {42311, 0, 0}, + {42433, 0, 0}, + {42436, 0, 0}, + {42444, 0, 0}, + {42445, 0, 0}, + {42472, 0, 0}, + {42487, 0, 0}, + {47152, 0, 0}, + {47184, 0, 0}, + {47216, 0, 0}, + {47312, 0, 0}, + {47620, 0, 0}, + {47688, 0, 0}, + {47811, 0, 0}, + {64354, 102, 108}, + {64356, 108, 0}, + {64357, 102, 105}, + {64358, 102, 0}, + {64359, 105, 0}, + {64373, 116, 0}, + {64374, 116, 0}, + {65120, 1381, 0}, + {65121, 1387, 0}, + {65123, 1389, 0}, + {65127, 1398, 0}, + {65128, 1398, 0} +}; + +int re_get_full_case_folding(RE_UINT32 codepoint, RE_UINT32* folded) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + RE_UINT16* data; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_full_folding_table_1[field_2]; + v = re_full_folding_table_2[(v << 5) | field_1]; + v = re_full_folding_table_3[(v << 5) | field_0]; + + data = re_full_folding_table_4[v].data; + folded[0] = codepoint ^ data[0]; + + if (data[1] == 0) + return 1; + + folded[1] = data[1]; + + if (data[2] == 0) + return 2; + + folded[2] = data[2]; + + return 3; } /* Property function table. */ - RE_GetPropertyFunc re_get_property[] = { - re_get_general_category, - re_get_block, - re_get_script, - 0, - re_get_word_break, - re_get_grapheme_cluster_break, - re_get_sentence_break, - re_get_math, re_get_alphabetic, - re_get_lowercase, - re_get_uppercase, + re_get_alphanumeric, + re_get_any, + re_get_ascii_hex_digit, + re_get_bidi_class, + re_get_bidi_control, + re_get_bidi_mirrored, + re_get_blank, + re_get_block, + re_get_canonical_combining_class, re_get_cased, re_get_case_ignorable, - re_get_changes_when_lowercased, - re_get_changes_when_uppercased, - re_get_changes_when_titlecased, re_get_changes_when_casefolded, re_get_changes_when_casemapped, - re_get_id_start, - re_get_id_continue, - re_get_xid_start, - re_get_xid_continue, + re_get_changes_when_lowercased, + re_get_changes_when_titlecased, + re_get_changes_when_uppercased, + re_get_dash, + re_get_decomposition_type, re_get_default_ignorable_code_point, - re_get_grapheme_extend, + re_get_deprecated, + re_get_diacritic, + re_get_east_asian_width, + re_get_emoji, + re_get_emoji_component, + re_get_emoji_modifier, + re_get_emoji_modifier_base, + re_get_emoji_presentation, + re_get_extended_pictographic, + re_get_extender, + re_get_general_category, + re_get_graph, re_get_grapheme_base, + re_get_grapheme_cluster_break, + re_get_grapheme_extend, re_get_grapheme_link, - re_get_white_space, - re_get_bidi_control, - re_get_join_control, - re_get_dash, - re_get_hyphen, - re_get_quotation_mark, - re_get_terminal_punctuation, - re_get_other_math, + re_get_hangul_syllable_type, re_get_hex_digit, - re_get_ascii_hex_digit, - re_get_other_alphabetic, + re_get_hyphen, + re_get_id_continue, re_get_ideographic, - re_get_diacritic, - re_get_extender, - re_get_other_lowercase, - re_get_other_uppercase, - re_get_noncharacter_code_point, - re_get_other_grapheme_extend, re_get_ids_binary_operator, + re_get_id_start, re_get_ids_trinary_operator, - re_get_radical, - re_get_unified_ideograph, - re_get_other_default_ignorable_code_point, - re_get_deprecated, - re_get_soft_dotted, - re_get_logical_order_exception, - re_get_other_id_start, - re_get_other_id_continue, - re_get_sentence_terminal, - re_get_variation_selector, - re_get_pattern_white_space, - re_get_pattern_syntax, - re_get_prepended_concatenation_mark, - re_get_regional_indicator, - re_get_hangul_syllable_type, - re_get_bidi_class, - re_get_canonical_combining_class, - re_get_decomposition_type, - re_get_east_asian_width, + re_get_indic_positional_category, + re_get_indic_syllabic_category, + re_get_join_control, re_get_joining_group, re_get_joining_type, re_get_line_break, - re_get_numeric_type, - re_get_numeric_value, - re_get_bidi_mirrored, - re_get_indic_positional_category, - re_get_indic_syllabic_category, - re_get_emoji, - re_get_emoji_presentation, - re_get_emoji_modifier, - re_get_emoji_modifier_base, - re_get_emoji_component, - re_get_extended_pictographic, - re_get_nfd_quick_check, + re_get_logical_order_exception, + re_get_lowercase, + re_get_math, re_get_nfc_quick_check, - re_get_nfkd_quick_check, + re_get_nfd_quick_check, re_get_nfkc_quick_check, - re_get_alphanumeric, - re_get_any, - re_get_blank, - re_get_graph, - re_get_print, - re_get_word, - re_get_xdigit, - re_get_posix_digit, + re_get_nfkd_quick_check, + re_get_noncharacter_code_point, + re_get_numeric_type, + re_get_numeric_value, + re_get_other_alphabetic, + re_get_other_default_ignorable_code_point, + re_get_other_grapheme_extend, + re_get_other_id_continue, + re_get_other_id_start, + re_get_other_lowercase, + re_get_other_math, + re_get_other_uppercase, + re_get_pattern_syntax, + re_get_pattern_white_space, re_get_posix_alnum, + re_get_posix_digit, re_get_posix_punct, re_get_posix_xdigit, + re_get_prepended_concatenation_mark, + re_get_print, + re_get_quotation_mark, + re_get_radical, + re_get_regional_indicator, + re_get_script, + 0, + re_get_sentence_break, + re_get_sentence_terminal, + re_get_soft_dotted, + re_get_terminal_punctuation, + re_get_unified_ideograph, + re_get_uppercase, + re_get_variation_selector, + re_get_white_space, + re_get_word, + re_get_word_break, + re_get_xdigit, + re_get_xid_continue, + re_get_xid_start }; diff --git a/regex_3/_regex_unicode.h b/regex_3/_regex_unicode.h index 77e5764..ea8e48c 100644 --- a/regex_3/_regex_unicode.h +++ b/regex_3/_regex_unicode.h @@ -13,7 +13,6 @@ typedef unsigned char BOOL; #define RE_ASCII_MAX 0x7F #define RE_LOCALE_MAX 0xFF -#define RE_UNICODE_MAX 0x10FFFF #define RE_MAX_CASES 4 #define RE_MAX_FOLDED 3 @@ -31,13 +30,13 @@ typedef struct RE_PropertyValue { RE_UINT16 id; } RE_PropertyValue; -typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 ch); +typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 codepoint); -#define RE_PROP_GC 0x0 -#define RE_PROP_CASED 0xB -#define RE_PROP_UPPERCASE 0xA -#define RE_PROP_LOWERCASE 0x9 -#define RE_PROP_SCX 0x3 +#define RE_PROP_GC 0x1E +#define RE_PROP_CASED 0xA +#define RE_PROP_UPPERCASE 0x56 +#define RE_PROP_LOWERCASE 0x33 +#define RE_PROP_SCX 0x50 #define RE_PROP_C 30 #define RE_PROP_L 31 @@ -46,254 +45,254 @@ typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 ch); #define RE_PROP_P 34 #define RE_PROP_S 35 #define RE_PROP_Z 36 -#define RE_PROP_ASSIGNED 38 -#define RE_PROP_CASEDLETTER 37 +#define RE_PROP_ASSIGNED 37 +#define RE_PROP_CASEDLETTER 38 #define RE_PROP_CN 0 -#define RE_PROP_LU 1 -#define RE_PROP_LL 2 -#define RE_PROP_LT 3 -#define RE_PROP_LM 4 -#define RE_PROP_LO 5 -#define RE_PROP_MN 6 -#define RE_PROP_ME 7 -#define RE_PROP_MC 8 +#define RE_PROP_CC 1 +#define RE_PROP_ZS 2 +#define RE_PROP_PO 3 +#define RE_PROP_SC 4 +#define RE_PROP_PS 5 +#define RE_PROP_PE 6 +#define RE_PROP_SM 7 +#define RE_PROP_PD 8 #define RE_PROP_ND 9 -#define RE_PROP_NL 10 -#define RE_PROP_NO 11 -#define RE_PROP_ZS 12 -#define RE_PROP_ZL 13 -#define RE_PROP_ZP 14 -#define RE_PROP_CC 15 -#define RE_PROP_CF 16 -#define RE_PROP_CO 17 -#define RE_PROP_CS 18 -#define RE_PROP_PD 19 -#define RE_PROP_PS 20 -#define RE_PROP_PE 21 -#define RE_PROP_PC 22 -#define RE_PROP_PO 23 -#define RE_PROP_SM 24 -#define RE_PROP_SC 25 -#define RE_PROP_SK 26 -#define RE_PROP_SO 27 -#define RE_PROP_PI 28 -#define RE_PROP_PF 29 +#define RE_PROP_LU 10 +#define RE_PROP_SK 11 +#define RE_PROP_PC 12 +#define RE_PROP_LL 13 +#define RE_PROP_SO 14 +#define RE_PROP_LO 15 +#define RE_PROP_PI 16 +#define RE_PROP_CF 17 +#define RE_PROP_NO 18 +#define RE_PROP_PF 19 +#define RE_PROP_LT 20 +#define RE_PROP_LM 21 +#define RE_PROP_MN 22 +#define RE_PROP_ME 23 +#define RE_PROP_MC 24 +#define RE_PROP_NL 25 +#define RE_PROP_ZL 26 +#define RE_PROP_ZP 27 +#define RE_PROP_CS 28 +#define RE_PROP_CO 29 -#define RE_PROP_C_MASK 0x00078001 -#define RE_PROP_L_MASK 0x0000003E -#define RE_PROP_M_MASK 0x000001C0 -#define RE_PROP_N_MASK 0x00000E00 -#define RE_PROP_P_MASK 0x30F80000 -#define RE_PROP_S_MASK 0x0F000000 -#define RE_PROP_Z_MASK 0x00007000 +#define RE_PROP_C_MASK 0x30020003 +#define RE_PROP_L_MASK 0x0030A400 +#define RE_PROP_M_MASK 0x01C00000 +#define RE_PROP_N_MASK 0x02040200 +#define RE_PROP_P_MASK 0x00091168 +#define RE_PROP_S_MASK 0x00004890 +#define RE_PROP_Z_MASK 0x0C000004 -#define RE_PROP_ALNUM 0x530001 -#define RE_PROP_ALPHA 0x080001 -#define RE_PROP_ANY 0x540001 -#define RE_PROP_ASCII 0x010001 -#define RE_PROP_BLANK 0x550001 -#define RE_PROP_CNTRL 0x00000F -#define RE_PROP_DIGIT 0x000009 -#define RE_PROP_GRAPH 0x560001 -#define RE_PROP_LOWER 0x090001 -#define RE_PROP_PRINT 0x570001 -#define RE_PROP_SPACE 0x1A0001 -#define RE_PROP_UPPER 0x0A0001 -#define RE_PROP_WORD 0x580001 -#define RE_PROP_XDIGIT 0x590001 -#define RE_PROP_POSIX_ALNUM 0x5B0001 -#define RE_PROP_POSIX_DIGIT 0x5A0001 -#define RE_PROP_POSIX_PUNCT 0x5C0001 -#define RE_PROP_POSIX_XDIGIT 0x5D0001 +#define RE_PROP_ALNUM 0x010001 +#define RE_PROP_ALPHA 0x000001 +#define RE_PROP_ANY 0x020001 +#define RE_PROP_ASCII 0x080001 +#define RE_PROP_BLANK 0x070001 +#define RE_PROP_CNTRL 0x1E0001 +#define RE_PROP_DIGIT 0x1E0009 +#define RE_PROP_GRAPH 0x1F0001 +#define RE_PROP_LOWER 0x330001 +#define RE_PROP_PRINT 0x4B0001 +#define RE_PROP_SPACE 0x580001 +#define RE_PROP_UPPER 0x560001 +#define RE_PROP_WORD 0x590001 +#define RE_PROP_XDIGIT 0x5B0001 +#define RE_PROP_POSIX_ALNUM 0x460001 +#define RE_PROP_POSIX_DIGIT 0x470001 +#define RE_PROP_POSIX_PUNCT 0x480001 +#define RE_PROP_POSIX_XDIGIT 0x490001 #define RE_WBREAK_OTHER 0 -#define RE_WBREAK_DOUBLEQUOTE 1 -#define RE_WBREAK_SINGLEQUOTE 2 -#define RE_WBREAK_HEBREWLETTER 3 -#define RE_WBREAK_CR 4 -#define RE_WBREAK_LF 5 -#define RE_WBREAK_NEWLINE 6 -#define RE_WBREAK_EXTEND 7 -#define RE_WBREAK_REGIONALINDICATOR 8 -#define RE_WBREAK_FORMAT 9 -#define RE_WBREAK_KATAKANA 10 +#define RE_WBREAK_LF 1 +#define RE_WBREAK_NEWLINE 2 +#define RE_WBREAK_CR 3 +#define RE_WBREAK_WSEGSPACE 4 +#define RE_WBREAK_DOUBLEQUOTE 5 +#define RE_WBREAK_SINGLEQUOTE 6 +#define RE_WBREAK_MIDNUM 7 +#define RE_WBREAK_MIDNUMLET 8 +#define RE_WBREAK_NUMERIC 9 +#define RE_WBREAK_MIDLETTER 10 #define RE_WBREAK_ALETTER 11 -#define RE_WBREAK_MIDLETTER 12 -#define RE_WBREAK_MIDNUM 13 -#define RE_WBREAK_MIDNUMLET 14 -#define RE_WBREAK_NUMERIC 15 -#define RE_WBREAK_EXTENDNUMLET 16 -#define RE_WBREAK_ZWJ 17 -#define RE_WBREAK_WSEGSPACE 18 +#define RE_WBREAK_EXTENDNUMLET 12 +#define RE_WBREAK_FORMAT 13 +#define RE_WBREAK_EXTEND 14 +#define RE_WBREAK_HEBREWLETTER 15 +#define RE_WBREAK_ZWJ 16 +#define RE_WBREAK_KATAKANA 17 +#define RE_WBREAK_REGIONALINDICATOR 18 #define RE_WBREAK_EBASE 19 #define RE_WBREAK_EBASEGAZ 20 #define RE_WBREAK_EMODIFIER 21 #define RE_WBREAK_GLUEAFTERZWJ 22 #define RE_GBREAK_OTHER 0 -#define RE_GBREAK_PREPEND 1 -#define RE_GBREAK_CR 2 -#define RE_GBREAK_LF 3 -#define RE_GBREAK_CONTROL 4 -#define RE_GBREAK_EXTEND 5 -#define RE_GBREAK_REGIONALINDICATOR 6 -#define RE_GBREAK_SPACINGMARK 7 -#define RE_GBREAK_L 8 -#define RE_GBREAK_V 9 -#define RE_GBREAK_T 10 +#define RE_GBREAK_CONTROL 1 +#define RE_GBREAK_LF 2 +#define RE_GBREAK_CR 3 +#define RE_GBREAK_EXTEND 4 +#define RE_GBREAK_PREPEND 5 +#define RE_GBREAK_SPACINGMARK 6 +#define RE_GBREAK_L 7 +#define RE_GBREAK_V 8 +#define RE_GBREAK_T 9 +#define RE_GBREAK_ZWJ 10 #define RE_GBREAK_LV 11 #define RE_GBREAK_LVT 12 -#define RE_GBREAK_ZWJ 13 +#define RE_GBREAK_REGIONALINDICATOR 13 #define RE_GBREAK_EBASE 14 #define RE_GBREAK_EBASEGAZ 15 #define RE_GBREAK_EMODIFIER 16 #define RE_GBREAK_GLUEAFTERZWJ 17 #define RE_LBREAK_UNKNOWN 0 -#define RE_LBREAK_OPENPUNCTUATION 1 -#define RE_LBREAK_CLOSEPUNCTUATION 2 -#define RE_LBREAK_QUOTATION 3 -#define RE_LBREAK_GLUE 4 -#define RE_LBREAK_NONSTARTER 5 -#define RE_LBREAK_EXCLAMATION 6 -#define RE_LBREAK_BREAKSYMBOLS 7 -#define RE_LBREAK_INFIXNUMERIC 8 -#define RE_LBREAK_PREFIXNUMERIC 9 -#define RE_LBREAK_POSTFIXNUMERIC 10 -#define RE_LBREAK_NUMERIC 11 -#define RE_LBREAK_ALPHABETIC 12 -#define RE_LBREAK_IDEOGRAPHIC 13 -#define RE_LBREAK_INSEPARABLE 14 +#define RE_LBREAK_COMBININGMARK 1 +#define RE_LBREAK_BREAKAFTER 2 +#define RE_LBREAK_LINEFEED 3 +#define RE_LBREAK_MANDATORYBREAK 4 +#define RE_LBREAK_CARRIAGERETURN 5 +#define RE_LBREAK_SPACE 6 +#define RE_LBREAK_EXCLAMATION 7 +#define RE_LBREAK_QUOTATION 8 +#define RE_LBREAK_ALPHABETIC 9 +#define RE_LBREAK_PREFIXNUMERIC 10 +#define RE_LBREAK_POSTFIXNUMERIC 11 +#define RE_LBREAK_OPENPUNCTUATION 12 +#define RE_LBREAK_CLOSEPARENTHESIS 13 +#define RE_LBREAK_INFIXNUMERIC 14 #define RE_LBREAK_HYPHEN 15 -#define RE_LBREAK_COMBININGMARK 16 -#define RE_LBREAK_BREAKBEFORE 17 -#define RE_LBREAK_BREAKAFTER 18 -#define RE_LBREAK_SPACE 19 -#define RE_LBREAK_MANDATORYBREAK 20 -#define RE_LBREAK_CARRIAGERETURN 21 -#define RE_LBREAK_LINEFEED 22 -#define RE_LBREAK_CONTINGENTBREAK 23 +#define RE_LBREAK_BREAKSYMBOLS 16 +#define RE_LBREAK_NUMERIC 17 +#define RE_LBREAK_CLOSEPUNCTUATION 18 +#define RE_LBREAK_NEXTLINE 19 +#define RE_LBREAK_GLUE 20 +#define RE_LBREAK_AMBIGUOUS 21 +#define RE_LBREAK_BREAKBEFORE 22 +#define RE_LBREAK_HEBREWLETTER 23 #define RE_LBREAK_COMPLEXCONTEXT 24 -#define RE_LBREAK_AMBIGUOUS 25 -#define RE_LBREAK_BREAKBOTH 26 -#define RE_LBREAK_SURROGATE 27 -#define RE_LBREAK_ZWSPACE 28 -#define RE_LBREAK_NEXTLINE 29 -#define RE_LBREAK_WORDJOINER 30 -#define RE_LBREAK_JL 31 -#define RE_LBREAK_JV 32 -#define RE_LBREAK_JT 33 -#define RE_LBREAK_H2 34 -#define RE_LBREAK_H3 35 -#define RE_LBREAK_CLOSEPARENTHESIS 36 -#define RE_LBREAK_HEBREWLETTER 37 -#define RE_LBREAK_CONDITIONALJAPANESESTARTER 38 -#define RE_LBREAK_REGIONALINDICATOR 39 -#define RE_LBREAK_EBASE 40 -#define RE_LBREAK_EMODIFIER 41 -#define RE_LBREAK_ZWJ 42 +#define RE_LBREAK_JL 25 +#define RE_LBREAK_JV 26 +#define RE_LBREAK_JT 27 +#define RE_LBREAK_NONSTARTER 28 +#define RE_LBREAK_ZWSPACE 29 +#define RE_LBREAK_ZWJ 30 +#define RE_LBREAK_BREAKBOTH 31 +#define RE_LBREAK_INSEPARABLE 32 +#define RE_LBREAK_WORDJOINER 33 +#define RE_LBREAK_IDEOGRAPHIC 34 +#define RE_LBREAK_EBASE 35 +#define RE_LBREAK_CONDITIONALJAPANESESTARTER 36 +#define RE_LBREAK_H2 37 +#define RE_LBREAK_H3 38 +#define RE_LBREAK_SURROGATE 39 +#define RE_LBREAK_CONTINGENTBREAK 40 +#define RE_LBREAK_REGIONALINDICATOR 41 +#define RE_LBREAK_EMODIFIER 42 -extern char* re_strings[1425]; -extern RE_Property re_properties[168]; -extern RE_PropertyValue re_property_values[1568]; +extern char* re_strings[1447]; +extern RE_Property re_properties[173]; +extern RE_PropertyValue re_property_values[1589]; extern RE_UINT16 re_expand_on_folding[104]; extern RE_GetPropertyFunc re_get_property[94]; -RE_UINT32 re_get_general_category(RE_UINT32 ch); -RE_UINT32 re_get_block(RE_UINT32 ch); -RE_UINT32 re_get_script(RE_UINT32 ch); -int re_get_script_extensions(RE_UINT32 ch, RE_UINT8* scripts); -RE_UINT32 re_get_word_break(RE_UINT32 ch); -RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 ch); -RE_UINT32 re_get_sentence_break(RE_UINT32 ch); -RE_UINT32 re_get_math(RE_UINT32 ch); -RE_UINT32 re_get_alphabetic(RE_UINT32 ch); -RE_UINT32 re_get_lowercase(RE_UINT32 ch); -RE_UINT32 re_get_uppercase(RE_UINT32 ch); -RE_UINT32 re_get_cased(RE_UINT32 ch); -RE_UINT32 re_get_case_ignorable(RE_UINT32 ch); -RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 ch); -RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 ch); -RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 ch); -RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 ch); -RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 ch); -RE_UINT32 re_get_id_start(RE_UINT32 ch); -RE_UINT32 re_get_id_continue(RE_UINT32 ch); -RE_UINT32 re_get_xid_start(RE_UINT32 ch); -RE_UINT32 re_get_xid_continue(RE_UINT32 ch); -RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 ch); -RE_UINT32 re_get_grapheme_extend(RE_UINT32 ch); -RE_UINT32 re_get_grapheme_base(RE_UINT32 ch); -RE_UINT32 re_get_grapheme_link(RE_UINT32 ch); -RE_UINT32 re_get_white_space(RE_UINT32 ch); -RE_UINT32 re_get_bidi_control(RE_UINT32 ch); -RE_UINT32 re_get_join_control(RE_UINT32 ch); -RE_UINT32 re_get_dash(RE_UINT32 ch); -RE_UINT32 re_get_hyphen(RE_UINT32 ch); -RE_UINT32 re_get_quotation_mark(RE_UINT32 ch); -RE_UINT32 re_get_terminal_punctuation(RE_UINT32 ch); -RE_UINT32 re_get_other_math(RE_UINT32 ch); -RE_UINT32 re_get_hex_digit(RE_UINT32 ch); -RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 ch); -RE_UINT32 re_get_other_alphabetic(RE_UINT32 ch); -RE_UINT32 re_get_ideographic(RE_UINT32 ch); -RE_UINT32 re_get_diacritic(RE_UINT32 ch); -RE_UINT32 re_get_extender(RE_UINT32 ch); -RE_UINT32 re_get_other_lowercase(RE_UINT32 ch); -RE_UINT32 re_get_other_uppercase(RE_UINT32 ch); -RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 ch); -RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 ch); -RE_UINT32 re_get_ids_binary_operator(RE_UINT32 ch); -RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 ch); -RE_UINT32 re_get_radical(RE_UINT32 ch); -RE_UINT32 re_get_unified_ideograph(RE_UINT32 ch); -RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 ch); -RE_UINT32 re_get_deprecated(RE_UINT32 ch); -RE_UINT32 re_get_soft_dotted(RE_UINT32 ch); -RE_UINT32 re_get_logical_order_exception(RE_UINT32 ch); -RE_UINT32 re_get_other_id_start(RE_UINT32 ch); -RE_UINT32 re_get_other_id_continue(RE_UINT32 ch); -RE_UINT32 re_get_sentence_terminal(RE_UINT32 ch); -RE_UINT32 re_get_variation_selector(RE_UINT32 ch); -RE_UINT32 re_get_pattern_white_space(RE_UINT32 ch); -RE_UINT32 re_get_pattern_syntax(RE_UINT32 ch); -RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 ch); -RE_UINT32 re_get_regional_indicator(RE_UINT32 ch); -RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 ch); -RE_UINT32 re_get_bidi_class(RE_UINT32 ch); -RE_UINT32 re_get_canonical_combining_class(RE_UINT32 ch); -RE_UINT32 re_get_decomposition_type(RE_UINT32 ch); -RE_UINT32 re_get_east_asian_width(RE_UINT32 ch); -RE_UINT32 re_get_joining_group(RE_UINT32 ch); -RE_UINT32 re_get_joining_type(RE_UINT32 ch); -RE_UINT32 re_get_line_break(RE_UINT32 ch); -RE_UINT32 re_get_numeric_type(RE_UINT32 ch); -RE_UINT32 re_get_numeric_value(RE_UINT32 ch); -RE_UINT32 re_get_bidi_mirrored(RE_UINT32 ch); -RE_UINT32 re_get_indic_positional_category(RE_UINT32 ch); -RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 ch); -RE_UINT32 re_get_emoji(RE_UINT32 ch); -RE_UINT32 re_get_emoji_presentation(RE_UINT32 ch); -RE_UINT32 re_get_emoji_modifier(RE_UINT32 ch); -RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 ch); -RE_UINT32 re_get_emoji_component(RE_UINT32 ch); -RE_UINT32 re_get_extended_pictographic(RE_UINT32 ch); -RE_UINT32 re_get_nfd_quick_check(RE_UINT32 ch); -RE_UINT32 re_get_nfc_quick_check(RE_UINT32 ch); -RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 ch); -RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 ch); -RE_UINT32 re_get_alphanumeric(RE_UINT32 ch); -RE_UINT32 re_get_any(RE_UINT32 ch); -RE_UINT32 re_get_blank(RE_UINT32 ch); -RE_UINT32 re_get_graph(RE_UINT32 ch); -RE_UINT32 re_get_print(RE_UINT32 ch); -RE_UINT32 re_get_word(RE_UINT32 ch); -RE_UINT32 re_get_xdigit(RE_UINT32 ch); -RE_UINT32 re_get_posix_digit(RE_UINT32 ch); -RE_UINT32 re_get_posix_alnum(RE_UINT32 ch); -RE_UINT32 re_get_posix_punct(RE_UINT32 ch); -RE_UINT32 re_get_posix_xdigit(RE_UINT32 ch); -int re_get_all_cases(RE_UINT32 ch, RE_UINT32* codepoints); -RE_UINT32 re_get_simple_case_folding(RE_UINT32 ch); -int re_get_full_case_folding(RE_UINT32 ch, RE_UINT32* codepoints); +RE_UINT32 re_get_alphabetic(RE_UINT32 codepoint); +RE_UINT32 re_get_alphanumeric(RE_UINT32 codepoint); +RE_UINT32 re_get_any(RE_UINT32 codepoint); +RE_UINT32 re_get_ascii_hex_digit(RE_UINT32 codepoint); +RE_UINT32 re_get_bidi_class(RE_UINT32 codepoint); +RE_UINT32 re_get_bidi_control(RE_UINT32 codepoint); +RE_UINT32 re_get_bidi_mirrored(RE_UINT32 codepoint); +RE_UINT32 re_get_blank(RE_UINT32 codepoint); +RE_UINT32 re_get_block(RE_UINT32 codepoint); +RE_UINT32 re_get_canonical_combining_class(RE_UINT32 codepoint); +RE_UINT32 re_get_cased(RE_UINT32 codepoint); +RE_UINT32 re_get_case_ignorable(RE_UINT32 codepoint); +RE_UINT32 re_get_changes_when_casefolded(RE_UINT32 codepoint); +RE_UINT32 re_get_changes_when_casemapped(RE_UINT32 codepoint); +RE_UINT32 re_get_changes_when_lowercased(RE_UINT32 codepoint); +RE_UINT32 re_get_changes_when_titlecased(RE_UINT32 codepoint); +RE_UINT32 re_get_changes_when_uppercased(RE_UINT32 codepoint); +RE_UINT32 re_get_dash(RE_UINT32 codepoint); +RE_UINT32 re_get_decomposition_type(RE_UINT32 codepoint); +RE_UINT32 re_get_default_ignorable_code_point(RE_UINT32 codepoint); +RE_UINT32 re_get_deprecated(RE_UINT32 codepoint); +RE_UINT32 re_get_diacritic(RE_UINT32 codepoint); +RE_UINT32 re_get_east_asian_width(RE_UINT32 codepoint); +RE_UINT32 re_get_emoji(RE_UINT32 codepoint); +RE_UINT32 re_get_emoji_component(RE_UINT32 codepoint); +RE_UINT32 re_get_emoji_modifier(RE_UINT32 codepoint); +RE_UINT32 re_get_emoji_modifier_base(RE_UINT32 codepoint); +RE_UINT32 re_get_emoji_presentation(RE_UINT32 codepoint); +RE_UINT32 re_get_extended_pictographic(RE_UINT32 codepoint); +RE_UINT32 re_get_extender(RE_UINT32 codepoint); +RE_UINT32 re_get_general_category(RE_UINT32 codepoint); +RE_UINT32 re_get_graph(RE_UINT32 codepoint); +RE_UINT32 re_get_grapheme_base(RE_UINT32 codepoint); +RE_UINT32 re_get_grapheme_cluster_break(RE_UINT32 codepoint); +RE_UINT32 re_get_grapheme_extend(RE_UINT32 codepoint); +RE_UINT32 re_get_grapheme_link(RE_UINT32 codepoint); +RE_UINT32 re_get_hangul_syllable_type(RE_UINT32 codepoint); +RE_UINT32 re_get_hex_digit(RE_UINT32 codepoint); +RE_UINT32 re_get_hyphen(RE_UINT32 codepoint); +RE_UINT32 re_get_id_continue(RE_UINT32 codepoint); +RE_UINT32 re_get_ideographic(RE_UINT32 codepoint); +RE_UINT32 re_get_ids_binary_operator(RE_UINT32 codepoint); +RE_UINT32 re_get_id_start(RE_UINT32 codepoint); +RE_UINT32 re_get_ids_trinary_operator(RE_UINT32 codepoint); +RE_UINT32 re_get_indic_positional_category(RE_UINT32 codepoint); +RE_UINT32 re_get_indic_syllabic_category(RE_UINT32 codepoint); +RE_UINT32 re_get_join_control(RE_UINT32 codepoint); +RE_UINT32 re_get_joining_group(RE_UINT32 codepoint); +RE_UINT32 re_get_joining_type(RE_UINT32 codepoint); +RE_UINT32 re_get_line_break(RE_UINT32 codepoint); +RE_UINT32 re_get_logical_order_exception(RE_UINT32 codepoint); +RE_UINT32 re_get_lowercase(RE_UINT32 codepoint); +RE_UINT32 re_get_math(RE_UINT32 codepoint); +RE_UINT32 re_get_nfc_quick_check(RE_UINT32 codepoint); +RE_UINT32 re_get_nfd_quick_check(RE_UINT32 codepoint); +RE_UINT32 re_get_nfkc_quick_check(RE_UINT32 codepoint); +RE_UINT32 re_get_nfkd_quick_check(RE_UINT32 codepoint); +RE_UINT32 re_get_noncharacter_code_point(RE_UINT32 codepoint); +RE_UINT32 re_get_numeric_type(RE_UINT32 codepoint); +RE_UINT32 re_get_numeric_value(RE_UINT32 codepoint); +RE_UINT32 re_get_other_alphabetic(RE_UINT32 codepoint); +RE_UINT32 re_get_other_default_ignorable_code_point(RE_UINT32 codepoint); +RE_UINT32 re_get_other_grapheme_extend(RE_UINT32 codepoint); +RE_UINT32 re_get_other_id_continue(RE_UINT32 codepoint); +RE_UINT32 re_get_other_id_start(RE_UINT32 codepoint); +RE_UINT32 re_get_other_lowercase(RE_UINT32 codepoint); +RE_UINT32 re_get_other_math(RE_UINT32 codepoint); +RE_UINT32 re_get_other_uppercase(RE_UINT32 codepoint); +RE_UINT32 re_get_pattern_syntax(RE_UINT32 codepoint); +RE_UINT32 re_get_pattern_white_space(RE_UINT32 codepoint); +RE_UINT32 re_get_posix_alnum(RE_UINT32 codepoint); +RE_UINT32 re_get_posix_digit(RE_UINT32 codepoint); +RE_UINT32 re_get_posix_punct(RE_UINT32 codepoint); +RE_UINT32 re_get_posix_xdigit(RE_UINT32 codepoint); +RE_UINT32 re_get_prepended_concatenation_mark(RE_UINT32 codepoint); +RE_UINT32 re_get_print(RE_UINT32 codepoint); +RE_UINT32 re_get_quotation_mark(RE_UINT32 codepoint); +RE_UINT32 re_get_radical(RE_UINT32 codepoint); +RE_UINT32 re_get_regional_indicator(RE_UINT32 codepoint); +RE_UINT32 re_get_script(RE_UINT32 codepoint); +int re_get_script_extensions(RE_UINT32 codepoint, RE_UINT8* scripts); +RE_UINT32 re_get_sentence_break(RE_UINT32 codepoint); +RE_UINT32 re_get_sentence_terminal(RE_UINT32 codepoint); +RE_UINT32 re_get_soft_dotted(RE_UINT32 codepoint); +RE_UINT32 re_get_terminal_punctuation(RE_UINT32 codepoint); +RE_UINT32 re_get_unified_ideograph(RE_UINT32 codepoint); +RE_UINT32 re_get_uppercase(RE_UINT32 codepoint); +RE_UINT32 re_get_variation_selector(RE_UINT32 codepoint); +RE_UINT32 re_get_white_space(RE_UINT32 codepoint); +RE_UINT32 re_get_word(RE_UINT32 codepoint); +RE_UINT32 re_get_word_break(RE_UINT32 codepoint); +RE_UINT32 re_get_xdigit(RE_UINT32 codepoint); +RE_UINT32 re_get_xid_continue(RE_UINT32 codepoint); +RE_UINT32 re_get_xid_start(RE_UINT32 codepoint); +int re_get_all_cases(RE_UINT32 codepoint, RE_UINT32* cases); +RE_UINT32 re_get_simple_case_folding(RE_UINT32 codepoint); +int re_get_full_case_folding(RE_UINT32 codepoint, RE_UINT32* folded); diff --git a/regex_3/regex/regex.py b/regex_3/regex.py similarity index 91% rename from regex_3/regex/regex.py rename to regex_3/regex.py index 5b28eda..a280ab8 100644 --- a/regex_3/regex/regex.py +++ b/regex_3/regex.py @@ -136,6 +136,7 @@ second character. \g<name> Matches the text matched by the group named name. \G Matches the empty string, but only at the position where the search started. + \h Matches horizontal whitespace. \K Keeps only what follows for the entire match. \L<name> Named list. The list is provided as a keyword argument. \m Matches the empty string, but only at the start of a word. @@ -239,54 +240,54 @@ __all__ = ["compile", "DEFAULT_VERSION", "escape", "findall", "finditer", "T", "TEMPLATE", "U", "UNICODE", "V0", "VERSION0", "V1", "VERSION1", "X", "VERBOSE", "W", "WORD", "error", "Regex", "__version__", "__doc__"] -__version__ = "2.5.64" +__version__ = "2.5.83" # -------------------------------------------------------------------- # Public interface. def match(pattern, string, flags=0, pos=None, endpos=None, partial=False, - concurrent=None, timeout=None, **kwargs): + concurrent=None, timeout=None, ignore_unused=False, **kwargs): """Try to apply the pattern at the start of the string, returning a match object, or None if no match was found.""" - return _compile(pattern, flags, kwargs).match(string, pos, endpos, - concurrent, partial, timeout) + return _compile(pattern, flags, ignore_unused, kwargs).match(string, pos, + endpos, concurrent, partial, timeout) def fullmatch(pattern, string, flags=0, pos=None, endpos=None, partial=False, - concurrent=None, timeout=None, **kwargs): + concurrent=None, timeout=None, ignore_unused=False, **kwargs): """Try to apply the pattern against all of the string, returning a match object, or None if no match was found.""" - return _compile(pattern, flags, kwargs).fullmatch(string, pos, endpos, - concurrent, partial, timeout) + return _compile(pattern, flags, ignore_unused, kwargs).fullmatch(string, + pos, endpos, concurrent, partial, timeout) def search(pattern, string, flags=0, pos=None, endpos=None, partial=False, - concurrent=None, timeout=None, **kwargs): + concurrent=None, timeout=None, ignore_unused=False, **kwargs): """Search through string looking for a match to the pattern, returning a match object, or None if no match was found.""" - return _compile(pattern, flags, kwargs).search(string, pos, endpos, - concurrent, partial, timeout) + return _compile(pattern, flags, ignore_unused, kwargs).search(string, pos, + endpos, concurrent, partial, timeout) def sub(pattern, repl, string, count=0, flags=0, pos=None, endpos=None, - concurrent=None, timeout=None, **kwargs): + concurrent=None, timeout=None, ignore_unused=False, **kwargs): """Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in string by the replacement repl. repl can be either a string or a callable; if a string, backslash escapes in it are processed; if a callable, it's passed the match object and must return a replacement string to be used.""" - return _compile(pattern, flags, kwargs).sub(repl, string, count, pos, - endpos, concurrent, timeout) + return _compile(pattern, flags, ignore_unused, kwargs).sub(repl, string, + count, pos, endpos, concurrent, timeout) def subf(pattern, format, string, count=0, flags=0, pos=None, endpos=None, - concurrent=None, timeout=None, **kwargs): + concurrent=None, timeout=None, ignore_unused=False, **kwargs): """Return the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in string by the replacement format. format can be either a string or a callable; if a string, it's treated as a format string; if a callable, it's passed the match object and must return a replacement string to be used.""" - return _compile(pattern, flags, kwargs).subf(format, string, count, pos, - endpos, concurrent, timeout) + return _compile(pattern, flags, ignore_unused, kwargs).subf(format, string, + count, pos, endpos, concurrent, timeout) def subn(pattern, repl, string, count=0, flags=0, pos=None, endpos=None, - concurrent=None, timeout=None, **kwargs): + concurrent=None, timeout=None, ignore_unused=False, **kwargs): """Return a 2-tuple containing (new_string, number). new_string is the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in the source string by the @@ -294,11 +295,11 @@ def subn(pattern, repl, string, count=0, flags=0, pos=None, endpos=None, can be either a string or a callable; if a string, backslash escapes in it are processed; if a callable, it's passed the match object and must return a replacement string to be used.""" - return _compile(pattern, flags, kwargs).subn(repl, string, count, pos, - endpos, concurrent, timeout) + return _compile(pattern, flags, ignore_unused, kwargs).subn(repl, string, + count, pos, endpos, concurrent, timeout) def subfn(pattern, format, string, count=0, flags=0, pos=None, endpos=None, - concurrent=None, timeout=None, **kwargs): + concurrent=None, timeout=None, ignore_unused=False, **kwargs): """Return a 2-tuple containing (new_string, number). new_string is the string obtained by replacing the leftmost (or rightmost with a reverse pattern) non-overlapping occurrences of the pattern in the source string by the @@ -306,45 +307,46 @@ def subfn(pattern, format, string, count=0, flags=0, pos=None, endpos=None, can be either a string or a callable; if a string, it's treated as a format string; if a callable, it's passed the match object and must return a replacement string to be used.""" - return _compile(pattern, flags, kwargs).subfn(format, string, count, pos, - endpos, concurrent, timeout) + return _compile(pattern, flags, ignore_unused, kwargs).subfn(format, string, + count, pos, endpos, concurrent, timeout) def split(pattern, string, maxsplit=0, flags=0, concurrent=None, timeout=None, - **kwargs): + ignore_unused=False, **kwargs): """Split the source string by the occurrences of the pattern, returning a list containing the resulting substrings. If capturing parentheses are used in pattern, then the text of all groups in the pattern are also returned as part of the resulting list. If maxsplit is nonzero, at most maxsplit splits occur, and the remainder of the string is returned as the final element of the list.""" - return _compile(pattern, flags, kwargs).split(string, maxsplit, concurrent, timeout) + return _compile(pattern, flags, ignore_unused, kwargs).split(string, + maxsplit, concurrent, timeout) def splititer(pattern, string, maxsplit=0, flags=0, concurrent=None, timeout=None, - **kwargs): + ignore_unused=False, **kwargs): "Return an iterator yielding the parts of a split string." - return _compile(pattern, flags, kwargs).splititer(string, maxsplit, - concurrent, timeout) + return _compile(pattern, flags, ignore_unused, kwargs).splititer(string, + maxsplit, concurrent, timeout) def findall(pattern, string, flags=0, pos=None, endpos=None, overlapped=False, - concurrent=None, timeout=None, **kwargs): + concurrent=None, timeout=None, ignore_unused=False, **kwargs): """Return a list of all matches in the string. The matches may be overlapped if overlapped is True. If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result.""" - return _compile(pattern, flags, kwargs).findall(string, pos, endpos, - overlapped, concurrent, timeout) + return _compile(pattern, flags, ignore_unused, kwargs).findall(string, pos, + endpos, overlapped, concurrent, timeout) def finditer(pattern, string, flags=0, pos=None, endpos=None, overlapped=False, - partial=False, concurrent=None, timeout=None, **kwargs): + partial=False, concurrent=None, timeout=None, ignore_unused=False, **kwargs): """Return an iterator over all matches in the string. The matches may be overlapped if overlapped is True. For each match, the iterator returns a match object. Empty matches are included in the result.""" - return _compile(pattern, flags, kwargs).finditer(string, pos, endpos, - overlapped, concurrent, partial, timeout) + return _compile(pattern, flags, ignore_unused, kwargs).finditer(string, pos, + endpos, overlapped, concurrent, partial, timeout) -def compile(pattern, flags=0, **kwargs): +def compile(pattern, flags=0, ignore_unused=False, **kwargs): "Compile a regular expression pattern, returning a pattern object." - return _compile(pattern, flags, kwargs) + return _compile(pattern, flags, ignore_unused, kwargs) def purge(): "Clear the regular expression cache" @@ -353,7 +355,7 @@ def purge(): def template(pattern, flags=0): "Compile a template pattern, returning a pattern object." - return _compile(pattern, flags | TEMPLATE) + return _compile(pattern, flags | TEMPLATE, False, {}) def escape(pattern, special_only=True, literal_spaces=False): """Escape a string for use as a literal in a pattern. If special_only is @@ -431,7 +433,7 @@ _locale_sensitive = {} _MAXCACHE = 500 _MAXREPCACHE = 500 -def _compile(pattern, flags=0, kwargs={}): +def _compile(pattern, flags, ignore_unused, kwargs): "Compiles a regular expression to a PatternObject." global DEFAULT_VERSION @@ -577,6 +579,12 @@ def _compile(pattern, flags=0, kwargs={}): named_list_indexes[index] = items args_needed.add((name, values)) + # Any unused keyword arguments, possibly resulting from a typo? + unused_kwargs = set(kwargs) - set(named_lists) + if unused_kwargs and not ignore_unused: + any_one = next(iter(unused_kwargs)) + raise ValueError('unused keyword argument {!a}'.format(any_one)) + # Check the features of the groups. _check_group_features(info, parsed) @@ -694,8 +702,8 @@ def _compile_replacement_helper(pattern, template): return compiled # We define Pattern here after all the support objects have been defined. -Pattern = type(_compile('', 0, {})) -Match = type(_compile('', 0).match('')) +Pattern = type(_compile('', 0, False, {})) +Match = type(_compile('', 0, False, {}).match('')) # We'll define an alias for the 'compile' function so that the repr of a # pattern object is eval-able. diff --git a/regex_3/regex/test/__init__.py b/regex_3/regex/test/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/regex_3/regex/test/test_regex.py b/regex_3/test_regex.py similarity index 97% rename from regex_3/regex/test/test_regex.py rename to regex_3/test_regex.py index 0b0e3ff..245c042 100644 --- a/regex_3/regex/test/test_regex.py +++ b/regex_3/test_regex.py @@ -1,11 +1,10 @@ -import regex -import string from weakref import proxy -import unittest import copy import pickle -from test.support import run_unittest +import regex +import string import sys +import unittest # String subclasses for issue 18468. class StrSubclass(str): @@ -1802,8 +1801,8 @@ class RegexTests(unittest.TestCase): ascii('\a\b\f\n\r\t\v')), (r'[\a][\b][\f][\n][\r][\t][\v]', '\a\b\f\n\r\t\v', '0', ascii('\a\b\f\n\r\t\v')), - (r'\c\e\g\h\i\j\k\o\p\q\y\z', 'ceghijkopqyz', '0', - ascii('ceghijkopqyz')), + (r'\c\e\g\i\j\k\o\p\q\y\z', 'cegijkopqyz', '0', + ascii('cegijkopqyz')), (r'\xff', '\377', '0', ascii(chr(255))), # New \x semantics. @@ -4188,103 +4187,142 @@ thing ['\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466']) # Hg issue 320: Abnormal performance - self.assertEquals(bool(regex.search(r'(?=a)a', 'a')), True) - self.assertEquals(bool(regex.search(r'(?!b)a', 'a')), True) + self.assertEqual(bool(regex.search(r'(?=a)a', 'a')), True) + self.assertEqual(bool(regex.search(r'(?!b)a', 'a')), True) # Hg issue 327: .fullmatch() causes MemoryError - self.assertEquals(regex.fullmatch(r'((\d)*?)*?', '123').span(), (0, 3)) + self.assertEqual(regex.fullmatch(r'((\d)*?)*?', '123').span(), (0, 3)) # Hg issue 329: Wrong group matches when question mark quantifier is used within a look behind - self.assertEquals(regex.search(r'''(?(DEFINE)(?<mydef>(?<wrong>THIS_SHOULD_NOT_MATCHx?)|(?<right>right))).*(?<=(?&mydef).*)''', + self.assertEqual(regex.search(r'''(?(DEFINE)(?<mydef>(?<wrong>THIS_SHOULD_NOT_MATCHx?)|(?<right>right))).*(?<=(?&mydef).*)''', 'x right').capturesdict(), {'mydef': ['right'], 'wrong': [], 'right': ['right']}) + # Hg issue 353: fuzzy changes negative indexes + self.assertEqual(regex.search(r'(?be)(AGTGTTCCCCGCGCCAGCGGGGATAAACCG){s<=5,i<=5,d<=5,s+i+d<=10}', + 'TTCCCCGCGCCAGCGGGGATAAACCG').fuzzy_changes, ([], [], [0, 1, 3, 5])) + + # Git issue 364: Contradictory values in fuzzy_counts and fuzzy_changes + self.assertEqual(regex.match(r'(?:bc){e}', 'c').fuzzy_counts, (1, 0, + 1)) + self.assertEqual(regex.match(r'(?:bc){e}', 'c').fuzzy_changes, ([0], + [], [1])) + self.assertEqual(regex.match(r'(?e)(?:bc){e}', 'c').fuzzy_counts, (0, + 0, 1)) + self.assertEqual(regex.match(r'(?e)(?:bc){e}', 'c').fuzzy_changes, + ([], [], [0])) + self.assertEqual(regex.match(r'(?b)(?:bc){e}', 'c').fuzzy_counts, (0, + 0, 1)) + self.assertEqual(regex.match(r'(?b)(?:bc){e}', 'c').fuzzy_changes, + ([], [], [0])) + + # Git issue 370: Confusions about Fuzzy matching behavior + self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){e}', + '$ 10,112.111.12').fuzzy_counts, (6, 0, 5)) + self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=1}', + '$ 10,112.111.12').fuzzy_counts, (1, 0, 0)) + self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=1,i<=1,d<=1}', + '$ 10,112.111.12').fuzzy_counts, (1, 0, 0)) + self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=3}', + '$ 10,1a2.111.12').fuzzy_counts, (2, 0, 0)) + self.assertEqual(regex.match('(?e)(?:^(\\$ )?\\d{1,3}(,\\d{3})*(\\.\\d{2})$){s<=2}', + '$ 10,1a2.111.12').fuzzy_counts, (2, 0, 0)) + + self.assertEqual(regex.fullmatch(r'(?e)(?:0?,0(?:,0)?){s<=1,d<=1}', + ',0;0').fuzzy_counts, (1, 0, 0)) + self.assertEqual(regex.fullmatch(r'(?e)(?:0??,0(?:,0)?){s<=1,d<=1}', + ',0;0').fuzzy_counts, (1, 0, 0)) + + # Git issue 371: Specifying character set when fuzzy-matching allows characters not in the set + self.assertEqual(regex.search(r"\b(?e)(?:\d{6,20}){i<=5:[\-\\\/]}\b", + "cat dog starting at 00:01132.000. hello world"), None) + def test_fuzzy_ext(self): - self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', 'e')), + self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', 'e')), True) - self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'e')), + self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'e')), True) - self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', '-')), + self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', '-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', '-')), + self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', '-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'ae')), + self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'ae')), True) - self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', 'ae')), True) - self.assertEquals(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'a-')), + self.assertEqual(bool(regex.fullmatch(r'(?:a){e<=1:[a-z]}', 'a-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?r)(?:a){e<=1:[a-z]}', 'a-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'ae')), + self.assertEqual(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'ae')), True) - self.assertEquals(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}', 'ae')), True) - self.assertEquals(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'a-')), + self.assertEqual(bool(regex.fullmatch(r'(?:ab){e<=1:[a-z]}', 'a-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?r)(?:ab){e<=1:[a-z]}', 'a-')), False) - self.assertEquals(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'ae')), + self.assertEqual(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'ae')), True) - self.assertEquals(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)', + self.assertEqual(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)', 'ea')), True) - self.assertEquals(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'a-')), + self.assertEqual(bool(regex.fullmatch(r'(a)\1{e<=1:[a-z]}', 'a-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)', + self.assertEqual(bool(regex.fullmatch(r'(?r)\1{e<=1:[a-z]}(a)', '-a')), False) - self.assertEquals(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', 'ts')), True) - self.assertEquals(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', 'st')), True) - self.assertEquals(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', 'st')), True) - self.assertEquals(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', 'ts')), True) - self.assertEquals(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', '-s')), False) - self.assertEquals(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?fiu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', 's-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', 's-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?firu)(?:\N{LATIN SMALL LETTER SHARP S}){e<=1:[a-z]}', '-s')), False) - self.assertEquals(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', 'ssst')), True) - self.assertEquals(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', 'ssts')), True) - self.assertEquals(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})', + self.assertEqual(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})', 'stss')), True) - self.assertEquals(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})', + self.assertEqual(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(\N{LATIN SMALL LETTER SHARP S})', 'tsss')), True) - self.assertEquals(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', 'ss-s')), False) - self.assertEquals(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?fiu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', 'sss-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', '-s')), False) - self.assertEquals(bool(regex.fullmatch(r'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?firu)(\N{LATIN SMALL LETTER SHARP S})\1{e<=1:[a-z]}', 's-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}', '\N{LATIN SMALL LETTER SHARP S}ts')), True) - self.assertEquals(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}', '\N{LATIN SMALL LETTER SHARP S}st')), True) - self.assertEquals(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(ss)', + self.assertEqual(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(ss)', 'st\N{LATIN SMALL LETTER SHARP S}')), True) - self.assertEquals(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(ss)', + self.assertEqual(bool(regex.fullmatch(r'(?firu)\1{e<=1:[a-z]}(ss)', 'ts\N{LATIN SMALL LETTER SHARP S}')), True) - self.assertEquals(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}', '\N{LATIN SMALL LETTER SHARP S}-s')), False) - self.assertEquals(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?fiu)(ss)\1{e<=1:[a-z]}', '\N{LATIN SMALL LETTER SHARP S}s-')), False) - self.assertEquals(bool(regex.fullmatch(r'(?firu)(ss)\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?firu)(ss)\1{e<=1:[a-z]}', 's-\N{LATIN SMALL LETTER SHARP S}')), False) - self.assertEquals(bool(regex.fullmatch(r'(?firu)(ss)\1{e<=1:[a-z]}', + self.assertEqual(bool(regex.fullmatch(r'(?firu)(ss)\1{e<=1:[a-z]}', '-s\N{LATIN SMALL LETTER SHARP S}')), False) def test_subscripted_captures(self): @@ -4323,7 +4361,7 @@ if sys.version_info < (3, 2, 0): RegexTests.assertRaisesRegex = RegexTests.assertRaisesRegexp def test_main(): - run_unittest(RegexTests) + unittest.main(verbosity=2) if __name__ == "__main__": test_main() diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..4927abe --- /dev/null +++ b/setup.cfg @@ -0,0 +1,4 @@ +[egg_info] +tag_build = +tag_date = 0 + diff --git a/setup.py b/setup.py index 7bce303..edcd6b8 100644 --- a/setup.py +++ b/setup.py @@ -1,33 +1,25 @@ #!/usr/bin/env python -from os.path import abspath, dirname, join +from setuptools import setup, Extension +from os.path import join import sys -try: - from setuptools import setup, Extension -except ImportError: - from distutils.core import setup, Extension - MAJOR, MINOR = sys.version_info[:2] -BASE_DIR = dirname(abspath(__file__)) -print('BASE_DIR is %s' % BASE_DIR) -PKG_BASE = 'regex_%i' % MAJOR -DOCS_DIR = join(BASE_DIR, 'docs') +SRC_BASE = 'regex_%i' % MAJOR + +with open('README.rst') as file: + long_description = file.read() setup( name='regex', - version='2019.08.19', + version='2020.7.14', description='Alternative regular expression module, to replace re.', - long_description=open(join(DOCS_DIR, 'Features.rst')).read(), - - # PyPI does spam protection on email addresses, no need to do it here + long_description=long_description, author='Matthew Barnett', author_email='regex@mrabarnett.plus.com', - - maintainer='Matthew Barnett', - maintainer_email='regex@mrabarnett.plus.com', - url='https://bitbucket.org/mrabarnett/mrab-regex', + license='Python Software Foundation License', + classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', @@ -42,13 +34,11 @@ setup( 'Topic :: Software Development :: Libraries :: Python Modules', 'Topic :: Text Processing', 'Topic :: Text Processing :: General', - ], - license='Python Software Foundation License', + ], + package_dir={'regex': SRC_BASE}, py_modules=['regex.__init__', 'regex.regex', 'regex._regex_core', - 'regex.test.__init__', 'regex.test.test_regex'], - package_dir={'': PKG_BASE}, - - ext_modules=[Extension('regex._regex', [join(PKG_BASE, '_regex.c'), - join(PKG_BASE, '_regex_unicode.c')])], - ) + 'regex.test_regex'], + ext_modules=[Extension('regex._regex', [join(SRC_BASE, '_regex.c'), + join(SRC_BASE, '_regex_unicode.c')])], +) diff --git a/tools/build_regex_unicode.py b/tools/build_regex_unicode.py index c87f036..4457033 100644 --- a/tools/build_regex_unicode.py +++ b/tools/build_regex_unicode.py @@ -1,2353 +1,1776 @@ -#! python3.7 -# -*- coding: utf-8 -*- -# -# This Python script parses the Unicode data files and generates the C files -# for the regex module. -# -# Written by MRAB. -# -from collections import defaultdict -from json import dump, load -from os import remove, rename -from os.path import dirname, exists, isfile, join, splitext -from shutil import copy2, move -from urllib.error import HTTPError -from urllib.parse import urljoin -from urllib.request import urlretrieve - -def report(*args, **kwargs): - print(*args, **kwargs, flush=True) - -class UnicodeDataError(Exception): - pass - -def download_unicode_file(url, path): - 'Downloads a Unicode file.' - - report('Downloading {}'.format(url)) - - new_path = path + '.new' - - try: - urlretrieve(url, new_path) - except ValueError: - # The download failed. Clean up. - try: - remove(new_path) - except OSError: - pass - - raise - - # Make a copy of the downloaded file with a versioned filename. - with open(new_path, encoding='utf-8') as file: - # The 1st line of the file should be a comment with a version filename. - line = file.readline() - - if line.startswith('#') and line.endswith('.txt\n'): - versioned_name = line.strip('# \n') - versioned_path = join(unicode_folder, versioned_name) - if isfile(versioned_path): - # We already have this version. - remove(new_path) - else: - # It's a new version. - move(new_path, path) - copy2(path, versioned_path) - - version = splitext(versioned_name)[0].partition('-')[2] - report('Updated to version {}'.format(versioned_name)) - -class MultistageTable: - 'A multi-stage table.' - - def __init__(self, block_sizes, stages, is_binary): - self.block_sizes = block_sizes - self.stages = stages - self.is_binary = is_binary - - self.num_stages = len(self.block_sizes) + 1 - - # How many bytes of storage are needed for this table? - if self.is_binary: - self.bytesize = (sum(smallest_datatype(min(stage), max(stage))[1] * - len(stage) for stage in self.stages[ : -1]) + - (len(self.stages[-1]) + 7) // 8) - else: - self.bytesize = sum(smallest_datatype(min(stage), max(stage))[1] * - len(stage) for stage in self.stages) - - # Calculate the block-size products for lookup. - self._size_products = [product(self.block_sizes[stage : ]) for stage in - range(self.num_stages - 1)] - -class PropertySet: - 'A collection of Unicode properties.' - - def __init__(self): - self._property_list = [] - self._property_dict = {} - self._munge_property_name = None - - def add(self, property): - 'Adds a property.' - - if not self._munge_property_name: - self._munge_property_name = property.munge_name - - if property.name in self: - raise ValueError('property set already has property {!a}'.format(property.name)) - - self._property_list.append(property) - - for name in [property.name] + property.aliases: - self._property_dict[self._munge_property_name(name)] = property - - def get(self, name, default=None): - if not self._property_dict: - return default - - return self._property_dict.get(self._munge_property_name(name), - default) - - def __len__(self): - return len(self._property_list) - - def __getitem__(self, name): - property = self.get(self._munge_property_name(name)) - if property is None: - raise KeyError(name) - - return property - - def __delitem__(self, name): - property = self[name] - - self._property_list = [p for p in self._property_list if p is not - property] - self._property_dict = {n: p for n, p in self._property_dict.items() if - p is not property} - - def __iter__(self): - for property in self._property_list: - yield property - -class Property: - 'A Unicode property.' - - def __init__(self, name, aliases=[]): - self.name = name - self.aliases = [] - self.default = None - self.id = None - self._value_list = [] - self._value_dict = {} - self._munge_value_name = None - - # Ignore any duplicate names. - seen = {self.munge_name(self.name)} - - for name in aliases: - munged_name = self.munge_name(name) - if munged_name not in seen: - self.aliases.append(name) - seen.add(munged_name) - - def add(self, value): - 'Adds a value.' - - if not self._munge_value_name: - self._munge_value_name = value.munge_name - - if value.name in self: - raise KeyError('property {!a} already has value {!a}'.format(self.name, - value.name)) - - self._value_list.append(value) - - for munged_name in [value.name] + value.aliases: - self._value_dict[self._munge_value_name(munged_name)] = value - - def munge_name(self, name): - 'Munges a name into a standard form.' - - return name.translate(self._munge_trans).upper() - - _munge_trans = str.maketrans('', '', ' -_') - - def get(self, name, default=None): - if not self._value_dict: - return default - - return self._value_dict.get(self._munge_value_name(name), default) - - def __len__(self): - return len(self._value_list) - - def __getitem__(self, name): - value = self.get(name) - if value is None: - raise KeyError(name) - - return value - - def __iter__(self): - for value in self._value_list: - yield value - - def _expand_entries(self): - 'Expands the value dict into a list of entries.' - - entries = [0] * NUM_CODEPOINTS - - if self.name == 'Script_Extensions': - script = properties['Script'] - - for value in script._value_list: - for lower, upper in value.ranges: - entries[lower : upper + 1] = [value.id] * (upper - lower + - 1) - - for value in self._value_list: - if not value.mask: - for lower, upper in value.ranges: - entries[lower : upper + 1] = [value.id] * (upper - lower + - 1) - - return entries - - def generate_code(self, h_file, c_file): - 'Generates the code for a property.' - - # Build the tables. - self._build_tables(MAX_STAGES) - - report('Generating code for {!a}'.format(self.name)) - - table = self.table - - # Write the property tables. - c_file.write(''' -/* {name}. */ -'''.format(name=self.name)) - - self.generate_tables(c_file) - - if self.name == 'Script_Extensions': - rows = [] - scripts = properties['Script'] - - for value in sorted(self, key=lambda value: value.id): - rows.append(sorted(scripts[name].id for name in - value.name.split())) - - max_cols = max(len(row) for row in rows) - fmt = ' {{' + ', '.join(['%3d'] * max_cols) + '}},' - - rows = [fmt % tuple(row + [0] * (max_cols - len(row))) for row in - rows] - rows[-1] = rows[-1].rstrip(',') - - c_file.write(''' -static RE_ScriptExt re_scripts_extensions_table[] = { -''') - - for row in rows: - c_file.write(row + '\n') - - c_file.write('''\ -}; -''') - - # Write the lookup function. - if self.name == 'Script_Extensions': - prototype = 'int re_get_script_extensions(RE_UINT32 ch, RE_UINT8* scripts)' - else: - prototype = 'RE_UINT32 re_get_{name}(RE_UINT32 ch)'.format(name=self.name.lower()) - - h_file.write('{prototype};\n'.format(prototype=prototype)) - - c_file.write(''' -{prototype} {{ -'''.format(prototype=prototype)) - - self._generate_locals(c_file) - - c_file.write('\n') - - self._generate_lookup(c_file) - - if self.name == 'Script_Extensions': - c_file.write(''' - scr = re_scripts_extensions_table[value].scripts; - scripts[0] = scr[0]; - count = 1; - - if (scr[0] != 0) { - while (count < RE_MAX_SCX && scr[count] != 0) { - scripts[count] = scr[count]; - ++count; - } - } - - return count; -} -''') - else: - c_file.write(''' - return value; -} -''') - - def generate_tables(self, c_file): - 'Generates the tables.' - - table = self.table - - for stage in range(table.num_stages): - # The contents of this table. - entries = table.stages[stage] - - # What data type should we use for the entries? - if self.is_binary and stage == table.num_stages - 1: - data_type = 'RE_UINT8' - - entries = self._pack_to_bitflags(entries) - else: - data_type = smallest_datatype(min(entries), max(entries))[0] - - # The entries will be stored in an array. - c_file.write(''' -static {data_type} re_{name}_stage_{stage}[] = {{ -'''.format(data_type=data_type, name=self.name.lower(), stage=stage + 1)) - - # Write the entries, nicely aligned in columns. - entries = ['{},'.format(e) for e in entries] - - entry_width = max(len(e) for e in entries) - entries = [e.rjust(entry_width) for e in entries] - - for start in range(0, len(entries), COLUMNS): - c_file.write(' {}\n'.format(' '.join(entries[start : start + - COLUMNS]))) - - c_file.write('};\n') - - # Write how much storage will be used by all of the tables. - c_file.write(''' -/* {name}: {bytesize} bytes. */ -'''.format(name=self.name, bytesize=table.bytesize)) - - def _pack_to_bitflags(self, entries): - entries = tuple(entries) - new_entries = [] - - for start in range(0, len(entries), 8): - new_entries.append(self.bitflag_dict[entries[start : start + 8]]) - - return new_entries - - # Build a dict for converting 8-tuples into bytes. - bitflag_dict = {} - - for byte in range(0x100): - bitflag_dict[tuple(map(int, '{:08b}'.format(byte)[ : : -1]))] = byte - - def _generate_locals(self, c_file): - c_file.write('''\ - RE_UINT32 code; - RE_UINT32 f; - RE_UINT32 pos; - RE_UINT32 value; -''') - - if self.name == 'Script_Extensions': - c_file.write('''\ - RE_UINT8* scr; - int count; -''') - - def _generate_lookup(self, c_file): - 'Generates the C lookup function.' - - table = self.table - name = self.name.lower() - - # Convert the block sizes into shift values. - shifts = [mul_to_shift(size) for size in table.block_sizes] - - c_file.write('''\ - f = ch >> {field_shift}; - code = ch ^ (f << {field_shift}); - pos = (RE_UINT32)re_{name}_stage_1[f] << {block_shift}; -'''.format(field_shift=sum(shifts), name=name, block_shift=shifts[0])) - - for stage in range(1, table.num_stages - 1): - c_file.write('''\ - f = code >> {field_shift}; - code ^= f << {field_shift}; - pos = (RE_UINT32)re_{name}_stage_{stage}[pos + f] << {block_shift}; -'''.format(field_shift=sum(shifts[stage : ]), name=name, stage=stage + 1, - block_shift=shifts[stage])) - - # If it's a binary property, we're using bitflags. - if self.is_binary: - c_file.write('''\ - pos += code; - value = (re_{name}_stage_{stage}[pos >> 3] >> (pos & 0x7)) & 0x1; -'''.format(name=self.name.lower(), stage=table.num_stages)) - else: - c_file.write('''\ - value = re_{name}_stage_{stage}[pos + code]; -'''.format(name=self.name.lower(), stage=table.num_stages)) - - def _build_tables(self, max_stages): - 'Calculates the block sizes and build the tables.' - - entries = self._expand_entries() - - self.is_binary = len(self._value_list) == 2 - - if self.name not in storage: - smallest_size = float('inf') - - report('Determining smallest storage size') - - # Try different numbers and sizes of blocks. - for block_sizes, bytesize in self._table_sizes(entries, 1, - max_stages, self.is_binary): - if bytesize < smallest_size: - best_block_sizes = block_sizes - smallest_size = bytesize - - storage[self.name] = best_block_sizes, smallest_size - else: - best_block_sizes, smallest_size = storage[self.name] - - report('The storage size is {} bytes'.format(smallest_size)) - - self._build_multistage_table(entries, best_block_sizes, smallest_size) - - def _table_sizes(self, entries, num_stages, max_stages, binary): - '''Yields different numbers and sizes of blocks, up to max_stages. - - All the sizes are powers of 2 and for a binary property the final block - size is at least 8 because the final stage of the table will be using - bitflags. - ''' - - # What if this is the top stage? - if binary: - bytesize = len(entries) // 8 - else: - bytesize = (smallest_datatype(min(entries), max(entries))[1] * - len(entries)) - - yield [], bytesize - - if num_stages >= max_stages: - return - - entries = tuple(entries) - - # Initialise the block size and double it on each iteration. Usually an - # index entry is 1 byte, so a data block should be at least 2 bytes. - size = 16 if binary else 2 - - # There should be at least 2 blocks. - while size * 2 <= len(entries) and len(entries) % size == 0: - # Group the entries into blocks. - indexes = [] - block_dict = {} - for start in range(0, len(entries), size): - block = entries[start : start + size] - indexes.append(block_dict.setdefault(block, len(block_dict))) - - # Collect all the blocks. - blocks = [] - for block in sorted(block_dict, key=lambda block: - block_dict[block]): - blocks.extend(block) - - # How much storage will the blocks stage need? - if binary: - block_bytesize = len(blocks) // 8 - else: - block_bytesize = (smallest_datatype(min(blocks), - max(blocks))[1] * len(blocks)) - - # Yield the higher stages for the indexes. - for block_sizes, total_bytesize in self._table_sizes(indexes, - num_stages + 1, max_stages, False): - yield block_sizes + [size], total_bytesize + block_bytesize - - # Next size up. - size *= 2 - - def _build_multistage_table(self, entries, block_sizes, bytesize): - 'Builds a multi-stage table.' - - if product(block_sizes) > len(entries): - raise UnicodeDataError('product of block sizes greater than number of entries') - - # Build the stages from the bottom one up. - stages = [] - - for block_size in reversed(block_sizes): - entries = tuple(entries) - - # Group the entries into blocks. - block_dict = {} - indexes = [] - for start in range(0, len(entries), block_size): - block = entries[start : start + block_size] - indexes.append(block_dict.setdefault(block, len(block_dict))) - - # Collect all the blocks. - blocks = [] - for block in sorted(block_dict, key=lambda block: - block_dict[block]): - blocks.extend(block) - - # We have a new stage. - stages.append(blocks) - - # Prepare for the next higher stage. - entries = indexes - - # We have the top stage. - stages.append(entries) - - # Put the stages into the correct order (top-down). - stages.reverse() - - self.table = MultistageTable(block_sizes, stages, self.is_binary) - -def product(numbers): - 'Returns the product of a series of numbers.' - - if not product: - raise ValueError('product of empty sequence') - - result = 1 - for n in numbers: - result *= n - - return result - -def mul_to_shift(number): - 'Converts a multiplier into a shift.' - - shift = number.bit_length() - 1 - if shift < 0 or (1 << shift) != number: - raise ValueError("can't convert multiplier into shift") - - return shift - -class AnyProperty(Property): - 'The Any property.' - - def __init__(self): - Property.__init__(self, 'Any') - - def generate_code(self, h_file, c_file): - 'Generates the code for a property.' - - report('Generating code for Any') - - # Write the lookup function. - prototype = 'RE_UINT32 re_get_any(RE_UINT32 ch)' - - h_file.write('{prototype};\n'.format(prototype=prototype)) - - c_file.write(''' -/* Any. */ - -{prototype} {{ - return 1; -}} -'''.format(prototype=prototype)) - -class Value: - 'A Unicode value.' - - def __init__(self, name, aliases=[], mask=0, id=None): - self.name = name - self.aliases = [] - self.id = id - self.mask = mask - self._ranges = [] - self._modified = False - - # Ignore any duplicate names. - seen = {self.munge_name(self.name)} - - for name in aliases: - munged_name = self.munge_name(name) - if munged_name not in seen: - self.aliases.append(name) - seen.add(munged_name) - - def add(self, ranges): - 'Adds a codepoint range.' - - if isinstance(ranges, tuple): - self._ranges.append(ranges) - else: - self._ranges.extend(ranges) - - self._modified = True - - @property - def ranges(self): - if self._modified: - self._ranges = merge_ranges(self._ranges) - self._modified = False - - return self._ranges - - def munge_name(self, name): - 'Munges a name into a standard form.' - - return name.translate(self._munge_trans).upper() - - _munge_trans = str.maketrans('', '', ' -_') - - def __iter__(self): - for codepoints in self.ranges: - yield codepoints - -class NumericValue(Value): - 'A Unicode numeric value.' - - _munge_trans = str.maketrans('', '', ' _') - -class CaseProperty(Property): - 'A case-folding property.' - - def _expand_entries(self): - entries = [0] * NUM_CODEPOINTS - - for id, key in enumerate(self._value_list): - for codepoint in self._value_dict[key]: - entries[codepoint] = id - - return entries - -class AllCases(CaseProperty): - 'All Unicode cases.' - - def __init__(self, name, other_cases): - self.name = name - - # How many other cases can there be? - max_other_cases = max(map(len, other_cases)) - self.max_cases = max_other_cases + 1 - - extra = tuple([0] * max_other_cases) - - self._value_list = [extra] - self._value_dict = {extra: []} - - for diff, codepoints in sorted(other_cases.items()): - if diff: - key = (diff + extra)[ : max_other_cases] - self._value_list.append(key) - self._value_dict[key] = codepoints - - self._value_list.sort(key=lambda diff: sorted(self._value_dict[diff])) - - def generate_code(self, h_file, c_file): - 'Generates the code for a property.' - - report('Generating code for {}'.format(self.name)) - - # Build the tables. - self._build_tables(MAX_CASE_STAGES) - - # Write the all-cases tables. - c_file.write(''' -/* {name}. */ -'''.format(name=self.name)) - - self.generate_tables(c_file) - - # Calculate the size of the struct. - entry_size = (self.max_cases - 1) * 4 - - # Write the entries, nicely aligned in columns. - rows = [[str(e) for e in r] for r in self._value_list] - entry_widths = [max(len(e) for e in c) for c in zip(*rows)] - rows = [[e.rjust(w) for e, w in zip(r, entry_widths)] for r in rows] - - c_file.write(''' -static RE_AllCases re_all_cases_table[] = { -''') - for r in rows: - c_file.write(' {{%s}},\n' % ', '.join(r)) - - c_file.write('};\n') - - # Write how much storage will be used by the table. - c_file.write(''' -/* {name}: {bytesize} bytes. */ -'''.format(name=self.name, bytesize=entry_size * len(rows))) - - # Write the lookup function. - prototype = 'int re_get_{name}(RE_UINT32 ch, RE_UINT32* codepoints)'.format(name=self.name.lower()) - - h_file.write('{prototype};\n'.format(prototype=prototype)) - - c_file.write(''' -{prototype} {{ -'''.format(name=self.name, prototype=prototype)) - - self._generate_locals(c_file) - - c_file.write('''\ - RE_AllCases* all_cases; - int count; - -''') - - self._generate_lookup(c_file) - - c_file.write(''' - all_cases = &re_all_cases_table[value]; - - codepoints[0] = ch; - count = 1; - - while (count < RE_MAX_CASES && all_cases->diffs[count - 1] != 0) { - codepoints[count] = (RE_UINT32)((RE_INT32)ch + all_cases->diffs[count - - 1]); - ++count; - } - - return count; -} -''') - -class SimpleCaseFolding(CaseProperty): - 'Unicode simple case-folding.' - - def __init__(self, name, folding): - self.name = name - self._value_dict = dict(folding) - self._value_dict.setdefault(0, []) - self._value_list = list(self._value_dict) - - self._value_list.sort(key=lambda diff: sorted(self._value_dict[diff])) - - def generate_code(self, h_file, c_file): - 'Generates the code for a property.' - - report('Generating code for {}'.format(self.name)) - - # Build the tables. - self._build_tables(MAX_CASE_STAGES) - - # Write the case-folding tables. - c_file.write(''' -/* {name}. */ -'''.format(name=self.name)) - - self.generate_tables(c_file) - - # Calculate the size of an entry, including alignment. - entry_size = 4 - - # Write the entries, nicely aligned in columns. - rows = [str(r) for r in self._value_list] - entry_width = max(len(r) for r in rows) - rows = [r.rjust(entry_width) for r in rows] - - c_file.write(''' -static RE_INT32 re_simple_case_folding_table[] = { -''') - for r in rows: - c_file.write(' {},\n'.format(r)) - - c_file.write('};\n') - - # Write how much storage will be used by the table. - c_file.write(''' -/* {name}: {bytesize} bytes. */ -'''.format(name=self.name, bytesize=entry_size * len(rows))) - - # Write the lookup function. - prototype = 'RE_UINT32 re_get_{name}(RE_UINT32 ch)'.format(name=self.name.lower()) - - h_file.write('{prototype};\n'.format(prototype=prototype)) - - c_file.write(''' -{prototype} {{ -'''.format(name=self.name, prototype=prototype)) - - self._generate_locals(c_file) - - c_file.write('''\ - RE_INT32 diff; - -''') - - self._generate_lookup(c_file) - - c_file.write(''' - diff = re_simple_case_folding_table[value]; - - return (RE_UINT32)((RE_INT32)ch + diff); -} -''') - -class FullCaseFolding(CaseProperty): - 'Unicode full case-folding.' - - def __init__(self, name, folding): - self.name = name - self.max_folded = max(map(len, folding)) - - extra = tuple([0] * self.max_folded) - - self._value_dict = {extra: []} - - for folded in folding: - key = (folded + extra)[ : self.max_folded] - self._value_dict[key] = folding[folded] - - self._value_list = list(self._value_dict) - self._value_list.sort(key=lambda diff: sorted(self._value_dict[diff])) - - def generate_code(self, h_file, c_file): - 'Generates the code for a property.' - - report('Generating code for {}'.format(self.name)) - - # Build the tables. - self._build_tables(MAX_CASE_STAGES) - - # Write the case-folding tables. - c_file.write(''' -/* {name}. */ -'''.format(name=self.name)) - - self.generate_tables(c_file) - - # What data type should we use for the case-folding entries? - rows = self._value_list - - # The diff entry needs to be signed 32-bit, the others should be OK - # with unsigned 16-bit. - data = [e for r in rows for e in r[1 : ]] - - # Verify that unsigned 16-bit is OK. - data_type = smallest_datatype(min(data), max(data))[0] - if data_type != 'RE_UINT16': - raise UnicodeDataError('full case-folding table entry too big') - - # Calculate the size of an entry, including alignment. - entry_size = 4 + 2 * (self.max_folded - 1) - excess = entry_size % 4 - if excess > 0: - entry_size += 4 - excess - - # Write the entries, nicely aligned in columns. - rows = [[str(e) for e in r] for r in rows] - entry_widths = [max(len(e) for e in c) for c in zip(*rows)] - rows = [[e.rjust(w) for e, w in zip(r, entry_widths)] for r in rows] - - c_file.write(''' -static RE_FullCaseFolding re_full_case_folding_table[] = { -''') - for r in rows: - c_file.write(' {%s, {%s}},\n' % (r[0], ', '.join(r[1 : ]))) - - c_file.write('};\n') - - # Write how much storage will be used by the table. - c_file.write(''' -/* {name}: {bytesize} bytes. */ -'''.format(name=self.name, bytesize=entry_size * len(rows))) - - # Write the lookup function. - prototype = 'int re_get_{name}(RE_UINT32 ch, RE_UINT32* codepoints)'.format(name=self.name.lower()) - - h_file.write('{prototype};\n'.format(prototype=prototype)) - - c_file.write(''' -{prototype} {{ -'''.format(name=self.name, prototype=prototype)) - - self._generate_locals(c_file) - - c_file.write('''\ - RE_FullCaseFolding* case_folding; - int count; - -''') - - self._generate_lookup(c_file) - - c_file.write(''' - case_folding = &re_full_case_folding_table[value]; - - codepoints[0] = (RE_UINT32)((RE_INT32)ch + case_folding->diff); - count = 1; - - while (count < RE_MAX_FOLDED && case_folding->codepoints[count - 1] != 0) { - codepoints[count] = case_folding->codepoints[count - 1]; - ++count; - } - - return count; -} -''') - -def parse_property_files(unicode_folder, unicode_data_files, properties): - 'Parses the Unicode data files.' - - # Parse the property and value aliases files. - parse_property_aliases(join(unicode_folder, 'PropertyAliases.txt'), - properties) - - parse_value_aliases(join(unicode_folder, 'PropertyValueAliases.txt'), - properties) - - # Parse the other data files. - next_property_id = 0 - it = iter(unicode_data_files.splitlines()) - - # Find the 'codepoints' section. - for line in it: - if line.startswith('[properties]'): - break - - # Process the 'properties' section. - for line in it: - if line.startswith('['): - break - - if line and not line.startswith('#'): - filename = line.rpartition('/')[2] - if filename == 'DerivedNumericValues.txt': - # Treat the numeric values file specially. - next_property_id = parse_numeric_values_file(unicode_folder, - filename, next_property_id, properties) - elif filename == 'emoji-data.txt': - next_property_id = parse_emoji_file(unicode_folder, filename, - next_property_id, properties) - elif filename == 'LineBreak.txt': - next_property_id = parse_linebreak_file(unicode_folder, - filename, next_property_id, properties) - elif filename == 'ScriptExtensions.txt': - next_property_id = parse_script_extensions_file(unicode_folder, - filename, next_property_id, properties) - else: - next_property_id = parse_unicode_data_file(unicode_folder, - filename, next_property_id, properties) - - if line.startswith('[normalisation]'): - filename = next(it).rpartition('/')[2] - next_property_id = parse_unicode_normalisation_file(unicode_folder, - filename, next_property_id, properties) - - # Add the additional properties. - next_property_id = make_additional_properties(properties, next_property_id) - - # Remove all the properties that have been named but not defined. - undefined = [property for property in properties if property.id is None] - - for property in undefined: - del properties[property.name] - - report() - -def parse_property_aliases(path, properties): - 'Parses the file listing the property aliases.' - - with open(path, encoding='utf-8') as file: - for line in file: - line = line.rstrip() - if line and not line.startswith('#'): - # It's a data line. - # - # Ignore anything after the comment, if any. - line = line.partition('#')[0] - - fields = [field.strip() for field in line.split(';')] - - # The canonical name of the property is in field 2. The other - # fields contain other aliases. - properties.add(Property(fields[1], aliases=fields)) - -def parse_value_aliases(path, properties): - 'Parses the file listing the value aliases for each property.' - - with open(path, encoding='utf-8') as file: - for line in file: - line = line.rstrip() - if line and not line.startswith('#'): - # It's a data line. - # - # Ignore anything after the comment, if any. - line = line.partition('#')[0] - - fields = [field.strip() for field in line.split(';')] - - # The name of the property is in field 1 and the canonical name - # of the value is in either field 3 or field 4. The other - # fields contain other aliases. - value_name = fields[3] if fields[0] == 'ccc' else fields[2] - properties[fields[0]].add(Value(value_name, aliases=fields[1 : - ])) - -def parse_unicode_data_file(unicode_folder, filename, next_property_id, - properties): - 'Parses a Unicode data file.' - - report('Parsing {}'.format(filename)) - property = None - value = None - is_binary = True - next_value_id = 0 - - with open(join(unicode_folder, filename), encoding='utf-8') as file: - for line in file: - line = line.rstrip() - if line.startswith('#'): - # It's a comment line. - if line.startswith(('# Property:', - '# All code points not explicitly listed for')): - # This line is giving the name of the property. - is_binary = False - property = properties[line.split()[-1]] - if property.id is None: - property.id = next_property_id - next_property_id += 1 - - if property.name == 'General_Category': - property.default = property['Unassigned'] - elif line.startswith('# @missing:'): - # This line is giving the name of the default value. - is_binary = False - value = property[line.split()[-1]] - value.id = 0 - next_value_id = 1 - property.default = value - elif line: - # It's a data line. - fields = line.partition('#')[0].split(';') - codepoints = [int(c, 16) for c in fields[0].split('..')] - name = fields[1].strip() - - if is_binary: - # It's a binary property. - property = properties[name] - if property.id is None: - property.id = next_property_id - next_property_id += 1 - - property.default = property['No'] - property['No'].id = 0 - property['Yes'].id = 1 - - value = property['Yes'] - else: - # It's a multi-value property. - value = property[name] - if value.id is None: - value.id = next_value_id - next_value_id += 1 - - value.add((codepoints[0], codepoints[-1])) - - return next_property_id - -def parse_numeric_values_file(unicode_folder, filename, next_property_id, - properties): - 'Parses the Unicode numeric value data file.' - - report('Parsing {}'.format(filename)) - property = None - value = None - next_value_id = 0 - - with open(join(unicode_folder, filename), encoding='utf-8') as file: - for line in file: - line = line.rstrip() - if line.startswith('#'): - # It's a comment line. - if line.startswith('# Derived Property:'): - # This line is giving the name of the property. - property = properties[line.split()[-1]] - if property.id is None: - property.id = next_property_id - next_property_id += 1 - - if property.default is None: - name= 'NaN' - value = property.get(name) - if value is None: - value = NumericValue(name, id=0) - next_value_id = 1 - property.add(value) - - property.default = value - elif line.startswith('# @missing:'): - # This line is giving the name of the default value. - name = line.split()[-1] - value = property.get(name) - if value is None: - value = NumericValue(name, id=0) - next_value_id = 1 - property.add(value) - - property.default = value - elif line: - # It's a data line. - fields = line.partition('#')[0].split(';') - codepoints = [int(c, 16) for c in fields[0].split('..')] - name = fields[3].strip() - - value = property.get(name) - if value is None: - value = NumericValue(name, id=next_value_id) - next_value_id += 1 - property.add(value) - - value.add((codepoints[0], codepoints[-1])) - - return next_property_id - -def parse_emoji_file(unicode_folder, filename, next_property_id, properties): - 'Parses the Unicode emoji data file.' - - report('Parsing {}'.format(filename)) - property = None - value = None - next_value_id = 0 - - with open(join(unicode_folder, filename), encoding='utf-8') as file: - for line in file: - line = line.rstrip() - if line.startswith('#'): - # It's a comment line. - if line.startswith('# @missing:'): - # This line is giving the name of the property. - fields = line.split() - property = Property(fields[-3]) - properties.add(property) - assert fields[-1] == 'No' - if property.id is None: - property.id = next_property_id - next_property_id += 1 - - if property.default is None: - name = 'No' - value = property.get(name) - if value is None: - value = Value(name, id=0) - next_value_id = 1 - property.add(value) - - property.default = value - elif line: - # It's a data line. - fields = line.partition('#')[0].split(';') - codepoints = [int(c, 16) for c in fields[0].split('..')] - name = 'Yes' - value = property.get(name) - if value is None: - value = Value(name, id=next_value_id) - next_value_id += 1 - property.add(value) - - value.add((codepoints[0], codepoints[-1])) - - return next_property_id - -def parse_linebreak_file(unicode_folder, filename, next_property_id, properties): - 'Parses the Unicode linebreak data file.' - - report('Parsing {}'.format(filename)) - property = Property('Line_Break') - properties.add(property) - if property.id is None: - property.id = next_property_id - next_property_id += 1 - - value = None - next_value_id = 0 - - with open(join(unicode_folder, filename), encoding='utf-8') as file: - for line in file: - line = line.rstrip() - if line.startswith('#'): - # It's a comment line. - if line.startswith('# @missing:'): - # This line is giving the name of the default value. - name = line.split(';')[-1].strip() - value = property.get(name) - if value is None: - value = NumericValue(name, id=0) - next_value_id = 1 - property.add(value) - - property.default = value - elif line: - # It's a data line. - fields = line.partition('#')[0].split(';') - codepoints = [int(c, 16) for c in fields[0].split('..')] - name = fields[1].strip() - value = property.get(name) - if value is None: - value = Value(name, id=next_value_id) - next_value_id += 1 - property.add(value) - - value.add((codepoints[0], codepoints[-1])) - - return next_property_id - -def parse_unicode_normalisation_file(unicode_folder, filename, - next_property_id, properties): - 'Parses a Unicode normalisation file.' - - report('Parsing {}'.format(filename)) - property = None - value = None - next_value_id = 0 - - with open(join(unicode_folder, filename), encoding='utf-8') as file: - for line in file: - line = line.rstrip() - if line.startswith('#'): - # It's a comment line. - if line.startswith('# Derived Property:'): - property = None - elif line.startswith('# Property:'): - # This line is giving the name of the property. - property = properties[line.split()[-1]] - if property.id is None: - property.id = next_property_id - next_property_id += 1 - elif property and line.startswith('# @missing:'): - # This line is giving the name of the default value. - value = property[line.split()[-1]] - value.id = 0 - next_value_id = 1 - property.default = value - elif property and line: - # It's a data line. - fields = line.partition('#')[0].split(';') - codepoints = [int(c, 16) for c in fields[0].split('..')] - name = fields[2].strip() - - # It's a multi-value property. - value = property[name] - if value.id is None: - value.id = next_value_id - next_value_id += 1 - - value.add((codepoints[0], codepoints[-1])) - - return next_property_id - -def parse_script_extensions_file(unicode_folder, filename, next_property_id, - properties): - 'Parses the Unicode Script Extensions file.' - - report('Parsing {}'.format(filename)) - - scripts = properties['Script'] - - property = properties['ScriptExtensions'] - if property.id is None: - property.id = next_property_id - property.default = scripts.default - next_property_id += 1 - - for value in scripts: - if value.id is not None: - property.add(Value(value.name, aliases=value.aliases, id=value.id)) - - next_value_id = max(value.id for value in property) + 1 - - with open(join(unicode_folder, filename), encoding='utf-8') as file: - for line in file: - line = line.rstrip() - if line.startswith('#'): - pass - elif line: - # It's a data line. - fields = line.partition('#')[0].split(';') - codepoints = [int(c, 16) for c in fields[0].split('..')] - script_names = fields[1].strip() - - # Ensure that the script names are known. - for name in script_names.split(): - scripts[name] - - try: - value = property[script_names] - except KeyError: - value = Value(script_names, id=next_value_id) - property.add(value) - next_value_id += 1 - - value.add((codepoints[0], codepoints[-1])) - - return next_property_id - -def make_additional_properties(properties, next_property_id): - 'Makes the additional properties.' - - general_category = properties['General_Category'] - - # Make the 'Alphanumeric' property. - alphabetic = properties['Alphabetic']['Yes'].ranges - decimal_number = general_category['Decimal_Number'].ranges - - next_property_id = make_binary_property(properties, next_property_id, - 'Alphanumeric', alphabetic + decimal_number, aliases=['AlNum']) - - # Make the 'Any' property. - next_property_id = make_Any_property(properties, next_property_id) - - # General_Category has a compound value called 'Assigned'. - mask = 0 - ranges = [] - - for value in general_category: - if value.id is not None: - mask |= 1 << value.id - - if value.name != 'Unassigned': - ranges.extend(value.ranges) - - value = Value('Assigned', mask=mask) - value.add(ranges) - general_category.add(value) - - # Make the 'Blank' property. - assigned = [] - - for value in general_category: - if value is not general_category.default: - assigned.extend(value.ranges) - - space_separator = general_category['Space_Separator'].ranges - blank = [(0x09, 0x09)] + space_separator - - next_property_id = make_binary_property(properties, next_property_id, - 'Blank', blank) - - # Make the 'Graph' property. - whitespace = properties['White_Space']['Yes'].ranges - control = general_category['Control'].ranges - surrogate = general_category['Surrogate'].ranges - - unassigned = range_difference([(0, MAX_CODEPOINT)], assigned) - - graph = range_difference([(0, MAX_CODEPOINT)], whitespace + control + - surrogate + unassigned) - - next_property_id = make_binary_property(properties, next_property_id, - 'Graph', graph) - - # Make the 'Print' property. - print_ = range_difference(graph + blank, control) - - next_property_id = make_binary_property(properties, next_property_id, - 'Print', print_) - - # Make the 'Word' property. - enclosing_mark = general_category['Enclosing_Mark'].ranges - nonspacing_mark = general_category['Nonspacing_Mark'].ranges - spacing_mark = general_category['Spacing_Mark'].ranges - connector_punctuation = general_category['Connector_Punctuation'].ranges - join_control = properties['Join_Control']['Yes'].ranges - - word = (alphabetic + enclosing_mark + nonspacing_mark + spacing_mark + - decimal_number + connector_punctuation + join_control) - - next_property_id = make_binary_property(properties, next_property_id, - 'Word', word) - - # Make the 'XDigit' property. - hex_digit = properties['Hex_Digit']['Yes'].ranges - - xdigit = decimal_number + hex_digit - - next_property_id = make_binary_property(properties, next_property_id, - 'XDigit', xdigit) - - # Make the 'Posix_Digit' property. - posix_digit = [(ord('0'), ord('9'))] - - next_property_id = make_binary_property(properties, next_property_id, - 'Posix_Digit', posix_digit) - - # Make the 'Posix_AlNum' property. - posix_alnum = alphabetic + posix_digit - - next_property_id = make_binary_property(properties, next_property_id, - 'Posix_AlNum', posix_alnum) - - # Make the 'Posix_Punct' property. - punctuation = [] - for name in 'Pd Ps Pe Pc Po Pi Pf'.split(): - punctuation.extend(general_category[name].ranges) - - symbol = general_category['Symbol'].ranges - for name in 'Sm Sc Sk So '.split(): - symbol.extend(general_category[name].ranges) - - posix_punct = range_difference(punctuation + symbol, alphabetic) - - next_property_id = make_binary_property(properties, next_property_id, - 'Posix_Punct', posix_punct) - - # Make the 'Posix_XDigit' property. - posix_xdigit = [(ord('0'), ord('9')), (ord('A'), ord('F')), (ord('a'), - ord('f'))] - - next_property_id = make_binary_property(properties, next_property_id, - 'Posix_XDigit', posix_xdigit) - - # The 'General_Category' property has a ompound value called 'Cased_Letter'. - lc_value = general_category['Cased_Letter'] - ranges = [] - - for name in 'Lu Ll Lt'.split(): - lc_value.mask |= 1 << general_category[name].id - ranges.extend(general_category[name].ranges) - - lc_value.add(ranges) - - # The 'General_Category' property has some compound values called 'Letter', - # 'Number', etc. - compound = [] - ids = [] - - for value in general_category: - for alias in list(value.aliases): - if len(alias) == 1: - # Add the additional alias for the compound value. - value.aliases.append(alias + '&') - compound.append(alias) - elif len(alias) == 2 and alias.istitle(): - # Build the mask for the compound value. - c_value = general_category[alias[0]] - c_value.mask |= 1 << value.id - c_value.add(value.ranges) - ids.append(value.id) - - last_value_id = max(ids) - - for id, name in enumerate(sorted(compound), start=last_value_id + 1): - general_category[name].id = id - - last_value_id += len(compound) - - for value in general_category: - if value.id is None: - last_value_id += 1 - value.id = last_value_id - - for property in properties: - used = [] - not_defined = [] - has_codepoints = False - - for value in property: - if value.id is None: - not_defined.append(value) - else: - used.append(value.id) - - if value.ranges: - has_codepoints = True - - if used: - for id, value in enumerate(not_defined, start=max(used) + 1): - value.id = id - elif has_codepoints: - for id, value in enumerate(not_defined): - value.id = id - - return next_property_id - -def make_binary_property(properties, next_property_id, name, ranges, - aliases=[]): - 'Makes a binary property.' - - yes_aliases = properties['Alphabetic']['Yes'].aliases - no_aliases = properties['Alphabetic']['No'].aliases - - property = Property(name, aliases=aliases) - property.id = next_property_id - - value = Value('No', aliases=no_aliases) - property.add(value) - - property.default = value - - value = Value('Yes', aliases=yes_aliases) - value.add(merge_ranges(ranges)) - property.add(value) - - properties.add(property) - - return next_property_id + 1 - -def make_Any_property(properties, next_property_id): - 'Makes the Any property.' - - yes_aliases = properties['Alphabetic']['Yes'].aliases - no_aliases = properties['Alphabetic']['No'].aliases - - property = AnyProperty() - property.id = next_property_id - - value = Value('No', aliases=no_aliases) - property.add(value) - - property.default = value - - value = Value('Yes', aliases=yes_aliases) - value.add((0x0000, MAX_CODEPOINT)) - property.add(value) - - properties.add(property) - - return next_property_id + 1 - -def parse_case_folding_file(path): - 'Parses the Unicode CaseFolding file.' - - simple_folding = defaultdict(list) - full_folding = defaultdict(list) - equivalent = defaultdict(set) - turkic_set = set() - empty_set = set() - - with open(path, encoding='utf-8') as file: - for line in file: - line = line.rstrip() - if line and not line.startswith('#'): - # It's a data line. - fields = line.partition('#')[0].split(';') - codepoint = int(fields[0], 16) - fold_type = fields[1].strip() - folded = [int(f, 16) for f in fields[2].split()] - - if fold_type in 'CFS': - # We want to determine which codepoints are equivalent to - # each other under case-folding. - - # These are equivalent to each other. - equiv_set = {(codepoint, ), tuple(folded)} - - # First collect the existing equivalences. - for x in list(equiv_set): - equiv_set.update(equivalent.get(x, empty_set)) - - # Then make them all refer to the same equivalence set. - for x in equiv_set: - equivalent[x] = equiv_set - - # The first entry is the delta. - entries = tuple([folded[0] - codepoint] + folded[1 : ]) - - if fold_type in 'CS': - # Common and simple case-folding. - simple_folding[entries[0]].append(codepoint) - - if fold_type in 'CF': - # Common and fall case-folding. - full_folding[entries].append(codepoint) - - if fold_type == 'T': - # Turkic case-folding. - turkic_set.add((codepoint, tuple(folded))) - - # Is the Turkic set what we expected? - if turkic_set != {(0x49, (0x131, )), (0x130, (0x69, ))}: - raise UnicodeDataError('Turkic set has changed') - - # Which codepoints expand on full case-folding? - expand_set = set() - - for expanded in full_folding: - if len(expanded) > 1: - expand_set.update(full_folding[expanded]) - - # Add the Turkic set to the equivalences. Note that: - # - # dotted_capital == dotted_small - # - # and: - # - # dotted_small == dotless_capital - # - # but: - # - # dotted_capital != dotless_capital - # - for codepoint, folded in turkic_set: - char1, char2 = (codepoint, ), folded - equivalent[char1] = equivalent[char1] | {char2} - equivalent[char2] = equivalent[char2] | {char1} - - # Collect and sort the equivalences. We want to know all of the possible - # case-forms for each codepoint. - other_cases = defaultdict(list) - - for codepoint, equiv_set in equivalent.items(): - if len(codepoint) == 1: - diff_list = [] - - for e in equiv_set - {codepoint}: - if len(e) == 1: - diff_list.append(e[0] - codepoint[0]) - - other_cases[tuple(sorted(diff_list))].append(codepoint[0]) - - # Save the all-cases property. - all_prop = AllCases('All_Cases', other_cases) - - # Save the simple case-folding property. - simple_folding_prop = SimpleCaseFolding('Simple_Case_Folding', - simple_folding) - - # Save the full case-folding property. - full_folding_prop = FullCaseFolding('Full_Case_Folding', full_folding) - - return all_prop, simple_folding_prop, full_folding_prop, expand_set - -def tabulate(rows): - 'Creates a table with right-justified columns.' - - # Convert all the entries to strings. - rows = [[str(e) for e in row] for row in rows] - - # Determine the widths of the columns. - widths = [max(len(e) for e in column) for column in zip(*rows)] - - # Pad all the entries. - rows = [[e.rjust(w) for e, w in zip(row, widths)] for row in rows] - - return rows - -def write_properties_description(properties, properties_path): - 'Writes the Unicode properties description file.' - - with open(properties_path, 'w', encoding='utf-8', newline='\n') as file: - file.write('The following is a list of the {} properties which are supported by this module:\n'.format(len(properties))) - - for property in sorted(properties, key=lambda property: property.name.upper()): - file.write('\n') - - name = property.name - aliases = sorted(property.aliases, key=str.upper) - if aliases: - file.write('{} [{}]\n'.format(name, ', '.join(aliases))) - else: - file.write('{}\n'.format(name)) - - for value in sorted(property, key=lambda value: value.name.upper()): - name = value.name - aliases = sorted(value.aliases, key=str.upper) - if aliases: - file.write(' {} [{}]\n'.format(name, - ', '.join(aliases))) - else: - file.write(' {}\n'.format(name)) - -def store_properties(unicode_version, properties, path): - 'Stores the Unicode properties in a file.' - - with open(path, 'w', encoding='ascii') as file: - file.write('Version {}\n'.format(unicode_version)) - for property in sorted(properties, key=lambda p: p.name.upper()): - aliases = [property.name] + sorted(property.aliases, key=str.upper) - file.write('Property {}\n'.format(', '.join('"{}"'.format(name) for - name in aliases))) - - value = property.default - if value is None: - raise UnicodeDataError('property {!a} has no default value'.format(property.name)) - - aliases = [value.name] + sorted(value.aliases, key=str.upper) - file.write('DefaultValue {}\n'.format(', '.join('"{}"'.format(name) - for name in aliases))) - - for value in sorted(property, key=lambda v: v.name.upper()): - if value is not property.default: - aliases = [value.name] + sorted(value.aliases, key=str.upper) - file.write('Value {}'.format(', '.join('"{}"'.format(name) - for name in aliases))) - - if value.mask: - file.write(' : 0x{:08X}\n'.format(value.mask)) - else: - file.write('\n') - - for lower, upper in value.ranges: - if lower == upper: - file.write('{:04X}\n'.format(lower)) - else: - file.write('{:04X}..{:04X}\n'.format(lower, upper)) - -def check_unicode_version(unicode_data_files): - 'Checks the Unicode version in the data files.' - - versions = defaultdict(set) - - # Read the version and filename from the first line of each data file. - for line in unicode_data_files.splitlines(): - if line and line[0] != '#' and line[0] != '[': - name = line.rpartition('/')[-1] - path = join(unicode_folder, name) - - with open(path, encoding='utf-8') as file: - line = file.readline() - - if line == '# emoji-data.txt\n': - for line in file: - if line.startswith('# Version:'): - ver = line.split()[-1] - ver += '.0' * (2 - ver.count('.')) - versions[ver].add(name) - break - elif line.endswith('.txt\n'): - ver = line[ : -5].rpartition('-')[2] - versions[ver].add(name) - - if len(versions) != 1: - if set(versions) == {'12.0.0', '12.1.0'} and versions['12.0.0'] == {'emoji-data.txt'}: - # Cannot find emoji-data.txt for version 12.1.0. - pass - else: - for ver, names in versions.items(): - print(ver, '=>', [name.strip('# \n') for name in names]) - - raise ValueError('expected 1 version of Unicode, but found {}'.format(len(versions))) - - def make_key(ver): - return tuple(map(int, ver.split('.'))) - - return max(versions, key=make_key) - -def download_files(unicode_version, unicode_data_files): - 'Downloads the Unicode data files from the website.' - - for line in unicode_data_files.splitlines(): - if line and line[0] != '#' and line[0] != '[': - base, ext = splitext(line.rpartition('/')[-1]) - versioned_path = join(unicode_folder, '{}-{}{}'.format(base, unicode_version, ext)) - - if not isfile(versioned_path): - url = urljoin(unicode_data_base, line) - path = join(unicode_folder, line.rpartition('/')[-1]) - - try: - download_unicode_file(url, path) - except HTTPError: - print('{} not found'.format(url)) - -def merge_ranges(ranges): - 'Sorts and merges a list of codepoint ranges.' - - ranges = sorted(ranges) - new_ranges = ranges[ : 1] - - for lower, upper in ranges: - if lower <= new_ranges[-1][1] + 1: - new_ranges[-1] = (new_ranges[-1][0], max(upper, new_ranges[-1][1])) - else: - new_ranges.append((lower, upper)) - - return new_ranges - -def range_difference(include_ranges, exclude_ranges): - 'Returns the difference between a list of inclusive ranges and a list of exclusive ranges.' - - new_ranges = [] - - include = IterRanges(merge_ranges(include_ranges)) - exclude = IterRanges(merge_ranges(exclude_ranges)) - - lower = include.lower - - while lower <= MAX_CODEPOINT: - if lower < include.lower: - # We're below the current include range. - # Advance into the range. - lower = include.lower - elif lower > include.upper: - # We're above the current include range. - # Advance into the next include range. - include.next() - lower = max(lower, include.lower) - elif lower < exclude.lower: - # We're below the current exclude range. - # Accept codepoints as far as the end of the include range. - upper = min(include.upper, exclude.lower - 1) - new_ranges.append((lower, upper)) - lower = upper + 1 - elif lower > exclude.upper: - # We're above the current exclude range. - exclude.next() - else: - # We're within both the include and exclude ranges. - # Advance out of the overlap. - upper = min(include.upper, exclude.upper) - lower = upper + 1 - - return new_ranges - -class IterRanges: - 'Class for iterating over a list of codepoint ranges.' - - def __init__(self, ranges): - self._ranges = ranges - self._index = 0 - - if self._index < len(self._ranges): - self.lower, self.upper = self._ranges[self._index] - else: - self.lower, self.upper = MAX_CODEPOINT + 1, MAX_CODEPOINT + 1 - - def next(self): - if self._index < len(self._ranges): - self._index += 1 - - if self._index < len(self._ranges): - self.lower, self.upper = self._ranges[self._index] - else: - self.lower, self.upper = MAX_CODEPOINT + 1, MAX_CODEPOINT + 1 - -def generate_code(): - 'Generates the code.' - - h_path = join(code_folder, '_regex_unicode.h') - c_path = join(code_folder, '_regex_unicode.c') - - # Create the list of standardised strings. - strings = [] - - for property in properties: - strings.append(property.name) - strings.extend(property.aliases) - - if property.name != 'Script_Extensions': - for value in property: - strings.append(value.name) - strings.extend(value.aliases) - - def reduce_name(name): - return name.replace('_', '').upper() - - def by_id(obj): - return obj.id - - strings = sorted(set(map(reduce_name, strings))) - - # The maximum number of scripts/codepoint in the Script_Extensions property. - max_scx = max(len(val.name.split()) for val in - properties['Script_Extensions']) - - with open(h_path , 'w', encoding='ascii', newline='\n') as h_file, \ - open(c_path, 'w', encoding='ascii', newline='\n') as c_file: - # Useful definitions. - h_file.write('''\ -typedef unsigned char RE_UINT8; -typedef signed char RE_INT8; -typedef unsigned short RE_UINT16; -typedef signed short RE_INT16; -typedef unsigned int RE_UINT32; -typedef signed int RE_INT32; - -typedef unsigned char BOOL; -#if !defined(FALSE) || !defined(TRUE) -#define FALSE 0 -#define TRUE 1 -#endif - -#define RE_ASCII_MAX 0x7F -#define RE_LOCALE_MAX 0xFF -#define RE_UNICODE_MAX 0x10FFFF - -#define RE_MAX_CASES {max_cases} -#define RE_MAX_FOLDED {max_folded} -#define RE_MAX_SCX {max_scx} - -typedef struct RE_Property {{ - RE_UINT16 name; - RE_UINT8 id; - RE_UINT8 value_set; -}} RE_Property; - -typedef struct RE_PropertyValue {{ - RE_UINT16 name; - RE_UINT8 value_set; - RE_UINT16 id; -}} RE_PropertyValue; - -typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 ch); - -'''.format(max_cases=all_cases.max_cases, - max_folded=full_case_folding.max_folded, max_scx=max_scx)) - - RE_Property_size = 4 - RE_PropertyValue_size = 4 - - for name in ('GC', 'Cased', 'Uppercase', 'Lowercase', 'SCX'): - h_file.write('#define RE_PROP_{} 0x{:X}\n'.format(name.upper(), - properties[name].id)) - - h_file.write('\n') - - values = [] - compound = [] - - for value in properties['GC']: - if value.mask: - for alias in value.aliases: - if len(alias) == 1: - compound.append((alias, value)) - break - else: - compound.append((reduce_name(value.name.upper()), value)) - else: - for alias in value.aliases: - if len(alias) == 2 and alias.isalpha(): - values.append((alias, value)) - - values.sort(key=lambda pair: pair[1].id) - compound.sort(key=lambda pair: (len(pair[0]) > 1, pair[0])) - - for alias, value in compound: - h_file.write('#define RE_PROP_{} {}\n'.format(alias, value.id)) - - h_file.write('\n') - - for alias, value in values: - h_file.write('#define RE_PROP_{} {}\n'.format(alias.upper(), - value.id)) - - h_file.write('\n') - - for alias, value in compound: - if len(alias) == 1: - h_file.write('#define RE_PROP_{}_MASK 0x{:08X}\n'.format(alias, - value.mask)) - - h_file.write('\n') - - # Common abbreviated properties. - common_properties = 'AlNum Alpha Any ASCII Blank Cntrl Digit Graph Lower Print Space Upper Word XDigit Posix_AlNum Posix_Digit Posix_Punct Posix_XDigit' - - for name in common_properties.split(): - property = properties.get(name) - if property is not None: - h_file.write('#define RE_PROP_{} 0x{:06X}\n'.format(name.upper(), - property.id << 16 | 1)) - else: - for prop_name in 'GC Script Block'.split(): - property = properties[prop_name] - value = property.get(name) - if value is not None: - h_file.write('#define RE_PROP_{} 0x{:06X}\n'.format(name.upper(), - property.id << 16 | value.id)) - break - else: - raise UnicodeDataError('unknown abbreviated property: {!a}'.format(name)) - - h_file.write('\n') - - for value in sorted(properties['Word_Break'], key=by_id): - h_file.write('#define RE_WBREAK_{} {}\n'.format(reduce_name(value.name), - value.id)) - - h_file.write('\n') - - for value in sorted(properties['Grapheme_Cluster_Break'], key=by_id): - h_file.write('#define RE_GBREAK_{} {}\n'.format(reduce_name(value.name), - value.id)) - - h_file.write('\n') - - for value in sorted(properties['Line_Break'], key=by_id): - h_file.write('#define RE_LBREAK_{} {}\n'.format(reduce_name(value.name), - value.id)) - - c_file.write('''/* For Unicode version {version} */ - -#include "_regex_unicode.h" -'''.format(version=unicode_version)) - - # Write the standardised strings. - c_file.write(''' -#define RE_BLANK_MASK ((1 << RE_PROP_ZL) | (1 << RE_PROP_ZP)) -#define RE_GRAPH_MASK ((1 << RE_PROP_CC) | (1 << RE_PROP_CS) | (1 << RE_PROP_CN)) -#define RE_WORD_MASK (RE_PROP_M_MASK | (1 << RE_PROP_ND) | (1 << RE_PROP_PC)) - -typedef struct RE_ScriptExt { - RE_UINT8 scripts[RE_MAX_SCX]; -} RE_ScriptExt; - -typedef struct RE_AllCases { - RE_INT32 diffs[RE_MAX_CASES - 1]; -} RE_AllCases; - -typedef struct RE_FullCaseFolding { - RE_INT32 diff; - RE_UINT16 codepoints[RE_MAX_FOLDED - 1]; -} RE_FullCaseFolding; - -/* strings. */ - -char* re_strings[] = { -''') - - bytesize = 0 - - for string in strings: - s = reduce_name(string) - c_file.write(' "{}",\n'.format(s)) - bytesize += len(s) + 1 - - h_file.write('\nextern char* re_strings[{}];\n'.format(len(strings))) - - c_file.write('''}}; - -/* strings: {bytesize} bytes. */ -'''.format(bytesize=bytesize)) - - # Write the property name tables. - # - # Properties which are aliases have the same property id, and - # properties, such as binary properties, which have the same set of - # values have the same value set id. - - # The rows of the property and value tables. - property_rows = [] - value_rows = [] - - # The value sets. - value_sets = {} - - # Give an id to each distinct property or value name. - strings = {string: id for id, string in enumerate(strings)} - - for property in sorted(properties, key=by_id): - prop = property - - if prop.name == 'Script_Extensions': - # The Script Extensions property name the same values as the - # Script property. - prop = properties['Script'] - - value_set = tuple((value.name, tuple(value.aliases)) for value in - prop) - new_value_set = value_set not in value_sets - value_set_id = value_sets.setdefault(value_set, len(value_sets)) - - # name of property, id of property, id of value set - property_rows.append((strings[reduce_name(property.name)], - property.id, value_set_id)) - for alias in property.aliases: - property_rows.append((strings[reduce_name(alias)], property.id, - value_set_id)) - - # We don't want to duplicate value sets. - if new_value_set: - for value in sorted(prop, key=by_id): - # name of value, id of value set, value - value_rows.append((strings[reduce_name(value.name)], - value_set_id, value.id)) - for alias in value.aliases: - value_rows.append((strings[reduce_name(alias)], - value_set_id, value.id)) - - # Columns of RE_Property are: - # RE_UINT16 name - # RE_UINT8 id - # RE_UINT8 value_set - fields = [('name', 16), ('id', 8), ('value_set', 8)] - max_values = [max(column) for column in zip(*property_rows)] - - for (name, width), max_value in zip(fields, max_values): - if max_value >> width: - raise ValueError("'{}' field of RE_Property struct is too small".format(name)) - - # Columns of RE_PropertyValue are: - # RE_UINT16 name - # RE_UINT8 value_set - # RE_UINT16 id - fields = [('name', 16), ('value_set', 8), ('id', 16)] - max_values = [max(column) for column in zip(*value_rows)] - - for (name, width), max_value in zip(fields, max_values): - if max_value >> width: - raise ValueError("'{}' field of RE_PropertyValue struct is too small".format(name)) - - # Fix the column widths of the tables. - property_rows = tabulate(property_rows) - value_rows = tabulate(value_rows) - - expand_data_type, expand_data_size = smallest_datatype(min(expand_set), - max(expand_set)) - - c_file.write(''' -/* properties. */ - -RE_Property re_properties[] = { -''') - - h_file.write('''\ -extern RE_Property re_properties[{prop_rows}]; -extern RE_PropertyValue re_property_values[{val_rows}]; -extern {data_type} re_expand_on_folding[{expand_rows}]; -extern RE_GetPropertyFunc re_get_property[{func_count}]; - -'''.format(prop_rows=len(property_rows), val_rows=len(value_rows), - data_type=expand_data_type, expand_rows=len(expand_set), - func_count=len(properties))) - - for row in property_rows: - c_file.write(' {{{}}},\n'.format(', '.join(row))) - - c_file.write('''\ -}}; - -/* properties: {bytesize} bytes. */ - -/* property values. */ - -RE_PropertyValue re_property_values[] = {{ -'''.format(bytesize=RE_Property_size * len(property_rows))) - - for row in value_rows: - c_file.write(' {{{}}},\n'.format(', '.join(row))) - - c_file.write('''\ -}}; - -/* property values: {bytesize} bytes. */ - -/* Codepoints which expand on full case-folding. */ - -{data_type} re_expand_on_folding[] = {{ -'''.format(bytesize=RE_PropertyValue_size * len(value_rows), - data_type=expand_data_type)) - - items = ['{},'.format(c) for c in sorted(expand_set)] - width = max(len(i) for i in items) - items = [i.rjust(width) for i in items] - - columns = 8 - for start in range(0, len(items), columns): - c_file.write(' {}\n'.format(' '.join(items[start : start + - columns]))) - - c_file.write('''}}; - -/* expand_on_folding: {bytesize} bytes. */ -'''.format(bytesize=len(items) * expand_data_size)) - - # Build and write the property data tables. - for index, property in enumerate(sorted(properties, key=by_id)): - report('{} of {}: {}'.format(index + 1, len(properties), - property.name)) - property.generate_code(h_file, c_file) - report() - - all_cases.generate_code(h_file, c_file) - report() - simple_case_folding.generate_code(h_file, c_file) - report() - full_case_folding.generate_code(h_file, c_file) - report() - - # Write the property function array. - c_file.write(''' -/* Property function table. */ - -RE_GetPropertyFunc re_get_property[] = { -''') - - for property in sorted(properties, key=by_id): - report('{} is {}'.format(property.name, property.id)) - - if property.name == 'Script_Extensions': - c_file.write(' 0,\n') - continue - - c_file.write(' re_get_{},\n'.format(property.name.lower())) - - c_file.write('};\n') - -def smallest_datatype(min_value, max_value): - 'Determines the smallest C data type which can store values in a range.' - - # 1 byte, unsigned and signed. - if 0 <= min_value <= max_value <= 0xFF: - return 'RE_UINT8', 1 - if -0x80 <= min_value <= max_value <= 0x7F: - return 'RE_INT8', 1 - - # 2 bytes, unsigned and signed. - if 0 <= min_value <= max_value <= 0xFFFF: - return 'RE_UINT16', 2 - if -0x8000 <= min_value <= max_value <= 0x7FFF: - return 'RE_INT16', 2 - - # 4 bytes, unsigned and signed. - if 0 <= min_value <= max_value <= 0xFFFFFFFF: - return 'RE_UINT32', 4 - if -0x80000000 <= min_value <= max_value <= 0x7FFFFFFF: - return 'RE_INT32', 4 - - raise ValueError('value range too big for 32 bits') - -# Whether to update the Unicode data files from the Unicode website. -UPDATE = False -#UPDATE = True -UNICODE_VERSION = '12.1.0' - -# Whether to recalculate the best block sizes for the tables. -RECALC = False - -# The URL from which the Unicode data files can be obtained. -unicode_data_base = 'http://www.unicode.org/Public/UNIDATA/' - -# The local folder in which the Unicode data files are stored. -unicode_folder = r'D:\projects\Unicode\Data' - -# The local folder in which the generated C files should be written. -code_folder = join(dirname(__file__), 'regex') - -# The path of the file in which the block sizes are stored. -json_path = splitext(__file__)[0] + '.json' - -COLUMNS = 16 -MAX_CODEPOINT = 0x10FFFF -NUM_CODEPOINTS = 0x110000 -MAX_STAGES = 4 -MAX_CASE_STAGES = 4 # Fewer stages for case info because it's used frequently. - -# The Unicode data files. The file names are given relative to the website URL. -unicode_data_files = '''\ -[properties] -extracted/DerivedGeneralCategory.txt -Blocks.txt -Scripts.txt -ScriptExtensions.txt -auxiliary/WordBreakProperty.txt -auxiliary/GraphemeBreakProperty.txt -auxiliary/SentenceBreakProperty.txt -DerivedCoreProperties.txt -PropList.txt -HangulSyllableType.txt -extracted/DerivedBidiClass.txt -extracted/DerivedCombiningClass.txt -extracted/DerivedDecompositionType.txt -extracted/DerivedEastAsianWidth.txt -extracted/DerivedJoiningGroup.txt -extracted/DerivedJoiningType.txt -extracted/DerivedLineBreak.txt -extracted/DerivedNumericType.txt -extracted/DerivedNumericValues.txt -extracted/DerivedBinaryProperties.txt -IndicPositionalCategory.txt -IndicSyllabicCategory.txt -emoji-data.txt -#LineBreak.txt -[normalisation] -DerivedNormalizationProps.txt -[others] -PropertyAliases.txt -PropertyValueAliases.txt -PropList.txt -CaseFolding.txt -#UnicodeData.txt -''' - -# Ensure that we have downloaded the Unicode data files for UNICODE_VERSION -# from the Unicode website. -# -# Returns True if any we get any new ones. -if UPDATE: - download_files(UNICODE_VERSION, unicode_data_files) - -# Which version of Unicode is it? -unicode_version = check_unicode_version(unicode_data_files) - -# The set of properties. -properties = PropertySet() - -# Parse the Unicode data files. -parse_property_files(unicode_folder, unicode_data_files, properties) - -storage_path = join(dirname(__file__), 'codepoint_properties.txt') - -store_properties(unicode_version, properties, storage_path) -base, ext = splitext(storage_path) -copy2(storage_path, '{}-{}{}'.format(base, unicode_version, ext)) - -# Parse the case-folding data specially. -path = join(unicode_folder, 'CaseFolding.txt') -all_cases, simple_case_folding, full_case_folding, expand_set = parse_case_folding_file(path) - -properties_path = join(dirname(__file__), 'UnicodeProperties.txt') -write_properties_description(properties, properties_path) - -# Load the sizes of the table blocks. -try: - with open(json_path, encoding='utf-8') as json_file: - storage = load(json_file) -except (FileNotFoundError, ValueError): - storage = {} - -# If it's a different version of Unicode, forget the saved block sizes. -if RECALC or storage.get('version') != unicode_version: - storage.clear() - -# Generate the _regex_unicode.h and _regex_unicode.c files. -generate_code() - -# Store the sizes of the table blocks. -storage['version'] = unicode_version - -with open(json_path, 'w', encoding='utf-8') as json_file: - dump(storage, json_file) - -report('\nThere are {} properties'.format(len(properties))) - -# Collect and summarise a few statistics. -import re -c_path = join(code_folder, '_regex_unicode.c') -code = open(c_path).read() -sizes = defaultdict(int) -for n, s in re.findall(r'(\w+(?: \w+)*): (\d+) bytes', code): - sizes[n] += int(s) -sizes = sorted(sizes.items(), key=lambda pair: pair[1], reverse=True) -total_size = sum(s for n, s in sizes) -report('\nTotal: {} bytes\n'.format(total_size)) -prop_width = max(len(row[0]) for row in sizes) -prop_width = max(prop_width, 8) -storage_width = max(len(str(row[1])) for row in sizes) -storage_width = max(storage_width, 7) -report('{:{}} {:{}} {}'.format('Property', prop_width, 'Storage', - storage_width, 'Percentage')) -report('{:{}} {:{}} {}'.format('--------', prop_width, '-------', - storage_width, '----------')) -format = '{{:<{}}} {{:>{}}} {{:>5.1%}}'.format(prop_width, storage_width) -for n, s in sizes: - report(format.format(n, s, s / total_size)) - -report('\nFinished!') +#! python3.8 +# -*- coding: utf-8 -*- +# +# This Python script parses the Unicode data files and generates the C files +# for the regex module. +# +# Written by MRAB. +# +from contextlib import suppress +from itertools import chain +from os import listdir, mkdir +from os.path import basename, dirname, exists, join, normpath +from urllib.parse import urljoin +from urllib.request import urlretrieve +from time import time + +import codecs +import sys +sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach()) + +class Timed: + def __init__(self, message=None): + self._message = message + + def __enter__(self): + self._start = time() + + def __exit__(self, exc_type, exc_val, exc_tb): + finish = time() + elapsed = finish - self._start + + if self._message is None: + print(f'Took {elapsed:0.2f} secs') + else: + print(f'{self._message} took {elapsed:0.2f} secs') + + return False + +def unique(iterable, key=None): + + if key is None: + def key(item): + return item + + seen = set() + + for item in iterable: + k = key(item) + + if k not in seen: + seen.add(k) + yield item + +class IterRanges: + def __init__(self, ranges): + self._ranges = ranges + self._pos = 0 + self._update() + + def next(self): + if self._pos >= len(self._ranges): + return + + self._pos += 1 + self._update() + + def _update(self): + if self._pos < len(self._ranges): + self.lower, self.upper = self._ranges[self._pos] + else: + self.lower = self.upper = NUM_CODEPOINTS + +class Ranges: + def __init__(self, initial=None): + self._ranges = [] + + if initial is not None: + self._ranges.extend(initial) + + self._is_normalised = initial is None + + def add(self, lower, upper=None): + if upper is None: + self._ranges.append((lower, lower)) + else: + self._ranges.append((lower, upper)) + + self._is_normalised = False + + def __or__(self, other): + return Ranges(self._ranges + other._ranges) + + def __sub__(self, other): + self._normalise() + other._normalise() + + include = IterRanges(self._ranges) + exclude = IterRanges(other._ranges) + new_ranges = [] + + lower = include.lower + + while lower < NUM_CODEPOINTS: + if lower < include.lower: + # We're below the current include range. + # Advance into the range. + lower = include.lower + elif lower > include.upper: + # We're above the current include range. + # Advance into the next include range. + include.next() + lower = max(lower, include.lower) + elif lower < exclude.lower: + # We're below the current exclude range. + # Accept codepoints as far as the end of the include range. + upper = min(include.upper, exclude.lower - 1) + new_ranges.append((lower, upper)) + lower = upper + 1 + elif lower > exclude.upper: + # We're above the current exclude range. + exclude.next() + else: + # We're within both the include and exclude ranges. + # Advance out of the overlap. + upper = min(include.upper, exclude.upper) + lower = upper + 1 + + return Ranges(new_ranges) + + def __iter__(self): + self._normalise() + + return iter(self._ranges) + + def __len__(self): + self._normalise() + + return len(self._ranges) + + def lowest(self): + self._normalise() + + return self._ranges[0][0] + + def __repr__(self): + self._normalise() + + return 'Ranges({!r})'.format(self._ranges) + + def _normalise(self): + if self._is_normalised: + return + + if len(self._ranges) >= 2: + self._ranges.sort() + + new_ranges = [] + lower, upper = self._ranges[0] + + for l, u in self._ranges[1 : ]: + if l - upper > 1: + new_ranges.append((lower, upper)) + lower, upper = l, u + else: + lower = min(lower, l) + upper = max(upper, u) + + new_ranges.append((lower, upper)) + + self._ranges = new_ranges + + self._is_normalised = True + +munge_dict = str.maketrans({'-': '', '_': '', ' ': ''}) + +def munge(value): + munged_value = value.translate(munge_dict).upper() + + if value.startswith('-'): + munged_value = '-' + munged_value + + return munged_value + +def download_unicode_files(unicode_data_base, data_files, data_folder): + for section in data_files.values(): + for rel_path in section: + path = normpath(join(data_folder, basename(rel_path))) + + if not exists(path): + url = urljoin(unicode_data_base, rel_path) + print('Downloading {} from {}'.format(rel_path, url), + flush=True) + urlretrieve(url, path) + +def parse_property_aliases(data_folder): + properties = {} + + path = join(data_folder, 'PropertyAliases.txt') + + with open(path, encoding='utf-8') as file: + for line in file: + line = line.strip() + + if not line or line.startswith('#'): + continue + + fields = [field.strip() for field in line.split(';')] + prop_name = fields.pop(1) + + property = {'names': list(unique([prop_name] + fields, key=munge))} + + for name in property['names']: + properties[munge(name)] = property + + return properties + +def parse_value_aliases(data_folder, properties): + path = join(data_folder, 'PropertyValueAliases.txt') + + with open(path, encoding='utf-8') as file: + for line in file: + line = line.strip() + + if not line or line.startswith('#'): + continue + + line = line.partition('#')[0] + fields = [field.strip() for field in line.split(';')] + prop_name = fields.pop(0) + val_name = fields.pop(2 if prop_name == 'ccc' else 1) + + property = properties[munge(prop_name)] + value = {'names': list(unique([val_name] + fields, key=munge))} + values = property.setdefault('values', {}) + + for name in value['names']: + values[munge(name)] = value + +def parse_binary(properties, path): + with open(path, encoding='utf-8') as file: + for line in file: + line = line.strip() + + if not line or line.startswith('#'): + continue + + line = line.partition('#')[0] + fields = [field.strip() for field in line.split(';')] + codepoints = [int(part, 16) for part in fields[0].split('..')] + prop_name = fields[1] + property = properties[munge(prop_name)] + property.setdefault('default', munge('No')) + value = property['values'][munge('Yes')] + value.setdefault('codepoints', Ranges()).add(codepoints[0], + codepoints[-1]) + +def parse_emoji(properties, path): + with open(path, encoding='utf-8') as file: + for line in file: + line = line.strip() + + if not line: + continue + + if line.startswith('# @missing:'): + fields = line.split() + prop_name = fields[-3] + + try: + property = properties[munge(prop_name)] + except KeyError: + property = {'names': [prop_name], 'values': {}} + value = {'names': ['No', 'N']} + property['values'][munge(value['names'][0])] = value + value = {'names': ['Yes', 'Y']} + property['values'][munge(value['names'][0])] = value + properties[munge(prop_name)] = property + + default = fields[-1] + property['default'] = munge(default) + elif not line.startswith('#'): + line = line.partition('#')[0] + fields = [field.strip() for field in line.split(';')] + codepoints = [int(part, 16) for part in fields[0].split('..')] + prop_name = fields[1] + property = properties[munge(prop_name)] + property.setdefault('default', munge('No')) + + try: + value = property['values'][munge('Yes')] + except KeyError: + value = {'names': ['Yes']} + property['values'][munge('Yes')] = value + + value.setdefault('codepoints', Ranges()).add(codepoints[0], + codepoints[-1]) + +def parse_multivalue(properties, path): + with open(path, encoding='utf-8') as file: + for line in file: + line = line.strip() + + if not line: + continue + + if line.startswith('# Property:'): + prop_name = line.split()[-1] + property = properties[munge(prop_name)] + elif line.startswith('# All code points not explicitly listed for'): + prop_name = line.split()[-1] + property = properties[munge(prop_name)] + elif line.startswith('# @missing:'): + default = line.split()[-1] + property['default'] = munge(default) + elif not line.startswith('#'): + line = line.partition('#')[0] + fields = [field.strip() for field in line.split(';')] + codepoints = [int(part, 16) for part in fields[0].split('..')] + val_name = fields[1] + value = property['values'][munge(val_name)] + value.setdefault('codepoints', Ranges()).add(codepoints[0], + codepoints[-1]) + +def parse_normalisation(properties, path): + property = None + + with open(path, encoding='utf-8') as file: + for line in file: + line = line.strip() + + if not line: + continue + + if line.startswith('# Derived Property:'): + property = None + elif line.startswith('# Property:'): + prop_name = line.split()[-1] + property = properties[munge(prop_name)] + elif property: + if line.startswith('# @missing:'): + default = line.split()[-1] + property['default'] = munge(default) + elif not line.startswith('#'): + line = line.partition('#')[0] + fields = [field.strip() for field in line.split(';')] + codepoints = [int(part, 16) for part in + fields[0].split('..')] + val_name = fields[2] + + value = property['values'][munge(val_name)] + value.setdefault('codepoints', Ranges()).add(codepoints[0], + codepoints[-1]) + +def parse_numeric_values(properties, path): + with open(path, encoding='utf-8') as file: + for line in file: + line = line.strip() + + if not line: + continue + + if line.startswith('# Derived Property:'): + prop_name = line.split()[-1] + property = properties[munge(prop_name)] + default = {'names': ['NaN']} + property['values'] = {munge('NaN'): default} + property['default'] = munge('NaN') + elif line.startswith('# @missing:'): + default = line.split()[-1] + property['default'] = munge(default) + elif not line.startswith('#'): + line = line.partition('#')[0] + fields = [field.strip() for field in line.split(';')] + codepoints = [int(part, 16) for part in fields[0].split('..')] + val_name = fields[3] + + try: + value = property['values'][munge(val_name)] + except KeyError: + value = {'names': [val_name]} + property['values'][munge(val_name)] = value + + value.setdefault('codepoints', Ranges()).add(codepoints[0], + codepoints[-1]) + +def parse_script_extensions(properties, path): + with open(path, encoding='utf-8') as file: + for line in file: + line = line.strip() + + if not line: + continue + + if line.startswith('# Property:'): + prop_name = line.split()[-1] + property = properties[munge(prop_name)] + property['values'] = {} + elif not line.startswith('#'): + line = line.partition('#')[0] + fields = [field.strip() for field in line.split(';')] + codepoints = [int(part, 16) for part in fields[0].split('..')] + + key = tuple(sorted(fields[1].split(), key=str.lower)) + + try: + value = property['values'][key] + except KeyError: + value = {'codepoints': Ranges()} + property['values'][key] = value + + value['codepoints'].add(codepoints[0], codepoints[-1]) + +def parse_case_folding(properties, path): + simple_folding = {} + full_folding = {} + turkic_set = set() + + with open(path, encoding='utf-8') as file: + for line in file: + line = line.strip() + + if not line or line.startswith('#'): + continue + + line = line.partition('#')[0] + fields = line.split(';') + codepoint = int(fields[0], 16) + kind = fields[1].strip() + folded = [int(part, 16) for part in fields[2].split()] + delta = folded[0] ^ codepoint + + if kind in {'S', 'C', 'T'}: + simple_folding.setdefault(delta, Ranges()).add(codepoint, + codepoint) + + if kind in {'F', 'C', 'T'}: + key = tuple([delta] + folded[1 : ]) + full_folding.setdefault(key, Ranges()).add(codepoint, + codepoint) + + if kind == 'T': + turkic_set.add((codepoint, tuple(folded))) + + # Is the Turkic set what we expected? + if turkic_set != {(0x49, (0x131, )), (0x130, (0x69, ))}: + raise ValueError('Turkic set has changed') + + properties['simple_folding'] = simple_folding + properties['full_folding'] = full_folding + +def parse_unicode_files(data_files, data_folder): + properties = parse_property_aliases(data_folder) + parse_value_aliases(data_folder, properties) + + def ignore(*args): + pass + + parsers = { + 'aliases': ignore, + 'binary': parse_binary, + 'emoji': parse_emoji, + 'multivalue': parse_multivalue, + 'normalisation': parse_normalisation, + 'numeric_values': parse_numeric_values, + 'script_extensions': parse_script_extensions, + 'case_folding': parse_case_folding, + } + + for section, rel_paths in data_files.items(): + parse = parsers[section] + + for rel_path in rel_paths: + data_file = basename(rel_path) + + print('Parsing {}'.format(data_file), flush=True) + parse(properties, join(data_folder, data_file)) + + unicode_data = {'properties': {}} + + for prop_name, property in properties.items(): + if has_codepoints(property): + unicode_data['properties'][prop_name] = property + elif prop_name in {'simple_folding', 'full_folding'}: + unicode_data[prop_name] = property + + properties = unicode_data['properties'] + property = properties[munge('General_Category')] + property['default'] = munge('Unassigned') + + values = property['values'] + + for val_name, value in list(values.items()): + if len(val_name) == 1: + new_name = val_name.upper() + '&' + values[munge(new_name)] = value + value['names'].append(new_name) + + return unicode_data + +def make_binary_property(properties, names, codepoints): + no_value = {'names': ['No', 'N', 'F', 'False']} + yes_value = {'names': ['Yes', 'Y', 'T', 'True'], 'codepoints': codepoints} + values = {} + + for value in [no_value, yes_value]: + for name in value['names']: + values[munge(name)] = value + + property = {'names': names, 'values': values, 'default': munge('No')} + + for name in names: + properties[munge(name)] = property + +def make_additional_properties(unicode_data): + + def get_values(prop_name): + return properties[munge(prop_name)]['values'] + + def get_codepoints(prop_name, val_name): + return get_values(prop_name)[munge(val_name)]['codepoints'] + + properties = unicode_data['properties'] + + # Make the 'Alphanumeric' property. + alphabetic = get_codepoints('Alphabetic', 'Yes') + decimal_number = get_codepoints('General_Category', 'Decimal_Number') + + make_binary_property(properties, ['Alphanumeric', 'AlNum'], alphabetic | + decimal_number) + + # Make the 'Any' property. + make_binary_property(properties, ['Any'], Ranges([(0, NUM_CODEPOINTS - + 1)])) + + # General_Category has a compound value called 'Assigned'. + assigned = Ranges() + + for value in unique(get_values('General_Category').values(), key=id): + if value['names'][0] != 'Unassigned': + try: + assigned |= value['codepoints'] + except KeyError: + pass + + value = {'names': ['Assigned']} + properties[munge('General_Category')]['values'][munge('Assigned')] = value + + # Make the 'Blank' property. + space_separator = get_codepoints('General_Category', 'Space_Separator') + blank = Ranges([(0x09, 0x09)]) | space_separator + + make_binary_property(properties, ['Blank'], blank) + + # Make the 'Graph' property. + whitespace = get_codepoints('White_Space', 'Yes') + control = get_codepoints('General_Category', 'Control') + surrogate = get_codepoints('General_Category', 'Surrogate') + + graph = assigned - (whitespace | control | surrogate) + + make_binary_property(properties, ['Graph'], graph) + + # Make the 'Print' property. + print_ = (graph | blank) - control + + make_binary_property(properties, ['Print'], print_) + + # Make the 'Word' property. + enclosing_mark = get_codepoints('General_Category', 'Enclosing_Mark') + nonspacing_mark = get_codepoints('General_Category', 'Nonspacing_Mark') + spacing_mark = get_codepoints('General_Category', 'Spacing_Mark') + connector_punctuation = get_codepoints('General_Category', + 'Connector_Punctuation') + join_control = get_codepoints('Join_Control', 'Yes') + + word = (alphabetic | enclosing_mark | nonspacing_mark | spacing_mark | + decimal_number | connector_punctuation | join_control) + + make_binary_property(properties, ['Word'], word) + + # Make the 'XDigit' property. + hex_digit = get_codepoints('Hex_Digit', 'Yes') + + xdigit = decimal_number | hex_digit + + make_binary_property(properties, ['XDigit'], xdigit) + + # Make the 'Posix_Digit' property. + posix_digit = Ranges([(ord('0'), ord('9'))]) + + make_binary_property(properties, ['Posix_Digit'], posix_digit) + + # Make the 'Posix_AlNum' property. + posix_alnum = alphabetic | posix_digit + + make_binary_property(properties, ['Posix_AlNum'], posix_alnum) + + # Make the 'Posix_Punct' property. + punctuation = Ranges() + + for name in 'Pd Ps Pe Pc Po Pi Pf'.split(): + punctuation |= get_codepoints('General_Category', name) + + symbol = Ranges() + + for name in 'Sm Sc Sk So '.split(): + symbol |= get_codepoints('General_Category', name) + + posix_punct = (punctuation | symbol) - alphabetic + + make_binary_property(properties, ['Posix_Punct'], posix_punct) + + # Make the 'Posix_XDigit' property. + posix_xdigit = Ranges([(ord('0'), ord('9')), (ord('A'), ord('F')), + (ord('a'), ord('f'))]) + + make_binary_property(properties, ['Posix_XDigit'], posix_xdigit) + +def preferred(d): + return munge(d['names'][0]) + +def has_codepoints(property): + if 'values' not in property: + return False + + return any('codepoints' in value for value in property['values'].values()) + +def write_summary(unicode_data, tools_folder): + print('Writing summary') + + properties = unicode_data['properties'] + + path = join(tools_folder, 'Unicode.txt') + + with open(path, 'w', encoding='ascii') as file: + file.write('Version {}\n'.format(UNICODE_VERSION)) + + for property in sorted(unique(properties.values(), key=id), + key=preferred): + if not has_codepoints(property): + print(property['names'][0]) + continue + + file.write('Property {}\n'.format(' '.join(property['names']))) + + values = property['values'] + + if property['names'][0] == 'Script_Extensions': + for key in sorted(values): + value = values[key] + file.write('Value {}\n'.format(' '.join(key))) + + for lower, upper in value.get('codepoints', []): + if lower == upper: + file.write('{:04X}\n'.format(lower)) + else: + file.write('{:04X}..{:04X}\n'.format(lower, upper)) + else: + if 'default' in property: + default = values[property['default']] + file.write('DefaultValue {}\n'.format(default['names'][0])) + + for value in sorted(unique(values.values(), key=id), + key=preferred): + file.write('Value {}\n'.format(' '.join(value['names']))) + + for lower, upper in value.get('codepoints', []): + if lower == upper: + file.write('{:04X}\n'.format(lower)) + else: + file.write('{:04X}..{:04X}\n'.format(lower, upper)) + + file.write('SimpleFolding\n') + + for delta, ranges in unicode_data['simple_folding'].items(): + file.write('Value {:04X}\n'.format(delta)) + + for lower, upper in ranges: + if lower == upper: + file.write('{:04X}\n'.format(lower)) + else: + file.write('{:04X}..{:04X}\n'.format(lower, upper)) + + file.write('FullFolding\n') + + for key, ranges in unicode_data['full_folding'].items(): + file.write('Value {}\n'.format(' '.join('{:04X}'.format(value) for + value in key))) + + for lower, upper in ranges: + if lower == upper: + file.write('{:04X}\n'.format(lower)) + else: + file.write('{:04X}..{:04X}\n'.format(lower, upper)) + +def make_binary_dict(): + binary_dict = {} + + for n in range(0x100): + key = tuple(map(int, format(n, '08b')[ : : -1])) + binary_dict[key] = n + + return binary_dict + +def collect_strings(properties): + strings = [] + + for property in properties.values(): + try: + strings.extend(property['names']) + + for value in property['values'].values(): + strings.extend(value['names']) + except KeyError: + pass + + return sorted(set(munge(string) for string in strings)) + +def chunked(iterable, chunk_size): + sequence = iterable + count = len(sequence) + + for start in range(0, count, chunk_size): + chunk = sequence[start : start + chunk_size] + yield chunk + +def determine_entry_type(iterable): + lower, upper = min(iterable), max(iterable) + + if 0 <= lower <= upper <= 0xFF: + return 'RE_UINT8' + + if 0 <= lower <= upper <= 0xFFFF: + return 'RE_UINT16' + + raise ValueError('cannot determine C type for {}..{}'.format(lower, upper)) + +def is_binary(property): + return sum(1 for val in val_list if val['id'] != 0) == 1 + +def count_ranges(property): + count = 0 + default_id = property['values'][munge(property['default'])]['id'] + + for value in unique(property['values'].values(), key=id): + if value['id'] != default_id: + count += len(value.get('codepoints', [])) + + return count + +def generate_small_lookup(property, c_file): + c_file.write(''' +/* {}. */ +RE_UINT32 re_get_{}(RE_UINT32 codepoint) {{ +'''.format(property['names'][0], property['names'][0].lower())) + + default_id = property['values'][munge(property['default'])]['id'] + ranges = [] + + for value in unique(property['values'].values(), key=id): + if value['id'] != default_id: + val_id = value['id'] + + for lower, upper in value.get('codepoints', []): + ranges.append((lower, upper, val_id)) + + if len(ranges) == 1 and ranges[0][ : 2] == (0, NUM_CODEPOINTS - 1): + c_file.write(' return {};\n}}\n'.format(ranges[0][2])) + else: + for lower, upper, val_id in ranges: + width = 2 if upper <= 0xFF else 4 if upper <= 0xFFFF else 6 + + if lower == upper: + c_file.write('''\ + if (codepoint == 0x{:0{width}X}) + return {}; +'''.format(lower, val_id, width=width)) + else: + c_file.write('''\ + if (0x{:0{width}X} <= codepoint && codepoint <= 0x{:0{width}X}) + return {}; +'''.format(lower, upper, val_id, width=width)) + + c_file.write('\n return {};\n}}\n'.format(default_id)) + +def generate_table(table_name, values, c_file, max_columns=16, public=False): + entry_type = determine_entry_type(values) + + if public: + c_file.write('{} {}[] = {{\n'.format(entry_type, table_name)) + else: + c_file.write('static {} {}[] = {{\n'.format(entry_type, table_name)) + + entries = [str(value) for value in values] + max_width = max(len(entry) for entry in entries) + entries = [entry.rjust(max_width) + ',' for entry in entries] + entries[-1] = entries[-1].rstrip(',') + + for chunk in chunked(entries, max_columns): + c_file.write(' %s\n' % ' '.join(chunk)) + + c_file.write('};\n') + +def generate_lookup(property, c_file): + val_list = list(unique(property['values'].values(), key=id)) + + if count_ranges(property) <= 8: + generate_small_lookup(property, c_file) + return + + default_id = property['values'][munge(property['default'])]['id'] + entries = [default_id] * NUM_CODEPOINTS + + for value in val_list: + val_id = value['id'] + + for lower, upper in value.get('codepoints', []): + entries[lower : upper + 1] = [val_id] * (upper - lower + 1) + + CHUNK_SIZE = 32 + + indexes = [] + chunks = {} + + for chunk in chunked(tuple(entries), CHUNK_SIZE): + indexes.append(chunks.setdefault(chunk, len(chunks))) + + table_2 = list(chain(*sorted(chunks, key=chunks.get))) + + entries = indexes + indexes = [] + chunks = {} + + for start in range(0, len(entries), CHUNK_SIZE): + chunk = tuple(entries[start : start + CHUNK_SIZE]) + indexes.append(chunks.setdefault(chunk, len(chunks))) + + table_1 = list(chain(*sorted(chunks, key=chunks.get))) + + table_0 = indexes + + c_file.write('\n/* {}. */\n'.format(property['names'][0])) + + prop_name = property['names'][0].lower() + binary = set(table_2) == {0, 1} + + for i, table in enumerate([table_0, table_1, table_2]): + if i == 2 and binary: + binary = True + entries = [] + + for start in range(0, len(table), 8): + entries.append(binary_dict[tuple(table[start : start + 8])]) + + table = entries + + if i > 0: + c_file.write('\n') + + generate_table('re_{}_table_{}'.format(prop_name, 1 + i), table, + c_file) + + if binary: + c_file.write(''' +RE_UINT32 re_get_{0}(RE_UINT32 codepoint) {{ + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 offset; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = (codepoint >> 3) & 0x3; + offset = codepoint & 0x7; + + v = re_{0}_table_1[field_2]; + v = re_{0}_table_2[(v << 5) | field_1]; + v = re_{0}_table_3[(v << 2) | field_0]; + + return (v >> offset) & 0x1; +}} +'''.format(prop_name)) + else: + c_file.write(''' +RE_UINT32 re_get_{0}(RE_UINT32 codepoint) {{ + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_{0}_table_1[field_2]; + v = re_{0}_table_2[(v << 5) | field_1]; + v = re_{0}_table_3[(v << 5) | field_0]; + + return v; +}} +'''.format(prop_name)) + +def generate_script_extensions_lookup(properties, property, c_file): + entries = [0] * NUM_CODEPOINTS + + # Initialise with script. + val_list = unique(properties[munge('Script')]['values'].values(), key=id) + + for value in val_list: + val_id = value['id'] + + for lower, upper in value.get('codepoints', []): + entries[lower : upper + 1] = [val_id] * (upper - lower + 1) + + script_count = 1 + max(value['id'] for value in + properties[munge('Script')]['values'].values()) + + val_list = unique(property['values'].values(), key=id) + + for value in val_list: + val_id = value['id'] + + for lower, upper in value.get('codepoints', []): + entries[lower : upper + 1] = [val_id] * (upper - lower + 1) + + CHUNK_SIZE = 32 + + indexes = [] + chunks = {} + + for chunk in chunked(entries, CHUNK_SIZE): + indexes.append(chunks.setdefault(tuple(chunk), len(chunks))) + + table_2 = list(chain(*sorted(chunks, key=chunks.get))) + + entries = indexes + indexes = [] + chunks = {} + + for start in range(0, len(entries), CHUNK_SIZE): + chunk = tuple(entries[start : start + CHUNK_SIZE]) + indexes.append(chunks.setdefault(chunk, len(chunks))) + + table_1 = list(chain(*sorted(chunks, key=chunks.get))) + + table_0 = indexes + + c_file.write('\n/* {}. */\n'.format(property['names'][0])) + + prop_name = property['names'][0].lower() + + for i, table in enumerate([table_0, table_1, table_2]): + generate_table('{}_table_{}'.format(prop_name, 1 + i), table, c_file) + + script_values = properties[munge('Script')]['values'] + ext_dict = {} + + for key, value in property['values'].items(): + ext_dict[value['id']] = [script_values[munge(name)]['id'] for name in + key] + + offsets = [] + entries = [] + + for key, value in sorted(ext_dict.items()): + offsets.append(len(entries)) + entries.extend(value + [0]) + + generate_table('{}_table_4'.format(prop_name), offsets, c_file) + + generate_table('{}_table_5'.format(prop_name), entries, c_file) + + c_file.write(''' +int re_get_{0}(RE_UINT32 codepoint, RE_UINT8* scripts) {{ + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + int offset; + int count; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = {0}_table_1[field_2]; + v = {0}_table_2[(v << 5) | field_1]; + v = {0}_table_3[(v << 5) | field_0]; + + if (v < {1}) {{ + scripts[0] = v; + + return 1; + }} + + offset = {0}_table_4[v - {1}]; + count = 0; + + do {{ + scripts[count] = {0}_table_5[offset + count]; + ++count; + }} while ({0}_table_5[offset + count] != 0); + + return count; +}} +'''.format(prop_name, script_count)) + +def generate_all_cases(unicode_data, c_file): + simple_folding = unicode_data['simple_folding'] + + all_cases = {} + + for delta, ranges in simple_folding.items(): + for lower, upper in ranges: + for codepoint in range(lower, upper + 1): + folded = codepoint ^ delta + all_cases.setdefault(folded, set()).update({codepoint, folded}) + + for codepoint in list(all_cases): + cases = {codepoint} | all_cases.get(codepoint, set()) + + for c in list(cases): + cases |= all_cases.get(c, set()) + + for c in cases: + all_cases[c] = cases + + all_cases[0x49] = {0x49, 0x69, 0x131} # Dotless capital I. + all_cases[0x69] = {0x69, 0x49, 0x130} # Dotted small I. + all_cases[0x130] = {0x130, 0x69} # Dotted capital I. + all_cases[0x131] = {0x131, 0x49} # Dotless small I. + + entries = [0] * NUM_CODEPOINTS + others_dict = {(0, ): 0} + + for codepoint, cases in all_cases.items(): + others = sorted(cases - {codepoint}) + key = tuple([others[0] ^ codepoint] + others[1 : ]) + entries[codepoint] = others_dict.setdefault(key, len(others_dict)) + + CHUNK_SIZE = 32 + + indexes = [] + chunks = {} + + for chunk in chunked(entries, CHUNK_SIZE): + indexes.append(chunks.setdefault(tuple(chunk), len(chunks))) + + table_2 = list(chain(*sorted(chunks, key=chunks.get))) + + entries = indexes + indexes = [] + chunks = {} + + for start in range(0, len(entries), CHUNK_SIZE): + chunk = tuple(entries[start : start + CHUNK_SIZE]) + indexes.append(chunks.setdefault(chunk, len(chunks))) + + table_1 = list(chain(*sorted(chunks, key=chunks.get))) + + table_0 = indexes + + c_file.write('\n/* All cases. */\n') + + for i, table in enumerate([table_0, table_1, table_2]): + if i > 0: + c_file.write('\n') + + generate_table('re_all_cases_table_{}'.format(1 + i), table, c_file) + + c_file.write('\nstatic RE_AllCases re_all_cases_table_4[] = {\n') + + max_columns = max(len(value) for value in others_dict) + + max_width = max(len(str(item)) for value in others_dict for item in value) + fmt = ' {{' + ', '.join(['{:%d}' % max_width] * max_columns) + '}},\n' + + lines = [] + + for values in sorted(others_dict, key=others_dict.get): + values = list(values) + [0] * max_columns + lines.append(fmt.format(*values)) + + lines[-1] = lines[-1].rstrip(',\n') + '\n' + + c_file.writelines(lines) + + c_file.write('};\n') + + c_file.write(''' +int re_get_all_cases(RE_UINT32 codepoint, RE_UINT32* cases) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_all_cases_table_1[field_2]; + v = re_all_cases_table_2[(v << 5) | field_1]; + v = re_all_cases_table_3[(v << 5) | field_0]; + + cases[0] = codepoint; + + if (re_all_cases_table_4[v].delta == 0) + return 1; + + cases[1] = codepoint ^ re_all_cases_table_4[v].delta; + + if (re_all_cases_table_4[v].others[0] == 0) + return 2; + + cases[2] = re_all_cases_table_4[v].others[0]; + + if (re_all_cases_table_4[v].others[1] == 0) + return 3; + + cases[3] = re_all_cases_table_4[v].others[1]; + + return 4; +} +''') + +def generate_simple_case_folding(unicode_data, c_file): + simple_folding = unicode_data['simple_folding'] + + entries = [0] * NUM_CODEPOINTS + value_dict = {0: 0} + + for delta, ranges in sorted(simple_folding.items()): + val_id = value_dict.setdefault(delta, len(value_dict)) + + for lower, upper in ranges: + entries[lower : upper + 1] = [val_id] * (upper - lower + 1) + + CHUNK_SIZE = 32 + + indexes = [] + chunks = {} + + for chunk in chunked(entries, CHUNK_SIZE): + indexes.append(chunks.setdefault(tuple(chunk), len(chunks))) + + table_2 = list(chain(*sorted(chunks, key=chunks.get))) + + entries = indexes + indexes = [] + chunks = {} + + for start in range(0, len(entries), CHUNK_SIZE): + chunk = tuple(entries[start : start + CHUNK_SIZE]) + indexes.append(chunks.setdefault(chunk, len(chunks))) + + table_1 = list(chain(*sorted(chunks, key=chunks.get))) + + table_0 = indexes + + c_file.write('\n/* Simple case folding. */\n') + + for i, table in enumerate([table_0, table_1, table_2]): + if i > 0: + c_file.write('\n') + + generate_table('re_simple_folding_table_{}'.format(1 + i), table, c_file) + + c_file.write('\nstatic RE_UINT16 re_simple_folding_table_4[] = {\n') + + entries = [str(value) for value in sorted(value_dict, key=value_dict.get)] + max_width = max(len(entry) for entry in entries) + entries = [entry.rjust(max_width) + ',' for entry in entries] + entries[-1] = entries[-1].rstrip(',') + + for chunk in chunked(entries, 8): + c_file.write(' %s\n' % ' '.join(chunk)) + + c_file.write('};\n') + + c_file.write(''' +RE_UINT32 re_get_simple_case_folding(RE_UINT32 codepoint) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_simple_folding_table_1[field_2]; + v = re_simple_folding_table_2[(v << 5) | field_1]; + v = re_simple_folding_table_3[(v << 5) | field_0]; + + return codepoint ^ re_simple_folding_table_4[v]; +} +''') + +def generate_full_case_folding(unicode_data, c_file): + full_folding = unicode_data['full_folding'] + + entries = [0] * NUM_CODEPOINTS + value_dict = {(0, ): 0} + + for delta, ranges in sorted(full_folding.items()): + val_id = value_dict.setdefault(delta, len(value_dict)) + + for lower, upper in ranges: + entries[lower : upper + 1] = [val_id] * (upper - lower + 1) + + CHUNK_SIZE = 32 + + indexes = [] + chunks = {} + + for chunk in chunked(entries, CHUNK_SIZE): + indexes.append(chunks.setdefault(tuple(chunk), len(chunks))) + + table_2 = list(chain(*sorted(chunks, key=chunks.get))) + + entries = indexes + indexes = [] + chunks = {} + + for start in range(0, len(entries), CHUNK_SIZE): + chunk = tuple(entries[start : start + CHUNK_SIZE]) + indexes.append(chunks.setdefault(chunk, len(chunks))) + + table_1 = list(chain(*sorted(chunks, key=chunks.get))) + + table_0 = indexes + + c_file.write('\n/* Full case folding. */\n') + + for i, table in enumerate([table_0, table_1, table_2]): + if i > 0: + c_file.write('\n') + + generate_table('re_full_folding_table_{}'.format(1 + i), table, c_file) + + c_file.write('\nstatic RE_FullCaseFolding re_full_folding_table_4[] = {\n') + + max_folded = max(len(value) for value in value_dict) + max_width = max(len(str(item)) for value in value_dict for item in value) + rows = [(value + (0, ) * max_folded)[ : max_folded] for value in + sorted(value_dict, key=value_dict.get)] + fmt = (' {{' + ', '.join(['{:%d}' % max_width] * max_folded) + + '}},\n').format + lines = [] + + for row in rows: + lines.append(fmt(*row)) + + lines[-1] = lines[-1].rstrip(',\n') + '\n' + + c_file.writelines(lines) + + c_file.write('};\n') + + c_file.write(''' +int re_get_full_case_folding(RE_UINT32 codepoint, RE_UINT32* folded) { + RE_UINT32 field_2; + RE_UINT32 field_1; + RE_UINT32 field_0; + RE_UINT32 v; + RE_UINT16* data; + + field_2 = codepoint >> 10; + field_1 = (codepoint >> 5) & 0x1F; + field_0 = codepoint & 0x1F; + + v = re_full_folding_table_1[field_2]; + v = re_full_folding_table_2[(v << 5) | field_1]; + v = re_full_folding_table_3[(v << 5) | field_0]; + + data = re_full_folding_table_4[v].data; + folded[0] = codepoint ^ data[0]; + + if (data[1] == 0) + return 1; + + folded[1] = data[1]; + + if (data[2] == 0) + return 2; + + folded[2] = data[2]; + + return 3; +} +''') + +def generate_code(unicode_data, tools_folder): + print('Generating code') + + # Codepoints that expand on full casefolding. + expanded = [] + + for key, ranges in unicode_data['full_folding'].items(): + if len(key) > 1: + for lower, upper in ranges: + expanded.extend(range(lower, upper + 1)) + + expanded.sort() + + # Assign the property and value IDs. + properties = unicode_data['properties'] + prop_list = list(unique(properties.values(), key=id)) + prop_list.sort(key=preferred) + + unicode_data['property_tablee_count'] = len(properties) + unicode_data['property_count'] = len(prop_list) + + no_yes_maybe = { + 'NO', 'N', 'FALSE', 'F', + 'YES', 'Y', 'TRUE', 'T', + 'MAYBE', 'M', + } + + yes_no_maybe_dict = {'No': 0, 'Yes': 1, 'Maybe': 2} + + for prop_id, property in enumerate(prop_list): + property['id'] = prop_id + + if property['names'][0] == 'Script_Extensions': + script_count = 1 + max(val['id'] for val in + properties[munge('Script')]['values'].values()) + + def make_key(value): + return value['codepoints'].lowest() + + val_list = list(unique(property['values'].values(), key=id)) + val_list.sort(key=make_key) + + for val_id, value in enumerate(val_list): + value['id'] = script_count + val_id + else: + default = property['default'] + + if not (set(property['values']) - no_yes_maybe): + + def make_key(value): + return yes_no_maybe_dict[value['names'][0]] + + else: + + def make_key(value): + if munge(value['names'][0]) == default: + return (0, ) + + if 'codepoints' not in value: + return (2, ) + + return 1, value['codepoints'].lowest() + + val_list = list(unique(property['values'].values(), key=id)) + val_list.sort(key=make_key) + + def make_key(val): + name_list = [name for name in val['names'] if '&' in name] + + if name_list: + return 1, name_list[0][0] + + return 0 + + if property['names'][0] == 'General_Category': + + def make_key(value): + for name in value['names']: + if '&' in name: + return (1, name) + + if value.get('codepoints'): + return (0, ) + + return (2, munge(value['names'][0])) + + for val_id, value in enumerate(sorted(val_list, key=make_key)): + value['id'] = val_id + else: + for val_id, value in enumerate(val_list): + value['id'] = val_id + + # Collect the value sets. + valueset_dict = {} + + for property in sorted(prop_list, key=lambda prop: prop['id']): + prop_name = property['names'][0] + + if prop_name == 'Script_Extensions': + property['valueset_id'] = properties[munge('Script')]['valueset_id'] + else: + valueset = [] + + val_list = list(unique(property['values'].values(), key=id)) + + for value in sorted(val_list, key=lambda val: val['id']): + valueset.append(tuple(value['names'])) + + valueset_id = valueset_dict.setdefault(tuple(valueset), + len(valueset_dict)) + property['valueset_id'] = valueset_id + + strings = collect_strings(properties) + + c_path = join(tools_folder, 'unicode.c') + h_path = join(tools_folder, 'unicode.h') + + with open(c_path, 'w', newline='\n', encoding='ascii') as c_file: + c_file.write('''\ +/* For Unicode version {} */ + +#include "_regex_unicode.h" + +#define RE_BLANK_MASK ((1 << RE_PROP_ZL) | (1 << RE_PROP_ZP)) +#define RE_GRAPH_MASK ((1 << RE_PROP_CC) | (1 << RE_PROP_CS) | (1 << RE_PROP_CN)) +#define RE_WORD_MASK (RE_PROP_M_MASK | (1 << RE_PROP_ND) | (1 << RE_PROP_PC)) + +typedef struct {{ + RE_UINT8 scripts[RE_MAX_SCX]; +}} RE_ScriptExt; + +typedef struct {{ + RE_UINT32 delta; + RE_UINT16 others[RE_MAX_CASES - 1]; +}} RE_AllCases; + +typedef struct {{ + RE_UINT16 data[RE_MAX_FOLDED]; +}} RE_FullCaseFolding; + +/* Strings. */ +char* re_strings[] = {{ +'''.format(UNICODE_VERSION)) + + lines = [] + + for string in strings: + lines.append(' "{}",\n'.format(string)) + + strings_dict = {string: i for i, string in enumerate(strings)} + + unicode_data['string_count'] = len(strings_dict) + + c_file.writelines(lines) + c_file.write('''\ +}; + +/* Properties. */ +RE_Property re_properties[] = { +''') + + for prop_id, property in enumerate(sorted(prop_list, key=lambda prop: + prop['id'])): + for name in property['names']: + c_file.write(' {{{:4}, {:2}, {:2}}}, /* {} */\n'.format(strings_dict[munge(name)], + prop_id, property['valueset_id'], munge(name))) + + c_file.write('''\ +}; + +/* Property values. */ +RE_PropertyValue re_property_values[] = { +''') + + def make_key(names): + if any(len(name) == 2 for name in names): + return 0 + + return 1 + + gc_valset_id = properties[munge('General_Category')]['valueset_id'] + count = 0 + + for valset, valset_id in sorted(valueset_dict.items(), key=lambda pair: + pair[1]): + if valset_id == gc_valset_id: + valset = sorted(valset, key=make_key) + + for val_id, names in enumerate(valset): + for name in names: + c_file.write(''' {{{:4}, {:2}, {:3}}}, /* {} */\n'''.format(strings_dict[munge(name)], + valset_id, val_id, munge(name))) + + count += len(names) + + unicode_data['valueset_table_count'] = count + + c_file.write('};\n') + + c_file.write('''\n/* Codepoints which expand on full case-folding. */\n''') + + unicode_data['expanded_count'] = len(expanded) + generate_table('re_expand_on_folding', expanded, c_file, max_columns=8, public=True) + + for property in prop_list: + print(' {}'.format(property['names'][0]), flush=True) + + if property['names'][0] == 'Script_Extensions': + generate_script_extensions_lookup(properties, property, c_file) + else: + generate_lookup(property, c_file) + + print(' All cases', flush=True) + generate_all_cases(unicode_data, c_file) + + print(' Simple case folding', flush=True) + generate_simple_case_folding(unicode_data, c_file) + + print(' Full case folding', flush=True) + generate_full_case_folding(unicode_data, c_file) + + c_file.write(''' +/* Property function table. */ +RE_GetPropertyFunc re_get_property[] = { +''') + + lines = [] + + for property in prop_list: + prop_name = property['names'][0].lower() + + if prop_name == 'script_extensions': + lines.append(' 0,\n') + else: + lines.append(' re_get_{},\n'.format(prop_name)) + + lines[-1] = lines[-1].rstrip(',\n') + '\n' + + c_file.writelines(lines) + + c_file.write('};\n') + + with open(h_path, 'w', newline='\n', encoding='ascii') as h_file: + property = unicode_data['properties'][munge('Script_Extensions')] + max_scx = max(len(key) for key in property['values']) + + h_file.write('''\ +typedef unsigned char RE_UINT8; +typedef signed char RE_INT8; +typedef unsigned short RE_UINT16; +typedef signed short RE_INT16; +typedef unsigned int RE_UINT32; +typedef signed int RE_INT32; + +typedef unsigned char BOOL; +#if !defined(FALSE) || !defined(TRUE) +#define FALSE 0 +#define TRUE 1 +#endif + +#define RE_ASCII_MAX 0x7F +#define RE_LOCALE_MAX 0xFF + +#define RE_MAX_CASES 4 +#define RE_MAX_FOLDED 3 +#define RE_MAX_SCX {} + +typedef struct RE_Property {{ + RE_UINT16 name; + RE_UINT8 id; + RE_UINT8 value_set; +}} RE_Property; + +typedef struct RE_PropertyValue {{ + RE_UINT16 name; + RE_UINT8 value_set; + RE_UINT16 id; +}} RE_PropertyValue; + +typedef RE_UINT32 (*RE_GetPropertyFunc)(RE_UINT32 codepoint); +'''.format(max_scx)) + + gc_id = properties[munge('General_Category')]['id'] + cased_id = properties[munge('Cased')]['id'] + upper_id = properties[munge('Uppercase')]['id'] + lower_id = properties[munge('Lowercase')]['id'] + scx_id = properties[munge('Script_Extensions')]['id'] + + h_file.write(''' +#define RE_PROP_GC 0x{:X} +#define RE_PROP_CASED 0x{:X} +#define RE_PROP_UPPERCASE 0x{:X} +#define RE_PROP_LOWERCASE 0x{:X} +#define RE_PROP_SCX 0x{:X} + +'''.format(gc_id, cased_id, upper_id, lower_id, scx_id)) + + gc_values = properties[munge('General_Category')]['values'] + group_names = set('C L M N P S Z Assigned Cased_Letter'.split()) + + names = set(gc_values) & set(munge(name) for name in group_names) + + for name in sorted(names, key=lambda name: gc_values[name]['id']): + h_file.write('#define RE_PROP_{} {}\n'.format(name, + gc_values[name]['id'])) + + h_file.write('\n') + + val_list = [] + masks = {} + + for name in gc_values: + if len(name) != 2 or not name.isalpha(): + continue + + if not gc_values[name].get('codepoints'): + continue + + val_id = gc_values[name]['id'] + val_list.append((val_id, name)) + masks.setdefault(name[0], 0) + masks[name[0]] |= 1 << val_id + + for val_id, name in sorted(val_list): + h_file.write('#define RE_PROP_{} {}\n'.format(name, val_id)) + + h_file.write('\n') + + for name, mask in sorted(masks.items()): + h_file.write('#define RE_PROP_{}_MASK 0x{:08X}\n'.format(name, + mask)) + + h_file.write('\n') + + common = ''' + Alnum Alpha Any Ascii Blank Cntrl Digit Graph Lower Print Space + Upper Word Xdigit Posix_Alnum Posix_Digit Posix_Punct Posix_Xdigit + ''' + + for name in common.split(): + property = properties.get(munge(name)) + + if property is not None: + h_file.write('#define RE_PROP_{} 0x{:06X}\n'.format(name.upper(), + (property['id'] << 16) | 1)) + else: + for prop_name in ['GC', 'Script', 'Block']: + property = properties[munge(prop_name)] + value = property['values'].get(munge(name)) + + if value is not None: + h_file.write('#define RE_PROP_{} 0x{:06X}\n'.format(name.upper(), + (property['id'] << 16) | value['id'])) + break + + h_file.write('\n') + + val_list = unique(properties[munge('Word_Break')]['values'].values(), + key=id) + values = [(value['id'], value['names'][0]) for value in val_list] + + for val_id, name in sorted(values): + h_file.write('#define RE_WBREAK_{} {}\n'.format(munge(name), + val_id)) + + h_file.write('\n') + + val_list = unique(properties[munge('Grapheme_Cluster_Break')]['values'].values(), + key=id) + values = [(value['id'], value['names'][0]) for value in val_list] + + for val_id, name in sorted(values): + h_file.write('#define RE_GBREAK_{} {}\n'.format(munge(name), + val_id)) + + h_file.write('\n') + + val_list = unique(properties[munge('Line_Break')]['values'].values(), + key=id) + values = [(value['id'], value['names'][0]) for value in val_list] + + for val_id, name in sorted(values): + h_file.write('#define RE_LBREAK_{} {}\n'.format(munge(name), + val_id)) + + h_file.write('\n') + + h_file.write('extern char* re_strings[{}];\n'.format(unicode_data['string_count'])) + h_file.write('extern RE_Property re_properties[{}];\n'.format(unicode_data['property_tablee_count'])) + h_file.write('extern RE_PropertyValue re_property_values[{}];\n'.format(unicode_data['valueset_table_count'])) + h_file.write('extern RE_UINT16 re_expand_on_folding[{}];\n'.format(unicode_data['expanded_count'])) + h_file.write('extern RE_GetPropertyFunc re_get_property[{}];\n'.format(unicode_data['property_count'])) + + h_file.write('\n') + + for property in prop_list: + prop_name = property['names'][0] + + if prop_name == 'Script_Extensions': + h_file.write('int re_get_{}(RE_UINT32 codepoint, RE_UINT8* scripts);\n'.format(prop_name.lower())) + else: + h_file.write('RE_UINT32 re_get_{}(RE_UINT32 codepoint);\n'.format(prop_name.lower())) + + h_file.write('int re_get_all_cases(RE_UINT32 codepoint, RE_UINT32* cases);\n') + h_file.write('RE_UINT32 re_get_simple_case_folding(RE_UINT32 codepoint);\n') + h_file.write('int re_get_full_case_folding(RE_UINT32 codepoint, RE_UINT32* folded);\n') + +# Whether to update the Unicode data files from the Unicode website. +UNICODE_VERSION = '13.0.0' + +# The URL from which the Unicode data files can be obtained. +unicode_data_base = 'http://www.unicode.org/Public/UNIDATA/' + +NUM_CODEPOINTS = 0x110000 + +# The Unicode data files. The file names are relative to the website URL. +unicode_data_files = ''' +[aliases] +PropertyAliases.txt +PropertyValueAliases.txt +[binary] +PropList.txt +extracted/DerivedBinaryProperties.txt +DerivedCoreProperties.txt +[emoji] +emoji/emoji-data.txt +[normalisation] +DerivedNormalizationProps.txt +[multivalue] +auxiliary/GraphemeBreakProperty.txt +auxiliary/SentenceBreakProperty.txt +auxiliary/WordBreakProperty.txt +Blocks.txt +extracted/DerivedBidiClass.txt +extracted/DerivedCombiningClass.txt +extracted/DerivedDecompositionType.txt +extracted/DerivedEastAsianWidth.txt +extracted/DerivedGeneralCategory.txt +extracted/DerivedJoiningGroup.txt +extracted/DerivedJoiningType.txt +extracted/DerivedLineBreak.txt +extracted/DerivedNumericType.txt +HangulSyllableType.txt +IndicPositionalCategory.txt +IndicSyllabicCategory.txt +Scripts.txt +[numeric_values] +extracted/DerivedNumericValues.txt +[case_folding] +CaseFolding.txt +[script_extensions] +ScriptExtensions.txt +''' + +data_files = {} +section = '' + +for line in unicode_data_files.splitlines(): + if line[ : 1] + line[-1 : ] == '[]': + section = line[1 : -1] + elif line: + data_files.setdefault(section, []).append(line) + +# The generated C files will be written into this folder. +tools_folder = dirname(__file__) + +# The local folder in which the Unicode data files are stored. +data_folder = join(tools_folder, 'unicode_data') + +with suppress(FileExistsError): + mkdir(data_folder) + +download_unicode_files(unicode_data_base, data_files, data_folder) + +unicode_data = parse_unicode_files(data_files, data_folder) +make_additional_properties(unicode_data) +write_summary(unicode_data, tools_folder) + +binary_dict = make_binary_dict() + +generate_code(unicode_data, tools_folder) + +print('\nFinished!') -- GitLab