LCOV - code coverage report
Current view: top level - utils - uni_bidi.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 695 1336 52.0 %
Date: 2021-04-29 23:48:07 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /*
       2             :  *                      GPAC - Multimedia Framework C SDK
       3             :  *
       4             :  *                      Authors: Jean Le Feuvre
       5             :  *                      Copyright (c) Telecom ParisTech 2007-2012
       6             :  *                                      All rights reserved
       7             :  *
       8             :  *  This file is part of GPAC / common tools sub-project
       9             :  *
      10             :  *  GPAC is free software; you can redistribute it and/or modify
      11             :  *  it under the terms of the GNU Lesser General Public License as published by
      12             :  *  the Free Software Foundation; either version 2, or (at your option)
      13             :  *  any later version.
      14             :  *
      15             :  *  GPAC is distributed in the hope that it will be useful,
      16             :  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
      17             :  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      18             :  *  GNU Lesser General Public License for more details.
      19             :  *
      20             :  *  You should have received a copy of the GNU Lesser General Public
      21             :  *  License along with this library; see the file COPYING.  If not, write to
      22             :  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
      23             :  *
      24             :  */
      25             : 
      26             : #include <gpac/utf.h>
      27             : 
      28             : 
      29             : /*------------------------------------------------------------------------
      30             :         Bidirectional Character Types
      31             : 
      32             :         as defined by the Unicode Bidirectional Algorithm Table 3-7.
      33             : 
      34             : ------------------------------------------------------------------------*/
      35             : enum
      36             : {
      37             :         // input types
      38             :         // ON MUST be zero, code relies on ON = N = 0
      39             :         ON = 0,  // Other Neutral
      40             :         L,       // Left Letter
      41             :         R,       // Right Letter
      42             :         AN,      // Arabic Number
      43             :         EN,      // European Number
      44             :         AL,      // Arabic Letter (Right-to-left)
      45             :         NSM,     // Non-spacing Mark
      46             :         CS,      // Common Separator
      47             :         ES,      // European Separator
      48             :         ET,      // European Terminator (post/prefix e.g. $ and %)
      49             : 
      50             :         // resolved types
      51             :         BN,      // Boundary neutral (type of RLE etc after explicit levels)
      52             : 
      53             :         // input types,
      54             :         S,       // Segment Separator (TAB)             // used only in L1
      55             :         WS,      // White space                                 // used only in L1
      56             :         B,       // Paragraph Separator (aka as PS)
      57             : 
      58             :         // types for explicit controls
      59             :         RLO,     // these are used only in X1-X9
      60             :         RLE,
      61             :         LRO,
      62             :         LRE,
      63             :         PDF,
      64             : 
      65             :         // resolved types, also resolved directions
      66             :         N = ON,  // alias, where ON, WS and S are treated the same
      67             : };
      68             : 
      69             : /*----------------------------------------------------------------------
      70             :    The following array maps character codes to types for the purpose of
      71             :    this sample implementation. The legend string gives a human readable
      72             :    explanation of the pseudo alphabet.
      73             : 
      74             :    For simplicity, characters entered by buttons are given a 1:1 mapping
      75             :    between their type and pseudo character value. Pseudo characters that
      76             :    can be typed from the keyboard are explained in the legend string.
      77             : 
      78             :    Use the Unicode Character Database for the real values in real use.
      79             :  ---------------------------------------------------------------------*/
      80             : 
      81             : #define LRM 4
      82             : #define RLM 5
      83             : #define LS 0x13
      84             : 
      85             : static int bidi_get_class(u32 val);
      86             : 
      87             : 
      88             : 
      89             : GF_EXPORT
      90        3831 : Bool gf_utf8_is_right_to_left(u16 *utf_string)
      91             : {
      92             :         u32 i = 0;
      93        1366 :         while (1) {
      94        5197 :                 u32 c = utf_string[i];
      95        5197 :                 if (!c) return GF_FALSE;
      96        5069 :                 switch (bidi_get_class(c)) {
      97             :                 case L:
      98             :                         return GF_FALSE;
      99           0 :                 case R:
     100           0 :                         return GF_TRUE;
     101           0 :                 case AN:
     102           0 :                         return GF_TRUE;
     103             :                 case EN:
     104             :                         return GF_FALSE;
     105           0 :                 case AL:
     106           0 :                         return GF_TRUE;
     107             :                 default:
     108             :                         break;
     109             :                 }
     110        1366 :                 i++;
     111             :         }
     112             :         return GF_FALSE;
     113             : }
     114             : 
     115             : 
     116             : /*a very VERY basic bidi reorderer */
     117             : GF_EXPORT
     118        3831 : Bool gf_utf8_reorder_bidi(u16 *utf_string, u32 len)
     119             : {
     120             :         u32 i, j, start, stop, cur_dir, slen, main_dir;
     121             :         Bool is_start;
     122             : 
     123             :         /*get main direction of the layour*/
     124        3831 :         Bool rev = gf_utf8_is_right_to_left(utf_string);
     125             : 
     126        3831 :         if (rev) {
     127           0 :                 for (i=0; i<len/2; i++) {
     128           0 :                         u32 v = utf_string[i];
     129           0 :                         utf_string[i] = utf_string[len-1-i];
     130           0 :                         utf_string[len-1-i] = v;
     131             :                 }
     132             :         }
     133        3831 :         cur_dir = rev ? 1 : 0;
     134             :         main_dir = cur_dir;
     135             :         is_start = GF_TRUE;
     136             : 
     137             :         start = stop = 0;
     138             : 
     139      276119 :         for (i=0; i<len; i++) {
     140             :                 Bool rtl;
     141      272288 :                 u32 c = bidi_get_class(utf_string[i]);
     142             :                 switch (c) {
     143             :                 case R:
     144             :                 case AN:
     145             :                 case AL:
     146             :                         rtl = GF_TRUE;
     147             :                         break;
     148             :                 case L:
     149             :                 case EN:
     150             :                         rtl = GF_FALSE;
     151             :                         break;
     152       55430 :                 default:
     153       55430 :                         if (is_start) {
     154             :                                 start = i;
     155           0 :                         } else if (!stop) {
     156             :                                 stop = i;
     157             :                         }
     158       55430 :                         continue;
     159             :                 }
     160      216858 :                 if (cur_dir != rtl) {
     161           0 :                         if (!stop)
     162             :                                 stop = i;
     163             : 
     164           0 :                         if (is_start) {
     165             :                                 is_start = GF_FALSE;
     166             :                         } else {
     167             :                                 is_start = GF_TRUE;
     168             : 
     169           0 :                                 if (main_dir != cur_dir) {
     170           0 :                                         slen = stop-start+1;
     171           0 :                                         for (j=0; j<slen/2; j++) {
     172           0 :                                                 u32 v = utf_string[start + j];
     173           0 :                                                 utf_string[start + j] = utf_string[stop-j];
     174           0 :                                                 utf_string[stop-j] = v;
     175             :                                         }
     176             :                                 }
     177             :                         }
     178             :                         cur_dir = rtl;
     179             :                 }
     180             :                 stop = 0;
     181             :         }
     182             : 
     183             :         /*not flushed yet*/
     184        3831 :         if (!is_start) {
     185           0 :                 if (!stop) stop = len-1;
     186           0 :                 slen = stop-start+1;
     187           0 :                 for (j=0; j<slen/2; j++) {
     188           0 :                         u32 v = utf_string[start + j];
     189           0 :                         utf_string[start + j] = utf_string[stop-j];
     190           0 :                         utf_string[stop-j] = v;
     191             :                 }
     192             :         }
     193        3831 :         return rev;
     194             : }
     195             : 
     196             : 
     197      277357 : static int bidi_get_class(u32 val)
     198             : {
     199      277357 :         if ((val>=0x0041) && (val<=0x005A)) return L;     //# L&  [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
     200      265955 :         if ((val>=0x0061) && (val<=0x007A)) return L;     //# L&  [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
     201       66338 :         if (val==0x000000AA) return L;  //# L&       FEMININE ORDINAL INDICATOR
     202       66338 :         if (val==0x000000B5) return L;  //# L&       MICRO SIGN
     203       66338 :         if (val==0x000000BA) return L;  //# L&       MASCULINE ORDINAL INDICATOR
     204       66338 :         if ((val>=0x00C0) && (val<=0x00D6)) return L;     //# L&  [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
     205       66333 :         if ((val>=0x00D8) && (val<=0x00F6)) return L;     //# L&  [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
     206       66303 :         if ((val>=0x00F8) && (val<=0x01BA)) return L;     //# L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
     207       66295 :         if (val==0x000001BB) return L;  //# Lo       LATIN LETTER TWO WITH STROKE
     208       66295 :         if ((val>=0x01BC) && (val<=0x01BF)) return L;     //# L&   [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
     209       66295 :         if ((val>=0x01C0) && (val<=0x01C3)) return L;     //# Lo   [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
     210       66295 :         if ((val>=0x01C4) && (val<=0x0293)) return L;     //# L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL
     211       66295 :         if (val==0x00000294) return L;  //# Lo       LATIN LETTER GLOTTAL STOP
     212       66295 :         if ((val>=0x0295) && (val<=0x02AF)) return L;     //# L&  [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
     213       66295 :         if ((val>=0x02B0) && (val<=0x02B8)) return L;     //# Lm   [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
     214       66295 :         if ((val>=0x02BB) && (val<=0x02C1)) return L;     //# Lm   [7] MODIFIER LETTER TURNED COMMA..MODIFIER LETTER REVERSED GLOTTAL STOP
     215       66295 :         if ((val>=0x02D0) && (val<=0x02D1)) return L;     //# Lm   [2] MODIFIER LETTER TRIANGULAR COLON..MODIFIER LETTER HALF TRIANGULAR COLON
     216       66295 :         if ((val>=0x02E0) && (val<=0x02E4)) return L;     //# Lm   [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
     217       66295 :         if (val==0x000002EE) return L;  //# Lm       MODIFIER LETTER DOUBLE APOSTROPHE
     218       66295 :         if (val==0x0000037A) return L;  //# Lm       GREEK YPOGEGRAMMENI
     219       66295 :         if ((val>=0x037B) && (val<=0x037D)) return L;     //# L&   [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
     220       66295 :         if (val==0x00000386) return L;  //# L&       GREEK CAPITAL LETTER ALPHA WITH TONOS
     221       66295 :         if ((val>=0x0388) && (val<=0x038A)) return L;     //# L&   [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
     222       66295 :         if (val==0x0000038C) return L;  //# L&       GREEK CAPITAL LETTER OMICRON WITH TONOS
     223       66295 :         if ((val>=0x038E) && (val<=0x03A1)) return L;     //# L&  [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
     224       66295 :         if ((val>=0x03A3) && (val<=0x03CE)) return L;     //# L&  [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS
     225       66295 :         if ((val>=0x03D0) && (val<=0x03F5)) return L;     //# L&  [38] GREEK BETA SYMBOL..GREEK LUNATE EPSILON SYMBOL
     226       66295 :         if ((val>=0x03F7) && (val<=0x0481)) return L;     //# L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA
     227       66295 :         if (val==0x00000482) return L;  //# So       CYRILLIC THOUSANDS SIGN
     228       66295 :         if ((val>=0x048A) && (val<=0x0513)) return L;     //# L& [138] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH HOOK
     229       66295 :         if ((val>=0x0531) && (val<=0x0556)) return L;     //# L&  [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
     230       66295 :         if (val==0x00000559) return L;  //# Lm       ARMENIAN MODIFIER LETTER LEFT HALF RING
     231       66295 :         if ((val>=0x055A) && (val<=0x055F)) return L;     //# Po   [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
     232       66295 :         if ((val>=0x0561) && (val<=0x0587)) return L;     //# L&  [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
     233       66295 :         if (val==0x00000589) return L;  //# Po       ARMENIAN FULL STOP
     234       66295 :         if (val==0x00000903) return L;  //# Mc       DEVANAGARI SIGN VISARGA
     235       66295 :         if ((val>=0x0904) && (val<=0x0939)) return L;     //# Lo  [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
     236       66295 :         if (val==0x0000093D) return L;  //# Lo       DEVANAGARI SIGN AVAGRAHA
     237       66295 :         if ((val>=0x093E) && (val<=0x0940)) return L;     //# Mc   [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
     238       66295 :         if ((val>=0x0949) && (val<=0x094C)) return L;     //# Mc   [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
     239       66295 :         if (val==0x00000950) return L;  //# Lo       DEVANAGARI OM
     240       66295 :         if ((val>=0x0958) && (val<=0x0961)) return L;     //# Lo  [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
     241       66295 :         if ((val>=0x0964) && (val<=0x0965)) return L;     //# Po   [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
     242       66295 :         if ((val>=0x0966) && (val<=0x096F)) return L;     //# Nd  [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE
     243       66295 :         if (val==0x00000970) return L;  //# Po       DEVANAGARI ABBREVIATION SIGN
     244       66295 :         if ((val>=0x097B) && (val<=0x097F)) return L;     //# Lo   [5] DEVANAGARI LETTER GGA..DEVANAGARI LETTER BBA
     245       66295 :         if ((val>=0x0982) && (val<=0x0983)) return L;     //# Mc   [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
     246       66295 :         if ((val>=0x0985) && (val<=0x098C)) return L;     //# Lo   [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
     247       66295 :         if ((val>=0x098F) && (val<=0x0990)) return L;     //# Lo   [2] BENGALI LETTER E..BENGALI LETTER AI
     248       66295 :         if ((val>=0x0993) && (val<=0x09A8)) return L;     //# Lo  [22] BENGALI LETTER O..BENGALI LETTER NA
     249       66295 :         if ((val>=0x09AA) && (val<=0x09B0)) return L;     //# Lo   [7] BENGALI LETTER PA..BENGALI LETTER RA
     250       66295 :         if (val==0x000009B2) return L;  //# Lo       BENGALI LETTER LA
     251       66295 :         if ((val>=0x09B6) && (val<=0x09B9)) return L;     //# Lo   [4] BENGALI LETTER SHA..BENGALI LETTER HA
     252       66295 :         if (val==0x000009BD) return L;  //# Lo       BENGALI SIGN AVAGRAHA
     253       66295 :         if ((val>=0x09BE) && (val<=0x09C0)) return L;     //# Mc   [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
     254       66295 :         if ((val>=0x09C7) && (val<=0x09C8)) return L;     //# Mc   [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
     255       66295 :         if ((val>=0x09CB) && (val<=0x09CC)) return L;     //# Mc   [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
     256       66295 :         if (val==0x000009CE) return L;  //# Lo       BENGALI LETTER KHANDA TA
     257       66295 :         if (val==0x000009D7) return L;  //# Mc       BENGALI AU LENGTH MARK
     258       66295 :         if ((val>=0x09DC) && (val<=0x09DD)) return L;     //# Lo   [2] BENGALI LETTER RRA..BENGALI LETTER RHA
     259       66295 :         if ((val>=0x09DF) && (val<=0x09E1)) return L;     //# Lo   [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
     260       66295 :         if ((val>=0x09E6) && (val<=0x09EF)) return L;     //# Nd  [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE
     261       66295 :         if ((val>=0x09F0) && (val<=0x09F1)) return L;     //# Lo   [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
     262       66295 :         if ((val>=0x09F4) && (val<=0x09F9)) return L;     //# No   [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN
     263       66295 :         if (val==0x000009FA) return L;  //# So       BENGALI ISSHAR
     264       66295 :         if (val==0x00000A03) return L;  //# Mc       GURMUKHI SIGN VISARGA
     265       66295 :         if ((val>=0x0A05) && (val<=0x0A0A)) return L;     //# Lo   [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
     266       66295 :         if ((val>=0x0A0F) && (val<=0x0A10)) return L;     //# Lo   [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
     267       66295 :         if ((val>=0x0A13) && (val<=0x0A28)) return L;     //# Lo  [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
     268       66295 :         if ((val>=0x0A2A) && (val<=0x0A30)) return L;     //# Lo   [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
     269       66295 :         if ((val>=0x0A32) && (val<=0x0A33)) return L;     //# Lo   [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
     270       66295 :         if ((val>=0x0A35) && (val<=0x0A36)) return L;     //# Lo   [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
     271       66295 :         if ((val>=0x0A38) && (val<=0x0A39)) return L;     //# Lo   [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
     272       66295 :         if ((val>=0x0A3E) && (val<=0x0A40)) return L;     //# Mc   [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
     273       66295 :         if ((val>=0x0A59) && (val<=0x0A5C)) return L;     //# Lo   [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
     274       66295 :         if (val==0x00000A5E) return L;  //# Lo       GURMUKHI LETTER FA
     275       66295 :         if ((val>=0x0A66) && (val<=0x0A6F)) return L;     //# Nd  [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE
     276       66295 :         if ((val>=0x0A72) && (val<=0x0A74)) return L;     //# Lo   [3] GURMUKHI IRI..GURMUKHI EK ONKAR
     277       66295 :         if (val==0x00000A83) return L;  //# Mc       GUJARATI SIGN VISARGA
     278       66295 :         if ((val>=0x0A85) && (val<=0x0A8D)) return L;     //# Lo   [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
     279       66295 :         if ((val>=0x0A8F) && (val<=0x0A91)) return L;     //# Lo   [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
     280       66295 :         if ((val>=0x0A93) && (val<=0x0AA8)) return L;     //# Lo  [22] GUJARATI LETTER O..GUJARATI LETTER NA
     281       66295 :         if ((val>=0x0AAA) && (val<=0x0AB0)) return L;     //# Lo   [7] GUJARATI LETTER PA..GUJARATI LETTER RA
     282       66295 :         if ((val>=0x0AB2) && (val<=0x0AB3)) return L;     //# Lo   [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
     283       66295 :         if ((val>=0x0AB5) && (val<=0x0AB9)) return L;     //# Lo   [5] GUJARATI LETTER VA..GUJARATI LETTER HA
     284       66295 :         if (val==0x00000ABD) return L;  //# Lo       GUJARATI SIGN AVAGRAHA
     285       66295 :         if ((val>=0x0ABE) && (val<=0x0AC0)) return L;     //# Mc   [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
     286       66295 :         if (val==0x00000AC9) return L;  //# Mc       GUJARATI VOWEL SIGN CANDRA O
     287       66295 :         if ((val>=0x0ACB) && (val<=0x0ACC)) return L;     //# Mc   [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
     288       66295 :         if (val==0x00000AD0) return L;  //# Lo       GUJARATI OM
     289       66295 :         if ((val>=0x0AE0) && (val<=0x0AE1)) return L;     //# Lo   [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
     290       66295 :         if ((val>=0x0AE6) && (val<=0x0AEF)) return L;     //# Nd  [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE
     291       66295 :         if ((val>=0x0B02) && (val<=0x0B03)) return L;     //# Mc   [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
     292       66295 :         if ((val>=0x0B05) && (val<=0x0B0C)) return L;     //# Lo   [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
     293       66295 :         if ((val>=0x0B0F) && (val<=0x0B10)) return L;     //# Lo   [2] ORIYA LETTER E..ORIYA LETTER AI
     294       66295 :         if ((val>=0x0B13) && (val<=0x0B28)) return L;     //# Lo  [22] ORIYA LETTER O..ORIYA LETTER NA
     295       66295 :         if ((val>=0x0B2A) && (val<=0x0B30)) return L;     //# Lo   [7] ORIYA LETTER PA..ORIYA LETTER RA
     296       66295 :         if ((val>=0x0B32) && (val<=0x0B33)) return L;     //# Lo   [2] ORIYA LETTER LA..ORIYA LETTER LLA
     297       66295 :         if ((val>=0x0B35) && (val<=0x0B39)) return L;     //# Lo   [5] ORIYA LETTER VA..ORIYA LETTER HA
     298       66295 :         if (val==0x00000B3D) return L;  //# Lo       ORIYA SIGN AVAGRAHA
     299       66295 :         if (val==0x00000B3E) return L;  //# Mc       ORIYA VOWEL SIGN AA
     300       66295 :         if (val==0x00000B40) return L;  //# Mc       ORIYA VOWEL SIGN II
     301       66295 :         if ((val>=0x0B47) && (val<=0x0B48)) return L;     //# Mc   [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
     302       66295 :         if ((val>=0x0B4B) && (val<=0x0B4C)) return L;     //# Mc   [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
     303       66295 :         if (val==0x00000B57) return L;  //# Mc       ORIYA AU LENGTH MARK
     304       66295 :         if ((val>=0x0B5C) && (val<=0x0B5D)) return L;     //# Lo   [2] ORIYA LETTER RRA..ORIYA LETTER RHA
     305       66295 :         if ((val>=0x0B5F) && (val<=0x0B61)) return L;     //# Lo   [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
     306       66295 :         if ((val>=0x0B66) && (val<=0x0B6F)) return L;     //# Nd  [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE
     307       66295 :         if (val==0x00000B70) return L;  //# So       ORIYA ISSHAR
     308       66295 :         if (val==0x00000B71) return L;  //# Lo       ORIYA LETTER WA
     309       66295 :         if (val==0x00000B83) return L;  //# Lo       TAMIL SIGN VISARGA
     310       66295 :         if ((val>=0x0B85) && (val<=0x0B8A)) return L;     //# Lo   [6] TAMIL LETTER A..TAMIL LETTER UU
     311       66295 :         if ((val>=0x0B8E) && (val<=0x0B90)) return L;     //# Lo   [3] TAMIL LETTER E..TAMIL LETTER AI
     312       66295 :         if ((val>=0x0B92) && (val<=0x0B95)) return L;     //# Lo   [4] TAMIL LETTER O..TAMIL LETTER KA
     313       66295 :         if ((val>=0x0B99) && (val<=0x0B9A)) return L;     //# Lo   [2] TAMIL LETTER NGA..TAMIL LETTER CA
     314       66295 :         if (val==0x00000B9C) return L;  //# Lo       TAMIL LETTER JA
     315       66295 :         if ((val>=0x0B9E) && (val<=0x0B9F)) return L;     //# Lo   [2] TAMIL LETTER NYA..TAMIL LETTER TTA
     316       66295 :         if ((val>=0x0BA3) && (val<=0x0BA4)) return L;     //# Lo   [2] TAMIL LETTER NNA..TAMIL LETTER TA
     317       66295 :         if ((val>=0x0BA8) && (val<=0x0BAA)) return L;     //# Lo   [3] TAMIL LETTER NA..TAMIL LETTER PA
     318       66295 :         if ((val>=0x0BAE) && (val<=0x0BB9)) return L;     //# Lo  [12] TAMIL LETTER MA..TAMIL LETTER HA
     319       66295 :         if ((val>=0x0BBE) && (val<=0x0BBF)) return L;     //# Mc   [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
     320       66295 :         if ((val>=0x0BC1) && (val<=0x0BC2)) return L;     //# Mc   [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
     321       66295 :         if ((val>=0x0BC6) && (val<=0x0BC8)) return L;     //# Mc   [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
     322       66295 :         if ((val>=0x0BCA) && (val<=0x0BCC)) return L;     //# Mc   [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
     323       66295 :         if (val==0x00000BD7) return L;  //# Mc       TAMIL AU LENGTH MARK
     324       66295 :         if ((val>=0x0BE6) && (val<=0x0BEF)) return L;     //# Nd  [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE
     325       66295 :         if ((val>=0x0BF0) && (val<=0x0BF2)) return L;     //# No   [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND
     326       66295 :         if ((val>=0x0C01) && (val<=0x0C03)) return L;     //# Mc   [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
     327       66295 :         if ((val>=0x0C05) && (val<=0x0C0C)) return L;     //# Lo   [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
     328       66295 :         if ((val>=0x0C0E) && (val<=0x0C10)) return L;     //# Lo   [3] TELUGU LETTER E..TELUGU LETTER AI
     329       66295 :         if ((val>=0x0C12) && (val<=0x0C28)) return L;     //# Lo  [23] TELUGU LETTER O..TELUGU LETTER NA
     330       66295 :         if ((val>=0x0C2A) && (val<=0x0C33)) return L;     //# Lo  [10] TELUGU LETTER PA..TELUGU LETTER LLA
     331       66295 :         if ((val>=0x0C35) && (val<=0x0C39)) return L;     //# Lo   [5] TELUGU LETTER VA..TELUGU LETTER HA
     332       66295 :         if ((val>=0x0C41) && (val<=0x0C44)) return L;     //# Mc   [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
     333       66295 :         if ((val>=0x0C60) && (val<=0x0C61)) return L;     //# Lo   [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
     334       66295 :         if ((val>=0x0C66) && (val<=0x0C6F)) return L;     //# Nd  [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE
     335       66295 :         if ((val>=0x0C82) && (val<=0x0C83)) return L;     //# Mc   [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
     336       66295 :         if ((val>=0x0C85) && (val<=0x0C8C)) return L;     //# Lo   [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
     337       66295 :         if ((val>=0x0C8E) && (val<=0x0C90)) return L;     //# Lo   [3] KANNADA LETTER E..KANNADA LETTER AI
     338       66295 :         if ((val>=0x0C92) && (val<=0x0CA8)) return L;     //# Lo  [23] KANNADA LETTER O..KANNADA LETTER NA
     339       66295 :         if ((val>=0x0CAA) && (val<=0x0CB3)) return L;     //# Lo  [10] KANNADA LETTER PA..KANNADA LETTER LLA
     340       66295 :         if ((val>=0x0CB5) && (val<=0x0CB9)) return L;     //# Lo   [5] KANNADA LETTER VA..KANNADA LETTER HA
     341       66295 :         if (val==0x00000CBD) return L;  //# Lo       KANNADA SIGN AVAGRAHA
     342       66295 :         if (val==0x00000CBE) return L;  //# Mc       KANNADA VOWEL SIGN AA
     343       66295 :         if (val==0x00000CBF) return L;  //# Mn       KANNADA VOWEL SIGN I
     344       66295 :         if ((val>=0x0CC0) && (val<=0x0CC4)) return L;     //# Mc   [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
     345       66295 :         if (val==0x00000CC6) return L;  //# Mn       KANNADA VOWEL SIGN E
     346       66295 :         if ((val>=0x0CC7) && (val<=0x0CC8)) return L;     //# Mc   [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
     347       66295 :         if ((val>=0x0CCA) && (val<=0x0CCB)) return L;     //# Mc   [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
     348       66295 :         if ((val>=0x0CD5) && (val<=0x0CD6)) return L;     //# Mc   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
     349       66295 :         if (val==0x00000CDE) return L;  //# Lo       KANNADA LETTER FA
     350       66295 :         if ((val>=0x0CE0) && (val<=0x0CE1)) return L;     //# Lo   [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
     351       66295 :         if ((val>=0x0CE6) && (val<=0x0CEF)) return L;     //# Nd  [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
     352       66295 :         if ((val>=0x0D02) && (val<=0x0D03)) return L;     //# Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
     353       66295 :         if ((val>=0x0D05) && (val<=0x0D0C)) return L;     //# Lo   [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
     354       66295 :         if ((val>=0x0D0E) && (val<=0x0D10)) return L;     //# Lo   [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
     355       66295 :         if ((val>=0x0D12) && (val<=0x0D28)) return L;     //# Lo  [23] MALAYALAM LETTER O..MALAYALAM LETTER NA
     356       66295 :         if ((val>=0x0D2A) && (val<=0x0D39)) return L;     //# Lo  [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA
     357       66295 :         if ((val>=0x0D3E) && (val<=0x0D40)) return L;     //# Mc   [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
     358       66295 :         if ((val>=0x0D46) && (val<=0x0D48)) return L;     //# Mc   [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
     359       66295 :         if ((val>=0x0D4A) && (val<=0x0D4C)) return L;     //# Mc   [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
     360       66295 :         if (val==0x00000D57) return L;  //# Mc       MALAYALAM AU LENGTH MARK
     361       66295 :         if ((val>=0x0D60) && (val<=0x0D61)) return L;     //# Lo   [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
     362       66295 :         if ((val>=0x0D66) && (val<=0x0D6F)) return L;     //# Nd  [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE
     363       66295 :         if ((val>=0x0D82) && (val<=0x0D83)) return L;     //# Mc   [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
     364       66295 :         if ((val>=0x0D85) && (val<=0x0D96)) return L;     //# Lo  [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
     365       66295 :         if ((val>=0x0D9A) && (val<=0x0DB1)) return L;     //# Lo  [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
     366       66295 :         if ((val>=0x0DB3) && (val<=0x0DBB)) return L;     //# Lo   [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
     367       66295 :         if (val==0x00000DBD) return L;  //# Lo       SINHALA LETTER DANTAJA LAYANNA
     368       66295 :         if ((val>=0x0DC0) && (val<=0x0DC6)) return L;     //# Lo   [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
     369       66295 :         if ((val>=0x0DCF) && (val<=0x0DD1)) return L;     //# Mc   [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
     370       66295 :         if ((val>=0x0DD8) && (val<=0x0DDF)) return L;     //# Mc   [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
     371       66295 :         if ((val>=0x0DF2) && (val<=0x0DF3)) return L;     //# Mc   [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
     372       66295 :         if (val==0x00000DF4) return L;  //# Po       SINHALA PUNCTUATION KUNDDALIYA
     373       66295 :         if ((val>=0x0E01) && (val<=0x0E30)) return L;     //# Lo  [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
     374       66295 :         if ((val>=0x0E32) && (val<=0x0E33)) return L;     //# Lo   [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
     375       66295 :         if ((val>=0x0E40) && (val<=0x0E45)) return L;     //# Lo   [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
     376       66295 :         if (val==0x00000E46) return L;  //# Lm       THAI CHARACTER MAIYAMOK
     377       66295 :         if (val==0x00000E4F) return L;  //# Po       THAI CHARACTER FONGMAN
     378       66295 :         if ((val>=0x0E50) && (val<=0x0E59)) return L;     //# Nd  [10] THAI DIGIT ZERO..THAI DIGIT NINE
     379       66295 :         if ((val>=0x0E5A) && (val<=0x0E5B)) return L;     //# Po   [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT
     380       66295 :         if ((val>=0x0E81) && (val<=0x0E82)) return L;     //# Lo   [2] LAO LETTER KO..LAO LETTER KHO SUNG
     381       66295 :         if (val==0x00000E84) return L;  //# Lo       LAO LETTER KHO TAM
     382       66295 :         if ((val>=0x0E87) && (val<=0x0E88)) return L;     //# Lo   [2] LAO LETTER NGO..LAO LETTER CO
     383       66295 :         if (val==0x00000E8A) return L;  //# Lo       LAO LETTER SO TAM
     384       66295 :         if (val==0x00000E8D) return L;  //# Lo       LAO LETTER NYO
     385       66295 :         if ((val>=0x0E94) && (val<=0x0E97)) return L;     //# Lo   [4] LAO LETTER DO..LAO LETTER THO TAM
     386       66295 :         if ((val>=0x0E99) && (val<=0x0E9F)) return L;     //# Lo   [7] LAO LETTER NO..LAO LETTER FO SUNG
     387       66295 :         if ((val>=0x0EA1) && (val<=0x0EA3)) return L;     //# Lo   [3] LAO LETTER MO..LAO LETTER LO LING
     388       66295 :         if (val==0x00000EA5) return L;  //# Lo       LAO LETTER LO LOOT
     389       66295 :         if (val==0x00000EA7) return L;  //# Lo       LAO LETTER WO
     390       66295 :         if ((val>=0x0EAA) && (val<=0x0EAB)) return L;     //# Lo   [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
     391       66295 :         if ((val>=0x0EAD) && (val<=0x0EB0)) return L;     //# Lo   [4] LAO LETTER O..LAO VOWEL SIGN A
     392       66295 :         if ((val>=0x0EB2) && (val<=0x0EB3)) return L;     //# Lo   [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM
     393       66295 :         if (val==0x00000EBD) return L;  //# Lo       LAO SEMIVOWEL SIGN NYO
     394       66295 :         if ((val>=0x0EC0) && (val<=0x0EC4)) return L;     //# Lo   [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
     395       66295 :         if (val==0x00000EC6) return L;  //# Lm       LAO KO LA
     396       66295 :         if ((val>=0x0ED0) && (val<=0x0ED9)) return L;     //# Nd  [10] LAO DIGIT ZERO..LAO DIGIT NINE
     397       66295 :         if ((val>=0x0EDC) && (val<=0x0EDD)) return L;     //# Lo   [2] LAO HO NO..LAO HO MO
     398       66295 :         if (val==0x00000F00) return L;  //# Lo       TIBETAN SYLLABLE OM
     399       66295 :         if ((val>=0x0F01) && (val<=0x0F03)) return L;     //# So   [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
     400       66295 :         if ((val>=0x0F04) && (val<=0x0F12)) return L;     //# Po  [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD
     401       66295 :         if ((val>=0x0F13) && (val<=0x0F17)) return L;     //# So   [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
     402       66295 :         if ((val>=0x0F1A) && (val<=0x0F1F)) return L;     //# So   [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG
     403       66295 :         if ((val>=0x0F20) && (val<=0x0F29)) return L;     //# Nd  [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE
     404       66295 :         if ((val>=0x0F2A) && (val<=0x0F33)) return L;     //# No  [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO
     405       66295 :         if (val==0x00000F34) return L;  //# So       TIBETAN MARK BSDUS RTAGS
     406       66295 :         if (val==0x00000F36) return L;  //# So       TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
     407       66295 :         if (val==0x00000F38) return L;  //# So       TIBETAN MARK CHE MGO
     408       66295 :         if ((val>=0x0F3E) && (val<=0x0F3F)) return L;     //# Mc   [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
     409       66295 :         if ((val>=0x0F40) && (val<=0x0F47)) return L;     //# Lo   [8] TIBETAN LETTER KA..TIBETAN LETTER JA
     410       66295 :         if ((val>=0x0F49) && (val<=0x0F6A)) return L;     //# Lo  [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA
     411       66295 :         if (val==0x00000F7F) return L;  //# Mc       TIBETAN SIGN RNAM BCAD
     412       66295 :         if (val==0x00000F85) return L;  //# Po       TIBETAN MARK PALUTA
     413       66295 :         if ((val>=0x0F88) && (val<=0x0F8B)) return L;     //# Lo   [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS
     414       66295 :         if ((val>=0x0FBE) && (val<=0x0FC5)) return L;     //# So   [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE
     415       66295 :         if ((val>=0x0FC7) && (val<=0x0FCC)) return L;     //# So   [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL
     416       66295 :         if (val==0x00000FCF) return L;  //# So       TIBETAN SIGN RDEL NAG GSUM
     417       66295 :         if ((val>=0x0FD0) && (val<=0x0FD1)) return L;     //# Po   [2] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK MNYAM YIG GI MGO RGYAN
     418       66295 :         if ((val>=0x1000) && (val<=0x1021)) return L;     //# Lo  [34] MYANMAR LETTER KA..MYANMAR LETTER A
     419       66295 :         if ((val>=0x1023) && (val<=0x1027)) return L;     //# Lo   [5] MYANMAR LETTER I..MYANMAR LETTER E
     420       66295 :         if ((val>=0x1029) && (val<=0x102A)) return L;     //# Lo   [2] MYANMAR LETTER O..MYANMAR LETTER AU
     421       66295 :         if (val==0x0000102C) return L;  //# Mc       MYANMAR VOWEL SIGN AA
     422       66295 :         if (val==0x00001031) return L;  //# Mc       MYANMAR VOWEL SIGN E
     423       66295 :         if (val==0x00001038) return L;  //# Mc       MYANMAR SIGN VISARGA
     424       66295 :         if ((val>=0x1040) && (val<=0x1049)) return L;     //# Nd  [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE
     425       66295 :         if ((val>=0x104A) && (val<=0x104F)) return L;     //# Po   [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE
     426       66295 :         if ((val>=0x1050) && (val<=0x1055)) return L;     //# Lo   [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
     427       66295 :         if ((val>=0x1056) && (val<=0x1057)) return L;     //# Mc   [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
     428       66295 :         if ((val>=0x10A0) && (val<=0x10C5)) return L;     //# L&  [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
     429       66295 :         if ((val>=0x10D0) && (val<=0x10FA)) return L;     //# Lo  [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
     430       66295 :         if (val==0x000010FB) return L;  //# Po       GEORGIAN PARAGRAPH SEPARATOR
     431       66295 :         if (val==0x000010FC) return L;  //# Lm       MODIFIER LETTER GEORGIAN NAR
     432       66295 :         if ((val>=0x1100) && (val<=0x1159)) return L;     //# Lo  [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH
     433       66295 :         if ((val>=0x115F) && (val<=0x11A2)) return L;     //# Lo  [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA
     434       66295 :         if ((val>=0x11A8) && (val<=0x11F9)) return L;     //# Lo  [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH
     435       66295 :         if ((val>=0x1200) && (val<=0x1248)) return L;     //# Lo  [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA
     436       66295 :         if ((val>=0x124A) && (val<=0x124D)) return L;     //# Lo   [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
     437       66295 :         if ((val>=0x1250) && (val<=0x1256)) return L;     //# Lo   [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
     438       66295 :         if (val==0x00001258) return L;  //# Lo       ETHIOPIC SYLLABLE QHWA
     439       66295 :         if ((val>=0x125A) && (val<=0x125D)) return L;     //# Lo   [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
     440       66295 :         if ((val>=0x1260) && (val<=0x1288)) return L;     //# Lo  [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA
     441       66295 :         if ((val>=0x128A) && (val<=0x128D)) return L;     //# Lo   [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
     442       66295 :         if ((val>=0x1290) && (val<=0x12B0)) return L;     //# Lo  [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA
     443       66295 :         if ((val>=0x12B2) && (val<=0x12B5)) return L;     //# Lo   [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
     444       66295 :         if ((val>=0x12B8) && (val<=0x12BE)) return L;     //# Lo   [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
     445       66295 :         if (val==0x000012C0) return L;  //# Lo       ETHIOPIC SYLLABLE KXWA
     446       66295 :         if ((val>=0x12C2) && (val<=0x12C5)) return L;     //# Lo   [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
     447       66295 :         if ((val>=0x12C8) && (val<=0x12D6)) return L;     //# Lo  [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
     448       66295 :         if ((val>=0x12D8) && (val<=0x1310)) return L;     //# Lo  [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
     449       66295 :         if ((val>=0x1312) && (val<=0x1315)) return L;     //# Lo   [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
     450       66295 :         if ((val>=0x1318) && (val<=0x135A)) return L;     //# Lo  [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
     451       66295 :         if (val==0x00001360) return L;  //# So       ETHIOPIC SECTION MARK
     452       66295 :         if ((val>=0x1361) && (val<=0x1368)) return L;     //# Po   [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR
     453       66295 :         if ((val>=0x1369) && (val<=0x137C)) return L;     //# No  [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND
     454       66295 :         if ((val>=0x1380) && (val<=0x138F)) return L;     //# Lo  [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
     455       66295 :         if ((val>=0x13A0) && (val<=0x13F4)) return L;     //# Lo  [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
     456       66295 :         if ((val>=0x1401) && (val<=0x166C)) return L;     //# Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
     457       66295 :         if ((val>=0x166D) && (val<=0x166E)) return L;     //# Po   [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP
     458       66295 :         if ((val>=0x166F) && (val<=0x1676)) return L;     //# Lo   [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA
     459       66295 :         if ((val>=0x1681) && (val<=0x169A)) return L;     //# Lo  [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
     460       66295 :         if ((val>=0x16A0) && (val<=0x16EA)) return L;     //# Lo  [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
     461       66295 :         if ((val>=0x16EB) && (val<=0x16ED)) return L;     //# Po   [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION
     462       66295 :         if ((val>=0x16EE) && (val<=0x16F0)) return L;     //# Nl   [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
     463       66295 :         if ((val>=0x1700) && (val<=0x170C)) return L;     //# Lo  [13] TAGALOG LETTER A..TAGALOG LETTER YA
     464       66295 :         if ((val>=0x170E) && (val<=0x1711)) return L;     //# Lo   [4] TAGALOG LETTER LA..TAGALOG LETTER HA
     465       66295 :         if ((val>=0x1720) && (val<=0x1731)) return L;     //# Lo  [18] HANUNOO LETTER A..HANUNOO LETTER HA
     466       66295 :         if ((val>=0x1735) && (val<=0x1736)) return L;     //# Po   [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION
     467       66295 :         if ((val>=0x1740) && (val<=0x1751)) return L;     //# Lo  [18] BUHID LETTER A..BUHID LETTER HA
     468       66295 :         if ((val>=0x1760) && (val<=0x176C)) return L;     //# Lo  [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
     469       66295 :         if ((val>=0x176E) && (val<=0x1770)) return L;     //# Lo   [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
     470       66295 :         if ((val>=0x1780) && (val<=0x17B3)) return L;     //# Lo  [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
     471       66295 :         if ((val>=0x17B4) && (val<=0x17B5)) return L;     //# Cf   [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
     472       66295 :         if (val==0x000017B6) return L;  //# Mc       KHMER VOWEL SIGN AA
     473       66295 :         if ((val>=0x17BE) && (val<=0x17C5)) return L;     //# Mc   [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
     474       66295 :         if ((val>=0x17C7) && (val<=0x17C8)) return L;     //# Mc   [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
     475       66295 :         if ((val>=0x17D4) && (val<=0x17D6)) return L;     //# Po   [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH
     476       66295 :         if (val==0x000017D7) return L;  //# Lm       KHMER SIGN LEK TOO
     477       66295 :         if ((val>=0x17D8) && (val<=0x17DA)) return L;     //# Po   [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT
     478       66295 :         if (val==0x000017DC) return L;  //# Lo       KHMER SIGN AVAKRAHASANYA
     479       66295 :         if ((val>=0x17E0) && (val<=0x17E9)) return L;     //# Nd  [10] KHMER DIGIT ZERO..KHMER DIGIT NINE
     480       66295 :         if ((val>=0x1810) && (val<=0x1819)) return L;     //# Nd  [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
     481       66295 :         if ((val>=0x1820) && (val<=0x1842)) return L;     //# Lo  [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
     482       66295 :         if (val==0x00001843) return L;  //# Lm       MONGOLIAN LETTER TODO LONG VOWEL SIGN
     483       66295 :         if ((val>=0x1844) && (val<=0x1877)) return L;     //# Lo  [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
     484       66295 :         if ((val>=0x1880) && (val<=0x18A8)) return L;     //# Lo  [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
     485       66295 :         if ((val>=0x1900) && (val<=0x191C)) return L;     //# Lo  [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
     486       66295 :         if ((val>=0x1923) && (val<=0x1926)) return L;     //# Mc   [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
     487       66295 :         if ((val>=0x1930) && (val<=0x1931)) return L;     //# Mc   [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
     488       66295 :         if ((val>=0x1933) && (val<=0x1938)) return L;     //# Mc   [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
     489       66295 :         if ((val>=0x1946) && (val<=0x194F)) return L;     //# Nd  [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE
     490       66295 :         if ((val>=0x1950) && (val<=0x196D)) return L;     //# Lo  [30] TAI LE LETTER KA..TAI LE LETTER AI
     491       66295 :         if ((val>=0x1970) && (val<=0x1974)) return L;     //# Lo   [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
     492       66295 :         if ((val>=0x1980) && (val<=0x19A9)) return L;     //# Lo  [42] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW XVA
     493       66295 :         if ((val>=0x19B0) && (val<=0x19C0)) return L;     //# Mc  [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY
     494       66295 :         if ((val>=0x19C1) && (val<=0x19C7)) return L;     //# Lo   [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B
     495       66295 :         if ((val>=0x19C8) && (val<=0x19C9)) return L;     //# Mc   [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2
     496       66295 :         if ((val>=0x19D0) && (val<=0x19D9)) return L;     //# Nd  [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE
     497       66295 :         if ((val>=0x1A00) && (val<=0x1A16)) return L;     //# Lo  [23] BUGINESE LETTER KA..BUGINESE LETTER HA
     498       66295 :         if ((val>=0x1A19) && (val<=0x1A1B)) return L;     //# Mc   [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE
     499       66295 :         if ((val>=0x1A1E) && (val<=0x1A1F)) return L;     //# Po   [2] BUGINESE PALLAWA..BUGINESE END OF SECTION
     500       66295 :         if (val==0x00001B04) return L;  //# Mc       BALINESE SIGN BISAH
     501       66295 :         if ((val>=0x1B05) && (val<=0x1B33)) return L;     //# Lo  [47] BALINESE LETTER AKARA..BALINESE LETTER HA
     502       66295 :         if (val==0x00001B35) return L;  //# Mc       BALINESE VOWEL SIGN TEDUNG
     503       66295 :         if (val==0x00001B3B) return L;  //# Mc       BALINESE VOWEL SIGN RA REPA TEDUNG
     504       66295 :         if ((val>=0x1B3D) && (val<=0x1B41)) return L;     //# Mc   [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
     505       66295 :         if ((val>=0x1B43) && (val<=0x1B44)) return L;     //# Mc   [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG
     506       66295 :         if ((val>=0x1B45) && (val<=0x1B4B)) return L;     //# Lo   [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK
     507       66295 :         if ((val>=0x1B50) && (val<=0x1B59)) return L;     //# Nd  [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE
     508       66295 :         if ((val>=0x1B5A) && (val<=0x1B60)) return L;     //# Po   [7] BALINESE PANTI..BALINESE PAMENENG
     509       66295 :         if ((val>=0x1B61) && (val<=0x1B6A)) return L;     //# So  [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE
     510       66295 :         if ((val>=0x1B74) && (val<=0x1B7C)) return L;     //# So   [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
     511       66295 :         if ((val>=0x1D00) && (val<=0x1D2B)) return L;     //# L&  [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
     512       66295 :         if ((val>=0x1D2C) && (val<=0x1D61)) return L;     //# Lm  [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
     513       66295 :         if ((val>=0x1D62) && (val<=0x1D77)) return L;     //# L&  [22] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER TURNED G
     514       66295 :         if (val==0x00001D78) return L;  //# Lm       MODIFIER LETTER CYRILLIC EN
     515       66295 :         if ((val>=0x1D79) && (val<=0x1D9A)) return L;     //# L&  [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
     516       66295 :         if ((val>=0x1D9B) && (val<=0x1DBF)) return L;     //# Lm  [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
     517       66295 :         if ((val>=0x1E00) && (val<=0x1E9B)) return L;     //# L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE
     518       66295 :         if ((val>=0x1EA0) && (val<=0x1EF9)) return L;     //# L&  [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE
     519       66295 :         if ((val>=0x1F00) && (val<=0x1F15)) return L;     //# L&  [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
     520       66295 :         if ((val>=0x1F18) && (val<=0x1F1D)) return L;     //# L&   [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
     521       66295 :         if ((val>=0x1F20) && (val<=0x1F45)) return L;     //# L&  [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
     522       66295 :         if ((val>=0x1F48) && (val<=0x1F4D)) return L;     //# L&   [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
     523       66295 :         if ((val>=0x1F50) && (val<=0x1F57)) return L;     //# L&   [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
     524       66295 :         if (val==0x00001F59) return L;  //# L&       GREEK CAPITAL LETTER UPSILON WITH DASIA
     525       66295 :         if (val==0x00001F5B) return L;  //# L&       GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
     526       66295 :         if (val==0x00001F5D) return L;  //# L&       GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
     527       66295 :         if ((val>=0x1F5F) && (val<=0x1F7D)) return L;     //# L&  [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
     528       66295 :         if ((val>=0x1F80) && (val<=0x1FB4)) return L;     //# L&  [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
     529       66295 :         if ((val>=0x1FB6) && (val<=0x1FBC)) return L;     //# L&   [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
     530       66295 :         if (val==0x00001FBE) return L;  //# L&       GREEK PROSGEGRAMMENI
     531       66295 :         if ((val>=0x1FC2) && (val<=0x1FC4)) return L;     //# L&   [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
     532       66295 :         if ((val>=0x1FC6) && (val<=0x1FCC)) return L;     //# L&   [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
     533       66295 :         if ((val>=0x1FD0) && (val<=0x1FD3)) return L;     //# L&   [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
     534       66295 :         if ((val>=0x1FD6) && (val<=0x1FDB)) return L;     //# L&   [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
     535       66295 :         if ((val>=0x1FE0) && (val<=0x1FEC)) return L;     //# L&  [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
     536       66295 :         if ((val>=0x1FF2) && (val<=0x1FF4)) return L;     //# L&   [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
     537       66295 :         if ((val>=0x1FF6) && (val<=0x1FFC)) return L;     //# L&   [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
     538       66295 :         if (val==0x0000200E) return L;  //# Cf       LEFT-TO-RIGHT MARK
     539       66295 :         if (val==0x00002071) return L;  //# L&       SUPERSCRIPT LATIN SMALL LETTER I
     540       66295 :         if (val==0x0000207F) return L;  //# L&       SUPERSCRIPT LATIN SMALL LETTER N
     541       66295 :         if ((val>=0x2090) && (val<=0x2094)) return L;     //# Lm   [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
     542       66295 :         if (val==0x00002102) return L;  //# L&       DOUBLE-STRUCK CAPITAL C
     543       66295 :         if (val==0x00002107) return L;  //# L&       EULER CONSTANT
     544       66295 :         if ((val>=0x210A) && (val<=0x2113)) return L;     //# L&  [10] SCRIPT SMALL G..SCRIPT SMALL L
     545       66295 :         if (val==0x00002115) return L;  //# L&       DOUBLE-STRUCK CAPITAL N
     546       66295 :         if ((val>=0x2119) && (val<=0x211D)) return L;     //# L&   [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
     547       66295 :         if (val==0x00002124) return L;  //# L&       DOUBLE-STRUCK CAPITAL Z
     548       66295 :         if (val==0x00002126) return L;  //# L&       OHM SIGN
     549       66295 :         if (val==0x00002128) return L;  //# L&       BLACK-LETTER CAPITAL Z
     550       66295 :         if ((val>=0x212A) && (val<=0x212D)) return L;     //# L&   [4] KELVIN SIGN..BLACK-LETTER CAPITAL C
     551       66295 :         if ((val>=0x212F) && (val<=0x2134)) return L;     //# L&   [6] SCRIPT SMALL E..SCRIPT SMALL O
     552       66295 :         if ((val>=0x2135) && (val<=0x2138)) return L;     //# Lo   [4] ALEF SYMBOL..DALET SYMBOL
     553       66295 :         if (val==0x00002139) return L;  //# L&       INFORMATION SOURCE
     554       66295 :         if ((val>=0x213C) && (val<=0x213F)) return L;     //# L&   [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
     555       66295 :         if ((val>=0x2145) && (val<=0x2149)) return L;     //# L&   [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
     556       66295 :         if (val==0x0000214E) return L;  //# L&       TURNED SMALL F
     557       66295 :         if ((val>=0x2160) && (val<=0x2182)) return L;     //# Nl  [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND
     558       66295 :         if ((val>=0x2183) && (val<=0x2184)) return L;     //# L&   [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C
     559       66295 :         if ((val>=0x2336) && (val<=0x237A)) return L;     //# So  [69] APL FUNCTIONAL SYMBOL I-BEAM..APL FUNCTIONAL SYMBOL ALPHA
     560       66295 :         if (val==0x00002395) return L;  //# So       APL FUNCTIONAL SYMBOL QUAD
     561       66295 :         if ((val>=0x249C) && (val<=0x24E9)) return L;     //# So  [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
     562       66295 :         if (val==0x000026AC) return L;  //# So       MEDIUM SMALL WHITE CIRCLE
     563       66295 :         if ((val>=0x2800) && (val<=0x28FF)) return L;     //# So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678
     564       66295 :         if ((val>=0x2C00) && (val<=0x2C2E)) return L;     //# L&  [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
     565       66295 :         if ((val>=0x2C30) && (val<=0x2C5E)) return L;     //# L&  [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
     566       66295 :         if ((val>=0x2C60) && (val<=0x2C6C)) return L;     //# L&  [13] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN SMALL LETTER Z WITH DESCENDER
     567       66295 :         if ((val>=0x2C74) && (val<=0x2C77)) return L;     //# L&   [4] LATIN SMALL LETTER V WITH CURL..LATIN SMALL LETTER TAILLESS PHI
     568       66295 :         if ((val>=0x2C80) && (val<=0x2CE4)) return L;     //# L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI
     569       66295 :         if ((val>=0x2D00) && (val<=0x2D25)) return L;     //# L&  [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
     570       66295 :         if ((val>=0x2D30) && (val<=0x2D65)) return L;     //# Lo  [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ
     571       66295 :         if (val==0x00002D6F) return L;  //# Lm       TIFINAGH MODIFIER LETTER LABIALIZATION MARK
     572       66295 :         if ((val>=0x2D80) && (val<=0x2D96)) return L;     //# Lo  [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
     573       66295 :         if ((val>=0x2DA0) && (val<=0x2DA6)) return L;     //# Lo   [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
     574       66295 :         if ((val>=0x2DA8) && (val<=0x2DAE)) return L;     //# Lo   [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
     575       66295 :         if ((val>=0x2DB0) && (val<=0x2DB6)) return L;     //# Lo   [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
     576       66295 :         if ((val>=0x2DB8) && (val<=0x2DBE)) return L;     //# Lo   [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
     577       66295 :         if ((val>=0x2DC0) && (val<=0x2DC6)) return L;     //# Lo   [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
     578       66295 :         if ((val>=0x2DC8) && (val<=0x2DCE)) return L;     //# Lo   [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
     579       66295 :         if ((val>=0x2DD0) && (val<=0x2DD6)) return L;     //# Lo   [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
     580       66295 :         if ((val>=0x2DD8) && (val<=0x2DDE)) return L;     //# Lo   [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
     581       66295 :         if (val==0x00003005) return L;  //# Lm       IDEOGRAPHIC ITERATION MARK
     582       66295 :         if (val==0x00003006) return L;  //# Lo       IDEOGRAPHIC CLOSING MARK
     583       66295 :         if (val==0x00003007) return L;  //# Nl       IDEOGRAPHIC NUMBER ZERO
     584       66295 :         if ((val>=0x3021) && (val<=0x3029)) return L;     //# Nl   [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
     585       66295 :         if ((val>=0x3031) && (val<=0x3035)) return L;     //# Lm   [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
     586       66295 :         if ((val>=0x3038) && (val<=0x303A)) return L;     //# Nl   [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
     587       66295 :         if (val==0x0000303B) return L;  //# Lm       VERTICAL IDEOGRAPHIC ITERATION MARK
     588       66295 :         if (val==0x0000303C) return L;  //# Lo       MASU MARK
     589       66295 :         if ((val>=0x3041) && (val<=0x3096)) return L;     //# Lo  [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
     590       66295 :         if ((val>=0x309D) && (val<=0x309E)) return L;     //# Lm   [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
     591       66295 :         if (val==0x0000309F) return L;  //# Lo       HIRAGANA DIGRAPH YORI
     592       66295 :         if ((val>=0x30A1) && (val<=0x30FA)) return L;     //# Lo  [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO
     593       66295 :         if ((val>=0x30FC) && (val<=0x30FE)) return L;     //# Lm   [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
     594       66295 :         if (val==0x000030FF) return L;  //# Lo       KATAKANA DIGRAPH KOTO
     595       66295 :         if ((val>=0x3105) && (val<=0x312C)) return L;     //# Lo  [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN
     596       66295 :         if ((val>=0x3131) && (val<=0x318E)) return L;     //# Lo  [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
     597       66295 :         if ((val>=0x3190) && (val<=0x3191)) return L;     //# So   [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK
     598       66295 :         if ((val>=0x3192) && (val<=0x3195)) return L;     //# No   [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK
     599       66295 :         if ((val>=0x3196) && (val<=0x319F)) return L;     //# So  [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK
     600       66295 :         if ((val>=0x31A0) && (val<=0x31B7)) return L;     //# Lo  [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
     601       66295 :         if ((val>=0x31F0) && (val<=0x31FF)) return L;     //# Lo  [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
     602       66295 :         if ((val>=0x3200) && (val<=0x321C)) return L;     //# So  [29] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED HANGUL CIEUC U
     603       66295 :         if ((val>=0x3220) && (val<=0x3229)) return L;     //# No  [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN
     604       66295 :         if ((val>=0x322A) && (val<=0x3243)) return L;     //# So  [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH
     605       66295 :         if ((val>=0x3260) && (val<=0x327B)) return L;     //# So  [28] CIRCLED HANGUL KIYEOK..CIRCLED HANGUL HIEUH A
     606       66295 :         if (val==0x0000327F) return L;  //# So       KOREAN STANDARD SYMBOL
     607       66295 :         if ((val>=0x3280) && (val<=0x3289)) return L;     //# No  [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN
     608       66295 :         if ((val>=0x328A) && (val<=0x32B0)) return L;     //# So  [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT
     609       66295 :         if ((val>=0x32C0) && (val<=0x32CB)) return L;     //# So  [12] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
     610       66295 :         if ((val>=0x32D0) && (val<=0x32FE)) return L;     //# So  [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO
     611       66295 :         if ((val>=0x3300) && (val<=0x3376)) return L;     //# So [119] SQUARE APAATO..SQUARE PC
     612       66295 :         if ((val>=0x337B) && (val<=0x33DD)) return L;     //# So  [99] SQUARE ERA NAME HEISEI..SQUARE WB
     613       66295 :         if ((val>=0x33E0) && (val<=0x33FE)) return L;     //# So  [31] IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
     614       66295 :         if ((val>=0x3400) && (val<=0x4DB5)) return L;     //# Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
     615       66295 :         if ((val>=0x4E00) && (val<=0x9FBB)) return L;     //# Lo [20924] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FBB
     616       66295 :         if ((val>=0xA000) && (val<=0xA014)) return L;     //# Lo  [21] YI SYLLABLE IT..YI SYLLABLE E
     617       66295 :         if (val==0x0000A015) return L;  //# Lm       YI SYLLABLE WU
     618       66295 :         if ((val>=0xA016) && (val<=0xA48C)) return L;     //# Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
     619       66295 :         if ((val>=0xA800) && (val<=0xA801)) return L;     //# Lo   [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I
     620       66295 :         if ((val>=0xA803) && (val<=0xA805)) return L;     //# Lo   [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O
     621       66295 :         if ((val>=0xA807) && (val<=0xA80A)) return L;     //# Lo   [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO
     622       66295 :         if ((val>=0xA80C) && (val<=0xA822)) return L;     //# Lo  [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO
     623       66295 :         if ((val>=0xA823) && (val<=0xA824)) return L;     //# Mc   [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
     624       66295 :         if (val==0x0000A827) return L;  //# Mc       SYLOTI NAGRI VOWEL SIGN OO
     625       66295 :         if ((val>=0xA840) && (val<=0xA873)) return L;     //# Lo  [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU
     626       66295 :         if ((val>=0xAC00) && (val<=0xD7A3)) return L;     //# Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
     627       66295 :         if ((val>=0xE000) && (val<=0xF8FF)) return L;     //# Co [6400] <private-use-E000>..<private-use-F8FF>
     628       66295 :         if ((val>=0xF900) && (val<=0xFA2D)) return L;     //# Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
     629       66295 :         if ((val>=0xFA30) && (val<=0xFA6A)) return L;     //# Lo  [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A
     630       66295 :         if ((val>=0xFA70) && (val<=0xFAD9)) return L;     //# Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
     631       66295 :         if ((val>=0xFB00) && (val<=0xFB06)) return L;     //# L&   [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
     632       66295 :         if ((val>=0xFB13) && (val<=0xFB17)) return L;     //# L&   [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
     633       66295 :         if ((val>=0xFF21) && (val<=0xFF3A)) return L;     //# L&  [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
     634       66295 :         if ((val>=0xFF41) && (val<=0xFF5A)) return L;     //# L&  [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
     635       66295 :         if ((val>=0xFF66) && (val<=0xFF6F)) return L;     //# Lo  [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
     636       66295 :         if (val==0x0000FF70) return L;  //# Lm       HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
     637       66295 :         if ((val>=0xFF71) && (val<=0xFF9D)) return L;     //# Lo  [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
     638       66295 :         if ((val>=0xFF9E) && (val<=0xFF9F)) return L;     //# Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
     639       66295 :         if ((val>=0xFFA0) && (val<=0xFFBE)) return L;     //# Lo  [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
     640       66295 :         if ((val>=0xFFC2) && (val<=0xFFC7)) return L;     //# Lo   [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
     641       66295 :         if ((val>=0xFFCA) && (val<=0xFFCF)) return L;     //# Lo   [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
     642       66295 :         if ((val>=0xFFD2) && (val<=0xFFD7)) return L;     //# Lo   [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
     643       66295 :         if ((val>=0xFFDA) && (val<=0xFFDC)) return L;     //# Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
     644       66295 :         if ((val>=0x10000) && (val<=0x1000B)) return L;   //# Lo  [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
     645       66295 :         if ((val>=0x1000D) && (val<=0x10026)) return L;   //# Lo  [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
     646       66295 :         if ((val>=0x10028) && (val<=0x1003A)) return L;   //# Lo  [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
     647       66295 :         if ((val>=0x1003C) && (val<=0x1003D)) return L;   //# Lo   [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
     648       66295 :         if ((val>=0x1003F) && (val<=0x1004D)) return L;   //# Lo  [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
     649       66295 :         if ((val>=0x10050) && (val<=0x1005D)) return L;   //# Lo  [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
     650       66295 :         if ((val>=0x10080) && (val<=0x100FA)) return L;   //# Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
     651       66295 :         if (val==0x00010100) return L;  //# Po       AEGEAN WORD SEPARATOR LINE
     652       66295 :         if (val==0x00010102) return L;  //# So       AEGEAN CHECK MARK
     653       66295 :         if ((val>=0x10107) && (val<=0x10133)) return L;   //# No  [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND
     654       66295 :         if ((val>=0x10137) && (val<=0x1013F)) return L;   //# So   [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT
     655       66295 :         if ((val>=0x10300) && (val<=0x1031E)) return L;   //# Lo  [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU
     656       66295 :         if ((val>=0x10320) && (val<=0x10323)) return L;   //# No   [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY
     657       66295 :         if ((val>=0x10330) && (val<=0x10340)) return L;   //# Lo  [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
     658       66295 :         if (val==0x00010341) return L;  //# Nl       GOTHIC LETTER NINETY
     659       66295 :         if ((val>=0x10342) && (val<=0x10349)) return L;   //# Lo   [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
     660       66295 :         if (val==0x0001034A) return L;  //# Nl       GOTHIC LETTER NINE HUNDRED
     661       66295 :         if ((val>=0x10380) && (val<=0x1039D)) return L;   //# Lo  [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
     662       66295 :         if (val==0x0001039F) return L;  //# Po       UGARITIC WORD DIVIDER
     663       66295 :         if ((val>=0x103A0) && (val<=0x103C3)) return L;   //# Lo  [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
     664       66295 :         if ((val>=0x103C8) && (val<=0x103CF)) return L;   //# Lo   [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
     665       66295 :         if (val==0x000103D0) return L;  //# Po       OLD PERSIAN WORD DIVIDER
     666       66295 :         if ((val>=0x103D1) && (val<=0x103D5)) return L;   //# Nl   [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED
     667       66295 :         if ((val>=0x10400) && (val<=0x1044F)) return L;   //# L&  [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
     668       66295 :         if ((val>=0x10450) && (val<=0x1049D)) return L;   //# Lo  [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO
     669       66295 :         if ((val>=0x104A0) && (val<=0x104A9)) return L;   //# Nd  [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE
     670       66295 :         if ((val>=0x12000) && (val<=0x1236E)) return L;   //# Lo [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM
     671       66295 :         if ((val>=0x12400) && (val<=0x12462)) return L;   //# Nl  [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
     672       66295 :         if ((val>=0x12470) && (val<=0x12473)) return L;   //# Po   [4] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
     673       66295 :         if ((val>=0x1D000) && (val<=0x1D0F5)) return L;   //# So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
     674       66295 :         if ((val>=0x1D100) && (val<=0x1D126)) return L;   //# So  [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2
     675       66295 :         if ((val>=0x1D12A) && (val<=0x1D164)) return L;   //# So  [59] MUSICAL SYMBOL DOUBLE SHARP..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
     676       66295 :         if ((val>=0x1D165) && (val<=0x1D166)) return L;   //# Mc   [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
     677       66295 :         if ((val>=0x1D16A) && (val<=0x1D16C)) return L;   //# So   [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3
     678       66295 :         if ((val>=0x1D16D) && (val<=0x1D172)) return L;   //# Mc   [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
     679       66295 :         if ((val>=0x1D183) && (val<=0x1D184)) return L;   //# So   [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN
     680       66295 :         if ((val>=0x1D18C) && (val<=0x1D1A9)) return L;   //# So  [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH
     681       66295 :         if ((val>=0x1D1AE) && (val<=0x1D1DD)) return L;   //# So  [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS
     682       66295 :         if ((val>=0x1D360) && (val<=0x1D371)) return L;   //# No  [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE
     683       66295 :         if ((val>=0x1D400) && (val<=0x1D454)) return L;   //# L&  [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
     684       66295 :         if ((val>=0x1D456) && (val<=0x1D49C)) return L;   //# L&  [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
     685       66295 :         if ((val>=0x1D49E) && (val<=0x1D49F)) return L;   //# L&   [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
     686       66295 :         if (val==0x0001D4A2) return L;  //# L&       MATHEMATICAL SCRIPT CAPITAL G
     687       66295 :         if ((val>=0x1D4A5) && (val<=0x1D4A6)) return L;   //# L&   [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
     688       66295 :         if ((val>=0x1D4A9) && (val<=0x1D4AC)) return L;   //# L&   [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
     689       66295 :         if ((val>=0x1D4AE) && (val<=0x1D4B9)) return L;   //# L&  [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
     690       66295 :         if (val==0x0001D4BB) return L;  //# L&       MATHEMATICAL SCRIPT SMALL F
     691       66295 :         if ((val>=0x1D4BD) && (val<=0x1D4C3)) return L;   //# L&   [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
     692       66295 :         if ((val>=0x1D4C5) && (val<=0x1D505)) return L;   //# L&  [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
     693       66295 :         if ((val>=0x1D507) && (val<=0x1D50A)) return L;   //# L&   [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
     694       66295 :         if ((val>=0x1D50D) && (val<=0x1D514)) return L;   //# L&   [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
     695       66295 :         if ((val>=0x1D516) && (val<=0x1D51C)) return L;   //# L&   [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
     696       66295 :         if ((val>=0x1D51E) && (val<=0x1D539)) return L;   //# L&  [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
     697       66295 :         if ((val>=0x1D53B) && (val<=0x1D53E)) return L;   //# L&   [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
     698       66295 :         if ((val>=0x1D540) && (val<=0x1D544)) return L;   //# L&   [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
     699       66295 :         if (val==0x0001D546) return L;  //# L&       MATHEMATICAL DOUBLE-STRUCK CAPITAL O
     700       66295 :         if ((val>=0x1D54A) && (val<=0x1D550)) return L;   //# L&   [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
     701       66295 :         if ((val>=0x1D552) && (val<=0x1D6A5)) return L;   //# L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
     702       66295 :         if ((val>=0x1D6A8) && (val<=0x1D6C0)) return L;   //# L&  [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
     703       66295 :         if (val==0x0001D6C1) return L;  //# Sm       MATHEMATICAL BOLD NABLA
     704       66295 :         if ((val>=0x1D6C2) && (val<=0x1D6DA)) return L;   //# L&  [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
     705       66295 :         if (val==0x0001D6DB) return L;  //# Sm       MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
     706       66295 :         if ((val>=0x1D6DC) && (val<=0x1D6FA)) return L;   //# L&  [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
     707       66295 :         if (val==0x0001D6FB) return L;  //# Sm       MATHEMATICAL ITALIC NABLA
     708       66295 :         if ((val>=0x1D6FC) && (val<=0x1D714)) return L;   //# L&  [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
     709       66295 :         if (val==0x0001D715) return L;  //# Sm       MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
     710       66295 :         if ((val>=0x1D716) && (val<=0x1D734)) return L;   //# L&  [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
     711       66295 :         if (val==0x0001D735) return L;  //# Sm       MATHEMATICAL BOLD ITALIC NABLA
     712       66295 :         if ((val>=0x1D736) && (val<=0x1D74E)) return L;   //# L&  [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
     713       66295 :         if (val==0x0001D74F) return L;  //# Sm       MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
     714       66295 :         if ((val>=0x1D750) && (val<=0x1D76E)) return L;   //# L&  [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
     715       66295 :         if (val==0x0001D76F) return L;  //# Sm       MATHEMATICAL SANS-SERIF BOLD NABLA
     716       66295 :         if ((val>=0x1D770) && (val<=0x1D788)) return L;   //# L&  [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
     717       66295 :         if (val==0x0001D789) return L;  //# Sm       MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
     718       66295 :         if ((val>=0x1D78A) && (val<=0x1D7A8)) return L;   //# L&  [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
     719       66295 :         if (val==0x0001D7A9) return L;  //# Sm       MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
     720       66295 :         if ((val>=0x1D7AA) && (val<=0x1D7C2)) return L;   //# L&  [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
     721       66295 :         if (val==0x0001D7C3) return L;  //# Sm       MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
     722       66295 :         if ((val>=0x1D7C4) && (val<=0x1D7CB)) return L;   //# L&   [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
     723       66295 :         if ((val>=0x20000) && (val<=0x2A6D6)) return L;   //# Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
     724       66295 :         if ((val>=0x2F800) && (val<=0x2FA1D)) return L;   //# Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
     725       66295 :         if ((val>=0xF0000) && (val<=0xFFFFD)) return L;   //# Co [65534] <private-use-F0000>..<private-use-FFFFD>
     726       66295 :         if ((val>=0x100000) && (val<=0x10FFFD)) return L; //# Co [65534] <private-use-100000>..<private-use-10FFFD>
     727       66295 :         if (val==0x00000590) return R;  //# Cn       <reserved-0590>
     728       66295 :         if (val==0x000005BE) return R;  //# Po       HEBREW PUNCTUATION MAQAF
     729       66295 :         if (val==0x000005C0) return R;  //# Po       HEBREW PUNCTUATION PASEQ
     730       66295 :         if (val==0x000005C3) return R;  //# Po       HEBREW PUNCTUATION SOF PASUQ
     731       66295 :         if (val==0x000005C6) return R;  //# Po       HEBREW PUNCTUATION NUN HAFUKHA
     732       66295 :         if ((val>=0x05C8) && (val<=0x05CF)) return R;     //# Cn   [8] <reserved-05C8>..<reserved-05CF>
     733       66295 :         if ((val>=0x05D0) && (val<=0x05EA)) return R;     //# Lo  [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
     734       66295 :         if ((val>=0x05EB) && (val<=0x05EF)) return R;     //# Cn   [5] <reserved-05EB>..<reserved-05EF>
     735       66295 :         if ((val>=0x05F0) && (val<=0x05F2)) return R;     //# Lo   [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
     736       66295 :         if ((val>=0x05F3) && (val<=0x05F4)) return R;     //# Po   [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
     737       66295 :         if ((val>=0x05F5) && (val<=0x05FF)) return R;     //# Cn  [11] <reserved-05F5>..<reserved-05FF>
     738       66295 :         if ((val>=0x07C0) && (val<=0x07C9)) return R;     //# Nd  [10] NKO DIGIT ZERO..NKO DIGIT NINE
     739       66295 :         if ((val>=0x07CA) && (val<=0x07EA)) return R;     //# Lo  [33] NKO LETTER A..NKO LETTER JONA RA
     740       66295 :         if ((val>=0x07F4) && (val<=0x07F5)) return R;     //# Lm   [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
     741       66295 :         if (val==0x000007FA) return R;  //# Lm       NKO LAJANYALAN
     742       66295 :         if ((val>=0x07FB) && (val<=0x08FF)) return R;     //# Cn [261] <reserved-07FB>..<reserved-08FF>
     743       66295 :         if (val==0x0000200F) return R;  //# Cf       RIGHT-TO-LEFT MARK
     744       66295 :         if (val==0x0000FB1D) return R;  //# Lo       HEBREW LETTER YOD WITH HIRIQ
     745       66295 :         if ((val>=0xFB1F) && (val<=0xFB28)) return R;     //# Lo  [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
     746       66295 :         if ((val>=0xFB2A) && (val<=0xFB36)) return R;     //# Lo  [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
     747       66295 :         if (val==0x0000FB37) return R;  //# Cn       <reserved-FB37>
     748       66295 :         if ((val>=0xFB38) && (val<=0xFB3C)) return R;     //# Lo   [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
     749       66295 :         if (val==0x0000FB3D) return R;  //# Cn       <reserved-FB3D>
     750       66295 :         if (val==0x0000FB3E) return R;  //# Lo       HEBREW LETTER MEM WITH DAGESH
     751       66295 :         if (val==0x0000FB3F) return R;  //# Cn       <reserved-FB3F>
     752       66295 :         if ((val>=0xFB40) && (val<=0xFB41)) return R;     //# Lo   [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
     753       66295 :         if (val==0x0000FB42) return R;  //# Cn       <reserved-FB42>
     754       66295 :         if ((val>=0xFB43) && (val<=0xFB44)) return R;     //# Lo   [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
     755       66295 :         if (val==0x0000FB45) return R;  //# Cn       <reserved-FB45>
     756       66295 :         if ((val>=0xFB46) && (val<=0xFB4F)) return R;     //# Lo  [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED
     757       66295 :         if ((val>=0x10800) && (val<=0x10805)) return R;   //# Lo   [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
     758       66295 :         if ((val>=0x10806) && (val<=0x10807)) return R;   //# Cn   [2] <reserved-10806>..<reserved-10807>
     759       66295 :         if (val==0x00010808) return R;  //# Lo       CYPRIOT SYLLABLE JO
     760       66295 :         if (val==0x00010809) return R;  //# Cn       <reserved-10809>
     761       66295 :         if ((val>=0x1080A) && (val<=0x10835)) return R;   //# Lo  [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
     762       66295 :         if (val==0x00010836) return R;  //# Cn       <reserved-10836>
     763       66295 :         if ((val>=0x10837) && (val<=0x10838)) return R;   //# Lo   [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
     764       66295 :         if ((val>=0x10839) && (val<=0x1083B)) return R;   //# Cn   [3] <reserved-10839>..<reserved-1083B>
     765       66295 :         if (val==0x0001083C) return R;  //# Lo       CYPRIOT SYLLABLE ZA
     766       66295 :         if ((val>=0x1083D) && (val<=0x1083E)) return R;   //# Cn   [2] <reserved-1083D>..<reserved-1083E>
     767       66295 :         if (val==0x0001083F) return R;  //# Lo       CYPRIOT SYLLABLE ZO
     768       66295 :         if ((val>=0x10840) && (val<=0x108FF)) return R;   //# Cn [192] <reserved-10840>..<reserved-108FF>
     769       66295 :         if ((val>=0x10900) && (val<=0x10915)) return R;   //# Lo  [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
     770       66295 :         if ((val>=0x10916) && (val<=0x10919)) return R;   //# No   [4] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER ONE HUNDRED
     771       66295 :         if ((val>=0x1091A) && (val<=0x1091E)) return R;   //# Cn   [5] <reserved-1091A>..<reserved-1091E>
     772       66295 :         if ((val>=0x10920) && (val<=0x109FF)) return R;   //# Cn [224] <reserved-10920>..<reserved-109FF>
     773       66295 :         if (val==0x00010A00) return R;  //# Lo       KHAROSHTHI LETTER A
     774       66295 :         if (val==0x00010A04) return R;  //# Cn       <reserved-10A04>
     775       66295 :         if ((val>=0x10A07) && (val<=0x10A0B)) return R;   //# Cn   [5] <reserved-10A07>..<reserved-10A0B>
     776       66295 :         if ((val>=0x10A10) && (val<=0x10A13)) return R;   //# Lo   [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
     777       66295 :         if (val==0x00010A14) return R;  //# Cn       <reserved-10A14>
     778       66295 :         if ((val>=0x10A15) && (val<=0x10A17)) return R;   //# Lo   [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
     779       66295 :         if (val==0x00010A18) return R;  //# Cn       <reserved-10A18>
     780       66295 :         if ((val>=0x10A19) && (val<=0x10A33)) return R;   //# Lo  [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
     781       66295 :         if ((val>=0x10A34) && (val<=0x10A37)) return R;   //# Cn   [4] <reserved-10A34>..<reserved-10A37>
     782       66295 :         if ((val>=0x10A3B) && (val<=0x10A3E)) return R;   //# Cn   [4] <reserved-10A3B>..<reserved-10A3E>
     783       66295 :         if ((val>=0x10A40) && (val<=0x10A47)) return R;   //# No   [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND
     784       66295 :         if ((val>=0x10A48) && (val<=0x10A4F)) return R;   //# Cn   [8] <reserved-10A48>..<reserved-10A4F>
     785       66295 :         if ((val>=0x10A50) && (val<=0x10A58)) return R;   //# Po   [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES
     786       66295 :         if ((val>=0x10A59) && (val<=0x10FFF)) return R;   //# Cn [1447] <reserved-10A59>..<reserved-10FFF>
     787       66295 :         if ((val>=0x0030) && (val<=0x0039)) return EN;    //# Nd  [10] DIGIT ZERO..DIGIT NINE
     788       56796 :         if ((val>=0x00B2) && (val<=0x00B3)) return EN;    //# No   [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE
     789       56796 :         if (val==0x000000B9) return EN; //# No       SUPERSCRIPT ONE
     790       56796 :         if ((val>=0x06F0) && (val<=0x06F9)) return EN;    //# Nd  [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE
     791       56796 :         if (val==0x00002070) return EN; //# No       SUPERSCRIPT ZERO
     792       56796 :         if ((val>=0x2074) && (val<=0x2079)) return EN;    //# No   [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE
     793       56796 :         if ((val>=0x2080) && (val<=0x2089)) return EN;    //# No  [10] SUBSCRIPT ZERO..SUBSCRIPT NINE
     794       56796 :         if ((val>=0x2488) && (val<=0x249B)) return EN;    //# No  [20] DIGIT ONE FULL STOP..NUMBER TWENTY FULL STOP
     795       56796 :         if ((val>=0xFF10) && (val<=0xFF19)) return EN;    //# Nd  [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
     796       56796 :         if ((val>=0x1D7CE) && (val<=0x1D7FF)) return EN;  //# Nd  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
     797       56796 :         if (val==0x0000002B) return ES; //# Sm       PLUS SIGN
     798       56796 :         if (val==0x0000002D) return ES; //# Pd       HYPHEN-MINUS
     799       55770 :         if ((val>=0x207A) && (val<=0x207B)) return ES;    //# Sm   [2] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT MINUS
     800       55770 :         if ((val>=0x208A) && (val<=0x208B)) return ES;    //# Sm   [2] SUBSCRIPT PLUS SIGN..SUBSCRIPT MINUS
     801       55770 :         if (val==0x00002212) return ES; //# Sm       MINUS SIGN
     802       55770 :         if (val==0x0000FB29) return ES; //# Sm       HEBREW LETTER ALTERNATIVE PLUS SIGN
     803       55770 :         if (val==0x0000FE62) return ES; //# Sm       SMALL PLUS SIGN
     804       55770 :         if (val==0x0000FE63) return ES; //# Pd       SMALL HYPHEN-MINUS
     805       55770 :         if (val==0x0000FF0B) return ES; //# Sm       FULLWIDTH PLUS SIGN
     806       55770 :         if (val==0x0000FF0D) return ES; //# Pd       FULLWIDTH HYPHEN-MINUS
     807       55770 :         if (val==0x00000023) return ET; //# Po       NUMBER SIGN
     808       55606 :         if (val==0x00000024) return ET; //# Sc       DOLLAR SIGN
     809       55522 :         if (val==0x00000025) return ET; //# Po       PERCENT SIGN
     810       55513 :         if ((val>=0x00A2) && (val<=0x00A5)) return ET;    //# Sc   [4] CENT SIGN..YEN SIGN
     811       55513 :         if (val==0x000000B0) return ET; //# So       DEGREE SIGN
     812       55513 :         if (val==0x000000B1) return ET; //# Sm       PLUS-MINUS SIGN
     813       55513 :         if (val==0x0000066A) return ET; //# Po       ARABIC PERCENT SIGN
     814       55513 :         if ((val>=0x09F2) && (val<=0x09F3)) return ET;    //# Sc   [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN
     815       55513 :         if (val==0x00000AF1) return ET; //# Sc       GUJARATI RUPEE SIGN
     816       55513 :         if (val==0x00000BF9) return ET; //# Sc       TAMIL RUPEE SIGN
     817       55513 :         if (val==0x00000E3F) return ET; //# Sc       THAI CURRENCY SYMBOL BAHT
     818       55513 :         if (val==0x000017DB) return ET; //# Sc       KHMER CURRENCY SYMBOL RIEL
     819       55513 :         if ((val>=0x2030) && (val<=0x2034)) return ET;    //# Po   [5] PER MILLE SIGN..TRIPLE PRIME
     820       55513 :         if ((val>=0x20A0) && (val<=0x20B5)) return ET;    //# Sc  [22] EURO-CURRENCY SIGN..CEDI SIGN
     821       55513 :         if (val==0x0000212E) return ET; //# So       ESTIMATED SYMBOL
     822       55513 :         if (val==0x00002213) return ET; //# Sm       MINUS-OR-PLUS SIGN
     823       55513 :         if (val==0x0000FE5F) return ET; //# Po       SMALL NUMBER SIGN
     824       55513 :         if (val==0x0000FE69) return ET; //# Sc       SMALL DOLLAR SIGN
     825       55513 :         if (val==0x0000FE6A) return ET; //# Po       SMALL PERCENT SIGN
     826       55513 :         if (val==0x0000FF03) return ET; //# Po       FULLWIDTH NUMBER SIGN
     827       55513 :         if (val==0x0000FF04) return ET; //# Sc       FULLWIDTH DOLLAR SIGN
     828       55513 :         if (val==0x0000FF05) return ET; //# Po       FULLWIDTH PERCENT SIGN
     829       55513 :         if ((val>=0xFFE0) && (val<=0xFFE1)) return ET;    //# Sc   [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN
     830       55513 :         if ((val>=0xFFE5) && (val<=0xFFE6)) return ET;    //# Sc   [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN
     831       55513 :         if ((val>=0x0660) && (val<=0x0669)) return AN;    //# Nd  [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE
     832       55513 :         if ((val>=0x066B) && (val<=0x066C)) return AN;    //# Po   [2] ARABIC DECIMAL SEPARATOR..ARABIC THOUSANDS SEPARATOR
     833       55513 :         if (val==0x0000002C) return CS; //# Po       COMMA
     834       52686 :         if ((val>=0x002E) && (val<=0x002F)) return CS;    //# Po   [2] FULL STOP..SOLIDUS
     835       49395 :         if (val==0x0000003A) return CS; //# Po       COLON
     836       48069 :         if (val==0x000000A0) return CS; //# Zs       NO-BREAK SPACE
     837       48069 :         if (val==0x0000060C) return CS; //# Po       ARABIC COMMA
     838       48069 :         if (val==0x0000202F) return CS; //# Zs       NARROW NO-BREAK SPACE
     839       48069 :         if (val==0x00002044) return CS; //# Sm       FRACTION SLASH
     840       48069 :         if (val==0x0000FE50) return CS; //# Po       SMALL COMMA
     841       48069 :         if (val==0x0000FE52) return CS; //# Po       SMALL FULL STOP
     842       48069 :         if (val==0x0000FE55) return CS; //# Po       SMALL COLON
     843       48069 :         if (val==0x0000FF0C) return CS; //# Po       FULLWIDTH COMMA
     844       48069 :         if ((val>=0xFF0E) && (val<=0xFF0F)) return CS;    //# Po   [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS
     845       48069 :         if (val==0x0000FF1A) return CS; //# Po       FULLWIDTH COLON
     846       48069 :         if (val==0x0000000A) return B;  //# Cc       <control-000A>
     847       48069 :         if (val==0x0000000D) return B;  //# Cc       <control-000D>
     848       48069 :         if ((val>=0x001C) && (val<=0x001E)) return B;     //# Cc   [3] <control-001C>..<control-001E>
     849       48069 :         if (val==0x00000085) return B;  //# Cc       <control-0085>
     850       48069 :         if (val==0x00002029) return B;  //# Zp       PARAGRAPH SEPARATOR
     851       48069 :         if (val==0x00000009) return S;  //# Cc       <control-0009>
     852       48063 :         if (val==0x0000000B) return S;  //# Cc       <control-000B>
     853       48063 :         if (val==0x0000001F) return S;  //# Cc       <control-001F>
     854       48063 :         if (val==0x0000000C) return WS; //# Cc       <control-000C>
     855       48063 :         if (val==0x00000020) return WS; //# Zs       SPACE
     856        1322 :         if (val==0x00001680) return WS; //# Zs       OGHAM SPACE MARK
     857        1322 :         if (val==0x0000180E) return WS; //# Zs       MONGOLIAN VOWEL SEPARATOR
     858        1322 :         if ((val>=0x2000) && (val<=0x200A)) return WS;    //# Zs  [11] EN QUAD..HAIR SPACE
     859        1322 :         if (val==0x00002028) return WS; //# Zl       LINE SEPARATOR
     860        1322 :         if (val==0x0000205F) return WS; //# Zs       MEDIUM MATHEMATICAL SPACE
     861        1322 :         if (val==0x00003000) return WS; //# Zs       IDEOGRAPHIC SPACE
     862        1322 :         if ((val>=0x0021) && (val<=0x0022)) return ON;    //# Po   [2] EXCLAMATION MARK..QUOTATION MARK
     863         663 :         if ((val>=0x0026) && (val<=0x0027)) return ON;    //# Po   [2] AMPERSAND..APOSTROPHE
     864         362 :         if (val==0x00000028) return ON; //# Ps       LEFT PARENTHESIS
     865         334 :         if (val==0x00000029) return ON; //# Pe       RIGHT PARENTHESIS
     866         310 :         if (val==0x0000002A) return ON; //# Po       ASTERISK
     867         271 :         if (val==0x0000003B) return ON; //# Po       SEMICOLON
     868         271 :         if ((val>=0x003C) && (val<=0x003E)) return ON;    //# Sm   [3] LESS-THAN SIGN..GREATER-THAN SIGN
     869         154 :         if ((val>=0x003F) && (val<=0x0040)) return ON;    //# Po   [2] QUESTION MARK..COMMERCIAL AT
     870         144 :         if (val==0x0000005B) return ON; //# Ps       LEFT SQUARE BRACKET
     871          62 :         if (val==0x0000005C) return ON; //# Po       REVERSE SOLIDUS
     872          58 :         if (val==0x0000005D) return ON; //# Pe       RIGHT SQUARE BRACKET
     873           3 :         if (val==0x0000005E) return ON; //# Sk       CIRCUMFLEX ACCENT
     874           3 :         if (val==0x0000005F) return ON; //# Pc       LOW LINE
     875           0 :         if (val==0x00000060) return ON; //# Sk       GRAVE ACCENT
     876           0 :         if (val==0x0000007B) return ON; //# Ps       LEFT CURLY BRACKET
     877           0 :         if (val==0x0000007C) return ON; //# Sm       VERTICAL LINE
     878           0 :         if (val==0x0000007D) return ON; //# Pe       RIGHT CURLY BRACKET
     879           0 :         if (val==0x0000007E) return ON; //# Sm       TILDE
     880           0 :         if (val==0x000000A1) return ON; //# Po       INVERTED EXCLAMATION MARK
     881           0 :         if ((val>=0x00A6) && (val<=0x00A7)) return ON;    //# So   [2] BROKEN BAR..SECTION SIGN
     882           0 :         if (val==0x000000A8) return ON; //# Sk       DIAERESIS
     883           0 :         if (val==0x000000A9) return ON; //# So       COPYRIGHT SIGN
     884           0 :         if (val==0x000000AB) return ON; //# Pi       LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
     885           0 :         if (val==0x000000AC) return ON; //# Sm       NOT SIGN
     886           0 :         if (val==0x000000AE) return ON; //# So       REGISTERED SIGN
     887           0 :         if (val==0x000000AF) return ON; //# Sk       MACRON
     888           0 :         if (val==0x000000B4) return ON; //# Sk       ACUTE ACCENT
     889           0 :         if (val==0x000000B6) return ON; //# So       PILCROW SIGN
     890           0 :         if (val==0x000000B7) return ON; //# Po       MIDDLE DOT
     891           0 :         if (val==0x000000B8) return ON; //# Sk       CEDILLA
     892           0 :         if (val==0x000000BB) return ON; //# Pf       RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
     893           0 :         if ((val>=0x00BC) && (val<=0x00BE)) return ON;    //# No   [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS
     894           0 :         if (val==0x000000BF) return ON; //# Po       INVERTED QUESTION MARK
     895           0 :         if (val==0x000000D7) return ON; //# Sm       MULTIPLICATION SIGN
     896           0 :         if (val==0x000000F7) return ON; //# Sm       DIVISION SIGN
     897           0 :         if ((val>=0x02B9) && (val<=0x02BA)) return ON;    //# Lm   [2] MODIFIER LETTER PRIME..MODIFIER LETTER DOUBLE PRIME
     898           0 :         if ((val>=0x02C2) && (val<=0x02C5)) return ON;    //# Sk   [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
     899           0 :         if ((val>=0x02C6) && (val<=0x02CF)) return ON;    //# Lm  [10] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER LOW ACUTE ACCENT
     900           0 :         if ((val>=0x02D2) && (val<=0x02DF)) return ON;    //# Sk  [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT
     901           0 :         if ((val>=0x02E5) && (val<=0x02ED)) return ON;    //# Sk   [9] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER UNASPIRATED
     902           0 :         if ((val>=0x02EF) && (val<=0x02FF)) return ON;    //# Sk  [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
     903           0 :         if ((val>=0x0374) && (val<=0x0375)) return ON;    //# Sk   [2] GREEK NUMERAL SIGN..GREEK LOWER NUMERAL SIGN
     904           0 :         if (val==0x0000037E) return ON; //# Po       GREEK QUESTION MARK
     905           0 :         if ((val>=0x0384) && (val<=0x0385)) return ON;    //# Sk   [2] GREEK TONOS..GREEK DIALYTIKA TONOS
     906           0 :         if (val==0x00000387) return ON; //# Po       GREEK ANO TELEIA
     907           0 :         if (val==0x000003F6) return ON; //# Sm       GREEK REVERSED LUNATE EPSILON SYMBOL
     908           0 :         if (val==0x0000058A) return ON; //# Pd       ARMENIAN HYPHEN
     909           0 :         if ((val>=0x060E) && (val<=0x060F)) return ON;    //# So   [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA
     910           0 :         if (val==0x000006E9) return ON; //# So       ARABIC PLACE OF SAJDAH
     911           0 :         if (val==0x000007F6) return ON; //# So       NKO SYMBOL OO DENNEN
     912           0 :         if ((val>=0x07F7) && (val<=0x07F9)) return ON;    //# Po   [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK
     913           0 :         if ((val>=0x0BF3) && (val<=0x0BF8)) return ON;    //# So   [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN
     914           0 :         if (val==0x00000BFA) return ON; //# So       TAMIL NUMBER SIGN
     915           0 :         if ((val>=0x0CF1) && (val<=0x0CF2)) return ON;    //# So   [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
     916           0 :         if (val==0x00000F3A) return ON; //# Ps       TIBETAN MARK GUG RTAGS GYON
     917           0 :         if (val==0x00000F3B) return ON; //# Pe       TIBETAN MARK GUG RTAGS GYAS
     918           0 :         if (val==0x00000F3C) return ON; //# Ps       TIBETAN MARK ANG KHANG GYON
     919           0 :         if (val==0x00000F3D) return ON; //# Pe       TIBETAN MARK ANG KHANG GYAS
     920           0 :         if ((val>=0x1390) && (val<=0x1399)) return ON;    //# So  [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT
     921           0 :         if (val==0x0000169B) return ON; //# Ps       OGHAM FEATHER MARK
     922           0 :         if (val==0x0000169C) return ON; //# Pe       OGHAM REVERSED FEATHER MARK
     923           0 :         if ((val>=0x17F0) && (val<=0x17F9)) return ON;    //# No  [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON
     924           0 :         if ((val>=0x1800) && (val<=0x1805)) return ON;    //# Po   [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS
     925           0 :         if (val==0x00001806) return ON; //# Pd       MONGOLIAN TODO SOFT HYPHEN
     926           0 :         if ((val>=0x1807) && (val<=0x180A)) return ON;    //# Po   [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU
     927           0 :         if (val==0x00001940) return ON; //# So       LIMBU SIGN LOO
     928           0 :         if ((val>=0x1944) && (val<=0x1945)) return ON;    //# Po   [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
     929           0 :         if ((val>=0x19DE) && (val<=0x19DF)) return ON;    //# Po   [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV
     930           0 :         if ((val>=0x19E0) && (val<=0x19FF)) return ON;    //# So  [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC
     931           0 :         if (val==0x00001FBD) return ON; //# Sk       GREEK KORONIS
     932           0 :         if ((val>=0x1FBF) && (val<=0x1FC1)) return ON;    //# Sk   [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
     933           0 :         if ((val>=0x1FCD) && (val<=0x1FCF)) return ON;    //# Sk   [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
     934           0 :         if ((val>=0x1FDD) && (val<=0x1FDF)) return ON;    //# Sk   [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
     935           0 :         if ((val>=0x1FED) && (val<=0x1FEF)) return ON;    //# Sk   [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA
     936           0 :         if ((val>=0x1FFD) && (val<=0x1FFE)) return ON;    //# Sk   [2] GREEK OXIA..GREEK DASIA
     937           0 :         if ((val>=0x2010) && (val<=0x2015)) return ON;    //# Pd   [6] HYPHEN..HORIZONTAL BAR
     938           0 :         if ((val>=0x2016) && (val<=0x2017)) return ON;    //# Po   [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE
     939           0 :         if (val==0x00002018) return ON; //# Pi       LEFT SINGLE QUOTATION MARK
     940           0 :         if (val==0x00002019) return ON; //# Pf       RIGHT SINGLE QUOTATION MARK
     941           0 :         if (val==0x0000201A) return ON; //# Ps       SINGLE LOW-9 QUOTATION MARK
     942           0 :         if ((val>=0x201B) && (val<=0x201C)) return ON;    //# Pi   [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
     943           0 :         if (val==0x0000201D) return ON; //# Pf       RIGHT DOUBLE QUOTATION MARK
     944           0 :         if (val==0x0000201E) return ON; //# Ps       DOUBLE LOW-9 QUOTATION MARK
     945           0 :         if (val==0x0000201F) return ON; //# Pi       DOUBLE HIGH-REVERSED-9 QUOTATION MARK
     946           0 :         if ((val>=0x2020) && (val<=0x2027)) return ON;    //# Po   [8] DAGGER..HYPHENATION POINT
     947           0 :         if ((val>=0x2035) && (val<=0x2038)) return ON;    //# Po   [4] REVERSED PRIME..CARET
     948           0 :         if (val==0x00002039) return ON; //# Pi       SINGLE LEFT-POINTING ANGLE QUOTATION MARK
     949           0 :         if (val==0x0000203A) return ON; //# Pf       SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
     950           0 :         if ((val>=0x203B) && (val<=0x203E)) return ON;    //# Po   [4] REFERENCE MARK..OVERLINE
     951           0 :         if ((val>=0x203F) && (val<=0x2040)) return ON;    //# Pc   [2] UNDERTIE..CHARACTER TIE
     952           0 :         if ((val>=0x2041) && (val<=0x2043)) return ON;    //# Po   [3] CARET INSERTION POINT..HYPHEN BULLET
     953           0 :         if (val==0x00002045) return ON; //# Ps       LEFT SQUARE BRACKET WITH QUILL
     954           0 :         if (val==0x00002046) return ON; //# Pe       RIGHT SQUARE BRACKET WITH QUILL
     955           0 :         if ((val>=0x2047) && (val<=0x2051)) return ON;    //# Po  [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY
     956           0 :         if (val==0x00002052) return ON; //# Sm       COMMERCIAL MINUS SIGN
     957           0 :         if (val==0x00002053) return ON; //# Po       SWUNG DASH
     958           0 :         if (val==0x00002054) return ON; //# Pc       INVERTED UNDERTIE
     959           0 :         if ((val>=0x2055) && (val<=0x205E)) return ON;    //# Po  [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS
     960           0 :         if (val==0x0000207C) return ON; //# Sm       SUPERSCRIPT EQUALS SIGN
     961           0 :         if (val==0x0000207D) return ON; //# Ps       SUPERSCRIPT LEFT PARENTHESIS
     962           0 :         if (val==0x0000207E) return ON; //# Pe       SUPERSCRIPT RIGHT PARENTHESIS
     963           0 :         if (val==0x0000208C) return ON; //# Sm       SUBSCRIPT EQUALS SIGN
     964           0 :         if (val==0x0000208D) return ON; //# Ps       SUBSCRIPT LEFT PARENTHESIS
     965           0 :         if (val==0x0000208E) return ON; //# Pe       SUBSCRIPT RIGHT PARENTHESIS
     966           0 :         if ((val>=0x2100) && (val<=0x2101)) return ON;    //# So   [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT
     967           0 :         if ((val>=0x2103) && (val<=0x2106)) return ON;    //# So   [4] DEGREE CELSIUS..CADA UNA
     968           0 :         if ((val>=0x2108) && (val<=0x2109)) return ON;    //# So   [2] SCRUPLE..DEGREE FAHRENHEIT
     969           0 :         if (val==0x00002114) return ON; //# So       L B BAR SYMBOL
     970           0 :         if ((val>=0x2116) && (val<=0x2118)) return ON;    //# So   [3] NUMERO SIGN..SCRIPT CAPITAL P
     971           0 :         if ((val>=0x211E) && (val<=0x2123)) return ON;    //# So   [6] PRESCRIPTION TAKE..VERSICLE
     972           0 :         if (val==0x00002125) return ON; //# So       OUNCE SIGN
     973           0 :         if (val==0x00002127) return ON; //# So       INVERTED OHM SIGN
     974           0 :         if (val==0x00002129) return ON; //# So       TURNED GREEK SMALL LETTER IOTA
     975           0 :         if ((val>=0x213A) && (val<=0x213B)) return ON;    //# So   [2] ROTATED CAPITAL Q..FACSIMILE SIGN
     976           0 :         if ((val>=0x2140) && (val<=0x2144)) return ON;    //# Sm   [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y
     977           0 :         if (val==0x0000214A) return ON; //# So       PROPERTY LINE
     978           0 :         if (val==0x0000214B) return ON; //# Sm       TURNED AMPERSAND
     979           0 :         if ((val>=0x214C) && (val<=0x214D)) return ON;    //# So   [2] PER SIGN..AKTIESELSKAB
     980           0 :         if ((val>=0x2153) && (val<=0x215F)) return ON;    //# No  [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE
     981           0 :         if ((val>=0x2190) && (val<=0x2194)) return ON;    //# Sm   [5] LEFTWARDS ARROW..LEFT RIGHT ARROW
     982           0 :         if ((val>=0x2195) && (val<=0x2199)) return ON;    //# So   [5] UP DOWN ARROW..SOUTH WEST ARROW
     983           0 :         if ((val>=0x219A) && (val<=0x219B)) return ON;    //# Sm   [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE
     984           0 :         if ((val>=0x219C) && (val<=0x219F)) return ON;    //# So   [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
     985           0 :         if (val==0x000021A0) return ON; //# Sm       RIGHTWARDS TWO HEADED ARROW
     986           0 :         if ((val>=0x21A1) && (val<=0x21A2)) return ON;    //# So   [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
     987           0 :         if (val==0x000021A3) return ON; //# Sm       RIGHTWARDS ARROW WITH TAIL
     988           0 :         if ((val>=0x21A4) && (val<=0x21A5)) return ON;    //# So   [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
     989           0 :         if (val==0x000021A6) return ON; //# Sm       RIGHTWARDS ARROW FROM BAR
     990           0 :         if ((val>=0x21A7) && (val<=0x21AD)) return ON;    //# So   [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW
     991           0 :         if (val==0x000021AE) return ON; //# Sm       LEFT RIGHT ARROW WITH STROKE
     992           0 :         if ((val>=0x21AF) && (val<=0x21CD)) return ON;    //# So  [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE
     993           0 :         if ((val>=0x21CE) && (val<=0x21CF)) return ON;    //# Sm   [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE
     994           0 :         if ((val>=0x21D0) && (val<=0x21D1)) return ON;    //# So   [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
     995           0 :         if (val==0x000021D2) return ON; //# Sm       RIGHTWARDS DOUBLE ARROW
     996           0 :         if (val==0x000021D3) return ON; //# So       DOWNWARDS DOUBLE ARROW
     997           0 :         if (val==0x000021D4) return ON; //# Sm       LEFT RIGHT DOUBLE ARROW
     998           0 :         if ((val>=0x21D5) && (val<=0x21F3)) return ON;    //# So  [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW
     999           0 :         if ((val>=0x21F4) && (val<=0x2211)) return ON;    //# Sm  [30] RIGHT ARROW WITH SMALL CIRCLE..N-ARY SUMMATION
    1000           0 :         if ((val>=0x2214) && (val<=0x22FF)) return ON;    //# Sm [236] DOT PLUS..Z NOTATION BAG MEMBERSHIP
    1001           0 :         if ((val>=0x2300) && (val<=0x2307)) return ON;    //# So   [8] DIAMETER SIGN..WAVY LINE
    1002           0 :         if ((val>=0x2308) && (val<=0x230B)) return ON;    //# Sm   [4] LEFT CEILING..RIGHT FLOOR
    1003           0 :         if ((val>=0x230C) && (val<=0x231F)) return ON;    //# So  [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER
    1004           0 :         if ((val>=0x2320) && (val<=0x2321)) return ON;    //# Sm   [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL
    1005           0 :         if ((val>=0x2322) && (val<=0x2328)) return ON;    //# So   [7] FROWN..KEYBOARD
    1006           0 :         if (val==0x00002329) return ON; //# Ps       LEFT-POINTING ANGLE BRACKET
    1007           0 :         if (val==0x0000232A) return ON; //# Pe       RIGHT-POINTING ANGLE BRACKET
    1008           0 :         if ((val>=0x232B) && (val<=0x2335)) return ON;    //# So  [11] ERASE TO THE LEFT..COUNTERSINK
    1009           0 :         if (val==0x0000237B) return ON; //# So       NOT CHECK MARK
    1010           0 :         if (val==0x0000237C) return ON; //# Sm       RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
    1011           0 :         if ((val>=0x237D) && (val<=0x2394)) return ON;    //# So  [24] SHOULDERED OPEN BOX..SOFTWARE-FUNCTION SYMBOL
    1012           0 :         if ((val>=0x2396) && (val<=0x239A)) return ON;    //# So   [5] DECIMAL SEPARATOR KEY SYMBOL..CLEAR SCREEN SYMBOL
    1013           0 :         if ((val>=0x239B) && (val<=0x23B3)) return ON;    //# Sm  [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM
    1014           0 :         if ((val>=0x23B4) && (val<=0x23DB)) return ON;    //# So  [40] TOP SQUARE BRACKET..FUSE
    1015           0 :         if ((val>=0x23DC) && (val<=0x23E1)) return ON;    //# Sm   [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET
    1016           0 :         if ((val>=0x23E2) && (val<=0x23E7)) return ON;    //# So   [6] WHITE TRAPEZIUM..ELECTRICAL INTERSECTION
    1017           0 :         if ((val>=0x2400) && (val<=0x2426)) return ON;    //# So  [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO
    1018           0 :         if ((val>=0x2440) && (val<=0x244A)) return ON;    //# So  [11] OCR HOOK..OCR DOUBLE BACKSLASH
    1019           0 :         if ((val>=0x2460) && (val<=0x2487)) return ON;    //# No  [40] CIRCLED DIGIT ONE..PARENTHESIZED NUMBER TWENTY
    1020           0 :         if ((val>=0x24EA) && (val<=0x24FF)) return ON;    //# No  [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO
    1021           0 :         if ((val>=0x2500) && (val<=0x25B6)) return ON;    //# So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE
    1022           0 :         if (val==0x000025B7) return ON; //# Sm       WHITE RIGHT-POINTING TRIANGLE
    1023           0 :         if ((val>=0x25B8) && (val<=0x25C0)) return ON;    //# So   [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE
    1024           0 :         if (val==0x000025C1) return ON; //# Sm       WHITE LEFT-POINTING TRIANGLE
    1025           0 :         if ((val>=0x25C2) && (val<=0x25F7)) return ON;    //# So  [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT
    1026           0 :         if ((val>=0x25F8) && (val<=0x25FF)) return ON;    //# Sm   [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE
    1027           0 :         if ((val>=0x2600) && (val<=0x266E)) return ON;    //# So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN
    1028           0 :         if (val==0x0000266F) return ON; //# Sm       MUSIC SHARP SIGN
    1029           0 :         if ((val>=0x2670) && (val<=0x269C)) return ON;    //# So  [45] WEST SYRIAC CROSS..FLEUR-DE-LIS
    1030           0 :         if ((val>=0x26A0) && (val<=0x26AB)) return ON;    //# So  [12] WARNING SIGN..MEDIUM BLACK CIRCLE
    1031           0 :         if ((val>=0x26AD) && (val<=0x26B2)) return ON;    //# So   [6] MARRIAGE SYMBOL..NEUTER
    1032           0 :         if ((val>=0x2701) && (val<=0x2704)) return ON;    //# So   [4] UPPER BLADE SCISSORS..WHITE SCISSORS
    1033           0 :         if ((val>=0x2706) && (val<=0x2709)) return ON;    //# So   [4] TELEPHONE LOCATION SIGN..ENVELOPE
    1034           0 :         if ((val>=0x270C) && (val<=0x2727)) return ON;    //# So  [28] VICTORY HAND..WHITE FOUR POINTED STAR
    1035           0 :         if ((val>=0x2729) && (val<=0x274B)) return ON;    //# So  [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
    1036           0 :         if (val==0x0000274D) return ON; //# So       SHADOWED WHITE CIRCLE
    1037           0 :         if ((val>=0x274F) && (val<=0x2752)) return ON;    //# So   [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE
    1038           0 :         if (val==0x00002756) return ON; //# So       BLACK DIAMOND MINUS WHITE X
    1039           0 :         if ((val>=0x2758) && (val<=0x275E)) return ON;    //# So   [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
    1040           0 :         if ((val>=0x2761) && (val<=0x2767)) return ON;    //# So   [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET
    1041           0 :         if (val==0x00002768) return ON; //# Ps       MEDIUM LEFT PARENTHESIS ORNAMENT
    1042           0 :         if (val==0x00002769) return ON; //# Pe       MEDIUM RIGHT PARENTHESIS ORNAMENT
    1043           0 :         if (val==0x0000276A) return ON; //# Ps       MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
    1044           0 :         if (val==0x0000276B) return ON; //# Pe       MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
    1045           0 :         if (val==0x0000276C) return ON; //# Ps       MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
    1046           0 :         if (val==0x0000276D) return ON; //# Pe       MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
    1047           0 :         if (val==0x0000276E) return ON; //# Ps       HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
    1048           0 :         if (val==0x0000276F) return ON; //# Pe       HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
    1049           0 :         if (val==0x00002770) return ON; //# Ps       HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
    1050           0 :         if (val==0x00002771) return ON; //# Pe       HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
    1051           0 :         if (val==0x00002772) return ON; //# Ps       LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
    1052           0 :         if (val==0x00002773) return ON; //# Pe       LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
    1053           0 :         if (val==0x00002774) return ON; //# Ps       MEDIUM LEFT CURLY BRACKET ORNAMENT
    1054           0 :         if (val==0x00002775) return ON; //# Pe       MEDIUM RIGHT CURLY BRACKET ORNAMENT
    1055           0 :         if ((val>=0x2776) && (val<=0x2793)) return ON;    //# No  [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
    1056           0 :         if (val==0x00002794) return ON; //# So       HEAVY WIDE-HEADED RIGHTWARDS ARROW
    1057           0 :         if ((val>=0x2798) && (val<=0x27AF)) return ON;    //# So  [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
    1058           0 :         if ((val>=0x27B1) && (val<=0x27BE)) return ON;    //# So  [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW
    1059           0 :         if ((val>=0x27C0) && (val<=0x27C4)) return ON;    //# Sm   [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET
    1060           0 :         if (val==0x000027C5) return ON; //# Ps       LEFT S-SHAPED BAG DELIMITER
    1061           0 :         if (val==0x000027C6) return ON; //# Pe       RIGHT S-SHAPED BAG DELIMITER
    1062           0 :         if ((val>=0x27C7) && (val<=0x27CA)) return ON;    //# Sm   [4] OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE
    1063           0 :         if ((val>=0x27D0) && (val<=0x27E5)) return ON;    //# Sm  [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK
    1064           0 :         if (val==0x000027E6) return ON; //# Ps       MATHEMATICAL LEFT WHITE SQUARE BRACKET
    1065           0 :         if (val==0x000027E7) return ON; //# Pe       MATHEMATICAL RIGHT WHITE SQUARE BRACKET
    1066           0 :         if (val==0x000027E8) return ON; //# Ps       MATHEMATICAL LEFT ANGLE BRACKET
    1067           0 :         if (val==0x000027E9) return ON; //# Pe       MATHEMATICAL RIGHT ANGLE BRACKET
    1068           0 :         if (val==0x000027EA) return ON; //# Ps       MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
    1069           0 :         if (val==0x000027EB) return ON; //# Pe       MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
    1070           0 :         if ((val>=0x27F0) && (val<=0x27FF)) return ON;    //# Sm  [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW
    1071           0 :         if ((val>=0x2900) && (val<=0x2982)) return ON;    //# Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON
    1072           0 :         if (val==0x00002983) return ON; //# Ps       LEFT WHITE CURLY BRACKET
    1073           0 :         if (val==0x00002984) return ON; //# Pe       RIGHT WHITE CURLY BRACKET
    1074           0 :         if (val==0x00002985) return ON; //# Ps       LEFT WHITE PARENTHESIS
    1075           0 :         if (val==0x00002986) return ON; //# Pe       RIGHT WHITE PARENTHESIS
    1076           0 :         if (val==0x00002987) return ON; //# Ps       Z NOTATION LEFT IMAGE BRACKET
    1077           0 :         if (val==0x00002988) return ON; //# Pe       Z NOTATION RIGHT IMAGE BRACKET
    1078           0 :         if (val==0x00002989) return ON; //# Ps       Z NOTATION LEFT BINDING BRACKET
    1079           0 :         if (val==0x0000298A) return ON; //# Pe       Z NOTATION RIGHT BINDING BRACKET
    1080           0 :         if (val==0x0000298B) return ON; //# Ps       LEFT SQUARE BRACKET WITH UNDERBAR
    1081           0 :         if (val==0x0000298C) return ON; //# Pe       RIGHT SQUARE BRACKET WITH UNDERBAR
    1082           0 :         if (val==0x0000298D) return ON; //# Ps       LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
    1083           0 :         if (val==0x0000298E) return ON; //# Pe       RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
    1084           0 :         if (val==0x0000298F) return ON; //# Ps       LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
    1085           0 :         if (val==0x00002990) return ON; //# Pe       RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
    1086           0 :         if (val==0x00002991) return ON; //# Ps       LEFT ANGLE BRACKET WITH DOT
    1087           0 :         if (val==0x00002992) return ON; //# Pe       RIGHT ANGLE BRACKET WITH DOT
    1088           0 :         if (val==0x00002993) return ON; //# Ps       LEFT ARC LESS-THAN BRACKET
    1089           0 :         if (val==0x00002994) return ON; //# Pe       RIGHT ARC GREATER-THAN BRACKET
    1090           0 :         if (val==0x00002995) return ON; //# Ps       DOUBLE LEFT ARC GREATER-THAN BRACKET
    1091           0 :         if (val==0x00002996) return ON; //# Pe       DOUBLE RIGHT ARC LESS-THAN BRACKET
    1092           0 :         if (val==0x00002997) return ON; //# Ps       LEFT BLACK TORTOISE SHELL BRACKET
    1093           0 :         if (val==0x00002998) return ON; //# Pe       RIGHT BLACK TORTOISE SHELL BRACKET
    1094           0 :         if ((val>=0x2999) && (val<=0x29D7)) return ON;    //# Sm  [63] DOTTED FENCE..BLACK HOURGLASS
    1095           0 :         if (val==0x000029D8) return ON; //# Ps       LEFT WIGGLY FENCE
    1096           0 :         if (val==0x000029D9) return ON; //# Pe       RIGHT WIGGLY FENCE
    1097           0 :         if (val==0x000029DA) return ON; //# Ps       LEFT DOUBLE WIGGLY FENCE
    1098           0 :         if (val==0x000029DB) return ON; //# Pe       RIGHT DOUBLE WIGGLY FENCE
    1099           0 :         if ((val>=0x29DC) && (val<=0x29FB)) return ON;    //# Sm  [32] INCOMPLETE INFINITY..TRIPLE PLUS
    1100           0 :         if (val==0x000029FC) return ON; //# Ps       LEFT-POINTING CURVED ANGLE BRACKET
    1101           0 :         if (val==0x000029FD) return ON; //# Pe       RIGHT-POINTING CURVED ANGLE BRACKET
    1102           0 :         if ((val>=0x29FE) && (val<=0x2AFF)) return ON;    //# Sm [258] TINY..N-ARY WHITE VERTICAL BAR
    1103           0 :         if ((val>=0x2B00) && (val<=0x2B1A)) return ON;    //# So  [27] NORTH EAST WHITE ARROW..DOTTED SQUARE
    1104           0 :         if ((val>=0x2B20) && (val<=0x2B23)) return ON;    //# So   [4] WHITE PENTAGON..HORIZONTAL BLACK HEXAGON
    1105           0 :         if ((val>=0x2CE5) && (val<=0x2CEA)) return ON;    //# So   [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA
    1106           0 :         if ((val>=0x2CF9) && (val<=0x2CFC)) return ON;    //# Po   [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER
    1107           0 :         if (val==0x00002CFD) return ON; //# No       COPTIC FRACTION ONE HALF
    1108           0 :         if ((val>=0x2CFE) && (val<=0x2CFF)) return ON;    //# Po   [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER
    1109           0 :         if ((val>=0x2E00) && (val<=0x2E01)) return ON;    //# Po   [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
    1110           0 :         if (val==0x00002E02) return ON; //# Pi       LEFT SUBSTITUTION BRACKET
    1111           0 :         if (val==0x00002E03) return ON; //# Pf       RIGHT SUBSTITUTION BRACKET
    1112           0 :         if (val==0x00002E04) return ON; //# Pi       LEFT DOTTED SUBSTITUTION BRACKET
    1113           0 :         if (val==0x00002E05) return ON; //# Pf       RIGHT DOTTED SUBSTITUTION BRACKET
    1114           0 :         if ((val>=0x2E06) && (val<=0x2E08)) return ON;    //# Po   [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER
    1115           0 :         if (val==0x00002E09) return ON; //# Pi       LEFT TRANSPOSITION BRACKET
    1116           0 :         if (val==0x00002E0A) return ON; //# Pf       RIGHT TRANSPOSITION BRACKET
    1117           0 :         if (val==0x00002E0B) return ON; //# Po       RAISED SQUARE
    1118           0 :         if (val==0x00002E0C) return ON; //# Pi       LEFT RAISED OMISSION BRACKET
    1119           0 :         if (val==0x00002E0D) return ON; //# Pf       RIGHT RAISED OMISSION BRACKET
    1120           0 :         if ((val>=0x2E0E) && (val<=0x2E16)) return ON;    //# Po   [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE
    1121           0 :         if (val==0x00002E17) return ON; //# Pd       DOUBLE OBLIQUE HYPHEN
    1122           0 :         if (val==0x00002E1C) return ON; //# Pi       LEFT LOW PARAPHRASE BRACKET
    1123           0 :         if (val==0x00002E1D) return ON; //# Pf       RIGHT LOW PARAPHRASE BRACKET
    1124           0 :         if ((val>=0x2E80) && (val<=0x2E99)) return ON;    //# So  [26] CJK RADICAL REPEAT..CJK RADICAL RAP
    1125           0 :         if ((val>=0x2E9B) && (val<=0x2EF3)) return ON;    //# So  [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
    1126           0 :         if ((val>=0x2F00) && (val<=0x2FD5)) return ON;    //# So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
    1127           0 :         if ((val>=0x2FF0) && (val<=0x2FFB)) return ON;    //# So  [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
    1128           0 :         if ((val>=0x3001) && (val<=0x3003)) return ON;    //# Po   [3] IDEOGRAPHIC COMMA..DITTO MARK
    1129           0 :         if (val==0x00003004) return ON; //# So       JAPANESE INDUSTRIAL STANDARD SYMBOL
    1130           0 :         if (val==0x00003008) return ON; //# Ps       LEFT ANGLE BRACKET
    1131           0 :         if (val==0x00003009) return ON; //# Pe       RIGHT ANGLE BRACKET
    1132           0 :         if (val==0x0000300A) return ON; //# Ps       LEFT DOUBLE ANGLE BRACKET
    1133           0 :         if (val==0x0000300B) return ON; //# Pe       RIGHT DOUBLE ANGLE BRACKET
    1134           0 :         if (val==0x0000300C) return ON; //# Ps       LEFT CORNER BRACKET
    1135           0 :         if (val==0x0000300D) return ON; //# Pe       RIGHT CORNER BRACKET
    1136           0 :         if (val==0x0000300E) return ON; //# Ps       LEFT WHITE CORNER BRACKET
    1137           0 :         if (val==0x0000300F) return ON; //# Pe       RIGHT WHITE CORNER BRACKET
    1138           0 :         if (val==0x00003010) return ON; //# Ps       LEFT BLACK LENTICULAR BRACKET
    1139           0 :         if (val==0x00003011) return ON; //# Pe       RIGHT BLACK LENTICULAR BRACKET
    1140           0 :         if ((val>=0x3012) && (val<=0x3013)) return ON;    //# So   [2] POSTAL MARK..GETA MARK
    1141           0 :         if (val==0x00003014) return ON; //# Ps       LEFT TORTOISE SHELL BRACKET
    1142           0 :         if (val==0x00003015) return ON; //# Pe       RIGHT TORTOISE SHELL BRACKET
    1143           0 :         if (val==0x00003016) return ON; //# Ps       LEFT WHITE LENTICULAR BRACKET
    1144           0 :         if (val==0x00003017) return ON; //# Pe       RIGHT WHITE LENTICULAR BRACKET
    1145           0 :         if (val==0x00003018) return ON; //# Ps       LEFT WHITE TORTOISE SHELL BRACKET
    1146           0 :         if (val==0x00003019) return ON; //# Pe       RIGHT WHITE TORTOISE SHELL BRACKET
    1147           0 :         if (val==0x0000301A) return ON; //# Ps       LEFT WHITE SQUARE BRACKET
    1148           0 :         if (val==0x0000301B) return ON; //# Pe       RIGHT WHITE SQUARE BRACKET
    1149           0 :         if (val==0x0000301C) return ON; //# Pd       WAVE DASH
    1150           0 :         if (val==0x0000301D) return ON; //# Ps       REVERSED DOUBLE PRIME QUOTATION MARK
    1151           0 :         if ((val>=0x301E) && (val<=0x301F)) return ON;    //# Pe   [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
    1152           0 :         if (val==0x00003020) return ON; //# So       POSTAL MARK FACE
    1153           0 :         if (val==0x00003030) return ON; //# Pd       WAVY DASH
    1154           0 :         if ((val>=0x3036) && (val<=0x3037)) return ON;    //# So   [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
    1155           0 :         if (val==0x0000303D) return ON; //# Po       PART ALTERNATION MARK
    1156           0 :         if ((val>=0x303E) && (val<=0x303F)) return ON;    //# So   [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE
    1157           0 :         if ((val>=0x309B) && (val<=0x309C)) return ON;    //# Sk   [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
    1158           0 :         if (val==0x000030A0) return ON; //# Pd       KATAKANA-HIRAGANA DOUBLE HYPHEN
    1159           0 :         if (val==0x000030FB) return ON; //# Po       KATAKANA MIDDLE DOT
    1160           0 :         if ((val>=0x31C0) && (val<=0x31CF)) return ON;    //# So  [16] CJK STROKE T..CJK STROKE N
    1161           0 :         if ((val>=0x321D) && (val<=0x321E)) return ON;    //# So   [2] PARENTHESIZED KOREAN CHARACTER OJEON..PARENTHESIZED KOREAN CHARACTER O HU
    1162           0 :         if (val==0x00003250) return ON; //# So       PARTNERSHIP SIGN
    1163           0 :         if ((val>=0x3251) && (val<=0x325F)) return ON;    //# No  [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE
    1164           0 :         if ((val>=0x327C) && (val<=0x327E)) return ON;    //# So   [3] CIRCLED KOREAN CHARACTER CHAMKO..CIRCLED HANGUL IEUNG U
    1165           0 :         if ((val>=0x32B1) && (val<=0x32BF)) return ON;    //# No  [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY
    1166           0 :         if ((val>=0x32CC) && (val<=0x32CF)) return ON;    //# So   [4] SQUARE HG..LIMITED LIABILITY SIGN
    1167           0 :         if ((val>=0x3377) && (val<=0x337A)) return ON;    //# So   [4] SQUARE DM..SQUARE IU
    1168           0 :         if ((val>=0x33DE) && (val<=0x33DF)) return ON;    //# So   [2] SQUARE V OVER M..SQUARE A OVER M
    1169           0 :         if (val==0x000033FF) return ON; //# So       SQUARE GAL
    1170           0 :         if ((val>=0x4DC0) && (val<=0x4DFF)) return ON;    //# So  [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION
    1171           0 :         if ((val>=0xA490) && (val<=0xA4C6)) return ON;    //# So  [55] YI RADICAL QOT..YI RADICAL KE
    1172           0 :         if ((val>=0xA700) && (val<=0xA716)) return ON;    //# Sk  [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
    1173           0 :         if ((val>=0xA717) && (val<=0xA71A)) return ON;    //# Lm   [4] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOWER RIGHT CORNER ANGLE
    1174           0 :         if ((val>=0xA720) && (val<=0xA721)) return ON;    //# Sk   [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE
    1175           0 :         if ((val>=0xA828) && (val<=0xA82B)) return ON;    //# So   [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4
    1176           0 :         if ((val>=0xA874) && (val<=0xA877)) return ON;    //# Po   [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD
    1177           0 :         if (val==0x0000FD3E) return ON; //# Ps       ORNATE LEFT PARENTHESIS
    1178           0 :         if (val==0x0000FD3F) return ON; //# Pe       ORNATE RIGHT PARENTHESIS
    1179           0 :         if (val==0x0000FDFD) return ON; //# So       ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
    1180           0 :         if ((val>=0xFE10) && (val<=0xFE16)) return ON;    //# Po   [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK
    1181           0 :         if (val==0x0000FE17) return ON; //# Ps       PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
    1182           0 :         if (val==0x0000FE18) return ON; //# Pe       PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
    1183           0 :         if (val==0x0000FE19) return ON; //# Po       PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
    1184           0 :         if (val==0x0000FE30) return ON; //# Po       PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
    1185           0 :         if ((val>=0xFE31) && (val<=0xFE32)) return ON;    //# Pd   [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
    1186           0 :         if ((val>=0xFE33) && (val<=0xFE34)) return ON;    //# Pc   [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
    1187           0 :         if (val==0x0000FE35) return ON; //# Ps       PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
    1188           0 :         if (val==0x0000FE36) return ON; //# Pe       PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
    1189           0 :         if (val==0x0000FE37) return ON; //# Ps       PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
    1190           0 :         if (val==0x0000FE38) return ON; //# Pe       PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
    1191           0 :         if (val==0x0000FE39) return ON; //# Ps       PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
    1192           0 :         if (val==0x0000FE3A) return ON; //# Pe       PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
    1193           0 :         if (val==0x0000FE3B) return ON; //# Ps       PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
    1194           0 :         if (val==0x0000FE3C) return ON; //# Pe       PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
    1195           0 :         if (val==0x0000FE3D) return ON; //# Ps       PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
    1196           0 :         if (val==0x0000FE3E) return ON; //# Pe       PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
    1197           0 :         if (val==0x0000FE3F) return ON; //# Ps       PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
    1198           0 :         if (val==0x0000FE40) return ON; //# Pe       PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
    1199           0 :         if (val==0x0000FE41) return ON; //# Ps       PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
    1200           0 :         if (val==0x0000FE42) return ON; //# Pe       PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
    1201           0 :         if (val==0x0000FE43) return ON; //# Ps       PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
    1202           0 :         if (val==0x0000FE44) return ON; //# Pe       PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
    1203           0 :         if ((val>=0xFE45) && (val<=0xFE46)) return ON;    //# Po   [2] SESAME DOT..WHITE SESAME DOT
    1204           0 :         if (val==0x0000FE47) return ON; //# Ps       PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
    1205           0 :         if (val==0x0000FE48) return ON; //# Pe       PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
    1206           0 :         if ((val>=0xFE49) && (val<=0xFE4C)) return ON;    //# Po   [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE
    1207           0 :         if ((val>=0xFE4D) && (val<=0xFE4F)) return ON;    //# Pc   [3] DASHED LOW LINE..WAVY LOW LINE
    1208           0 :         if (val==0x0000FE51) return ON; //# Po       SMALL IDEOGRAPHIC COMMA
    1209           0 :         if (val==0x0000FE54) return ON; //# Po       SMALL SEMICOLON
    1210           0 :         if ((val>=0xFE56) && (val<=0xFE57)) return ON;    //# Po   [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK
    1211           0 :         if (val==0x0000FE58) return ON; //# Pd       SMALL EM DASH
    1212           0 :         if (val==0x0000FE59) return ON; //# Ps       SMALL LEFT PARENTHESIS
    1213           0 :         if (val==0x0000FE5A) return ON; //# Pe       SMALL RIGHT PARENTHESIS
    1214           0 :         if (val==0x0000FE5B) return ON; //# Ps       SMALL LEFT CURLY BRACKET
    1215           0 :         if (val==0x0000FE5C) return ON; //# Pe       SMALL RIGHT CURLY BRACKET
    1216           0 :         if (val==0x0000FE5D) return ON; //# Ps       SMALL LEFT TORTOISE SHELL BRACKET
    1217           0 :         if (val==0x0000FE5E) return ON; //# Pe       SMALL RIGHT TORTOISE SHELL BRACKET
    1218           0 :         if ((val>=0xFE60) && (val<=0xFE61)) return ON;    //# Po   [2] SMALL AMPERSAND..SMALL ASTERISK
    1219           0 :         if ((val>=0xFE64) && (val<=0xFE66)) return ON;    //# Sm   [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN
    1220           0 :         if (val==0x0000FE68) return ON; //# Po       SMALL REVERSE SOLIDUS
    1221           0 :         if (val==0x0000FE6B) return ON; //# Po       SMALL COMMERCIAL AT
    1222           0 :         if ((val>=0xFF01) && (val<=0xFF02)) return ON;    //# Po   [2] FULLWIDTH EXCLAMATION MARK..FULLWIDTH QUOTATION MARK
    1223           0 :         if ((val>=0xFF06) && (val<=0xFF07)) return ON;    //# Po   [2] FULLWIDTH AMPERSAND..FULLWIDTH APOSTROPHE
    1224           0 :         if (val==0x0000FF08) return ON; //# Ps       FULLWIDTH LEFT PARENTHESIS
    1225           0 :         if (val==0x0000FF09) return ON; //# Pe       FULLWIDTH RIGHT PARENTHESIS
    1226           0 :         if (val==0x0000FF0A) return ON; //# Po       FULLWIDTH ASTERISK
    1227           0 :         if (val==0x0000FF1B) return ON; //# Po       FULLWIDTH SEMICOLON
    1228           0 :         if ((val>=0xFF1C) && (val<=0xFF1E)) return ON;    //# Sm   [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN
    1229           0 :         if ((val>=0xFF1F) && (val<=0xFF20)) return ON;    //# Po   [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT
    1230           0 :         if (val==0x0000FF3B) return ON; //# Ps       FULLWIDTH LEFT SQUARE BRACKET
    1231           0 :         if (val==0x0000FF3C) return ON; //# Po       FULLWIDTH REVERSE SOLIDUS
    1232           0 :         if (val==0x0000FF3D) return ON; //# Pe       FULLWIDTH RIGHT SQUARE BRACKET
    1233           0 :         if (val==0x0000FF3E) return ON; //# Sk       FULLWIDTH CIRCUMFLEX ACCENT
    1234           0 :         if (val==0x0000FF3F) return ON; //# Pc       FULLWIDTH LOW LINE
    1235           0 :         if (val==0x0000FF40) return ON; //# Sk       FULLWIDTH GRAVE ACCENT
    1236           0 :         if (val==0x0000FF5B) return ON; //# Ps       FULLWIDTH LEFT CURLY BRACKET
    1237           0 :         if (val==0x0000FF5C) return ON; //# Sm       FULLWIDTH VERTICAL LINE
    1238           0 :         if (val==0x0000FF5D) return ON; //# Pe       FULLWIDTH RIGHT CURLY BRACKET
    1239           0 :         if (val==0x0000FF5E) return ON; //# Sm       FULLWIDTH TILDE
    1240           0 :         if (val==0x0000FF5F) return ON; //# Ps       FULLWIDTH LEFT WHITE PARENTHESIS
    1241           0 :         if (val==0x0000FF60) return ON; //# Pe       FULLWIDTH RIGHT WHITE PARENTHESIS
    1242           0 :         if (val==0x0000FF61) return ON; //# Po       HALFWIDTH IDEOGRAPHIC FULL STOP
    1243           0 :         if (val==0x0000FF62) return ON; //# Ps       HALFWIDTH LEFT CORNER BRACKET
    1244           0 :         if (val==0x0000FF63) return ON; //# Pe       HALFWIDTH RIGHT CORNER BRACKET
    1245           0 :         if ((val>=0xFF64) && (val<=0xFF65)) return ON;    //# Po   [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT
    1246           0 :         if (val==0x0000FFE2) return ON; //# Sm       FULLWIDTH NOT SIGN
    1247           0 :         if (val==0x0000FFE3) return ON; //# Sk       FULLWIDTH MACRON
    1248           0 :         if (val==0x0000FFE4) return ON; //# So       FULLWIDTH BROKEN BAR
    1249           0 :         if (val==0x0000FFE8) return ON; //# So       HALFWIDTH FORMS LIGHT VERTICAL
    1250           0 :         if ((val>=0xFFE9) && (val<=0xFFEC)) return ON;    //# Sm   [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW
    1251           0 :         if ((val>=0xFFED) && (val<=0xFFEE)) return ON;    //# So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
    1252           0 :         if ((val>=0xFFF9) && (val<=0xFFFB)) return ON;    //# Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
    1253           0 :         if ((val>=0xFFFC) && (val<=0xFFFD)) return ON;    //# So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
    1254           0 :         if (val==0x00010101) return ON; //# Po       AEGEAN WORD SEPARATOR DOT
    1255           0 :         if ((val>=0x10140) && (val<=0x10174)) return ON;  //# Nl  [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS
    1256           0 :         if ((val>=0x10175) && (val<=0x10178)) return ON;  //# No   [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN
    1257           0 :         if ((val>=0x10179) && (val<=0x10189)) return ON;  //# So  [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN
    1258           0 :         if (val==0x0001018A) return ON; //# No       GREEK ZERO SIGN
    1259           0 :         if (val==0x0001091F) return ON; //# Po       PHOENICIAN WORD SEPARATOR
    1260           0 :         if ((val>=0x1D200) && (val<=0x1D241)) return ON;  //# So  [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
    1261           0 :         if (val==0x0001D245) return ON; //# So       GREEK MUSICAL LEIMMA
    1262           0 :         if ((val>=0x1D300) && (val<=0x1D356)) return ON;  //# So  [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
    1263           0 :         if (/*(val>=0x0000) && */(val<=0x0008)) return BN;        //# Cc   [9] <control-0000>..<control-0008>
    1264           0 :         if ((val>=0x000E) && (val<=0x001B)) return BN;    //# Cc  [14] <control-000E>..<control-001B>
    1265           0 :         if ((val>=0x007F) && (val<=0x0084)) return BN;    //# Cc   [6] <control-007F>..<control-0084>
    1266           0 :         if ((val>=0x0086) && (val<=0x009F)) return BN;    //# Cc  [26] <control-0086>..<control-009F>
    1267           0 :         if (val==0x000000AD) return BN; //# Cf       SOFT HYPHEN
    1268           0 :         if (val==0x0000070F) return BN; //# Cf       SYRIAC ABBREVIATION MARK
    1269           0 :         if ((val>=0x200B) && (val<=0x200D)) return BN;    //# Cf   [3] ZERO WIDTH SPACE..ZERO WIDTH JOINER
    1270           0 :         if ((val>=0x2060) && (val<=0x2063)) return BN;    //# Cf   [4] WORD JOINER..INVISIBLE SEPARATOR
    1271           0 :         if ((val>=0x2064) && (val<=0x2069)) return BN;    //# Cn   [6] <reserved-2064>..<reserved-2069>
    1272           0 :         if ((val>=0x206A) && (val<=0x206F)) return BN;    //# Cf   [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
    1273           0 :         if ((val>=0xFDD0) && (val<=0xFDEF)) return BN;    //# Cn  [32] <noncharacter-FDD0>..<noncharacter-FDEF>
    1274           0 :         if (val==0x0000FEFF) return BN; //# Cf       ZERO WIDTH NO-BREAK SPACE
    1275           0 :         if ((val>=0xFFF0) && (val<=0xFFF8)) return BN;    //# Cn   [9] <reserved-FFF0>..<reserved-FFF8>
    1276           0 :         if ((val>=0xFFFE) && (val<=0xFFFF)) return BN;    //# Cn   [2] <noncharacter-FFFE>..<noncharacter-FFFF>
    1277           0 :         if ((val>=0x1D173) && (val<=0x1D17A)) return BN;  //# Cf   [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
    1278           0 :         if ((val>=0x1FFFE) && (val<=0x1FFFF)) return BN;  //# Cn   [2] <noncharacter-1FFFE>..<noncharacter-1FFFF>
    1279           0 :         if ((val>=0x2FFFE) && (val<=0x2FFFF)) return BN;  //# Cn   [2] <noncharacter-2FFFE>..<noncharacter-2FFFF>
    1280           0 :         if ((val>=0x3FFFE) && (val<=0x3FFFF)) return BN;  //# Cn   [2] <noncharacter-3FFFE>..<noncharacter-3FFFF>
    1281           0 :         if ((val>=0x4FFFE) && (val<=0x4FFFF)) return BN;  //# Cn   [2] <noncharacter-4FFFE>..<noncharacter-4FFFF>
    1282           0 :         if ((val>=0x5FFFE) && (val<=0x5FFFF)) return BN;  //# Cn   [2] <noncharacter-5FFFE>..<noncharacter-5FFFF>
    1283           0 :         if ((val>=0x6FFFE) && (val<=0x6FFFF)) return BN;  //# Cn   [2] <noncharacter-6FFFE>..<noncharacter-6FFFF>
    1284           0 :         if ((val>=0x7FFFE) && (val<=0x7FFFF)) return BN;  //# Cn   [2] <noncharacter-7FFFE>..<noncharacter-7FFFF>
    1285           0 :         if ((val>=0x8FFFE) && (val<=0x8FFFF)) return BN;  //# Cn   [2] <noncharacter-8FFFE>..<noncharacter-8FFFF>
    1286           0 :         if ((val>=0x9FFFE) && (val<=0x9FFFF)) return BN;  //# Cn   [2] <noncharacter-9FFFE>..<noncharacter-9FFFF>
    1287           0 :         if ((val>=0xAFFFE) && (val<=0xAFFFF)) return BN;  //# Cn   [2] <noncharacter-AFFFE>..<noncharacter-AFFFF>
    1288           0 :         if ((val>=0xBFFFE) && (val<=0xBFFFF)) return BN;  //# Cn   [2] <noncharacter-BFFFE>..<noncharacter-BFFFF>
    1289           0 :         if ((val>=0xCFFFE) && (val<=0xCFFFF)) return BN;  //# Cn   [2] <noncharacter-CFFFE>..<noncharacter-CFFFF>
    1290           0 :         if ((val>=0xDFFFE) && (val<=0xE0000)) return BN;  //# Cn   [3] <noncharacter-DFFFE>..<reserved-E0000>
    1291           0 :         if (val==0x000E0001) return BN; //# Cf       LANGUAGE TAG
    1292           0 :         if ((val>=0xE0002) && (val<=0xE001F)) return BN;  //# Cn  [30] <reserved-E0002>..<reserved-E001F>
    1293           0 :         if ((val>=0xE0020) && (val<=0xE007F)) return BN;  //# Cf  [96] TAG SPACE..CANCEL TAG
    1294           0 :         if ((val>=0xE0080) && (val<=0xE00FF)) return BN;  //# Cn [128] <reserved-E0080>..<reserved-E00FF>
    1295           0 :         if ((val>=0xE01F0) && (val<=0xE0FFF)) return BN;  //# Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
    1296           0 :         if ((val>=0xEFFFE) && (val<=0xEFFFF)) return BN;  //# Cn   [2] <noncharacter-EFFFE>..<noncharacter-EFFFF>
    1297           0 :         if ((val>=0xFFFFE) && (val<=0xFFFFF)) return BN;  //# Cn   [2] <noncharacter-FFFFE>..<noncharacter-FFFFF>
    1298           0 :         if ((val>=0x10FFFE) && (val<=0x10FFFF)) return BN;        //# Cn   [2] <noncharacter-10FFFE>..<noncharacter-10FFFF>
    1299           0 :         if ((val>=0x0300) && (val<=0x036F)) return NSM;   //# Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
    1300           0 :         if ((val>=0x0483) && (val<=0x0486)) return NSM;   //# Mn   [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA
    1301           0 :         if ((val>=0x0488) && (val<=0x0489)) return NSM;   //# Me   [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
    1302           0 :         if ((val>=0x0591) && (val<=0x05BD)) return NSM;   //# Mn  [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
    1303           0 :         if (val==0x000005BF) return NSM;        //# Mn       HEBREW POINT RAFE
    1304           0 :         if ((val>=0x05C1) && (val<=0x05C2)) return NSM;   //# Mn   [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
    1305           0 :         if ((val>=0x05C4) && (val<=0x05C5)) return NSM;   //# Mn   [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
    1306           0 :         if (val==0x000005C7) return NSM;        //# Mn       HEBREW POINT QAMATS QATAN
    1307           0 :         if ((val>=0x0610) && (val<=0x0615)) return NSM;   //# Mn   [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH
    1308           0 :         if ((val>=0x064B) && (val<=0x065E)) return NSM;   //# Mn  [20] ARABIC FATHATAN..ARABIC FATHA WITH TWO DOTS
    1309           0 :         if (val==0x00000670) return NSM;        //# Mn       ARABIC LETTER SUPERSCRIPT ALEF
    1310           0 :         if ((val>=0x06D6) && (val<=0x06DC)) return NSM;   //# Mn   [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
    1311           0 :         if (val==0x000006DE) return NSM;        //# Me       ARABIC START OF RUB EL HIZB
    1312           0 :         if ((val>=0x06DF) && (val<=0x06E4)) return NSM;   //# Mn   [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
    1313           0 :         if ((val>=0x06E7) && (val<=0x06E8)) return NSM;   //# Mn   [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
    1314           0 :         if ((val>=0x06EA) && (val<=0x06ED)) return NSM;   //# Mn   [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
    1315           0 :         if (val==0x00000711) return NSM;        //# Mn       SYRIAC LETTER SUPERSCRIPT ALAPH
    1316           0 :         if ((val>=0x0730) && (val<=0x074A)) return NSM;   //# Mn  [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
    1317           0 :         if ((val>=0x07A6) && (val<=0x07B0)) return NSM;   //# Mn  [11] THAANA ABAFILI..THAANA SUKUN
    1318           0 :         if ((val>=0x07EB) && (val<=0x07F3)) return NSM;   //# Mn   [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
    1319           0 :         if ((val>=0x0901) && (val<=0x0902)) return NSM;   //# Mn   [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA
    1320           0 :         if (val==0x0000093C) return NSM;        //# Mn       DEVANAGARI SIGN NUKTA
    1321           0 :         if ((val>=0x0941) && (val<=0x0948)) return NSM;   //# Mn   [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
    1322           0 :         if (val==0x0000094D) return NSM;        //# Mn       DEVANAGARI SIGN VIRAMA
    1323           0 :         if ((val>=0x0951) && (val<=0x0954)) return NSM;   //# Mn   [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT
    1324           0 :         if ((val>=0x0962) && (val<=0x0963)) return NSM;   //# Mn   [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
    1325           0 :         if (val==0x00000981) return NSM;        //# Mn       BENGALI SIGN CANDRABINDU
    1326           0 :         if (val==0x000009BC) return NSM;        //# Mn       BENGALI SIGN NUKTA
    1327           0 :         if ((val>=0x09C1) && (val<=0x09C4)) return NSM;   //# Mn   [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
    1328           0 :         if (val==0x000009CD) return NSM;        //# Mn       BENGALI SIGN VIRAMA
    1329           0 :         if ((val>=0x09E2) && (val<=0x09E3)) return NSM;   //# Mn   [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
    1330           0 :         if ((val>=0x0A01) && (val<=0x0A02)) return NSM;   //# Mn   [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
    1331           0 :         if (val==0x00000A3C) return NSM;        //# Mn       GURMUKHI SIGN NUKTA
    1332           0 :         if ((val>=0x0A41) && (val<=0x0A42)) return NSM;   //# Mn   [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
    1333           0 :         if ((val>=0x0A47) && (val<=0x0A48)) return NSM;   //# Mn   [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
    1334           0 :         if ((val>=0x0A4B) && (val<=0x0A4D)) return NSM;   //# Mn   [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
    1335           0 :         if ((val>=0x0A70) && (val<=0x0A71)) return NSM;   //# Mn   [2] GURMUKHI TIPPI..GURMUKHI ADDAK
    1336           0 :         if ((val>=0x0A81) && (val<=0x0A82)) return NSM;   //# Mn   [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
    1337           0 :         if (val==0x00000ABC) return NSM;        //# Mn       GUJARATI SIGN NUKTA
    1338           0 :         if ((val>=0x0AC1) && (val<=0x0AC5)) return NSM;   //# Mn   [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
    1339           0 :         if ((val>=0x0AC7) && (val<=0x0AC8)) return NSM;   //# Mn   [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
    1340           0 :         if (val==0x00000ACD) return NSM;        //# Mn       GUJARATI SIGN VIRAMA
    1341           0 :         if ((val>=0x0AE2) && (val<=0x0AE3)) return NSM;   //# Mn   [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
    1342           0 :         if (val==0x00000B01) return NSM;        //# Mn       ORIYA SIGN CANDRABINDU
    1343           0 :         if (val==0x00000B3C) return NSM;        //# Mn       ORIYA SIGN NUKTA
    1344           0 :         if (val==0x00000B3F) return NSM;        //# Mn       ORIYA VOWEL SIGN I
    1345           0 :         if ((val>=0x0B41) && (val<=0x0B43)) return NSM;   //# Mn   [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R
    1346           0 :         if (val==0x00000B4D) return NSM;        //# Mn       ORIYA SIGN VIRAMA
    1347           0 :         if (val==0x00000B56) return NSM;        //# Mn       ORIYA AI LENGTH MARK
    1348           0 :         if (val==0x00000B82) return NSM;        //# Mn       TAMIL SIGN ANUSVARA
    1349           0 :         if (val==0x00000BC0) return NSM;        //# Mn       TAMIL VOWEL SIGN II
    1350           0 :         if (val==0x00000BCD) return NSM;        //# Mn       TAMIL SIGN VIRAMA
    1351           0 :         if ((val>=0x0C3E) && (val<=0x0C40)) return NSM;   //# Mn   [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
    1352           0 :         if ((val>=0x0C46) && (val<=0x0C48)) return NSM;   //# Mn   [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
    1353           0 :         if ((val>=0x0C4A) && (val<=0x0C4D)) return NSM;   //# Mn   [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
    1354           0 :         if ((val>=0x0C55) && (val<=0x0C56)) return NSM;   //# Mn   [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
    1355           0 :         if (val==0x00000CBC) return NSM;        //# Mn       KANNADA SIGN NUKTA
    1356           0 :         if ((val>=0x0CCC) && (val<=0x0CCD)) return NSM;   //# Mn   [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
    1357           0 :         if ((val>=0x0CE2) && (val<=0x0CE3)) return NSM;   //# Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
    1358           0 :         if ((val>=0x0D41) && (val<=0x0D43)) return NSM;   //# Mn   [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R
    1359           0 :         if (val==0x00000D4D) return NSM;        //# Mn       MALAYALAM SIGN VIRAMA
    1360           0 :         if (val==0x00000DCA) return NSM;        //# Mn       SINHALA SIGN AL-LAKUNA
    1361           0 :         if ((val>=0x0DD2) && (val<=0x0DD4)) return NSM;   //# Mn   [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
    1362           0 :         if (val==0x00000DD6) return NSM;        //# Mn       SINHALA VOWEL SIGN DIGA PAA-PILLA
    1363           0 :         if (val==0x00000E31) return NSM;        //# Mn       THAI CHARACTER MAI HAN-AKAT
    1364           0 :         if ((val>=0x0E34) && (val<=0x0E3A)) return NSM;   //# Mn   [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
    1365           0 :         if ((val>=0x0E47) && (val<=0x0E4E)) return NSM;   //# Mn   [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
    1366           0 :         if (val==0x00000EB1) return NSM;        //# Mn       LAO VOWEL SIGN MAI KAN
    1367           0 :         if ((val>=0x0EB4) && (val<=0x0EB9)) return NSM;   //# Mn   [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
    1368           0 :         if ((val>=0x0EBB) && (val<=0x0EBC)) return NSM;   //# Mn   [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
    1369           0 :         if ((val>=0x0EC8) && (val<=0x0ECD)) return NSM;   //# Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
    1370           0 :         if ((val>=0x0F18) && (val<=0x0F19)) return NSM;   //# Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
    1371           0 :         if (val==0x00000F35) return NSM;        //# Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
    1372           0 :         if (val==0x00000F37) return NSM;        //# Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
    1373           0 :         if (val==0x00000F39) return NSM;        //# Mn       TIBETAN MARK TSA -PHRU
    1374           0 :         if ((val>=0x0F71) && (val<=0x0F7E)) return NSM;   //# Mn  [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
    1375           0 :         if ((val>=0x0F80) && (val<=0x0F84)) return NSM;   //# Mn   [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
    1376           0 :         if ((val>=0x0F86) && (val<=0x0F87)) return NSM;   //# Mn   [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
    1377           0 :         if ((val>=0x0F90) && (val<=0x0F97)) return NSM;   //# Mn   [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
    1378           0 :         if ((val>=0x0F99) && (val<=0x0FBC)) return NSM;   //# Mn  [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
    1379           0 :         if (val==0x00000FC6) return NSM;        //# Mn       TIBETAN SYMBOL PADMA GDAN
    1380           0 :         if ((val>=0x102D) && (val<=0x1030)) return NSM;   //# Mn   [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
    1381           0 :         if (val==0x00001032) return NSM;        //# Mn       MYANMAR VOWEL SIGN AI
    1382           0 :         if ((val>=0x1036) && (val<=0x1037)) return NSM;   //# Mn   [2] MYANMAR SIGN ANUSVARA..MYANMAR SIGN DOT BELOW
    1383           0 :         if (val==0x00001039) return NSM;        //# Mn       MYANMAR SIGN VIRAMA
    1384           0 :         if ((val>=0x1058) && (val<=0x1059)) return NSM;   //# Mn   [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
    1385           0 :         if (val==0x0000135F) return NSM;        //# Mn       ETHIOPIC COMBINING GEMINATION MARK
    1386           0 :         if ((val>=0x1712) && (val<=0x1714)) return NSM;   //# Mn   [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
    1387           0 :         if ((val>=0x1732) && (val<=0x1734)) return NSM;   //# Mn   [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
    1388           0 :         if ((val>=0x1752) && (val<=0x1753)) return NSM;   //# Mn   [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
    1389           0 :         if ((val>=0x1772) && (val<=0x1773)) return NSM;   //# Mn   [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
    1390           0 :         if ((val>=0x17B7) && (val<=0x17BD)) return NSM;   //# Mn   [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
    1391           0 :         if (val==0x000017C6) return NSM;        //# Mn       KHMER SIGN NIKAHIT
    1392           0 :         if ((val>=0x17C9) && (val<=0x17D3)) return NSM;   //# Mn  [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
    1393           0 :         if (val==0x000017DD) return NSM;        //# Mn       KHMER SIGN ATTHACAN
    1394           0 :         if ((val>=0x180B) && (val<=0x180D)) return NSM;   //# Mn   [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
    1395           0 :         if (val==0x000018A9) return NSM;        //# Mn       MONGOLIAN LETTER ALI GALI DAGALGA
    1396           0 :         if ((val>=0x1920) && (val<=0x1922)) return NSM;   //# Mn   [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
    1397           0 :         if ((val>=0x1927) && (val<=0x1928)) return NSM;   //# Mn   [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
    1398           0 :         if ((val>=0x1929) && (val<=0x192B)) return NSM;   //# Mc   [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
    1399           0 :         if (val==0x00001932) return NSM;        //# Mn       LIMBU SMALL LETTER ANUSVARA
    1400           0 :         if ((val>=0x1939) && (val<=0x193B)) return NSM;   //# Mn   [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
    1401           0 :         if ((val>=0x1A17) && (val<=0x1A18)) return NSM;   //# Mn   [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
    1402           0 :         if ((val>=0x1B00) && (val<=0x1B03)) return NSM;   //# Mn   [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
    1403           0 :         if (val==0x00001B34) return NSM;        //# Mn       BALINESE SIGN REREKAN
    1404           0 :         if ((val>=0x1B36) && (val<=0x1B3A)) return NSM;   //# Mn   [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
    1405           0 :         if (val==0x00001B3C) return NSM;        //# Mn       BALINESE VOWEL SIGN LA LENGA
    1406           0 :         if (val==0x00001B42) return NSM;        //# Mn       BALINESE VOWEL SIGN PEPET
    1407           0 :         if ((val>=0x1B6B) && (val<=0x1B73)) return NSM;   //# Mn   [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
    1408           0 :         if ((val>=0x1DC0) && (val<=0x1DCA)) return NSM;   //# Mn  [11] COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER R BELOW
    1409           0 :         if ((val>=0x1DFE) && (val<=0x1DFF)) return NSM;   //# Mn   [2] COMBINING LEFT ARROWHEAD ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
    1410           0 :         if ((val>=0x20D0) && (val<=0x20DC)) return NSM;   //# Mn  [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
    1411           0 :         if ((val>=0x20DD) && (val<=0x20E0)) return NSM;   //# Me   [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
    1412           0 :         if (val==0x000020E1) return NSM;        //# Mn       COMBINING LEFT RIGHT ARROW ABOVE
    1413           0 :         if ((val>=0x20E2) && (val<=0x20E4)) return NSM;   //# Me   [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE
    1414           0 :         if ((val>=0x20E5) && (val<=0x20EF)) return NSM;   //# Mn  [11] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING RIGHT ARROW BELOW
    1415           0 :         if ((val>=0x302A) && (val<=0x302F)) return NSM;   //# Mn   [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
    1416           0 :         if ((val>=0x3099) && (val<=0x309A)) return NSM;   //# Mn   [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
    1417           0 :         if (val==0x0000A802) return NSM;        //# Mc       SYLOTI NAGRI SIGN DVISVARA
    1418           0 :         if (val==0x0000A806) return NSM;        //# Mn       SYLOTI NAGRI SIGN HASANTA
    1419           0 :         if (val==0x0000A80B) return NSM;        //# Mn       SYLOTI NAGRI SIGN ANUSVARA
    1420           0 :         if ((val>=0xA825) && (val<=0xA826)) return NSM;   //# Mn   [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
    1421           0 :         if (val==0x0000FB1E) return NSM;        //# Mn       HEBREW POINT JUDEO-SPANISH VARIKA
    1422           0 :         if ((val>=0xFE00) && (val<=0xFE0F)) return NSM;   //# Mn  [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
    1423           0 :         if ((val>=0xFE20) && (val<=0xFE23)) return NSM;   //# Mn   [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF
    1424           0 :         if ((val>=0x10A01) && (val<=0x10A03)) return NSM; //# Mn   [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
    1425           0 :         if ((val>=0x10A05) && (val<=0x10A06)) return NSM; //# Mn   [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
    1426           0 :         if ((val>=0x10A0C) && (val<=0x10A0F)) return NSM; //# Mn   [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
    1427           0 :         if ((val>=0x10A38) && (val<=0x10A3A)) return NSM; //# Mn   [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
    1428           0 :         if (val==0x00010A3F) return NSM;        //# Mn       KHAROSHTHI VIRAMA
    1429           0 :         if ((val>=0x1D167) && (val<=0x1D169)) return NSM; //# Mn   [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
    1430           0 :         if ((val>=0x1D17B) && (val<=0x1D182)) return NSM; //# Mn   [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
    1431           0 :         if ((val>=0x1D185) && (val<=0x1D18B)) return NSM; //# Mn   [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
    1432           0 :         if ((val>=0x1D1AA) && (val<=0x1D1AD)) return NSM; //# Mn   [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
    1433           0 :         if ((val>=0x1D242) && (val<=0x1D244)) return NSM; //# Mn   [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
    1434           0 :         if ((val>=0xE0100) && (val<=0xE01EF)) return NSM; //# Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
    1435           0 :         if ((val>=0x0600) && (val<=0x0603)) return AL;    //# Cf   [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA
    1436           0 :         if ((val>=0x0604) && (val<=0x060A)) return AL;    //# Cn   [7] <reserved-0604>..<reserved-060A>
    1437           0 :         if (val==0x0000060B) return AL; //# Sc       AFGHANI SIGN
    1438           0 :         if (val==0x0000060D) return AL; //# Po       ARABIC DATE SEPARATOR
    1439           0 :         if ((val>=0x0616) && (val<=0x061A)) return AL;    //# Cn   [5] <reserved-0616>..<reserved-061A>
    1440           0 :         if (val==0x0000061B) return AL; //# Po       ARABIC SEMICOLON
    1441           0 :         if ((val>=0x061C) && (val<=0x061D)) return AL;    //# Cn   [2] <reserved-061C>..<reserved-061D>
    1442           0 :         if ((val>=0x061E) && (val<=0x061F)) return AL;    //# Po   [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK
    1443           0 :         if (val==0x00000620) return AL; //# Cn       <reserved-0620>
    1444           0 :         if ((val>=0x0621) && (val<=0x063A)) return AL;    //# Lo  [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN
    1445           0 :         if ((val>=0x063B) && (val<=0x063F)) return AL;    //# Cn   [5] <reserved-063B>..<reserved-063F>
    1446           0 :         if (val==0x00000640) return AL; //# Lm       ARABIC TATWEEL
    1447           0 :         if ((val>=0x0641) && (val<=0x064A)) return AL;    //# Lo  [10] ARABIC LETTER FEH..ARABIC LETTER YEH
    1448           0 :         if (val==0x0000065F) return AL; //# Cn       <reserved-065F>
    1449           0 :         if (val==0x0000066D) return AL; //# Po       ARABIC FIVE POINTED STAR
    1450           0 :         if ((val>=0x066E) && (val<=0x066F)) return AL;    //# Lo   [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
    1451           0 :         if ((val>=0x0671) && (val<=0x06D3)) return AL;    //# Lo  [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
    1452           0 :         if (val==0x000006D4) return AL; //# Po       ARABIC FULL STOP
    1453           0 :         if (val==0x000006D5) return AL; //# Lo       ARABIC LETTER AE
    1454           0 :         if (val==0x000006DD) return AL; //# Cf       ARABIC END OF AYAH
    1455           0 :         if ((val>=0x06E5) && (val<=0x06E6)) return AL;    //# Lm   [2] ARABIC SMALL WAW..ARABIC SMALL YEH
    1456           0 :         if ((val>=0x06EE) && (val<=0x06EF)) return AL;    //# Lo   [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
    1457           0 :         if ((val>=0x06FA) && (val<=0x06FC)) return AL;    //# Lo   [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
    1458           0 :         if ((val>=0x06FD) && (val<=0x06FE)) return AL;    //# So   [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN
    1459           0 :         if (val==0x000006FF) return AL; //# Lo       ARABIC LETTER HEH WITH INVERTED V
    1460           0 :         if ((val>=0x0700) && (val<=0x070D)) return AL;    //# Po  [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS
    1461           0 :         if (val==0x0000070E) return AL; //# Cn       <reserved-070E>
    1462           0 :         if (val==0x00000710) return AL; //# Lo       SYRIAC LETTER ALAPH
    1463           0 :         if ((val>=0x0712) && (val<=0x072F)) return AL;    //# Lo  [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
    1464           0 :         if ((val>=0x074B) && (val<=0x074C)) return AL;    //# Cn   [2] <reserved-074B>..<reserved-074C>
    1465           0 :         if ((val>=0x074D) && (val<=0x076D)) return AL;    //# Lo  [33] SYRIAC LETTER SOGDIAN ZHAIN..ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
    1466           0 :         if ((val>=0x076E) && (val<=0x077F)) return AL;    //# Cn  [18] <reserved-076E>..<reserved-077F>
    1467           0 :         if ((val>=0x0780) && (val<=0x07A5)) return AL;    //# Lo  [38] THAANA LETTER HAA..THAANA LETTER WAAVU
    1468           0 :         if (val==0x000007B1) return AL; //# Lo       THAANA LETTER NAA
    1469           0 :         if ((val>=0x07B2) && (val<=0x07BF)) return AL;    //# Cn  [14] <reserved-07B2>..<reserved-07BF>
    1470           0 :         if ((val>=0xFB50) && (val<=0xFBB1)) return AL;    //# Lo  [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
    1471           0 :         if ((val>=0xFBB2) && (val<=0xFBD2)) return AL;    //# Cn  [33] <reserved-FBB2>..<reserved-FBD2>
    1472           0 :         if ((val>=0xFBD3) && (val<=0xFD3D)) return AL;    //# Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
    1473           0 :         if ((val>=0xFD40) && (val<=0xFD4F)) return AL;    //# Cn  [16] <reserved-FD40>..<reserved-FD4F>
    1474           0 :         if ((val>=0xFD50) && (val<=0xFD8F)) return AL;    //# Lo  [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
    1475           0 :         if ((val>=0xFD90) && (val<=0xFD91)) return AL;    //# Cn   [2] <reserved-FD90>..<reserved-FD91>
    1476           0 :         if ((val>=0xFD92) && (val<=0xFDC7)) return AL;    //# Lo  [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
    1477           0 :         if ((val>=0xFDC8) && (val<=0xFDCF)) return AL;    //# Cn   [8] <reserved-FDC8>..<reserved-FDCF>
    1478           0 :         if ((val>=0xFDF0) && (val<=0xFDFB)) return AL;    //# Lo  [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
    1479           0 :         if (val==0x0000FDFC) return AL; //# Sc       RIAL SIGN
    1480           0 :         if ((val>=0xFDFE) && (val<=0xFDFF)) return AL;    //# Cn   [2] <reserved-FDFE>..<reserved-FDFF>
    1481           0 :         if ((val>=0xFE70) && (val<=0xFE74)) return AL;    //# Lo   [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
    1482           0 :         if (val==0x0000FE75) return AL; //# Cn       <reserved-FE75>
    1483           0 :         if ((val>=0xFE76) && (val<=0xFEFC)) return AL;    //# Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
    1484           0 :         if ((val>=0xFEFD) && (val<=0xFEFE)) return AL;    //# Cn   [2] <reserved-FEFD>..<reserved-FEFE>
    1485           0 :         if (val==0x0000202D) return LRO;        //# Cf       LEFT-TO-RIGHT OVERRIDE
    1486           0 :         if (val==0x0000202E) return RLO;        //# Cf       RIGHT-TO-LEFT OVERRIDE
    1487           0 :         if (val==0x0000202A) return LRE;        //# Cf       LEFT-TO-RIGHT EMBEDDING
    1488           0 :         if (val==0x0000202B) return RLE;        //# Cf       RIGHT-TO-LEFT EMBEDDING
    1489           0 :         if (val==0x0000202C) return PDF;        //# Cf       POP DIRECTIONAL FORMATTING
    1490           0 :         return L;
    1491             : }

Generated by: LCOV version 1.13