]> granicus.if.org Git - php/commitdiff
Revert "Update to PCRE2 10.35"
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 30 Jun 2020 16:24:48 +0000 (18:24 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 30 Jun 2020 16:24:48 +0000 (18:24 +0200)
This reverts commit b419f96c626d1f9cbbba42698e947e32a0af9c4f.

This breaks the GCC build with -fcf-protection (default on Ubuntu
at least).

39 files changed:
ext/pcre/pcre2lib/pcre2.h
ext/pcre/pcre2lib/pcre2_auto_possess.c
ext/pcre/pcre2lib/pcre2_chartables.c
ext/pcre/pcre2lib/pcre2_compile.c
ext/pcre/pcre2lib/pcre2_config.c
ext/pcre/pcre2lib/pcre2_dfa_match.c
ext/pcre/pcre2lib/pcre2_internal.h
ext/pcre/pcre2lib/pcre2_jit_compile.c
ext/pcre/pcre2lib/pcre2_jit_misc.c
ext/pcre/pcre2lib/pcre2_jit_neon_inc.h
ext/pcre/pcre2lib/pcre2_jit_simd_inc.h
ext/pcre/pcre2lib/pcre2_maketables.c
ext/pcre/pcre2lib/pcre2_match.c
ext/pcre/pcre2lib/pcre2_serialize.c
ext/pcre/pcre2lib/pcre2_study.c
ext/pcre/pcre2lib/pcre2_substitute.c
ext/pcre/pcre2lib/pcre2_tables.c
ext/pcre/pcre2lib/pcre2_ucd.c
ext/pcre/pcre2lib/pcre2_ucp.h
ext/pcre/pcre2lib/pcre2_valid_utf.c
ext/pcre/pcre2lib/sljit/sljitConfig.h
ext/pcre/pcre2lib/sljit/sljitConfigInternal.h
ext/pcre/pcre2lib/sljit/sljitExecAllocator.c
ext/pcre/pcre2lib/sljit/sljitLir.c
ext/pcre/pcre2lib/sljit/sljitLir.h
ext/pcre/pcre2lib/sljit/sljitNativeARM_32.c
ext/pcre/pcre2lib/sljit/sljitNativeARM_64.c
ext/pcre/pcre2lib/sljit/sljitNativeARM_T2_32.c
ext/pcre/pcre2lib/sljit/sljitNativeMIPS_32.c
ext/pcre/pcre2lib/sljit/sljitNativeMIPS_64.c
ext/pcre/pcre2lib/sljit/sljitNativeMIPS_common.c
ext/pcre/pcre2lib/sljit/sljitNativePPC_common.c
ext/pcre/pcre2lib/sljit/sljitNativeSPARC_common.c
ext/pcre/pcre2lib/sljit/sljitNativeTILEGX_64.c
ext/pcre/pcre2lib/sljit/sljitNativeX86_32.c
ext/pcre/pcre2lib/sljit/sljitNativeX86_64.c
ext/pcre/pcre2lib/sljit/sljitNativeX86_common.c
ext/pcre/pcre2lib/sljit/sljitProtExecAllocator.c
ext/pcre/pcre2lib/sljit/sljitUtils.c

index 4a42a7975a8ed01d726fee682fa5b36e1aae69f2..cb9d61a35b14efb848c8a03c7d55c0ab143190c7 100644 (file)
@@ -5,7 +5,7 @@
 /* This is the public header file for the PCRE library, second API, to be
 #included by applications that call PCRE2 functions.
 
-           Copyright (c) 2016-2020 University of Cambridge
+           Copyright (c) 2016-2019 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -42,9 +42,9 @@ POSSIBILITY OF SUCH DAMAGE.
 /* The current PCRE version information. */
 
 #define PCRE2_MAJOR           10
-#define PCRE2_MINOR           35
+#define PCRE2_MINOR           34
 #define PCRE2_PRERELEASE      
-#define PCRE2_DATE            2020-05-09
+#define PCRE2_DATE            2019-11-21
 
 /* When an application links to a PCRE DLL in Windows, the symbols that are
 imported have to be identified as such. When building PCRE2, the appropriate
@@ -181,9 +181,6 @@ pcre2_jit_match() ignores the latter since it bypasses all sanity checks). */
 #define PCRE2_SUBSTITUTE_OVERFLOW_LENGTH  0x00001000u  /* pcre2_substitute() only */
 #define PCRE2_NO_JIT                      0x00002000u  /* Not for pcre2_dfa_match() */
 #define PCRE2_COPY_MATCHED_SUBJECT        0x00004000u
-#define PCRE2_SUBSTITUTE_LITERAL          0x00008000u  /* pcre2_substitute() only */
-#define PCRE2_SUBSTITUTE_MATCHED          0x00010000u  /* pcre2_substitute() only */
-#define PCRE2_SUBSTITUTE_REPLACEMENT_ONLY 0x00020000u  /* pcre2_substitute() only */
 
 /* Options for pcre2_pattern_convert(). */
 
@@ -448,7 +445,6 @@ released, the numbers must not be changed. */
 #define PCRE2_CONFIG_HEAPLIMIT              12
 #define PCRE2_CONFIG_NEVER_BACKSLASH_C      13
 #define PCRE2_CONFIG_COMPILED_WIDTHS        14
-#define PCRE2_CONFIG_TABLES_LENGTH          15
 
 
 /* Types for code units in patterns and subject strings. */
index c64cf856d17b4365a6e8f4b5846f769cb9830ded..5b95b9b8a8b057224ae50bebcae1fb97d4d8edc9 100644 (file)
@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2020 University of Cambridge
+          New API code Copyright (c) 2016-2019 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -292,7 +292,6 @@ possessification, and if so, fills a list with its properties.
 Arguments:
   code        points to start of expression
   utf         TRUE if in UTF mode
-  ucp         TRUE if in UCP mode
   fcc         points to the case-flipping table
   list        points to output list
               list[0] will be filled with the opcode
@@ -305,7 +304,7 @@ Returns:      points to the start of the next opcode if *code is accepted
 */
 
 static PCRE2_SPTR
-get_chr_property_list(PCRE2_SPTR code, BOOL utf, BOOL ucp, const uint8_t *fcc,
+get_chr_property_list(PCRE2_SPTR code, BOOL utf, const uint8_t *fcc,
   uint32_t *list)
 {
 PCRE2_UCHAR c = *code;
@@ -317,8 +316,7 @@ uint32_t chr;
 uint32_t *clist_dest;
 const uint32_t *clist_src;
 #else
-(void)utf;    /* Suppress "unused parameter" compiler warnings */
-(void)ucp;
+(void)utf;    /* Suppress "unused parameter" compiler warning */
 #endif
 
 list[0] = c;
@@ -398,7 +396,7 @@ switch(c)
   list[2] = chr;
 
 #ifdef SUPPORT_UNICODE
-  if (chr < 128 || (chr < 256 && !utf && !ucp))
+  if (chr < 128 || (chr < 256 && !utf))
     list[3] = fcc[chr];
   else
     list[3] = UCD_OTHERCASE(chr);
@@ -505,7 +503,6 @@ which case the base cannot be possessified.
 Arguments:
   code        points to the byte code
   utf         TRUE in UTF mode
-  ucp         TRUE in UCP mode
   cb          compile data block
   base_list   the data list of the base opcode
   base_end    the end of the base opcode
@@ -515,7 +512,7 @@ Returns:      TRUE if the auto-possessification is possible
 */
 
 static BOOL
-compare_opcodes(PCRE2_SPTR code, BOOL utf, BOOL ucp, const compile_block *cb,
+compare_opcodes(PCRE2_SPTR code, BOOL utf, const compile_block *cb,
   const uint32_t *base_list, PCRE2_SPTR base_end, int *rec_limit)
 {
 PCRE2_UCHAR c;
@@ -654,7 +651,7 @@ for(;;)
 
     while (*next_code == OP_ALT)
       {
-      if (!compare_opcodes(code, utf, ucp, cb, base_list, base_end, rec_limit))
+      if (!compare_opcodes(code, utf, cb, base_list, base_end, rec_limit))
         return FALSE;
       code = next_code + 1 + LINK_SIZE;
       next_code += GET(next_code, 1);
@@ -675,8 +672,7 @@ for(;;)
     /* The bracket content will be checked by the OP_BRA/OP_CBRA case above. */
 
     next_code += 1 + LINK_SIZE;
-    if (!compare_opcodes(next_code, utf, ucp, cb, base_list, base_end,
-         rec_limit))
+    if (!compare_opcodes(next_code, utf, cb, base_list, base_end, rec_limit))
       return FALSE;
 
     code += PRIV(OP_lengths)[c];
@@ -692,7 +688,7 @@ for(;;)
   /* We now have the next appropriate opcode to compare with the base. Check
   for a supported opcode, and load its properties. */
 
-  code = get_chr_property_list(code, utf, ucp, cb->fcc, list);
+  code = get_chr_property_list(code, utf, cb->fcc, list);
   if (code == NULL) return FALSE;    /* Unsupported */
 
   /* If either opcode is a small character list, set pointers for comparing
@@ -1104,6 +1100,7 @@ leaving the remainder of the pattern unpossessified.
 
 Arguments:
   code        points to start of the byte code
+  utf         TRUE in UTF mode
   cb          compile data block
 
 Returns:      0 for success
@@ -1111,15 +1108,13 @@ Returns:      0 for success
 */
 
 int
-PRIV(auto_possessify)(PCRE2_UCHAR *code, const compile_block *cb)
+PRIV(auto_possessify)(PCRE2_UCHAR *code, BOOL utf, const compile_block *cb)
 {
 PCRE2_UCHAR c;
 PCRE2_SPTR end;
 PCRE2_UCHAR *repeat_opcode;
 uint32_t list[8];
 int rec_limit = 1000;  /* Was 10,000 but clang+ASAN uses a lot of stack. */
-BOOL utf = (cb->external_options & PCRE2_UTF) != 0;
-BOOL ucp = (cb->external_options & PCRE2_UCP) != 0;
 
 for (;;)
   {
@@ -1131,11 +1126,10 @@ for (;;)
     {
     c -= get_repeat_base(c) - OP_STAR;
     end = (c <= OP_MINUPTO) ?
-      get_chr_property_list(code, utf, ucp, cb->fcc, list) : NULL;
+      get_chr_property_list(code, utf, cb->fcc, list) : NULL;
     list[1] = c == OP_STAR || c == OP_PLUS || c == OP_QUERY || c == OP_UPTO;
 
-    if (end != NULL && compare_opcodes(end, utf, ucp, cb, list, end,
-        &rec_limit))
+    if (end != NULL && compare_opcodes(end, utf, cb, list, end, &rec_limit))
       {
       switch(c)
         {
@@ -1187,11 +1181,11 @@ for (;;)
     if (c >= OP_CRSTAR && c <= OP_CRMINRANGE)
       {
       /* end must not be NULL. */
-      end = get_chr_property_list(code, utf, ucp, cb->fcc, list);
+      end = get_chr_property_list(code, utf, cb->fcc, list);
 
       list[1] = (c & 1) == 0;
 
-      if (compare_opcodes(end, utf, ucp, cb, list, end, &rec_limit))
+      if (compare_opcodes(end, utf, cb, list, end, &rec_limit))
         {
         switch (c)
           {
index 861914d1ac3ac7f05c0ba286bd492eef71421ac3..0e07edb4943d8a28f0dc722a9aa4a92ede91df22 100644 (file)
@@ -2,21 +2,17 @@
 *      Perl-Compatible Regular Expressions       *
 *************************************************/
 
-/* This file was automatically written by the pcre2_dftables auxiliary
+/* This file was automatically written by the dftables auxiliary
 program. It contains character tables that are used when no external
 tables are passed to PCRE2 by the application that calls it. The tables
 are used only for characters whose code values are less than 256. */
 
-/* This set of tables was written in the C locale. */
-
-/* The pcre2_ftables program (which is distributed with PCRE2) can be used
-to build alternative versions of this file. This is necessary if you are
+/*The dftables program (which is distributed with PCRE2) can be used to
+build alternative versions of this file. This is necessary if you are
 running in an EBCDIC environment, or if you want to default to a different
-encoding, for example ISO-8859-1. When pcre2_dftables is run, it creates
-these tables in the "C" locale by default. This happens automatically if
-PCRE2 is configured with --enable-rebuild-chartables. However, you can run
-pcre2_dftables manually with the -L option to build tables using the LC_ALL
-locale. */
+encoding, for example ISO-8859-1. When dftables is run, it creates these
+tables in the current locale. This happens automatically if PCRE2 is
+configured with --enable-rebuild-chartables. */
 
 /* The following #include is present because without it gcc 4.x may remove
 the array definition from the final binary if PCRE2 is built into a static
@@ -106,54 +102,54 @@ const uint8_t PRIV(default_tables)[] = {
 /* This table contains bit maps for various character classes. Each map is 32
 bytes long and the bits run from the least significant end of each byte. The
 classes that have their own maps are: space, xdigit, digit, upper, lower, word,
-graph, print, punct, and cntrl. Other classes are built from combinations. */
+graph print, punct, and cntrl. Other classes are built from combinations. */
 
-  0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00,  /* space */
+  0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 
-  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,  /* xdigit */
+  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
   0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 
-  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,  /* digit */
+  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* upper */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* lower */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 
-  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,  /* word */
+  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
   0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 
-  0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,  /* graph */
+  0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
   0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 
-  0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,  /* print */
+  0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
   0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 
-  0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc,  /* punct */
+  0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc,
   0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 
-  0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,  /* cntrl */
+  0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
index 62393bea74667a9f90711ef3fbd0a66cb86c296d..f2e6b6b5bde4293dfefc77f421a9c040f867b35d 100644 (file)
@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2020 University of Cambridge
+          New API code Copyright (c) 2016-2019 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -1202,7 +1202,7 @@ in the decoded tables. */
 
 if ((code->flags & PCRE2_DEREF_TABLES) != 0)
   {
-  ref_count = (PCRE2_SIZE *)(code->tables + TABLES_LENGTH);
+  ref_count = (PCRE2_SIZE *)(code->tables + tables_length);
   (*ref_count)++;
   }
 
@@ -1232,15 +1232,15 @@ if (newcode == NULL) return NULL;
 memcpy(newcode, code, code->blocksize);
 newcode->executable_jit = NULL;
 
-newtables = code->memctl.malloc(TABLES_LENGTH + sizeof(PCRE2_SIZE),
+newtables = code->memctl.malloc(tables_length + sizeof(PCRE2_SIZE),
   code->memctl.memory_data);
 if (newtables == NULL)
   {
   code->memctl.free((void *)newcode, code->memctl.memory_data);
   return NULL;
   }
-memcpy(newtables, code->tables, TABLES_LENGTH);
-ref_count = (PCRE2_SIZE *)(newtables + TABLES_LENGTH);
+memcpy(newtables, code->tables, tables_length);
+ref_count = (PCRE2_SIZE *)(newtables + tables_length);
 *ref_count = 1;
 
 newcode->tables = newtables;
@@ -1270,7 +1270,7 @@ if (code != NULL)
     be freed when there are no more references to them. The *ref_count should
     always be > 0. */
 
-    ref_count = (PCRE2_SIZE *)(code->tables + TABLES_LENGTH);
+    ref_count = (PCRE2_SIZE *)(code->tables + tables_length);
     if (*ref_count > 0)
       {
       (*ref_count)--;
@@ -3653,7 +3653,7 @@ while (ptr < ptrend)
     if (ptr >= ptrend) goto UNCLOSED_PARENTHESIS;
 
     /* If ( is not followed by ? it is either a capture or a special verb or an
-    alpha assertion or a positive non-atomic lookahead. */
+    alpha assertion. */
 
     if (*ptr != CHAR_QUESTION_MARK)
       {
@@ -3685,10 +3685,10 @@ while (ptr < ptrend)
         break;
 
       /* Handle "alpha assertions" such as (*pla:...). Most of these are
-      synonyms for the historical symbolic assertions, but the script run and
-      non-atomic lookaround ones are new. They are distinguished by starting
-      with a lower case letter. Checking both ends of the alphabet makes this
-      work in all character codes. */
+      synonyms for the historical symbolic assertions, but the script run ones
+      are new. They are distinguished by starting with a lower case letter.
+      Checking both ends of the alphabet makes this work in all character
+      codes. */
 
       else if (CHMAX_255(c) && (cb->ctypes[c] & ctype_lcletter) != 0)
         {
@@ -3747,7 +3747,9 @@ while (ptr < ptrend)
           goto POSITIVE_LOOK_AHEAD;
 
           case META_LOOKAHEAD_NA:
-          goto POSITIVE_NONATOMIC_LOOK_AHEAD;
+          *parsed_pattern++ = meta;
+          ptr++;
+          goto POST_ASSERTION;
 
           case META_LOOKAHEADNOT:
           goto NEGATIVE_LOOK_AHEAD;
@@ -4436,12 +4438,6 @@ while (ptr < ptrend)
       ptr++;
       goto POST_ASSERTION;
 
-      case CHAR_ASTERISK:
-      POSITIVE_NONATOMIC_LOOK_AHEAD:         /* Come from (?* */
-      *parsed_pattern++ = META_LOOKAHEAD_NA;
-      ptr++;
-      goto POST_ASSERTION;
-
       case CHAR_EXCLAMATION_MARK:
       NEGATIVE_LOOK_AHEAD:                   /* Come from (*nla: */
       *parsed_pattern++ = META_LOOKAHEADNOT;
@@ -4451,23 +4447,20 @@ while (ptr < ptrend)
 
       /* ---- Lookbehind assertions ---- */
 
-      /* (?< followed by = or ! or * is a lookbehind assertion. Otherwise (?<
-      is the start of the name of a capturing group. */
+      /* (?< followed by = or ! is a lookbehind assertion. Otherwise (?< is the
+      start of the name of a capturing group. */
 
       case CHAR_LESS_THAN_SIGN:
       if (ptrend - ptr <= 1 ||
-         (ptr[1] != CHAR_EQUALS_SIGN &&
-          ptr[1] != CHAR_EXCLAMATION_MARK &&
-          ptr[1] != CHAR_ASTERISK))
+         (ptr[1] != CHAR_EQUALS_SIGN && ptr[1] != CHAR_EXCLAMATION_MARK))
         {
         terminator = CHAR_GREATER_THAN_SIGN;
         goto DEFINE_NAME;
         }
       *parsed_pattern++ = (ptr[1] == CHAR_EQUALS_SIGN)?
-        META_LOOKBEHIND : (ptr[1] == CHAR_EXCLAMATION_MARK)?
-        META_LOOKBEHINDNOT : META_LOOKBEHIND_NA;
+        META_LOOKBEHIND : META_LOOKBEHINDNOT;
 
-      POST_LOOKBEHIND:           /* Come from (*plb: (*naplb: and (*nlb: */
+      POST_LOOKBEHIND:              /* Come from (*plb: (*naplb: and (*nlb: */
       *has_lookbehind = TRUE;
       offset = (PCRE2_SIZE)(ptr - cb->start_pattern - 2);
       PUTOFFSET(offset, parsed_pattern);
@@ -4640,6 +4633,8 @@ while (ptr < ptrend)
         *parsed_pattern++ = META_KET;
         }
 
+
+
       if (top_nest == (nest_save *)(cb->start_workspace)) top_nest = NULL;
         else top_nest--;
       }
@@ -4904,7 +4899,7 @@ range. */
 if ((options & PCRE2_CASELESS) != 0)
   {
 #ifdef SUPPORT_UNICODE
-  if ((options & (PCRE2_UTF|PCRE2_UCP)) != 0)
+  if ((options & PCRE2_UTF) != 0)
     {
     int rc;
     uint32_t oc, od;
@@ -5319,8 +5314,7 @@ dynamically as we process the pattern. */
 
 #ifdef SUPPORT_UNICODE
 BOOL utf = (options & PCRE2_UTF) != 0;
-BOOL ucp = (options & PCRE2_UCP) != 0;
-#else  /* No Unicode support */
+#else  /* No UTF support */
 BOOL utf = FALSE;
 #endif
 
@@ -5565,12 +5559,12 @@ for (;; pptr++)
       zerofirstcu = firstcu;
       zerofirstcuflags = firstcuflags;
 
-      /* For caseless UTF or UCP mode, check whether this character has more
-      than one other case. If so, generate a special OP_NOTPROP item instead of
+      /* For caseless UTF mode, check whether this character has more than
+      one other case. If so, generate a special OP_NOTPROP item instead of
       OP_NOTI. */
 
 #ifdef SUPPORT_UNICODE
-      if ((utf||ucp) && (options & PCRE2_CASELESS) != 0 &&
+      if (utf && (options & PCRE2_CASELESS) != 0 &&
           (d = UCD_CASESET(c)) != 0)
         {
         *code++ = OP_NOTPROP;
@@ -5603,7 +5597,7 @@ for (;; pptr++)
         uint32_t d;
 
 #ifdef SUPPORT_UNICODE
-        if ((utf || ucp) && c > 127) d = UCD_OTHERCASE(c); else
+        if (utf && c > 127) d = UCD_OTHERCASE(c); else
 #endif
           {
 #if PCRE2_CODE_UNIT_WIDTH != 8
@@ -6677,11 +6671,23 @@ for (;; pptr++)
             }
 
           /* For a back reference, update the back reference map and the
-          maximum back reference. */
+          maximum back reference. Then, for each group, we must check to
+          see if it is recursive, that is, it is inside the group that it
+          references. A flag is set so that the group can be made atomic.
+          */
 
           cb->backref_map |= (groupnumber < 32)? (1u << groupnumber) : 1;
           if (groupnumber > cb->top_backref)
             cb->top_backref = groupnumber;
+
+          for (oc = cb->open_caps; oc != NULL; oc = oc->next)
+            {
+            if (oc->number == groupnumber)
+              {
+              oc->flag = TRUE;
+              break;
+              }
+            }
           }
         }
 
@@ -7075,18 +7081,15 @@ for (;; pptr++)
             previous[GET(previous, 1)] != OP_ALT)
           goto END_REPEAT;
 
-        /* Perl allows all assertions to be quantified, and when they contain
-        capturing parentheses and/or are optional there are potential uses for
-        this feature. PCRE2 used to force the maximum quantifier to 1 on the
-        invalid grounds that further repetition was never useful. This was
-        always a bit pointless, since an assertion could be wrapped with a
-        repeated group to achieve the effect. General repetition is now
-        permitted, but if the maximum is unlimited it is set to one more than
-        the minimum. */
+        /* There is no sense in actually repeating assertions. The only
+        potential use of repetition is in cases when the assertion is optional.
+        Therefore, if the minimum is greater than zero, just ignore the repeat.
+        If the maximum is not zero or one, set it to 1. */
 
         if (op_previous < OP_ONCE)    /* Assertion */
           {
-          if (repeat_max == REPEAT_UNLIMITED) repeat_max = repeat_min + 1;
+          if (repeat_min > 0) goto END_REPEAT;
+          if (repeat_max > 1) repeat_max = 1;
           }
 
         /* The case of a zero minimum is special because of the need to stick
@@ -7679,6 +7682,19 @@ for (;; pptr++)
 
     cb->backref_map |= (meta_arg < 32)? (1u << meta_arg) : 1;
     if (meta_arg > cb->top_backref) cb->top_backref = meta_arg;
+
+    /* Check to see if this back reference is recursive, that it, it
+    is inside the group that it references. A flag is set so that the
+    group can be made atomic. */
+
+    for (oc = cb->open_caps; oc != NULL; oc = oc->next)
+      {
+      if (oc->number == meta_arg)
+        {
+        oc->flag = TRUE;
+        break;
+        }
+      }
     break;
 
 
@@ -7824,12 +7840,11 @@ for (;; pptr++)
     NORMAL_CHAR_SET:  /* Character is already in meta */
     matched_char = TRUE;
 
-    /* For caseless UTF or UCP mode, check whether this character has more than
-    one other case. If so, generate a special OP_PROP item instead of OP_CHARI.
-    */
+    /* For caseless UTF mode, check whether this character has more than one
+    other case. If so, generate a special OP_PROP item instead of OP_CHARI. */
 
 #ifdef SUPPORT_UNICODE
-    if ((utf||ucp) && (options & PCRE2_CASELESS) != 0)
+    if (utf && (options & PCRE2_CASELESS) != 0)
       {
       uint32_t caseset = UCD_CASESET(meta);
       if (caseset != 0)
@@ -8038,6 +8053,7 @@ if (*code == OP_CBRA)
   capnumber = GET2(code, 1 + LINK_SIZE);
   capitem.number = capnumber;
   capitem.next = cb->open_caps;
+  capitem.flag = FALSE;
   capitem.assert_depth = cb->assert_depth;
   cb->open_caps = &capitem;
   }
@@ -8166,9 +8182,26 @@ for (;;)
     PUT(code, 1, (int)(code - start_bracket));
     code += 1 + LINK_SIZE;
 
-    /* If it was a capturing subpattern, remove the block from the chain. */
+    /* If it was a capturing subpattern, check to see if it contained any
+    recursive back references. If so, we must wrap it in atomic brackets. In
+    any event, remove the block from the chain. */
 
-    if (capnumber > 0) cb->open_caps = cb->open_caps->next;
+    if (capnumber > 0)
+      {
+      if (cb->open_caps->flag)
+        {
+        (void)memmove(start_bracket + 1 + LINK_SIZE, start_bracket,
+          CU2BYTES(code - start_bracket));
+        *start_bracket = OP_ONCE;
+        code += 1 + LINK_SIZE;
+        PUT(start_bracket, 1, (int)(code - start_bracket));
+        *code = OP_KET;
+        PUT(code, 1, (int)(code - start_bracket));
+        code += 1 + LINK_SIZE;
+        length += 2 + 2*LINK_SIZE;
+        }
+      cb->open_caps = cb->open_caps->next;
+      }
 
     /* Set values to pass back */
 
@@ -8803,10 +8836,9 @@ memset(slot + IMM2_SIZE + length, 0,
 
 /* This function is called to skip parts of the parsed pattern when finding the
 length of a lookbehind branch. It is called after (*ACCEPT) and (*FAIL) to find
-the end of the branch, it is called to skip over an internal lookaround or
-(DEFINE) group, and it is also called to skip to the end of a class, during
-which it will never encounter nested groups (but there's no need to have
-special code for that).
+the end of the branch, it is called to skip over an internal lookaround, and it
+is also called to skip to the end of a class, during which it will never
+encounter nested groups (but there's no need to have special code for that).
 
 When called to find the end of a branch or group, pptr must point to the first
 meta code inside the branch, not the branch-starting code. In other cases it
@@ -9284,21 +9316,14 @@ for (;; pptr++)
     itemlength = grouplength;
     break;
 
-    /* A (DEFINE) group is never obeyed inline and so it does not contribute to
-    the length of this branch. Skip from the following item to the next
-    unpaired ket. */
-
-    case META_COND_DEFINE:
-    pptr = parsed_skip(pptr + 1, PSKIP_KET);
-    break;
-
-    /* Check other nested groups - advance past the initial data for each type
-    and then seek a fixed length with get_grouplength(). */
+    /* Check nested groups - advance past the initial data for each type and
+    then seek a fixed length with get_grouplength(). */
 
     case META_COND_NAME:
     case META_COND_NUMBER:
     case META_COND_RNAME:
     case META_COND_RNUMBER:
+    case META_COND_DEFINE:
     pptr += 2 + SIZEOFFSET;
     goto CHECK_GROUP;
 
@@ -9555,10 +9580,6 @@ for (; *pptr != META_END; pptr++)
     break;
 
     case META_COND_DEFINE:
-    pptr += SIZEOFFSET;
-    nestlevel++;
-    break;
-
     case META_COND_NAME:
     case META_COND_NUMBER:
     case META_COND_RNAME:
@@ -9639,7 +9660,6 @@ pcre2_compile(PCRE2_SPTR pattern, PCRE2_SIZE patlen, uint32_t options,
    int *errorptr, PCRE2_SIZE *erroroffset, pcre2_compile_context *ccontext)
 {
 BOOL utf;                             /* Set TRUE for UTF mode */
-BOOL ucp;                             /* Set TRUE for UCP mode */
 BOOL has_lookbehind = FALSE;          /* Set TRUE if a lookbehind is found */
 BOOL zero_terminated;                 /* Set TRUE for zero-terminated pattern */
 pcre2_real_code *re = NULL;           /* What we will return */
@@ -9927,8 +9947,8 @@ if (utf)
 
 /* Check UCP lockout. */
 
-ucp = (cb.external_options & PCRE2_UCP) != 0;
-if (ucp && (cb.external_options & PCRE2_NEVER_UCP) != 0)
+if ((cb.external_options & (PCRE2_UCP|PCRE2_NEVER_UCP)) ==
+    (PCRE2_UCP|PCRE2_NEVER_UCP))
   {
   errorcode = ERR75;
   goto HAD_EARLY_ERROR;
@@ -10304,7 +10324,7 @@ function call. */
 if (errorcode == 0 && (re->overall_options & PCRE2_NO_AUTO_POSSESS) == 0)
   {
   PCRE2_UCHAR *temp = (PCRE2_UCHAR *)codestart;
-  if (PRIV(auto_possessify)(temp, &cb) != 0) errorcode = ERR80;
+  if (PRIV(auto_possessify)(temp, utf, &cb) != 0) errorcode = ERR80;
   }
 
 /* Failed to compile, or error while post-processing. */
@@ -10352,25 +10372,21 @@ if ((re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
 
     if ((firstcuflags & REQ_CASELESS) != 0)
       {
-      if (firstcu < 128 || (!utf && !ucp && firstcu < 255))
+      if (firstcu < 128 || (!utf && firstcu < 255))
         {
         if (cb.fcc[firstcu] != firstcu) re->flags |= PCRE2_FIRSTCASELESS;
         }
 
-      /* The first code unit is > 128 in UTF or UCP mode, or > 255 otherwise.
-      In 8-bit UTF mode, codepoints in the range 128-255 are introductory code
-      points and cannot have another case, but if UCP is set they may do. */
+      /* The first code unit is > 128 in UTF mode, or > 255 otherwise. In
+      8-bit UTF mode, codepoints in the range 128-255 are introductory code
+      points and cannot have another case. In 16-bit and 32-bit modes, we can
+      check wide characters when UTF (and therefore UCP) is supported. */
 
-#ifdef SUPPORT_UNICODE
-#if PCRE2_CODE_UNIT_WIDTH == 8
-      else if (ucp && !utf && UCD_OTHERCASE(firstcu) != firstcu)
-        re->flags |= PCRE2_FIRSTCASELESS;
-#else
-      else if ((utf || ucp) && firstcu <= MAX_UTF_CODE_POINT &&
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+      else if (firstcu <= MAX_UTF_CODE_POINT &&
                UCD_OTHERCASE(firstcu) != firstcu)
         re->flags |= PCRE2_FIRSTCASELESS;
 #endif
-#endif  /* SUPPORT_UNICODE */
       }
     }
 
@@ -10419,20 +10435,14 @@ if ((re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
 
       if ((reqcuflags & REQ_CASELESS) != 0)
         {
-        if (reqcu < 128 || (!utf && !ucp && reqcu < 255))
+        if (reqcu < 128 || (!utf && reqcu < 255))
           {
           if (cb.fcc[reqcu] != reqcu) re->flags |= PCRE2_LASTCASELESS;
           }
-#ifdef SUPPORT_UNICODE
-#if PCRE2_CODE_UNIT_WIDTH == 8
-      else if (ucp && !utf && UCD_OTHERCASE(reqcu) != reqcu)
-        re->flags |= PCRE2_LASTCASELESS;
-#else
-      else if ((utf || ucp) && reqcu <= MAX_UTF_CODE_POINT &&
-               UCD_OTHERCASE(reqcu) != reqcu)
-        re->flags |= PCRE2_LASTCASELESS;
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+        else if (reqcu <= MAX_UTF_CODE_POINT && UCD_OTHERCASE(reqcu) != reqcu)
+          re->flags |= PCRE2_LASTCASELESS;
 #endif
-#endif  /* SUPPORT_UNICODE */
         }
       }
     }
index 5ef103caf79258fbe658168ecb6674d7af3fe4bd..e487b1022070a2788c76cee5311616fa5cf30bdd 100644 (file)
@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2020 University of Cambridge
+          New API code Copyright (c) 2016-2017 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -43,8 +43,7 @@ POSSIBILITY OF SUCH DAMAGE.
 #endif
 
 /* Save the configured link size, which is in bytes. In 16-bit and 32-bit modes
-its value gets changed by pcre2_intmodedep.h (included by pcre2_internal.h) to
-be in code units. */
+its value gets changed by pcre2_internal.h to be in code units. */
 
 static int configured_link_size = LINK_SIZE;
 
@@ -95,7 +94,6 @@ if (where == NULL)  /* Requests a length */
     case PCRE2_CONFIG_NEWLINE:
     case PCRE2_CONFIG_PARENSLIMIT:
     case PCRE2_CONFIG_STACKRECURSE:    /* Obsolete */
-    case PCRE2_CONFIG_TABLES_LENGTH:
     case PCRE2_CONFIG_UNICODE:
     return sizeof(uint32_t);
 
@@ -193,10 +191,6 @@ switch (what)
   *((uint32_t *)where) = 0;
   break;
 
-  case PCRE2_CONFIG_TABLES_LENGTH:
-  *((uint32_t *)where) = TABLES_LENGTH;
-  break;
-
   case PCRE2_CONFIG_UNICODE_VERSION:
     {
 #if defined SUPPORT_UNICODE
index 625695b7cb0ed321264bbf7f1e9bff8e9ce833b8..7d8ffe8a3ec35d61442dec0b981a4d95eb10de99 100644 (file)
@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2020 University of Cambridge
+          New API code Copyright (c) 2016-2019 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -548,7 +548,6 @@ PCRE2_SPTR start_code = mb->start_code;
 
 #ifdef SUPPORT_UNICODE
 BOOL utf = (mb->poptions & PCRE2_UTF) != 0;
-BOOL utf_or_ucp = utf || (mb->poptions & PCRE2_UCP) != 0;
 #else
 BOOL utf = FALSE;
 #endif
@@ -2191,7 +2190,7 @@ for (;;)
       if (clen == 0) break;
 
 #ifdef SUPPORT_UNICODE
-      if (utf_or_ucp)
+      if (utf)
         {
         if (c == d) { ADD_NEW(state_offset + dlen + 1, 0); } else
           {
@@ -2205,7 +2204,7 @@ for (;;)
         }
       else
 #endif  /* SUPPORT_UNICODE */
-      /* Not UTF or UCP mode */
+      /* Not UTF mode */
         {
         if (TABLE_GET(c, lcc, c) == TABLE_GET(d, lcc, d))
           { ADD_NEW(state_offset + 2, 0); }
@@ -2340,7 +2339,7 @@ for (;;)
         {
         uint32_t otherd;
 #ifdef SUPPORT_UNICODE
-        if (utf_or_ucp && d >= 128)
+        if (utf && d >= 128)
           otherd = UCD_OTHERCASE(d);
         else
 #endif  /* SUPPORT_UNICODE */
@@ -2375,7 +2374,7 @@ for (;;)
         if (caseless)
           {
 #ifdef SUPPORT_UNICODE
-          if (utf_or_ucp && d >= 128)
+          if (utf && d >= 128)
             otherd = UCD_OTHERCASE(d);
           else
 #endif  /* SUPPORT_UNICODE */
@@ -2418,7 +2417,7 @@ for (;;)
         if (caseless)
           {
 #ifdef SUPPORT_UNICODE
-          if (utf_or_ucp && d >= 128)
+          if (utf && d >= 128)
             otherd = UCD_OTHERCASE(d);
           else
 #endif  /* SUPPORT_UNICODE */
@@ -2459,7 +2458,7 @@ for (;;)
         if (caseless)
           {
 #ifdef SUPPORT_UNICODE
-          if (utf_or_ucp && d >= 128)
+          if (utf && d >= 128)
             otherd = UCD_OTHERCASE(d);
           else
 #endif  /* SUPPORT_UNICODE */
@@ -2492,7 +2491,7 @@ for (;;)
         if (caseless)
           {
 #ifdef SUPPORT_UNICODE
-          if (utf_or_ucp && d >= 128)
+          if (utf && d >= 128)
             otherd = UCD_OTHERCASE(d);
           else
 #endif  /* SUPPORT_UNICODE */
@@ -2532,7 +2531,7 @@ for (;;)
         if (caseless)
           {
 #ifdef SUPPORT_UNICODE
-          if (utf_or_ucp && d >= 128)
+          if (utf && d >= 128)
             otherd = UCD_OTHERCASE(d);
           else
 #endif  /* SUPPORT_UNICODE */
@@ -3527,15 +3526,10 @@ if ((re->flags & PCRE2_FIRSTSET) != 0)
   if ((re->flags & PCRE2_FIRSTCASELESS) != 0)
     {
     first_cu2 = TABLE_GET(first_cu, mb->tables + fcc_offset, first_cu);
-#ifdef SUPPORT_UNICODE
-#if PCRE2_CODE_UNIT_WIDTH == 8
-    if (first_cu > 127 && !utf && (re->overall_options & PCRE2_UCP) != 0)
-      first_cu2 = (PCRE2_UCHAR)UCD_OTHERCASE(first_cu);
-#else
-    if (first_cu > 127 && (utf || (re->overall_options & PCRE2_UCP) != 0))
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+    if (utf && first_cu > 127)
       first_cu2 = (PCRE2_UCHAR)UCD_OTHERCASE(first_cu);
 #endif
-#endif  /* SUPPORT_UNICODE */
     }
   }
 else
@@ -3551,15 +3545,9 @@ if ((re->flags & PCRE2_LASTSET) != 0)
   if ((re->flags & PCRE2_LASTCASELESS) != 0)
     {
     req_cu2 = TABLE_GET(req_cu, mb->tables + fcc_offset, req_cu);
-#ifdef SUPPORT_UNICODE
-#if PCRE2_CODE_UNIT_WIDTH == 8
-    if (req_cu > 127 && !utf && (re->overall_options & PCRE2_UCP) != 0)
-      req_cu2 = (PCRE2_UCHAR)UCD_OTHERCASE(req_cu);
-#else
-    if (req_cu > 127 && (utf || (re->overall_options & PCRE2_UCP) != 0))
-      req_cu2 = (PCRE2_UCHAR)UCD_OTHERCASE(req_cu);
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+    if (utf && req_cu > 127) req_cu2 = (PCRE2_UCHAR)UCD_OTHERCASE(req_cu);
 #endif
-#endif  /* SUPPORT_UNICODE */
     }
   }
 
index d8fad1e93ba5f4c748c3ad890fa42aa55b024b93..fe8ffe5c80db0547541ce6901f34b1d6cec77fde 100644 (file)
@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2020 University of Cambridge
+          New API code Copyright (c) 2016-2019 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -76,17 +76,6 @@ typedef int BOOL;
 #include <valgrind/memcheck.h>
 #endif
 
-/* -ftrivial-auto-var-init support supports initializing all local variables
-to avoid some classes of bug, but this can cause an unacceptable slowdown
-for large on-stack arrays in hot functions. This macro lets us annotate
-such arrays. */
-
-#ifdef HAVE_ATTRIBUTE_UNINITIALIZED
-#define PCRE2_KEEP_UNINITIALIZED __attribute__((uninitialized))
-#else
-#define PCRE2_KEEP_UNINITIALIZED
-#endif
-
 /* Older versions of MSVC lack snprintf(). This define allows for
 warning/error-free compilation and testing with MSVC compilers back to at least
 MSVC 10/2010. Except for VC6 (which is missing some fundamentals and fails). */
@@ -590,7 +579,7 @@ total length of the tables. */
 #define fcc_offset    256                           /* Flip case */
 #define cbits_offset  512                           /* Character classes */
 #define ctypes_offset (cbits_offset + cbit_length)  /* Character types */
-#define TABLES_LENGTH (ctypes_offset + 256)
+#define tables_length (ctypes_offset + 256)
 
 
 /* -------------------- Character and string names ------------------------ */
@@ -1770,11 +1759,13 @@ typedef struct pcre2_memctl {
 
 /* Structure for building a chain of open capturing subpatterns during
 compiling, so that instructions to close them can be compiled when (*ACCEPT) is
-encountered. */
+encountered. This is also used to identify subpatterns that contain recursive
+back references to themselves, so that they can be made atomic. */
 
 typedef struct open_capitem {
   struct open_capitem *next;    /* Chain link */
   uint16_t number;              /* Capture number */
+  uint16_t flag;                /* Set TRUE if recursive back ref */
   uint16_t assert_depth;        /* Assertion depth when opened */
 } open_capitem;
 
@@ -1963,7 +1954,7 @@ is available. */
 #define _pcre2_was_newline           PCRE2_SUFFIX(_pcre2_was_newline_)
 #define _pcre2_xclass                PCRE2_SUFFIX(_pcre2_xclass_)
 
-extern int          _pcre2_auto_possessify(PCRE2_UCHAR *,
+extern int          _pcre2_auto_possessify(PCRE2_UCHAR *, BOOL,
                       const compile_block *);
 extern int          _pcre2_check_escape(PCRE2_SPTR *, PCRE2_SPTR, uint32_t *,
                       int *, uint32_t, uint32_t, BOOL, compile_block *);
index 33ad7e65537a12ed444107f6bec0ad4e910cd05f..f564127c2ae2407cfcd0bb2f083992ed3de53a84 100644 (file)
@@ -223,12 +223,6 @@ enum control_types {
   type_then_trap = 1
 };
 
-enum  early_fail_types {
-  type_skip = 0,
-  type_fail = 1,
-  type_fail_range = 2
-};
-
 typedef int (SLJIT_FUNC *jit_function)(jit_arguments *args);
 
 /* The following structure is the key data type for the recursive
@@ -411,8 +405,8 @@ typedef struct compiler_common {
   /* Fast forward skipping byte code pointer. */
   PCRE2_SPTR fast_forward_bc_ptr;
   /* Locals used by fast fail optimization. */
-  sljit_s32 early_fail_start_ptr;
-  sljit_s32 early_fail_end_ptr;
+  sljit_s32 fast_fail_start_ptr;
+  sljit_s32 fast_fail_end_ptr;
 
   /* Flipped and lower case tables. */
   const sljit_u8 *fcc;
@@ -482,7 +476,7 @@ typedef struct compiler_common {
 #ifdef SUPPORT_UNICODE
   BOOL utf;
   BOOL invalid_utf;
-  BOOL ucp;
+  BOOL use_ucp;
   /* Points to saving area for iref. */
   sljit_s32 iref_ptr;
   jump_list *getucd;
@@ -613,8 +607,6 @@ the start pointers when the end of the capturing group has not yet reached. */
   sljit_emit_op1(compiler, (op), (dst), (dstw), (src), (srcw))
 #define OP2(op, dst, dstw, src1, src1w, src2, src2w) \
   sljit_emit_op2(compiler, (op), (dst), (dstw), (src1), (src1w), (src2), (src2w))
-#define OP_SRC(op, src, srcw) \
-  sljit_emit_op_src(compiler, (op), (src), (srcw))
 #define LABEL() \
   sljit_emit_label(compiler)
 #define JUMP(type) \
@@ -831,7 +823,7 @@ the start pointers when the end of the capturing group has not yet reached. */
 
 static PCRE2_SPTR bracketend(PCRE2_SPTR cc)
 {
-SLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NA) || (*cc >= OP_ONCE && *cc <= OP_SCOND));
+SLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) || (*cc >= OP_ONCE && *cc <= OP_SCOND));
 do cc += GET(cc, 1); while (*cc == OP_ALT);
 SLJIT_ASSERT(*cc >= OP_KET && *cc <= OP_KETRPOS);
 cc += 1 + LINK_SIZE;
@@ -841,7 +833,7 @@ return cc;
 static int no_alternatives(PCRE2_SPTR cc)
 {
 int count = 0;
-SLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NA) || (*cc >= OP_ONCE && *cc <= OP_SCOND));
+SLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) || (*cc >= OP_ONCE && *cc <= OP_SCOND));
 do
   {
   cc += GET(cc, 1);
@@ -926,8 +918,6 @@ switch(*cc)
   case OP_ASSERT_NOT:
   case OP_ASSERTBACK:
   case OP_ASSERTBACK_NOT:
-  case OP_ASSERT_NA:
-  case OP_ASSERTBACK_NA:
   case OP_ONCE:
   case OP_SCRIPT_RUN:
   case OP_BRA:
@@ -1060,7 +1050,8 @@ switch(*cc)
   return cc + 1 + 2 + cc[1];
 
   default:
-  SLJIT_UNREACHABLE();
+  /* Unsupported opcodes: OP_ASSERT_NA and OP_ASSERTBACK_NA */
+  /* SLJIT_UNREACHABLE(); */
   return NULL;
   }
 }
@@ -1070,7 +1061,6 @@ static BOOL check_opcode_types(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPT
 int count;
 PCRE2_SPTR slot;
 PCRE2_SPTR assert_back_end = cc - 1;
-PCRE2_SPTR assert_na_end = cc - 1;
 
 /* Calculate important variables (like stack size) and checks whether all opcodes are supported. */
 while (cc < ccend)
@@ -1097,14 +1087,6 @@ while (cc < ccend)
     cc += 1 + IMM2_SIZE;
     break;
 
-    case OP_ASSERT_NA:
-    case OP_ASSERTBACK_NA:
-    slot = bracketend(cc);
-    if (slot > assert_na_end)
-      assert_na_end = slot;
-    cc += 1 + LINK_SIZE;
-    break;
-
     case OP_CBRAPOS:
     case OP_SCBRAPOS:
     common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] = 0;
@@ -1172,9 +1154,6 @@ while (cc < ccend)
 
     case OP_COMMIT_ARG:
     case OP_PRUNE_ARG:
-    if (cc < assert_na_end)
-      return FALSE;
-    /* Fall through */
     case OP_MARK:
     if (common->mark_ptr == 0)
       {
@@ -1193,8 +1172,6 @@ while (cc < ccend)
     case OP_SKIP:
     if (cc < assert_back_end)
       common->has_skip_in_assert_back = TRUE;
-    if (cc < assert_na_end)
-      return FALSE;
     cc += 1;
     break;
 
@@ -1203,19 +1180,9 @@ while (cc < ccend)
     common->has_skip_arg = TRUE;
     if (cc < assert_back_end)
       common->has_skip_in_assert_back = TRUE;
-    if (cc < assert_na_end)
-      return FALSE;
     cc += 1 + 2 + cc[1];
     break;
 
-    case OP_PRUNE:
-    case OP_COMMIT:
-    case OP_ASSERT_ACCEPT:
-    if (cc < assert_na_end)
-      return FALSE;
-    cc++;
-    break;
-
     default:
     cc = next_opcode(common, cc);
     if (cc == NULL)
@@ -1226,355 +1193,183 @@ while (cc < ccend)
 return TRUE;
 }
 
-#define EARLY_FAIL_ENHANCE_MAX (1 + 1)
-
-/*
-start:
-  0 - skip / early fail allowed
-  1 - only early fail with range allowed
-  >1 - (start - 1) early fail is processed
-
-return: current number of iterators enhanced with fast fail
-*/
-static int detect_early_fail(compiler_common *common, PCRE2_SPTR cc, int *private_data_start, sljit_s32 depth, int start)
+static BOOL is_accelerated_repeat(PCRE2_SPTR cc)
 {
-PCRE2_SPTR next_alt;
-PCRE2_SPTR end;
-PCRE2_SPTR accelerated_start;
-int result = 0;
-int count;
-BOOL fast_forward_allowed = TRUE;
-
-SLJIT_ASSERT(*cc == OP_ONCE || *cc == OP_BRA || *cc == OP_CBRA);
-SLJIT_ASSERT(*cc != OP_CBRA || common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] != 0);
-SLJIT_ASSERT(start < EARLY_FAIL_ENHANCE_MAX);
-
-do
+switch(*cc)
   {
-  count = start;
-  next_alt = cc + GET(cc, 1);
-  cc += 1 + LINK_SIZE + ((*cc == OP_CBRA) ? IMM2_SIZE : 0);
+  case OP_TYPESTAR:
+  case OP_TYPEMINSTAR:
+  case OP_TYPEPLUS:
+  case OP_TYPEMINPLUS:
+  case OP_TYPEPOSSTAR:
+  case OP_TYPEPOSPLUS:
+  return (cc[1] != OP_ANYNL && cc[1] != OP_EXTUNI);
 
-  while (TRUE)
-    {
-    accelerated_start = NULL;
+  case OP_STAR:
+  case OP_MINSTAR:
+  case OP_PLUS:
+  case OP_MINPLUS:
+  case OP_POSSTAR:
+  case OP_POSPLUS:
 
-    switch(*cc)
-      {
-      case OP_SOD:
-      case OP_SOM:
-      case OP_SET_SOM:
-      case OP_NOT_WORD_BOUNDARY:
-      case OP_WORD_BOUNDARY:
-      case OP_EODN:
-      case OP_EOD:
-      case OP_CIRC:
-      case OP_CIRCM:
-      case OP_DOLL:
-      case OP_DOLLM:
-      /* Zero width assertions. */
-      cc++;
-      continue;
-
-      case OP_NOT_DIGIT:
-      case OP_DIGIT:
-      case OP_NOT_WHITESPACE:
-      case OP_WHITESPACE:
-      case OP_NOT_WORDCHAR:
-      case OP_WORDCHAR:
-      case OP_ANY:
-      case OP_ALLANY:
-      case OP_ANYBYTE:
-      case OP_NOT_HSPACE:
-      case OP_HSPACE:
-      case OP_NOT_VSPACE:
-      case OP_VSPACE:
-      fast_forward_allowed = FALSE;
-      cc++;
-      continue;
+  case OP_STARI:
+  case OP_MINSTARI:
+  case OP_PLUSI:
+  case OP_MINPLUSI:
+  case OP_POSSTARI:
+  case OP_POSPLUSI:
 
-      case OP_ANYNL:
-      case OP_EXTUNI:
-      fast_forward_allowed = FALSE;
-      if (count == 0)
-        count = 1;
-      cc++;
-      continue;
-
-      case OP_NOTPROP:
-      case OP_PROP:
-      fast_forward_allowed = FALSE;
-      cc += 1 + 2;
-      continue;
-
-      case OP_CHAR:
-      case OP_CHARI:
-      case OP_NOT:
-      case OP_NOTI:
-      fast_forward_allowed = FALSE;
-      cc += 2;
-#ifdef SUPPORT_UNICODE
-      if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
-#endif
-      continue;
+  case OP_NOTSTAR:
+  case OP_NOTMINSTAR:
+  case OP_NOTPLUS:
+  case OP_NOTMINPLUS:
+  case OP_NOTPOSSTAR:
+  case OP_NOTPOSPLUS:
 
-      case OP_TYPESTAR:
-      case OP_TYPEMINSTAR:
-      case OP_TYPEPLUS:
-      case OP_TYPEMINPLUS:
-      case OP_TYPEPOSSTAR:
-      case OP_TYPEPOSPLUS:
-      /* The type or prop opcode is skipped in the next iteration. */
-      cc += 1;
+  case OP_NOTSTARI:
+  case OP_NOTMINSTARI:
+  case OP_NOTPLUSI:
+  case OP_NOTMINPLUSI:
+  case OP_NOTPOSSTARI:
+  case OP_NOTPOSPLUSI:
+  return TRUE;
 
-      if (cc[0] != OP_ANYNL && cc[0] != OP_EXTUNI)
-        {
-        accelerated_start = cc - 1;
-        break;
-        }
+  case OP_CLASS:
+  case OP_NCLASS:
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
+  case OP_XCLASS:
+  cc += (*cc == OP_XCLASS) ? GET(cc, 1) : (int)(1 + (32 / sizeof(PCRE2_UCHAR)));
+#else
+  cc += (1 + (32 / sizeof(PCRE2_UCHAR)));
+#endif
 
-      if (count == 0)
-        count = 1;
-      fast_forward_allowed = FALSE;
-      continue;
+  switch(*cc)
+    {
+    case OP_CRSTAR:
+    case OP_CRMINSTAR:
+    case OP_CRPLUS:
+    case OP_CRMINPLUS:
+    case OP_CRPOSSTAR:
+    case OP_CRPOSPLUS:
+    return TRUE;
+    }
+  break;
+  }
+return FALSE;
+}
 
-      case OP_TYPEUPTO:
-      case OP_TYPEMINUPTO:
-      case OP_TYPEEXACT:
-      case OP_TYPEPOSUPTO:
-      cc += IMM2_SIZE;
-      /* Fall through */
-
-      case OP_TYPEQUERY:
-      case OP_TYPEMINQUERY:
-      case OP_TYPEPOSQUERY:
-      /* The type or prop opcode is skipped in the next iteration. */
-      fast_forward_allowed = FALSE;
-      if (count == 0)
-        count = 1;
-      cc += 1;
-      continue;
-
-      case OP_STAR:
-      case OP_MINSTAR:
-      case OP_PLUS:
-      case OP_MINPLUS:
-      case OP_POSSTAR:
-      case OP_POSPLUS:
-
-      case OP_STARI:
-      case OP_MINSTARI:
-      case OP_PLUSI:
-      case OP_MINPLUSI:
-      case OP_POSSTARI:
-      case OP_POSPLUSI:
-
-      case OP_NOTSTAR:
-      case OP_NOTMINSTAR:
-      case OP_NOTPLUS:
-      case OP_NOTMINPLUS:
-      case OP_NOTPOSSTAR:
-      case OP_NOTPOSPLUS:
-
-      case OP_NOTSTARI:
-      case OP_NOTMINSTARI:
-      case OP_NOTPLUSI:
-      case OP_NOTMINPLUSI:
-      case OP_NOTPOSSTARI:
-      case OP_NOTPOSPLUSI:
-      accelerated_start = cc;
-      cc += 2;
-#ifdef SUPPORT_UNICODE
-      if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
-#endif
-      break;
+static SLJIT_INLINE BOOL detect_fast_forward_skip(compiler_common *common, int *private_data_start)
+{
+PCRE2_SPTR cc = common->start;
+PCRE2_SPTR end;
 
-      case OP_UPTO:
-      case OP_MINUPTO:
-      case OP_EXACT:
-      case OP_POSUPTO:
-      case OP_UPTOI:
-      case OP_MINUPTOI:
-      case OP_EXACTI:
-      case OP_POSUPTOI:
-      case OP_NOTUPTO:
-      case OP_NOTMINUPTO:
-      case OP_NOTEXACT:
-      case OP_NOTPOSUPTO:
-      case OP_NOTUPTOI:
-      case OP_NOTMINUPTOI:
-      case OP_NOTEXACTI:
-      case OP_NOTPOSUPTOI:
-      cc += IMM2_SIZE;
-      /* Fall through */
-
-      case OP_QUERY:
-      case OP_MINQUERY:
-      case OP_POSQUERY:
-      case OP_QUERYI:
-      case OP_MINQUERYI:
-      case OP_POSQUERYI:
-      case OP_NOTQUERY:
-      case OP_NOTMINQUERY:
-      case OP_NOTPOSQUERY:
-      case OP_NOTQUERYI:
-      case OP_NOTMINQUERYI:
-      case OP_NOTPOSQUERYI:
-      fast_forward_allowed = FALSE;
-      if (count == 0)
-        count = 1;
-      cc += 2;
-#ifdef SUPPORT_UNICODE
-      if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
-#endif
-      continue;
+/* Skip not repeated brackets. */
+while (TRUE)
+  {
+  switch(*cc)
+    {
+    case OP_SOD:
+    case OP_SOM:
+    case OP_SET_SOM:
+    case OP_NOT_WORD_BOUNDARY:
+    case OP_WORD_BOUNDARY:
+    case OP_EODN:
+    case OP_EOD:
+    case OP_CIRC:
+    case OP_CIRCM:
+    case OP_DOLL:
+    case OP_DOLLM:
+    /* Zero width assertions. */
+    cc++;
+    continue;
+    }
 
-      case OP_CLASS:
-      case OP_NCLASS:
-#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
-      case OP_XCLASS:
-      accelerated_start = cc;
-      cc += ((*cc == OP_XCLASS) ? GET(cc, 1) : (unsigned int)(1 + (32 / sizeof(PCRE2_UCHAR))));
-#else
-      accelerated_start = cc;
-      cc += (1 + (32 / sizeof(PCRE2_UCHAR)));
-#endif
+  if (*cc != OP_BRA && *cc != OP_CBRA)
+    break;
 
-      switch (*cc)
-        {
-        case OP_CRSTAR:
-        case OP_CRMINSTAR:
-        case OP_CRPLUS:
-        case OP_CRMINPLUS:
-        case OP_CRPOSSTAR:
-        case OP_CRPOSPLUS:
-        cc++;
-        break;
+  end = cc + GET(cc, 1);
+  if (*end != OP_KET || PRIVATE_DATA(end) != 0)
+    return FALSE;
+  if (*cc == OP_CBRA)
+    {
+    if (common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0)
+      return FALSE;
+    cc += IMM2_SIZE;
+    }
+  cc += 1 + LINK_SIZE;
+  }
 
-        case OP_CRRANGE:
-        case OP_CRMINRANGE:
-        case OP_CRPOSRANGE:
-        cc += 2 * IMM2_SIZE;
-        /* Fall through */
-        case OP_CRQUERY:
-        case OP_CRMINQUERY:
-        case OP_CRPOSQUERY:
-        cc++;
-        if (count == 0)
-          count = 1;
-        /* Fall through */
-        default:
-        accelerated_start = NULL;
-        fast_forward_allowed = FALSE;
-        break;
-        }
-      continue;
+if (is_accelerated_repeat(cc))
+  {
+  common->fast_forward_bc_ptr = cc;
+  common->private_data_ptrs[(cc + 1) - common->start] = *private_data_start;
+  *private_data_start += sizeof(sljit_sw);
+  return TRUE;
+  }
+return FALSE;
+}
 
-      case OP_ONCE:
-      case OP_BRA:
-      case OP_CBRA:
-      end = cc + GET(cc, 1);
+static SLJIT_INLINE void detect_fast_fail(compiler_common *common, PCRE2_SPTR cc, int *private_data_start, sljit_s32 depth)
+{
+  PCRE2_SPTR next_alt;
 
-      if (*end == OP_KET && PRIVATE_DATA(end) == 0)
-        {
-        if (*cc == OP_CBRA)
-          {
-          if (common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0)
-            break;
-          cc += IMM2_SIZE;
-          }
+  SLJIT_ASSERT(*cc == OP_BRA || *cc == OP_CBRA);
 
-        cc += 1 + LINK_SIZE;
-        continue;
-        }
+  if (*cc == OP_CBRA && common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0)
+    return;
 
-      fast_forward_allowed = FALSE;
-      if (depth >= 4)
-        break;
+  next_alt = bracketend(cc) - (1 + LINK_SIZE);
+  if (*next_alt != OP_KET || PRIVATE_DATA(next_alt) != 0)
+    return;
 
-      end = bracketend(cc) - (1 + LINK_SIZE);
-      if (*end != OP_KET || PRIVATE_DATA(end) != 0)
-        break;
+  do
+    {
+    next_alt = cc + GET(cc, 1);
 
-      if (*cc == OP_CBRA && common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0)
-        break;
+    cc += 1 + LINK_SIZE + ((*cc == OP_CBRA) ? IMM2_SIZE : 0);
 
-      count = detect_early_fail(common, cc, private_data_start, depth + 1, count);
-      if (count < EARLY_FAIL_ENHANCE_MAX)
+    while (TRUE)
+      {
+      switch(*cc)
         {
-        cc = end + (1 + LINK_SIZE);
+        case OP_SOD:
+        case OP_SOM:
+        case OP_SET_SOM:
+        case OP_NOT_WORD_BOUNDARY:
+        case OP_WORD_BOUNDARY:
+        case OP_EODN:
+        case OP_EOD:
+        case OP_CIRC:
+        case OP_CIRCM:
+        case OP_DOLL:
+        case OP_DOLLM:
+        /* Zero width assertions. */
+        cc++;
         continue;
         }
       break;
-
-      case OP_KET:
-      SLJIT_ASSERT(PRIVATE_DATA(cc) == 0);
-      if (cc >= next_alt)
-        break;
-      cc += 1 + LINK_SIZE;
-      continue;
       }
 
-    if (accelerated_start != NULL)
-      {
-      if (count == 0)
-        {
-        count++;
-
-        if (fast_forward_allowed && *next_alt == OP_KET)
-          {
-          common->fast_forward_bc_ptr = accelerated_start;
-          common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_skip;
-          *private_data_start += sizeof(sljit_sw);
-          }
-        else
-          {
-          common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_fail;
-
-          if (common->early_fail_start_ptr == 0)
-            common->early_fail_start_ptr = *private_data_start;
-
-          *private_data_start += sizeof(sljit_sw);
-          common->early_fail_end_ptr = *private_data_start;
+    if (depth > 0 && (*cc == OP_BRA || *cc == OP_CBRA))
+      detect_fast_fail(common, cc, private_data_start, depth - 1);
 
-          if (*private_data_start > SLJIT_MAX_LOCAL_SIZE)
-            return EARLY_FAIL_ENHANCE_MAX;
-          }
-        }
-      else
-        {
-        common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_fail_range;
-
-        if (common->early_fail_start_ptr == 0)
-          common->early_fail_start_ptr = *private_data_start;
-
-        *private_data_start += 2 * sizeof(sljit_sw);
-        common->early_fail_end_ptr = *private_data_start;
+    if (is_accelerated_repeat(cc))
+      {
+      common->private_data_ptrs[(cc + 1) - common->start] = *private_data_start;
 
-        if (*private_data_start > SLJIT_MAX_LOCAL_SIZE)
-          return EARLY_FAIL_ENHANCE_MAX;
-        }
+      if (common->fast_fail_start_ptr == 0)
+        common->fast_fail_start_ptr = *private_data_start;
 
-      count++;
+      *private_data_start += sizeof(sljit_sw);
+      common->fast_fail_end_ptr = *private_data_start;
 
-      if (count < EARLY_FAIL_ENHANCE_MAX)
-        continue;
+      if (*private_data_start > SLJIT_MAX_LOCAL_SIZE)
+        return;
       }
 
-    break;
+    cc = next_alt;
     }
-
-  if (*cc != OP_ALT && *cc != OP_KET)
-    result = EARLY_FAIL_ENHANCE_MAX;
-  else if (result < count)
-    result = count;
-
-  fast_forward_allowed = FALSE;
-  cc = next_alt;
-  }
-while (*cc == OP_ALT);
-
-return result;
+  while (*cc == OP_ALT);
 }
 
 static int get_class_iterator_size(PCRE2_SPTR cc)
@@ -1791,8 +1586,6 @@ while (cc < ccend)
     case OP_ASSERT_NOT:
     case OP_ASSERTBACK:
     case OP_ASSERTBACK_NOT:
-    case OP_ASSERT_NA:
-    case OP_ASSERTBACK_NA:
     case OP_ONCE:
     case OP_SCRIPT_RUN:
     case OP_BRAPOS:
@@ -2370,8 +2163,6 @@ while (cc < ccend)
     case OP_ASSERT_NOT:
     case OP_ASSERTBACK:
     case OP_ASSERTBACK_NOT:
-    case OP_ASSERT_NA:
-    case OP_ASSERTBACK_NA:
     case OP_ONCE:
     case OP_SCRIPT_RUN:
     case OP_BRAPOS:
@@ -2696,8 +2487,6 @@ while (cc < ccend)
     case OP_ASSERT_NOT:
     case OP_ASSERTBACK:
     case OP_ASSERTBACK_NOT:
-    case OP_ASSERT_NA:
-    case OP_ASSERTBACK_NA:
     case OP_ONCE:
     case OP_SCRIPT_RUN:
     case OP_BRAPOS:
@@ -2871,8 +2660,8 @@ while (cc < ccend)
       }
     if (common->control_head_ptr != 0 && !control_head_found)
       {
-      private_srcw[0] = common->control_head_ptr;
-      private_count = 1;
+      shared_srcw[0] = common->control_head_ptr;
+      shared_count = 1;
       control_head_found = TRUE;
       }
     cc += 1 + 2 + cc[1];
@@ -2882,8 +2671,8 @@ while (cc < ccend)
     SLJIT_ASSERT(common->control_head_ptr != 0);
     if (!control_head_found)
       {
-      private_srcw[0] = common->control_head_ptr;
-      private_count = 1;
+      shared_srcw[0] = common->control_head_ptr;
+      shared_count = 1;
       control_head_found = TRUE;
       }
     cc++;
@@ -2967,7 +2756,7 @@ PCRE2_SPTR end = bracketend(cc);
 BOOL has_alternatives = cc[GET(cc, 1)] == OP_ALT;
 
 /* Assert captures then. */
-if (*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NA)
+if (*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT)
   current_offset = NULL;
 /* Conditional block does not. */
 if (*cc == OP_COND || *cc == OP_SCOND)
@@ -2979,7 +2768,7 @@ if (has_alternatives)
 
 while (cc < end)
   {
-  if ((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NA) || (*cc >= OP_ONCE && *cc <= OP_SCOND))
+  if ((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) || (*cc >= OP_ONCE && *cc <= OP_SCOND))
     cc = set_then_offsets(common, cc, current_offset);
   else
     {
@@ -3149,54 +2938,16 @@ else
   }
 }
 
-static SLJIT_INLINE void reset_early_fail(compiler_common *common)
+static SLJIT_INLINE void reset_fast_fail(compiler_common *common)
 {
 DEFINE_COMPILER;
-sljit_u32 size = (sljit_u32)(common->early_fail_end_ptr - common->early_fail_start_ptr);
-sljit_u32 uncleared_size;
-sljit_s32 src = SLJIT_IMM;
 sljit_s32 i;
-struct sljit_label *loop;
-
-SLJIT_ASSERT(common->early_fail_start_ptr < common->early_fail_end_ptr);
 
-if (size == sizeof(sljit_sw))
-  {
-  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->early_fail_start_ptr, SLJIT_IMM, 0);
-  return;
-  }
-
-if (sljit_get_register_index(TMP3) >= 0 && !sljit_has_cpu_feature(SLJIT_HAS_ZERO_REGISTER))
-  {
-  OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0);
-  src = TMP3;
-  }
-
-if (size <= 6 * sizeof(sljit_sw))
-  {
-  for (i = common->early_fail_start_ptr; i < common->early_fail_end_ptr; i += sizeof(sljit_sw))
-    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), i, src, 0);
-  return;
-  }
-
-GET_LOCAL_BASE(TMP1, 0, common->early_fail_start_ptr);
-
-uncleared_size = ((size / sizeof(sljit_sw)) % 3) * sizeof(sljit_sw);
+SLJIT_ASSERT(common->fast_fail_start_ptr < common->fast_fail_end_ptr);
 
-OP2(SLJIT_ADD, TMP2, 0, TMP1, 0, SLJIT_IMM, size - uncleared_size);
-
-loop = LABEL();
-OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), 0, src, 0);
-OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 3 * sizeof(sljit_sw));
-OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), -2 * (sljit_sw)sizeof(sljit_sw), src, 0);
-OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), -1 * (sljit_sw)sizeof(sljit_sw), src, 0);
-CMPTO(SLJIT_LESS, TMP1, 0, TMP2, 0, loop);
-
-if (uncleared_size >= sizeof(sljit_sw))
-  OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), 0, src, 0);
-
-if (uncleared_size >= 2 * sizeof(sljit_sw))
-  OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), sizeof(sljit_sw), src, 0);
+OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+for (i = common->fast_fail_start_ptr; i < common->fast_fail_end_ptr; i += sizeof(sljit_sw))
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), i, TMP1, 0);
 }
 
 static SLJIT_INLINE void do_reset_match(compiler_common *common, int length)
@@ -3442,19 +3193,16 @@ static SLJIT_INLINE BOOL char_has_othercase(compiler_common *common, PCRE2_SPTR
 unsigned int c;
 
 #ifdef SUPPORT_UNICODE
-if (common->utf || common->ucp)
+if (common->utf)
   {
-  if (common->utf)
-    {
-    GETCHAR(c, cc);
-    }
-  else
-    c = *cc;
-
+  GETCHAR(c, cc);
   if (c > 127)
+    {
     return c != UCD_OTHERCASE(c);
-
+    }
+#if PCRE2_CODE_UNIT_WIDTH != 8
   return common->fcc[c] != c;
+#endif
   }
 else
 #endif
@@ -3466,8 +3214,10 @@ static SLJIT_INLINE unsigned int char_othercase(compiler_common *common, unsigne
 {
 /* Returns with the othercase. */
 #ifdef SUPPORT_UNICODE
-if ((common->utf || common->ucp) && c > 127)
+if (common->utf && c > 127)
+  {
   return UCD_OTHERCASE(c);
+  }
 #endif
 return TABLE_GET(c, common->fcc, c);
 }
@@ -3481,19 +3231,15 @@ int n;
 #endif
 
 #ifdef SUPPORT_UNICODE
-if (common->utf || common->ucp)
+if (common->utf)
   {
-  if (common->utf)
-    {
-    GETCHAR(c, cc);
-    }
-  else
-    c = *cc;
-
+  GETCHAR(c, cc);
   if (c <= 127)
     oc = common->fcc[c];
   else
+    {
     oc = UCD_OTHERCASE(c);
+    }
   }
 else
   {
@@ -4337,7 +4083,7 @@ jump = JUMP(SLJIT_NOT_ZERO);
 /* Two byte sequence. */
 OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3000);
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(jump);
 OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
@@ -4350,7 +4096,7 @@ jump = JUMP(SLJIT_NOT_ZERO);
 /* Three byte sequence. */
 OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xe0000);
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 /* Four byte sequence. */
 JUMPHERE(jump);
@@ -4360,7 +4106,7 @@ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3));
 OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
 OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);
 OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 static void do_utfreadtype8(compiler_common *common)
@@ -4385,18 +4131,18 @@ OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);
 OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f);
 OP2(SLJIT_OR, TMP2, 0, TMP2, 0, TMP1, 0);
 OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(compare);
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 /* We only have types for characters less than 256. */
 JUMPHERE(jump);
 OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(utf8_table4) - 0xc0);
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 static void do_utfreadchar_invalid(compiler_common *common)
@@ -4436,7 +4182,7 @@ OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800);
 jump = JUMP(SLJIT_NOT_ZERO);
 
 OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(jump);
 
@@ -4479,7 +4225,7 @@ if (has_cmov)
   }
 else
   exit_invalid[4] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x800);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(jump);
 
@@ -4508,7 +4254,7 @@ else
   exit_invalid[6] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x100000);
 
 OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(buffer_end_close);
 OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
@@ -4525,7 +4271,7 @@ exit_invalid[8] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
 OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800);
 jump = JUMP(SLJIT_NOT_ZERO);
 
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 /* Three-byte sequence. */
 JUMPHERE(jump);
@@ -4555,7 +4301,7 @@ for (i = 0; i < 11; i++)
   sljit_set_label(exit_invalid[i], exit_invalid_label);
 
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 static void do_utfreadnewline_invalid(compiler_common *common)
@@ -4586,7 +4332,7 @@ if (common->nltype != NLTYPE_ANY)
   JUMPHERE(jump[0]);
 
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
-  OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+  sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
   return;
   }
 
@@ -4617,14 +4363,14 @@ JUMPHERE(jump[0]);
 JUMPHERE(jump[4]);
 
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 /* Two byte long newline: 0x85. */
 JUMPHERE(jump[1]);
 CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0x85, skip_start);
 
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0x85);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 /* Three byte long newlines: 0x2028 and 0x2029. */
 JUMPHERE(jump[2]);
@@ -4639,7 +4385,7 @@ CMPTO(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x40, skip_start);
 
 OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0x2000);
 OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 static void do_utfmoveback_invalid(compiler_common *common)
@@ -4668,7 +4414,7 @@ jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x20);
 
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1);
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 /* Three-byte sequence. */
 JUMPHERE(jump);
@@ -4681,7 +4427,7 @@ jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x10);
 
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1);
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 /* Four-byte sequence. */
 JUMPHERE(jump);
@@ -4694,7 +4440,7 @@ exit_invalid[3] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x05);
 
 exit_ok_label = LABEL();
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 /* Two-byte sequence. */
 JUMPHERE(buffer_start_close);
@@ -4724,7 +4470,7 @@ sljit_set_label(exit_invalid[5], exit_invalid_label);
 sljit_set_label(exit_invalid[6], exit_invalid_label);
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3));
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(exit_invalid[4]);
 /* -2 + 4 = 2 */
@@ -4735,7 +4481,7 @@ for (i = 0; i < 4; i++)
   sljit_set_label(exit_invalid[i], exit_invalid_label);
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(4));
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 static void do_utfpeakcharback(compiler_common *common)
@@ -4772,7 +4518,7 @@ OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
 OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80);
 OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
 
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 static void do_utfpeakcharback_invalid(compiler_common *common)
@@ -4802,7 +4548,7 @@ two_byte_entry = LABEL();
 OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);
 /* If TMP1 is in 0x80-0xbf range, TMP1 is also increased by (0x2 << 6). */
 OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(jump[1]);
 OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc2 - 0x80);
@@ -4840,7 +4586,7 @@ if (has_cmov)
 else
   exit_invalid[3] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x800);
 
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(jump[1]);
 OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xe0 - 0x80);
@@ -4866,7 +4612,7 @@ else
   exit_invalid[5] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x100000);
 
 OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(jump[0]);
 OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
@@ -4889,7 +4635,7 @@ OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xe0);
 CMPTO(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0x10, three_byte_entry);
 
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(jump[0]);
 exit_invalid[7] = CMP(SLJIT_GREATER, TMP2, 0, STR_PTR, 0);
@@ -4904,7 +4650,7 @@ for (i = 0; i < 8; i++)
   sljit_set_label(exit_invalid[i], exit_invalid_label);
 
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
@@ -4934,13 +4680,13 @@ OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x10000);
 exit_invalid[2] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x400);
 
 OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(exit_invalid[0]);
 JUMPHERE(exit_invalid[1]);
 JUMPHERE(exit_invalid[2]);
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 static void do_utfreadnewline_invalid(compiler_common *common)
@@ -4967,12 +4713,12 @@ OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0x10000);
 OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCHAR_SHIFT);
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
 
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(exit_invalid[0]);
 JUMPHERE(exit_invalid[1]);
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 static void do_utfmoveback_invalid(compiler_common *common)
@@ -4992,7 +4738,7 @@ exit_invalid[2] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x400);
 
 OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(exit_invalid[0]);
 JUMPHERE(exit_invalid[1]);
@@ -5000,7 +4746,7 @@ JUMPHERE(exit_invalid[2]);
 
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 static void do_utfpeakcharback_invalid(compiler_common *common)
@@ -5025,14 +4771,14 @@ OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10);
 OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
 
 JUMPHERE(jump);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(exit_invalid[0]);
 JUMPHERE(exit_invalid[1]);
 JUMPHERE(exit_invalid[2]);
 
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 #endif /* PCRE2_CODE_UNIT_WIDTH == 16 */
@@ -5078,7 +4824,7 @@ OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCD_BLOCK_SHIFT);
 OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
 OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_stage2));
 OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM2(TMP2, TMP1), 1);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 static void do_getucdtype(compiler_common *common)
@@ -5125,7 +4871,7 @@ OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 2);
 OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
 OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 1);
 
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 #endif /* SUPPORT_UNICODE */
@@ -5413,8 +5159,6 @@ while (TRUE)
     case OP_ASSERT_NOT:
     case OP_ASSERTBACK:
     case OP_ASSERTBACK_NOT:
-    case OP_ASSERT_NA:
-    case OP_ASSERTBACK_NA:
     cc = bracketend(cc);
     continue;
 
@@ -5714,12 +5458,7 @@ while (TRUE)
 #endif
       {
       chr = *cc;
-#ifdef SUPPORT_UNICODE
-      if (common->ucp && chr > 127)
-        othercase[0] = UCD_OTHERCASE(chr);
-      else
-#endif
-        othercase[0] = TABLE_GET(chr, common->fcc, chr);
+      othercase[0] = TABLE_GET(chr, common->fcc, chr);
       }
     }
   else
@@ -6148,8 +5887,8 @@ oc = first_char;
 if ((common->re->flags & PCRE2_FIRSTCASELESS) != 0)
   {
   oc = TABLE_GET(first_char, common->fcc, first_char);
-#if defined SUPPORT_UNICODE
-  if (first_char > 127 && (common->utf || common->ucp))
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+  if (first_char > 127 && common->utf)
     oc = UCD_OTHERCASE(first_char);
 #endif
   }
@@ -6333,80 +6072,67 @@ if (common->match_end_ptr != 0)
   OP1(SLJIT_MOV, STR_END, 0, RETURN_ADDR, 0);
 }
 
-static SLJIT_INLINE jump_list *search_requested_char(compiler_common *common, PCRE2_UCHAR req_char, BOOL caseless, BOOL has_firstchar)
+static SLJIT_INLINE struct sljit_jump *search_requested_char(compiler_common *common, PCRE2_UCHAR req_char, BOOL caseless, BOOL has_firstchar)
 {
 DEFINE_COMPILER;
 struct sljit_label *loop;
 struct sljit_jump *toolong;
-struct sljit_jump *already_found;
+struct sljit_jump *alreadyfound;
 struct sljit_jump *found;
-struct sljit_jump *found_oc = NULL;
-jump_list *not_found = NULL;
+struct sljit_jump *foundoc = NULL;
+struct sljit_jump *notfound;
 sljit_u32 oc, bit;
 
 SLJIT_ASSERT(common->req_char_ptr != 0);
-OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(REQ_CU_MAX) * 100);
-OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->req_char_ptr);
-toolong = CMP(SLJIT_LESS, TMP2, 0, STR_END, 0);
-already_found = CMP(SLJIT_LESS, STR_PTR, 0, TMP1, 0);
+OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->req_char_ptr);
+OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, REQ_CU_MAX);
+toolong = CMP(SLJIT_LESS, TMP1, 0, STR_END, 0);
+alreadyfound = CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0);
 
 if (has_firstchar)
   OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
 else
   OP1(SLJIT_MOV, TMP1, 0, STR_PTR, 0);
 
+loop = LABEL();
+notfound = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_END, 0);
+
+OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(TMP1), 0);
 oc = req_char;
 if (caseless)
   {
   oc = TABLE_GET(req_char, common->fcc, req_char);
-#if defined SUPPORT_UNICODE
-  if (req_char > 127 && (common->utf || common->ucp))
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+  if (req_char > 127 && common->utf)
     oc = UCD_OTHERCASE(req_char);
 #endif
   }
-
-#ifdef JIT_HAS_FAST_REQUESTED_CHAR_SIMD
-if (JIT_HAS_FAST_REQUESTED_CHAR_SIMD)
-  {
-  not_found = fast_requested_char_simd(common, req_char, oc);
-  }
+if (req_char == oc)
+  found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char);
 else
-#endif
   {
-  loop = LABEL();
-  add_jump(compiler, &not_found, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_END, 0));
-
-  OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(TMP1), 0);
-
-  if (req_char == oc)
-    found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char);
+  bit = req_char ^ oc;
+  if (is_powerof2(bit))
+    {
+    OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, bit);
+    found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char | bit);
+    }
   else
     {
-    bit = req_char ^ oc;
-    if (is_powerof2(bit))
-      {
-       OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, bit);
-      found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char | bit);
-      }
-    else
-      {
-      found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char);
-      found_oc = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, oc);
-      }
+    found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char);
+    foundoc = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, oc);
     }
-  OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
-  JUMPTO(SLJIT_JUMP, loop);
-
-  JUMPHERE(found);
-  if (found_oc)
-    JUMPHERE(found_oc);
   }
+OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
+JUMPTO(SLJIT_JUMP, loop);
 
+JUMPHERE(found);
+if (foundoc)
+  JUMPHERE(foundoc);
 OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->req_char_ptr, TMP1, 0);
-
-JUMPHERE(already_found);
+JUMPHERE(alreadyfound);
 JUMPHERE(toolong);
-return not_found;
+return notfound;
 }
 
 static void do_revertframes(compiler_common *common)
@@ -6444,7 +6170,7 @@ JUMPTO(SLJIT_JUMP, mainloop);
 JUMPHERE(jump);
 jump = CMP(SLJIT_NOT_ZERO /* SIG_LESS */, TMP2, 0, SLJIT_IMM, 0);
 /* End of reverting values. */
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 
 JUMPHERE(jump);
 OP1(SLJIT_NEG, TMP2, 0, TMP2, 0);
@@ -6514,7 +6240,7 @@ else
 
 /* Testing char type. */
 #ifdef SUPPORT_UNICODE
-if (common->ucp)
+if (common->use_ucp)
   {
   OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1);
   jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE);
@@ -6560,7 +6286,7 @@ peek_char(common, READ_CHAR_MAX, SLJIT_MEM1(SLJIT_SP), LOCALS1, &invalid_utf2);
 
 valid_utf = LABEL();
 
-if (common->ucp)
+if (common->use_ucp)
   {
   OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1);
   jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE);
@@ -6600,7 +6326,7 @@ set_jumps(skipread_list, LABEL());
 
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
 OP2(SLJIT_XOR | SLJIT_SET_Z, TMP2, 0, TMP2, 0, TMP3, 0);
-OP_SRC(SLJIT_FAST_RETURN, TMP1, 0);
+sljit_emit_fast_return(compiler, TMP1, 0);
 
 #ifdef SUPPORT_UNICODE
 if (common->invalid_utf)
@@ -6612,12 +6338,12 @@ if (common->invalid_utf)
 
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
   OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, -1);
-  OP_SRC(SLJIT_FAST_RETURN, TMP1, 0);
+  sljit_emit_fast_return(compiler, TMP1, 0);
 
   set_jumps(invalid_utf2, LABEL());
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
   OP1(SLJIT_MOV, TMP2, 0, TMP3, 0);
-  OP_SRC(SLJIT_FAST_RETURN, TMP1, 0);
+  sljit_emit_fast_return(compiler, TMP1, 0);
   }
 #endif /* SUPPORT_UNICODE */
 }
@@ -6907,7 +6633,7 @@ if (common->utf)
 #endif
 #endif /* SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == [16|32] */
 OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 static void check_hspace(compiler_common *common)
@@ -6946,7 +6672,7 @@ if (common->utf)
 #endif /* SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == [16|32] */
 OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);
 
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 static void check_vspace(compiler_common *common)
@@ -6974,7 +6700,7 @@ if (common->utf)
 #endif /* SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == [16|32] */
 OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);
 
-OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
+sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
 static void do_casefulcmp(compiler_common *common)
@@ -7054,7 +6780,7 @@ if (char1_reg == STR_END)
   OP1(SLJIT_MOV, char2_reg, 0, RETURN_ADDR, 0);
   }
 
-OP_SRC(SLJIT_FAST_RETURN, TMP1, 0);
+sljit_emit_fast_return(compiler, TMP1, 0);
 }
 
 static void do_caselesscmp(compiler_common *common)
@@ -7152,7 +6878,7 @@ if (char2_reg == STACK_TOP)
   }
 
 OP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);
-OP_SRC(SLJIT_FAST_RETURN, TMP1, 0);
+sljit_emit_fast_return(compiler, TMP1, 0);
 }
 
 static PCRE2_SPTR byte_sequence_compare(compiler_common *common, BOOL caseless, PCRE2_SPTR cc,
@@ -7463,13 +7189,7 @@ cc = ccbegin;
 if ((cc[-1] & XCL_NOT) != 0)
   read_char(common, min, max, backtracks, READ_CHAR_UPDATE_STR_PTR);
 else
-  {
-#ifdef SUPPORT_UNICODE
-  read_char(common, min, max, (needstype || needsscript) ? backtracks : NULL, 0);
-#else /* !SUPPORT_UNICODE */
   read_char(common, min, max, NULL, 0);
-#endif /* SUPPORT_UNICODE */
-  }
 
 if ((cc[-1] & XCL_HASPROP) == 0)
   {
@@ -7555,11 +7275,16 @@ if (needstype || needsscript)
   /* Before anything else, we deal with scripts. */
   if (needsscript)
     {
-    OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 3);
-    OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 2);
-    OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
+// PH hacking
+      OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2);
+      OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3);
+      OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
+
+    OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, script));
+
+      OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 0);
 
-    OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, script));
+    // OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3);
 
     ccbegin = cc;
 
@@ -7603,19 +7328,28 @@ if (needstype || needsscript)
     {
     if (!needschar)
       {
-      OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 3);
-      OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 2);
-      OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
+// PH hacking
+  OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2);
+  OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3);
+  OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
+  OP2(SLJIT_ADD, TMP1, 0, TMP2, 0, TMP1, 0);
 
-      OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
+      OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
+
+  OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 0);
+
+//      OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3);
       }
     else
       {
-      OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2);
+// PH hacking
+  OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2);
+
       OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3);
-      OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
 
-      OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
+  OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
+  OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
+
       OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
       typereg = RETURN_ADDR;
       }
@@ -8994,13 +8728,16 @@ if (common->utf && *cc == OP_REFI)
 
   CMPTO(SLJIT_EQUAL, TMP1, 0, char1_reg, 0, loop);
 
+// PH hacking
   OP1(SLJIT_MOV, TMP3, 0, TMP1, 0);
 
   add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL));
 
-  OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2);
+    OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2);
+
   OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3);
-  OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
+
+    OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
 
   OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records));
 
@@ -9860,8 +9597,7 @@ if (opcode == OP_ASSERT || opcode == OP_ASSERTBACK)
         }
       else
         {
-        SLJIT_ASSERT(extrasize == 3);
-        OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-1));
+        OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), 0);
         OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), bra == OP_BRAZERO ? STR_PTR : SLJIT_IMM, 0);
         }
       }
@@ -10193,7 +9929,7 @@ if (opcode == OP_CBRA || opcode == OP_SCBRA)
   BACKTRACK_AS(bracket_backtrack)->private_data_ptr = private_data_ptr;
   matchingpath += IMM2_SIZE;
   }
-else if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA || opcode == OP_ONCE || opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND)
+else if (opcode == OP_ONCE || opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND)
   {
   /* Other brackets simply allocate the next entry. */
   private_data_ptr = PRIVATE_DATA(ccbegin);
@@ -10378,7 +10114,7 @@ else if (opcode == OP_CBRA || opcode == OP_SCBRA)
     OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);
     }
   }
-else if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA || opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND)
+else if (opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND)
   {
   /* Saving the previous value. */
   OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
@@ -10504,9 +10240,6 @@ compile_matchingpath(common, matchingpath, cc, backtrack);
 if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
   return NULL;
 
-if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA)
-  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
-
 if (opcode == OP_ONCE)
   match_once_common(common, ket, BACKTRACK_AS(bracket_backtrack)->u.framesize, private_data_ptr, has_alternatives, needs_control_head);
 
@@ -11107,8 +10840,8 @@ backtrack_common *backtrack;
 PCRE2_UCHAR opcode;
 PCRE2_UCHAR type;
 sljit_u32 max = 0, exact;
-sljit_s32 early_fail_ptr = PRIVATE_DATA(cc + 1);
-sljit_s32 early_fail_type;
+BOOL fast_fail;
+sljit_s32 fast_str_ptr;
 BOOL charpos_enabled;
 PCRE2_UCHAR charpos_char;
 unsigned int charpos_othercasebit;
@@ -11122,27 +10855,21 @@ int base = (private_data_ptr == 0) ? SLJIT_MEM1(STACK_TOP) : SLJIT_MEM1(SLJIT_SP
 int offset0 = (private_data_ptr == 0) ? STACK(0) : private_data_ptr;
 int offset1 = (private_data_ptr == 0) ? STACK(1) : private_data_ptr + (int)sizeof(sljit_sw);
 int tmp_base, tmp_offset;
-#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
-BOOL use_tmp;
-#endif
 
 PUSH_BACKTRACK(sizeof(char_iterator_backtrack), cc, NULL);
 
-early_fail_type = (early_fail_ptr & 0x7);
-early_fail_ptr >>= 3;
+fast_str_ptr = PRIVATE_DATA(cc + 1);
+fast_fail = TRUE;
 
-/* During recursion, these optimizations are disabled. */
-if (common->early_fail_start_ptr == 0)
-  {
-  early_fail_ptr = 0;
-  early_fail_type = type_skip;
-  }
+SLJIT_ASSERT(common->fast_forward_bc_ptr == NULL || fast_str_ptr == 0 || cc == common->fast_forward_bc_ptr);
 
-SLJIT_ASSERT(common->fast_forward_bc_ptr != NULL || early_fail_ptr == 0
-  || (early_fail_ptr >= common->early_fail_start_ptr && early_fail_ptr <= common->early_fail_end_ptr));
+if (cc == common->fast_forward_bc_ptr)
+  fast_fail = FALSE;
+else if (common->fast_fail_start_ptr == 0)
+  fast_str_ptr = 0;
 
-if (early_fail_type == type_fail)
-  add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr));
+SLJIT_ASSERT(common->fast_forward_bc_ptr != NULL || fast_str_ptr == 0
+  || (fast_str_ptr >= common->fast_fail_start_ptr && fast_str_ptr <= common->fast_fail_end_ptr));
 
 cc = get_iterator_parameters(common, cc, &opcode, &type, &max, &exact, &end);
 
@@ -11157,11 +10884,13 @@ else
   tmp_offset = POSSESSIVE0;
   }
 
+if (fast_fail && fast_str_ptr != 0)
+  add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), fast_str_ptr));
+
 /* Handle fixed part first. */
 if (exact > 1)
   {
-  SLJIT_ASSERT(early_fail_ptr == 0);
-
+  SLJIT_ASSERT(fast_str_ptr == 0);
   if (common->mode == PCRE2_JIT_COMPLETE
 #ifdef SUPPORT_UNICODE
       && !common->utf
@@ -11186,31 +10915,18 @@ if (exact > 1)
     }
   }
 else if (exact == 1)
-  {
   compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE);
 
-  if (early_fail_type == type_fail_range)
-    {
-    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr);
-    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr + (int)sizeof(sljit_sw));
-    OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, TMP2, 0);
-    OP2(SLJIT_SUB, TMP2, 0, STR_PTR, 0, TMP2, 0);
-    add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_LESS_EQUAL, TMP2, 0, TMP1, 0));
-
-    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr + (int)sizeof(sljit_sw), STR_PTR, 0);
-    }
-  }
-
 switch(opcode)
   {
   case OP_STAR:
   case OP_UPTO:
-  SLJIT_ASSERT(early_fail_ptr == 0 || opcode == OP_STAR);
+  SLJIT_ASSERT(fast_str_ptr == 0 || opcode == OP_STAR);
 
   if (type == OP_ANYNL || type == OP_EXTUNI)
     {
     SLJIT_ASSERT(private_data_ptr == 0);
-    SLJIT_ASSERT(early_fail_ptr == 0);
+    SLJIT_ASSERT(fast_str_ptr == 0);
 
     allocate_stack(common, 2);
     OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
@@ -11229,7 +10945,7 @@ switch(opcode)
       OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, TMP1, 0);
       }
 
-    /* We cannot use TMP3 because of allocate_stack. */
+    /* We cannot use TMP3 because of this allocate_stack. */
     allocate_stack(common, 1);
     OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
     JUMPTO(SLJIT_JUMP, label);
@@ -11255,8 +10971,8 @@ switch(opcode)
       OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0);
       process_partial_match(common);
 
-      if (early_fail_ptr != 0)
-        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_END, 0);
+      if (fast_str_ptr != 0)
+        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_END, 0);
       BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
       break;
       }
@@ -11286,8 +11002,8 @@ switch(opcode)
 
       OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
 
-      if (early_fail_ptr != 0)
-        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
+      if (fast_str_ptr != 0)
+        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
       BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
       break;
       }
@@ -11314,7 +11030,7 @@ switch(opcode)
     if (charpos_enabled)
       {
       charpos_char = end[1];
-      /* Consume the OP_CHAR opcode. */
+      /* Consumpe the OP_CHAR opcode. */
       end += 2;
 #if PCRE2_CODE_UNIT_WIDTH == 8
       SLJIT_ASSERT((charpos_othercasebit >> 8) == 0);
@@ -11346,8 +11062,8 @@ switch(opcode)
       add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_ZERO));
       }
     compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE);
-    if (early_fail_ptr != 0)
-      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
+    if (fast_str_ptr != 0)
+      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
     JUMPHERE(jump);
 
     detect_partial_match(common, &backtrack->topbacktracks);
@@ -11360,7 +11076,6 @@ switch(opcode)
       allocate_stack(common, 2);
     OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
     OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
-
     if (opcode == OP_UPTO)
       {
       OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
@@ -11370,55 +11085,53 @@ switch(opcode)
     /* Search the last instance of charpos_char. */
     label = LABEL();
     compile_char1_matchingpath(common, type, cc, &no_match, FALSE);
-    if (early_fail_ptr != 0)
-      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
+    if (fast_str_ptr != 0)
+      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
     detect_partial_match(common, &no_match);
     OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
     if (charpos_othercasebit != 0)
       OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit);
-
     if (opcode == OP_STAR)
       {
       CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label);
       OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
-      JUMPTO(SLJIT_JUMP, label);
       }
     else
       {
       jump = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char);
       OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
       JUMPHERE(jump);
+      }
+
+    if (opcode == OP_UPTO)
+      {
       OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
       JUMPTO(SLJIT_NOT_ZERO, label);
       }
+    else
+      JUMPTO(SLJIT_JUMP, label);
 
     set_jumps(no_match, LABEL());
-    OP2(SLJIT_ADD, STR_PTR, 0, base, offset0, SLJIT_IMM, IN_UCHARS(1));
+    OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
+    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
     OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
     }
-  else
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+  else if (common->utf)
     {
     if (private_data_ptr == 0)
       allocate_stack(common, 2);
 
+    OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
     OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
-#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
-    use_tmp = (!HAS_VIRTUAL_REGISTERS && opcode == OP_STAR);
-    SLJIT_ASSERT(!use_tmp || tmp_base == TMP3);
 
-    if (common->utf)
-      OP1(SLJIT_MOV, use_tmp ? TMP3 : base, use_tmp ? 0 : offset0, STR_PTR, 0);
-#endif
     if (opcode == OP_UPTO)
       OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
 
     detect_partial_match(common, &no_match);
     label = LABEL();
-    compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);
-#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
-    if (common->utf)
-      OP1(SLJIT_MOV, use_tmp ? TMP3 : base, use_tmp ? 0 : offset0, STR_PTR, 0);
-#endif
+    compile_char1_matchingpath(common, type, cc, &no_match, FALSE);
+    OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
 
     if (opcode == OP_UPTO)
       {
@@ -11429,29 +11142,39 @@ switch(opcode)
     detect_partial_match_to(common, label);
     OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
 
-    set_jumps(no_char1_match, LABEL());
-#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
-    if (common->utf)
-      {
-      set_jumps(no_match, LABEL());
-      if (use_tmp)
-        {
-        OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);
-        OP1(SLJIT_MOV, base, offset0, TMP3, 0);
-        }
-      else
-        OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
-      }
-    else
+    set_jumps(no_match, LABEL());
+    OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
+    if (fast_str_ptr != 0)
+      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+    }
 #endif
+  else
+    {
+    if (private_data_ptr == 0)
+      allocate_stack(common, 2);
+
+    OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
+    if (opcode == OP_UPTO)
+      OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
+
+    detect_partial_match(common, &no_match);
+    label = LABEL();
+    compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);
+    if (opcode == OP_UPTO)
       {
-      OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
-      set_jumps(no_match, LABEL());
-      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+      OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+      add_jump(compiler, &no_match, JUMP(SLJIT_ZERO));
       }
 
-    if (early_fail_ptr != 0)
-      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
+    detect_partial_match_to(common, label);
+    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+
+    set_jumps(no_char1_match, LABEL());
+    OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+    set_jumps(no_match, LABEL());
+    OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+    if (fast_str_ptr != 0)
+      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
     }
 
   BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
@@ -11462,12 +11185,12 @@ switch(opcode)
     allocate_stack(common, 1);
   OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
   BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
-  if (early_fail_ptr != 0)
-    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
+  if (fast_str_ptr != 0)
+    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
   break;
 
   case OP_MINUPTO:
-  SLJIT_ASSERT(early_fail_ptr == 0);
+  SLJIT_ASSERT(fast_str_ptr == 0);
   if (private_data_ptr == 0)
     allocate_stack(common, 2);
   OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
@@ -11477,7 +11200,7 @@ switch(opcode)
 
   case OP_QUERY:
   case OP_MINQUERY:
-  SLJIT_ASSERT(early_fail_ptr == 0);
+  SLJIT_ASSERT(fast_str_ptr == 0);
   if (private_data_ptr == 0)
     allocate_stack(common, 1);
   OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
@@ -11498,8 +11221,8 @@ switch(opcode)
     {
     OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0);
     process_partial_match(common);
-    if (early_fail_ptr != 0)
-      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_END, 0);
+    if (fast_str_ptr != 0)
+      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_END, 0);
     break;
     }
 
@@ -11515,17 +11238,16 @@ switch(opcode)
 
     set_jumps(no_match, LABEL());
     OP1(SLJIT_MOV, STR_PTR, 0, tmp_base, tmp_offset);
-    if (early_fail_ptr != 0)
+    if (fast_str_ptr != 0)
       {
-      if (!HAS_VIRTUAL_REGISTERS && tmp_base == TMP3)
-        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, TMP3, 0);
+      if (tmp_base == TMP3)
+        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, TMP3, 0);
       else
-        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
+        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
       }
     break;
     }
 #endif
-
   detect_partial_match(common, &no_match);
   label = LABEL();
   compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);
@@ -11535,12 +11257,12 @@ switch(opcode)
   set_jumps(no_char1_match, LABEL());
   OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
   set_jumps(no_match, LABEL());
-  if (early_fail_ptr != 0)
-    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
+  if (fast_str_ptr != 0)
+    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
   break;
 
   case OP_POSUPTO:
-  SLJIT_ASSERT(early_fail_ptr == 0);
+  SLJIT_ASSERT(fast_str_ptr == 0);
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
   if (common->utf)
     {
@@ -11576,6 +11298,9 @@ switch(opcode)
       process_partial_match(common);
       JUMPHERE(jump);
       }
+
+    if (fast_str_ptr != 0)
+      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
     break;
     }
 
@@ -11595,7 +11320,7 @@ switch(opcode)
   break;
 
   case OP_POSQUERY:
-  SLJIT_ASSERT(early_fail_ptr == 0);
+  SLJIT_ASSERT(fast_str_ptr == 0);
   OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
   compile_char1_matchingpath(common, type, cc, &no_match, TRUE);
   OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
@@ -11970,8 +11695,6 @@ while (cc < ccend)
     count_match(common);
     break;
 
-    case OP_ASSERT_NA:
-    case OP_ASSERTBACK_NA:
     case OP_ONCE:
     case OP_SCRIPT_RUN:
     case OP_BRA:
@@ -12509,7 +12232,6 @@ else if (has_alternatives)
 
     SLJIT_ASSERT(CURRENT_AS(bracket_backtrack)->u.matching_put_label);
     sljit_set_put_label(CURRENT_AS(bracket_backtrack)->u.matching_put_label, LABEL());
-    sljit_emit_op0(compiler, SLJIT_ENDBR);
     }
   else
     next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0);
@@ -12576,9 +12298,6 @@ if (has_alternatives)
       if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
         return;
 
-      if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA)
-        OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
-
       if (opcode == OP_SCRIPT_RUN)
         match_script_run_common(common, private_data_ptr, current);
       }
@@ -12660,10 +12379,7 @@ if (has_alternatives)
           }
         }
       else
-        {
         sljit_set_put_label(put_label, LABEL());
-        sljit_emit_op0(compiler, SLJIT_ENDBR);
-        }
       }
 
     COMPILE_BACKTRACKINGPATH(current->top);
@@ -12711,7 +12427,7 @@ if (offset != 0)
     OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);
     }
   }
-else if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA || opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND)
+else if (opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND)
   {
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(0));
   free_stack(common, 1);
@@ -13059,8 +12775,6 @@ while (current)
     compile_assert_backtrackingpath(common, current);
     break;
 
-    case OP_ASSERT_NA:
-    case OP_ASSERTBACK_NA:
     case OP_ONCE:
     case OP_SCRIPT_RUN:
     case OP_BRA:
@@ -13158,7 +12872,7 @@ jump_list *match = NULL;
 struct sljit_jump *next_alt = NULL;
 struct sljit_jump *accept_exit = NULL;
 struct sljit_label *quit;
-struct sljit_put_label *put_label = NULL;
+struct sljit_put_label *put_label;
 
 /* Recurse captures then. */
 common->then_trap = NULL;
@@ -13255,7 +12969,6 @@ while (1)
         {
         sljit_emit_ijump(compiler, SLJIT_JUMP, TMP1, 0);
         sljit_set_put_label(put_label, LABEL());
-        sljit_emit_op0(compiler, SLJIT_ENDBR);
         }
       else
         next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0);
@@ -13264,10 +12977,7 @@ while (1)
       free_stack(common, has_accept ? 2 : 1);
     }
   else if (alt_max > 3)
-    {
     sljit_set_put_label(put_label, LABEL());
-    sljit_emit_op0(compiler, SLJIT_ENDBR);
-    }
   else
     {
     JUMPHERE(next_alt);
@@ -13301,7 +13011,7 @@ copy_recurse_data(common, ccbegin, ccend, recurse_copy_private_to_global, local_
 OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(local_size - 1));
 free_stack(common, private_data_size + local_size);
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
-OP_SRC(SLJIT_FAST_RETURN, TMP2, 0);
+sljit_emit_fast_return(compiler, TMP2, 0);
 
 if (common->quit != NULL)
   {
@@ -13326,7 +13036,7 @@ if (has_accept)
   OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(local_size - 1));
   free_stack(common, private_data_size + local_size);
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
-  OP_SRC(SLJIT_FAST_RETURN, TMP2, 0);
+  sljit_emit_fast_return(compiler, TMP2, 0);
   }
 
 if (common->accept != NULL)
@@ -13350,7 +13060,7 @@ copy_recurse_data(common, ccbegin, ccend, recurse_swap_global, local_size, priva
 
 OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP2), STACK(local_size - 1));
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1);
-OP_SRC(SLJIT_FAST_RETURN, TMP2, 0);
+sljit_emit_fast_return(compiler, TMP2, 0);
 }
 
 #undef COMPILE_BACKTRACKINGPATH
@@ -13382,9 +13092,9 @@ struct sljit_label *reset_match_label;
 struct sljit_label *quit_label;
 struct sljit_jump *jump;
 struct sljit_jump *minlength_check_failed = NULL;
+struct sljit_jump *reqbyte_notfound = NULL;
 struct sljit_jump *empty_match = NULL;
 struct sljit_jump *end_anchor_failed = NULL;
-jump_list *reqcu_not_found = NULL;
 
 SLJIT_ASSERT(tables);
 
@@ -13412,8 +13122,8 @@ common->read_only_data_head = NULL;
 common->fcc = tables + fcc_offset;
 common->lcc = (sljit_sw)(tables + lcc_offset);
 common->mode = mode;
-common->might_be_empty = (re->minlength == 0) || (re->flags & PCRE2_MATCH_EMPTY);
-common->allow_empty_partial = (re->max_lookbehind > 0) || (re->flags & PCRE2_MATCH_EMPTY);
+common->might_be_empty = re->minlength == 0;
+common->allow_empty_partial = (re->max_lookbehind > 0) || (re->flags & PCRE2_MATCH_EMPTY) != 0;
 common->nltype = NLTYPE_FIXED;
 switch(re->newline_convention)
   {
@@ -13450,7 +13160,7 @@ common->alt_circumflex = (re->overall_options & PCRE2_ALT_CIRCUMFLEX) != 0;
 #ifdef SUPPORT_UNICODE
 /* PCRE_UTF[16|32] have the same value as PCRE_UTF8. */
 common->utf = (re->overall_options & PCRE2_UTF) != 0;
-common->ucp = (re->overall_options & PCRE2_UCP) != 0;
+common->use_ucp = (re->overall_options & PCRE2_UCP) != 0;
 if (common->utf)
   {
   if (common->nltype == NLTYPE_ANY)
@@ -13562,10 +13272,13 @@ memset(common->private_data_ptrs, 0, total_length * sizeof(sljit_s32));
 
 private_data_size = common->cbra_ptr + (re->top_bracket + 1) * sizeof(sljit_sw);
 set_private_data_ptrs(common, &private_data_size, ccend);
-if ((re->overall_options & PCRE2_ANCHORED) == 0 && (re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0 && !common->has_skip_in_assert_back)
-  detect_early_fail(common, common->start, &private_data_size, 0, 0);
+if ((re->overall_options & PCRE2_ANCHORED) == 0 && (re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
+  {
+  if (!detect_fast_forward_skip(common, &private_data_size) && !common->has_skip_in_assert_back)
+    detect_fast_fail(common, common->start, &private_data_size, 4);
+  }
 
-SLJIT_ASSERT(common->early_fail_start_ptr <= common->early_fail_end_ptr);
+SLJIT_ASSERT(common->fast_fail_start_ptr <= common->fast_fail_end_ptr);
 
 if (private_data_size > SLJIT_MAX_LOCAL_SIZE)
   {
@@ -13609,8 +13322,8 @@ OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_sta
 OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
 OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH, TMP1, 0);
 
-if (common->early_fail_start_ptr < common->early_fail_end_ptr)
-  reset_early_fail(common);
+if (common->fast_fail_start_ptr < common->fast_fail_end_ptr)
+  reset_fast_fail(common);
 
 if (mode == PCRE2_JIT_PARTIAL_SOFT)
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1);
@@ -13647,7 +13360,7 @@ if (mode == PCRE2_JIT_COMPLETE && re->minlength > 0 && (re->overall_options & PC
   minlength_check_failed = CMP(SLJIT_GREATER, TMP2, 0, STR_END, 0);
   }
 if (common->req_char_ptr != 0)
-  reqcu_not_found = search_requested_char(common, (PCRE2_UCHAR)(re->last_codeunit), (re->flags & PCRE2_LASTCASELESS) != 0, (re->flags & PCRE2_FIRSTSET) != 0);
+  reqbyte_notfound = search_requested_char(common, (PCRE2_UCHAR)(re->last_codeunit), (re->flags & PCRE2_LASTCASELESS) != 0, (re->flags & PCRE2_FIRSTSET) != 0);
 
 /* Store the current STR_PTR in OVECTOR(0). */
 OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), STR_PTR, 0);
@@ -13656,7 +13369,7 @@ OP1(SLJIT_MOV, COUNT_MATCH, 0, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH);
 if (common->capture_last_ptr != 0)
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, 0);
 if (common->fast_forward_bc_ptr != NULL)
-  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), PRIVATE_DATA(common->fast_forward_bc_ptr + 1) >> 3, STR_PTR, 0);
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), PRIVATE_DATA(common->fast_forward_bc_ptr + 1), STR_PTR, 0);
 
 if (common->start_ptr != OVECTOR(0))
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_ptr, STR_PTR, 0);
@@ -13703,8 +13416,6 @@ if (common->abort != NULL)
   set_jumps(common->abort, common->abort_label);
 if (minlength_check_failed != NULL)
   SET_LABEL(minlength_check_failed, common->abort_label);
-
-sljit_emit_op0(compiler, SLJIT_SKIP_FRAMES_BEFORE_RETURN);
 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
 
 if (common->failed_match != NULL)
@@ -13757,7 +13468,7 @@ if ((re->overall_options & PCRE2_ANCHORED) == 0 && common->match_end_ptr != 0)
   }
 
 OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP),
-    (common->fast_forward_bc_ptr != NULL) ? (PRIVATE_DATA(common->fast_forward_bc_ptr + 1) >> 3) : common->start_ptr);
+    (common->fast_forward_bc_ptr != NULL) ? (PRIVATE_DATA(common->fast_forward_bc_ptr + 1)) : common->start_ptr);
 
 if ((re->overall_options & PCRE2_ANCHORED) == 0)
   {
@@ -13782,8 +13493,8 @@ if ((re->overall_options & PCRE2_ANCHORED) == 0)
   }
 
 /* No more remaining characters. */
-if (reqcu_not_found != NULL)
-  set_jumps(reqcu_not_found, LABEL());
+if (reqbyte_notfound != NULL)
+  JUMPHERE(reqbyte_notfound);
 
 if (mode == PCRE2_JIT_PARTIAL_SOFT)
   CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1, common->partialmatchlabel);
@@ -13808,8 +13519,8 @@ if (common->might_be_empty)
   }
 
 common->fast_forward_bc_ptr = NULL;
-common->early_fail_start_ptr = 0;
-common->early_fail_end_ptr = 0;
+common->fast_fail_start_ptr = 0;
+common->fast_fail_end_ptr = 0;
 common->currententry = common->entries;
 common->local_quit_available = TRUE;
 quit_label = common->quit_label;
@@ -13852,7 +13563,7 @@ OP1(SLJIT_MOV, TMP2, 0, STACK_LIMIT, 0);
 OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_RETURN_REG, 0);
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
 OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);
-OP_SRC(SLJIT_FAST_RETURN, TMP1, 0);
+sljit_emit_fast_return(compiler, TMP1, 0);
 
 /* Allocation failed. */
 JUMPHERE(jump);
@@ -14031,6 +13742,11 @@ pcre2_jit_compile(pcre2_code *code, uint32_t options)
 {
 pcre2_real_code *re = (pcre2_real_code *)code;
 
+#ifdef SUPPORT_JIT
+executable_functions *functions = (executable_functions *)re->executable_jit;
+static int executable_allocator_is_working = 0;
+#endif
+
 if (code == NULL)
   return PCRE2_ERROR_NULL;
 
@@ -14063,11 +13779,6 @@ actions are needed:
      avoid compiler warnings.
 */
 
-#ifdef SUPPORT_JIT
-executable_functions *functions = (executable_functions *)re->executable_jit;
-static int executable_allocator_is_working = 0;
-#endif
-
 if ((options & PCRE2_JIT_INVALID_UTF) != 0)
   {
   if ((re->overall_options & PCRE2_MATCH_INVALID_UTF) == 0)
index 36abdbaf9c53670f13acbad9f95e1cb24c5db556..efdb05580f565d60cb40317d1e4e9aca52b846c2 100644 (file)
@@ -145,11 +145,6 @@ maxsize = (maxsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1);
 jit_stack = PRIV(memctl_malloc)(sizeof(pcre2_real_jit_stack), (pcre2_memctl *)gcontext);
 if (jit_stack == NULL) return NULL;
 jit_stack->stack = sljit_allocate_stack(startsize, maxsize, &jit_stack->memctl);
-if (jit_stack->stack == NULL)
-  {
-  jit_stack->memctl.free(jit_stack, jit_stack->memctl.memory_data);
-  return NULL;
-  }
 return jit_stack;
 
 #endif
index 66373b6cb0e055e6a9dec13697da6c75b95cb0b6..0265f36a0b3093fbeb8c8b699cdca1a805881861 100644 (file)
@@ -215,7 +215,7 @@ if (p1 < str_ptr)
   }
 else
   data2 = shift_left_n_lanes(data, offs1 - offs2);
+
 if (compare1_type == compare_match1)
   data = VCEQQ(data, cmp1a);
 else
index 5673d338c016c998c0abce8f3c22c85a8f130c0d..f7d56b29f8d07a95521b413911b41a6ef82449e4 100644 (file)
@@ -344,136 +344,6 @@ if (common->utf && offset > 0)
 #endif
 }
 
-#define JIT_HAS_FAST_REQUESTED_CHAR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SSE2))
-
-static jump_list *fast_requested_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2)
-{
-DEFINE_COMPILER;
-struct sljit_label *start;
-struct sljit_jump *quit;
-jump_list *not_found = NULL;
-sse2_compare_type compare_type = sse2_compare_match1;
-sljit_u8 instruction[8];
-sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1);
-sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR);
-sljit_s32 data_ind = 0;
-sljit_s32 tmp_ind = 1;
-sljit_s32 cmp1_ind = 2;
-sljit_s32 cmp2_ind = 3;
-sljit_u32 bit = 0;
-int i;
-
-if (char1 != char2)
-  {
-  bit = char1 ^ char2;
-  compare_type = sse2_compare_match1i;
-
-  if (!is_powerof2(bit))
-    {
-    bit = 0;
-    compare_type = sse2_compare_match2;
-    }
-  }
-
-add_jump(compiler, &not_found, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_END, 0));
-OP1(SLJIT_MOV, TMP2, 0, TMP1, 0);
-OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0);
-
-/* First part (unaligned start) */
-
-OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1 | bit));
-
-SLJIT_ASSERT(tmp1_reg_ind < 8);
-
-/* MOVD xmm, r/m32 */
-instruction[0] = 0x66;
-instruction[1] = 0x0f;
-instruction[2] = 0x6e;
-instruction[3] = 0xc0 | (cmp1_ind << 3) | tmp1_reg_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-if (char1 != char2)
-  {
-  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(bit != 0 ? bit : char2));
-
-  /* MOVD xmm, r/m32 */
-  instruction[3] = 0xc0 | (cmp2_ind << 3) | tmp1_reg_ind;
-  sljit_emit_op_custom(compiler, instruction, 4);
-  }
-
-OP1(SLJIT_MOV, STR_PTR, 0, TMP2, 0);
-
-/* PSHUFD xmm1, xmm2/m128, imm8 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x70;
-instruction[3] = 0xc0 | (cmp1_ind << 3) | cmp1_ind;
-instruction[4] = 0;
-sljit_emit_op_custom(compiler, instruction, 5);
-
-if (char1 != char2)
-  {
-  /* PSHUFD xmm1, xmm2/m128, imm8 */
-  instruction[3] = 0xc0 | (cmp2_ind << 3) | cmp2_ind;
-  sljit_emit_op_custom(compiler, instruction, 5);
-  }
-
-OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf);
-OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf);
-
-load_from_mem_sse2(compiler, data_ind, str_ptr_reg_ind, 0);
-for (i = 0; i < 4; i++)
-  fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
-
-/* PMOVMSKB reg, xmm */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xd7;
-instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | data_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
-OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0);
-
-quit = CMP(SLJIT_NOT_ZERO, TMP1, 0, SLJIT_IMM, 0);
-
-OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
-
-/* Second part (aligned) */
-start = LABEL();
-
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16);
-
-add_jump(compiler, &not_found, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
-
-load_from_mem_sse2(compiler, data_ind, str_ptr_reg_ind, 0);
-for (i = 0; i < 4; i++)
-  fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
-
-/* PMOVMSKB reg, xmm */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xd7;
-instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | data_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-CMPTO(SLJIT_ZERO, TMP1, 0, SLJIT_IMM, 0, start);
-
-JUMPHERE(quit);
-
-/* BSF r32, r/m32 */
-instruction[0] = 0x0f;
-instruction[1] = 0xbc;
-instruction[2] = 0xc0 | (tmp1_reg_ind << 3) | tmp1_reg_ind;
-sljit_emit_op_custom(compiler, instruction, 3);
-
-OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, STR_PTR, 0);
-add_jump(compiler, &not_found, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_END, 0));
-
-OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);
-return not_found;
-}
-
 #ifndef _WIN64
 
 static SLJIT_INLINE sljit_u32 max_fast_forward_char_pair_offset(void)
index 56d24940232e13ec180fd878046ec69a0afba490..8c93b4b57373ecfec2eeeb29c9a01a8a67cbe696 100644 (file)
@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2020 University of Cambridge
+          New API code Copyright (c) 2016-2019 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -41,11 +41,10 @@ POSSIBILITY OF SUCH DAMAGE.
 
 /* This module contains the external function pcre2_maketables(), which builds
 character tables for PCRE2 in the current locale. The file is compiled on its
-own as part of the PCRE2 library. It is also included in the compilation of
-pcre2_dftables.c as a freestanding program, in which case the macro
-PCRE2_DFTABLES is defined. */
+own as part of the PCRE2 library. However, it is also included in the
+compilation of dftables.c, in which case the macro DFTABLES is defined. */
 
-#ifndef PCRE2_DFTABLES    /* Compiling the library */
+#ifndef DFTABLES
 #  ifdef HAVE_CONFIG_H
 #  include "config.h"
 #  endif
@@ -62,29 +61,28 @@ PCRE2_DFTABLES is defined. */
 a pointer to them. They are build using the ctype functions, and consequently
 their contents will depend upon the current locale setting. When compiled as
 part of the library, the store is obtained via a general context malloc, if
-supplied, but when PCRE2_DFTABLES is defined (when compiling the pcre2_dftables
-freestanding auxiliary program) malloc() is used, and the function has a
-different name so as not to clash with the prototype in pcre2.h.
+supplied, but when DFTABLES is defined (when compiling the dftables auxiliary
+program) malloc() is used, and the function has a different name so as not to
+clash with the prototype in pcre2.h.
 
-Arguments:   none when PCRE2_DFTABLES is defined
-               else a PCRE2 general context or NULL
+Arguments:   none when DFTABLES is defined
+             else a PCRE2 general context or NULL
 Returns:     pointer to the contiguous block of data
-               else NULL if memory allocation failed
 */
 
-#ifdef PCRE2_DFTABLES  /* Included in freestanding pcre2_dftables program */
+#ifdef DFTABLES  /* Included in freestanding dftables.c program */
 static const uint8_t *maketables(void)
 {
-uint8_t *yield = (uint8_t *)malloc(TABLES_LENGTH);
+uint8_t *yield = (uint8_t *)malloc(tables_length);
 
-#else  /* Not PCRE2_DFTABLES, that is, compiling the library */
+#else  /* Not DFTABLES, compiling the library */
 PCRE2_EXP_DEFN const uint8_t * PCRE2_CALL_CONVENTION
 pcre2_maketables(pcre2_general_context *gcontext)
 {
 uint8_t *yield = (uint8_t *)((gcontext != NULL)?
-  gcontext->memctl.malloc(TABLES_LENGTH, gcontext->memctl.memory_data) :
-  malloc(TABLES_LENGTH));
-#endif  /* PCRE2_DFTABLES */
+  gcontext->memctl.malloc(tables_length, gcontext->memctl.memory_data) :
+  malloc(tables_length));
+#endif  /* DFTABLES */
 
 int i;
 uint8_t *p;
@@ -105,8 +103,8 @@ exclusive ones - in some locales things may be different.
 
 Note that the table for "space" includes everything "isspace" gives, including
 VT in the default locale. This makes it work for the POSIX class [:space:].
-From PCRE1 release 8.34 and for all PCRE2 releases it is also correct for Perl
-space, because Perl added VT at release 5.18.
+From release 8.34 is is also correct for Perl space, because Perl added VT at
+release 5.18.
 
 Note also that it is possible for a character to be alnum or alpha without
 being lower or upper, such as "male and female ordinals" (\xAA and \xBA) in the
@@ -116,24 +114,24 @@ test for alnum specially. */
 memset(p, 0, cbit_length);
 for (i = 0; i < 256; i++)
   {
-  if (isdigit(i))  p[cbit_digit  + i/8] |= 1u << (i&7);
-  if (isupper(i))  p[cbit_upper  + i/8] |= 1u << (i&7);
-  if (islower(i))  p[cbit_lower  + i/8] |= 1u << (i&7);
-  if (isalnum(i))  p[cbit_word   + i/8] |= 1u << (i&7);
-  if (i == '_')    p[cbit_word   + i/8] |= 1u << (i&7);
-  if (isspace(i))  p[cbit_space  + i/8] |= 1u << (i&7);
-  if (isxdigit(i)) p[cbit_xdigit + i/8] |= 1u << (i&7);
-  if (isgraph(i))  p[cbit_graph  + i/8] |= 1u << (i&7);
-  if (isprint(i))  p[cbit_print  + i/8] |= 1u << (i&7);
-  if (ispunct(i))  p[cbit_punct  + i/8] |= 1u << (i&7);
-  if (iscntrl(i))  p[cbit_cntrl  + i/8] |= 1u << (i&7);
+  if (isdigit(i)) p[cbit_digit  + i/8] |= 1u << (i&7);
+  if (isupper(i)) p[cbit_upper  + i/8] |= 1u << (i&7);
+  if (islower(i)) p[cbit_lower  + i/8] |= 1u << (i&7);
+  if (isalnum(i)) p[cbit_word   + i/8] |= 1u << (i&7);
+  if (i == '_')   p[cbit_word   + i/8] |= 1u << (i&7);
+  if (isspace(i)) p[cbit_space  + i/8] |= 1u << (i&7);
+  if (isxdigit(i))p[cbit_xdigit + i/8] |= 1u << (i&7);
+  if (isgraph(i)) p[cbit_graph  + i/8] |= 1u << (i&7);
+  if (isprint(i)) p[cbit_print  + i/8] |= 1u << (i&7);
+  if (ispunct(i)) p[cbit_punct  + i/8] |= 1u << (i&7);
+  if (iscntrl(i)) p[cbit_cntrl  + i/8] |= 1u << (i&7);
   }
 p += cbit_length;
 
 /* Finally, the character type table. In this, we used to exclude VT from the
 white space chars, because Perl didn't recognize it as such for \s and for
-comments within regexes. However, Perl changed at release 5.18, so PCRE1
-changed at release 8.34 and it's always been this way for PCRE2. */
+comments within regexes. However, Perl changed at release 5.18, so PCRE changed
+at release 8.34. */
 
 for (i = 0; i < 256; i++)
   {
@@ -149,7 +147,7 @@ for (i = 0; i < 256; i++)
 return yield;
 }
 
-#ifndef PCRE2_DFTABLES   /* Compiling the library */
+#ifndef DFTABLES
 PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
 pcre2_maketables_free(pcre2_general_context *gcontext, const uint8_t *tables)
 {
index 11289d575d08d1326f86642f134451c5e3d1b6b6..48e7b9dbb2c409ce3592297e315ac786acd91135 100644 (file)
@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2015-2020 University of Cambridge
+          New API code Copyright (c) 2015-2019 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -381,12 +381,8 @@ length = Fovector[offset+1] - Fovector[offset];
 if (caseless)
   {
 #if defined SUPPORT_UNICODE
-  BOOL utf = (mb->poptions & PCRE2_UTF) != 0;
-
-  if (utf || (mb->poptions & PCRE2_UCP) != 0)
+  if ((mb->poptions & PCRE2_UTF) != 0)
     {
-    PCRE2_SPTR endptr = p + length;
-
     /* Match characters up to the end of the reference. NOTE: the number of
     code units matched may differ, because in UTF-8 there are some characters
     whose upper and lower case codes have different numbers of bytes. For
@@ -394,25 +390,16 @@ if (caseless)
     bytes in UTF-8); a sequence of 3 of the former uses 6 bytes, as does a
     sequence of two of the latter. It is important, therefore, to check the
     length along the reference, not along the subject (earlier code did this
-    wrong). UCP without uses Unicode properties but without UTF encoding. */
+    wrong). */
 
+    PCRE2_SPTR endptr = p + length;
     while (p < endptr)
       {
       uint32_t c, d;
       const ucd_record *ur;
       if (eptr >= mb->end_subject) return 1;   /* Partial match */
-
-      if (utf)
-        {
-        GETCHARINC(c, eptr);
-        GETCHARINC(d, p);
-        }
-      else
-        {
-        c = *eptr++;
-        d = *p++;
-        }
-
+      GETCHARINC(c, eptr);
+      GETCHARINC(d, p);
       ur = GET_UCD(d);
       if (c != d && c != (uint32_t)((int)d + ur->other_case))
         {
@@ -428,7 +415,7 @@ if (caseless)
   else
 #endif
 
-  /* Not in UTF or UCP mode */
+  /* Not in UTF mode */
     {
     for (; length > 0; length--)
       {
@@ -445,8 +432,7 @@ if (caseless)
   }
 
 /* In the caseful case, we can just compare the code units, whether or not we
-are in UTF and/or UCP mode. When partial matching, we have to do this unit by
-unit. */
+are in UTF mode. When partial matching, we have to do this unit-by-unit. */
 
 else
   {
@@ -588,8 +574,8 @@ match(PCRE2_SPTR start_eptr, PCRE2_SPTR start_ecode, PCRE2_SIZE *ovector,
 heapframe *F;           /* Current frame pointer */
 heapframe *N = NULL;    /* Temporary frame pointers */
 heapframe *P = NULL;
-heapframe *assert_accept_frame = NULL;  /* For passing back a frame with captures */
-PCRE2_SIZE frame_copy_size;     /* Amount to copy when creating a new frame */
+heapframe *assert_accept_frame;  /* For passing back the frame with captures */
+PCRE2_SIZE frame_copy_size;      /* Amount to copy when creating a new frame */
 
 /* Local variables that do not need to be preserved over calls to RRMATCH(). */
 
@@ -612,13 +598,12 @@ BOOL condition;         /* Used in conditional groups */
 BOOL cur_is_word;       /* Used in "word" tests */
 BOOL prev_is_word;      /* Used in "word" tests */
 
-/* UTF and UCP flags */
+/* UTF flag */
 
 #ifdef SUPPORT_UNICODE
 BOOL utf = (mb->poptions & PCRE2_UTF) != 0;
-BOOL ucp = (mb->poptions & PCRE2_UCP) != 0;
 #else
-BOOL utf = FALSE;  /* Required for convenience even when no Unicode support */
+BOOL utf = FALSE;
 #endif
 
 /* This is the length of the last part of a backtracking frame that must be
@@ -943,7 +928,6 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
       }
     else
 #endif
-
     /* Not UTF mode */
       {
       if (mb->end_subject - Feptr < 1)
@@ -1003,30 +987,10 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
         if (dc != fc && dc != UCD_OTHERCASE(fc)) RRETURN(MATCH_NOMATCH);
         }
       }
-
-    /* If UCP is set without UTF we must do the same as above, but with one
-    character per code unit. */
-
-    else if (ucp)
-      {
-      uint32_t cc = UCHAR21(Feptr);
-      fc = Fecode[1];
-      if (fc < 128)
-        {
-        if (mb->lcc[fc] != TABLE_GET(cc, mb->lcc, cc)) RRETURN(MATCH_NOMATCH);
-        }
-      else
-        {
-        if (cc != fc && cc != UCD_OTHERCASE(fc)) RRETURN(MATCH_NOMATCH);
-        }
-      Feptr++;
-      Fecode += 2;
-      }
-
     else
 #endif   /* SUPPORT_UNICODE */
 
-    /* Not UTF or UCP mode; use the table for characters < 256. */
+    /* Not UTF mode; use the table for characters < 256. */
       {
       if (TABLE_GET(Fecode[1], mb->lcc, Fecode[1])
           != TABLE_GET(*Feptr, mb->lcc, *Feptr)) RRETURN(MATCH_NOMATCH);
@@ -1046,7 +1010,6 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
       }
-
 #ifdef SUPPORT_UNICODE
     if (utf)
       {
@@ -1063,42 +1026,15 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
         if (ch > 127)
           ch = UCD_OTHERCASE(ch);
         else
-          ch = (mb->fcc)[ch];
-        if (ch == fc) RRETURN(MATCH_NOMATCH);
-        }
-      }
-
-    /* UCP without UTF is as above, but with one character per code unit. */
-
-    else if (ucp)
-      {
-      uint32_t ch;
-      fc = UCHAR21INC(Feptr);
-      ch = Fecode[1];
-      Fecode += 2;
-
-      if (ch == fc)
-        {
-        RRETURN(MATCH_NOMATCH);  /* Caseful match */
-        }
-      else if (Fop == OP_NOTI)   /* If caseless */
-        {
-        if (ch > 127)
-          ch = UCD_OTHERCASE(ch);
-        else
-          ch = (mb->fcc)[ch];
+          ch = TABLE_GET(ch, mb->fcc, ch);
         if (ch == fc) RRETURN(MATCH_NOMATCH);
         }
       }
-
     else
 #endif  /* SUPPORT_UNICODE */
-
-    /* Neither UTF nor UCP is set */
-
       {
       uint32_t ch = Fecode[1];
-      fc = UCHAR21INC(Feptr);
+      fc = *Feptr++;
       if (ch == fc || (Fop == OP_NOTI && TABLE_GET(ch, mb->fcc, ch) == fc))
         RRETURN(MATCH_NOMATCH);
       Fecode += 2;
@@ -1308,7 +1244,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
 #endif  /* SUPPORT_UNICODE */
 
     /* When not in UTF mode, load a single-code-unit character. Then proceed as
-    above, using Unicode casing if either UTF or UCP is set. */
+    above. */
 
     Lc = *Fecode++;
 
@@ -1317,15 +1253,11 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
     if (Fop >= OP_STARI)
       {
 #if PCRE2_CODE_UNIT_WIDTH == 8
-#ifdef SUPPORT_UNICODE
-      if (ucp && !utf && Lc > 127) Loc = UCD_OTHERCASE(Lc);
-      else
-#endif  /* SUPPORT_UNICODE */
-      /* Lc will be < 128 in UTF-8 mode. */
+      /* Lc must be < 128 in UTF-8 mode. */
       Loc = mb->fcc[Lc];
 #else /* 16-bit & 32-bit */
 #ifdef SUPPORT_UNICODE
-      if ((utf || ucp) && Lc > 127) Loc = UCD_OTHERCASE(Lc);
+      if (utf && Lc > 127) Loc = UCD_OTHERCASE(Lc);
       else
 #endif  /* SUPPORT_UNICODE */
       Loc = TABLE_GET(Lc, mb->fcc, Lc);
@@ -1558,7 +1490,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
     if (Fop >= OP_NOTSTARI)     /* Caseless */
       {
 #ifdef SUPPORT_UNICODE
-      if ((utf || ucp) && Lc > 127)
+      if (utf && Lc > 127)
         Loc = UCD_OTHERCASE(Lc);
       else
 #endif /* SUPPORT_UNICODE */
@@ -6113,6 +6045,7 @@ BOOL firstline;
 BOOL has_first_cu = FALSE;
 BOOL has_req_cu = FALSE;
 BOOL startline;
+BOOL utf;
 
 #if PCRE2_CODE_UNIT_WIDTH == 8
 BOOL memchr_not_found_first_cu = FALSE;
@@ -6136,19 +6069,13 @@ PCRE2_SPTR match_partial;
 BOOL use_jit;
 #endif
 
-/* This flag is needed even when Unicode is not supported for convenience
-(it is used by the IS_NEWLINE macro). */
-
-BOOL utf = FALSE;
-
 #ifdef SUPPORT_UNICODE
-BOOL ucp = FALSE;
 BOOL allow_invalid;
 uint32_t fragment_options = 0;
 #ifdef SUPPORT_JIT
 BOOL jit_checked_utf = FALSE;
 #endif
-#endif  /* SUPPORT_UNICODE */
+#endif
 
 PCRE2_SIZE frame_size;
 
@@ -6164,8 +6091,7 @@ proves to be too small, it is replaced by a larger one on the heap. To get a
 vector of the size required that is aligned for pointers, allocate it as a
 vector of pointers. */
 
-PCRE2_SPTR stack_frames_vector[START_FRAMES_SIZE/sizeof(PCRE2_SPTR)]
-    PCRE2_KEEP_UNINITIALIZED;
+PCRE2_SPTR stack_frames_vector[START_FRAMES_SIZE/sizeof(PCRE2_SPTR)];
 mb->stack_frames = (heapframe *)stack_frames_vector;
 
 /* A length equal to PCRE2_ZERO_TERMINATED implies a zero-terminated
@@ -6221,13 +6147,12 @@ use_jit = (re->executable_jit != NULL &&
           (options & ~PUBLIC_JIT_MATCH_OPTIONS) == 0);
 #endif
 
-/* Initialize UTF/UCP parameters. */
+/* Initialize UTF parameters. */
 
-#ifdef SUPPORT_UNICODE
 utf = (re->overall_options & PCRE2_UTF) != 0;
+#ifdef SUPPORT_UNICODE
 allow_invalid = (re->overall_options & PCRE2_MATCH_INVALID_UTF) != 0;
-ucp = (re->overall_options & PCRE2_UCP) != 0;
-#endif  /* SUPPORT_UNICODE */
+#endif
 
 /* Convert the partial matching flags into an integer. */
 
@@ -6664,13 +6589,9 @@ if ((re->flags & PCRE2_FIRSTSET) != 0)
   if ((re->flags & PCRE2_FIRSTCASELESS) != 0)
     {
     first_cu2 = TABLE_GET(first_cu, mb->fcc, first_cu);
-#ifdef SUPPORT_UNICODE
-#if PCRE2_CODE_UNIT_WIDTH == 8
-    if (first_cu > 127 && ucp && !utf) first_cu2 = UCD_OTHERCASE(first_cu);
-#else
-    if (first_cu > 127 && (utf || ucp)) first_cu2 = UCD_OTHERCASE(first_cu);
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+    if (utf && first_cu > 127) first_cu2 = UCD_OTHERCASE(first_cu);
 #endif
-#endif  /* SUPPORT_UNICODE */
     }
   }
 else
@@ -6686,13 +6607,9 @@ if ((re->flags & PCRE2_LASTSET) != 0)
   if ((re->flags & PCRE2_LASTCASELESS) != 0)
     {
     req_cu2 = TABLE_GET(req_cu, mb->fcc, req_cu);
-#ifdef SUPPORT_UNICODE
-#if PCRE2_CODE_UNIT_WIDTH == 8
-    if (req_cu > 127 && ucp && !utf) req_cu2 = UCD_OTHERCASE(req_cu);
-#else
-    if (req_cu > 127 && (utf || ucp)) req_cu2 = UCD_OTHERCASE(req_cu);
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+    if (utf && req_cu > 127) req_cu2 = UCD_OTHERCASE(req_cu);
 #endif
-#endif  /* SUPPORT_UNICODE */
     }
   }
 
@@ -6839,16 +6756,15 @@ for(;;)
 #endif
           }
 
-        /* If we can't find the required first code unit, having reached the
-        true end of the subject, break the bumpalong loop, to force a match
-        failure, except when doing partial matching, when we let the next cycle
-        run at the end of the subject. To see why, consider the pattern
-        /(?<=abc)def/, which partially matches "abc", even though the string
-        does not contain the starting character "d". If we have not reached the
-        true end of the subject (PCRE2_FIRSTLINE caused end_subject to be
-        temporarily modified) we also let the cycle run, because the matching
-        string is legitimately allowed to start with the first code unit of a
-        newline. */
+        /* If we can't find the required code unit, having reached the true end
+        of the subject, break the bumpalong loop, to force a match failure,
+        except when doing partial matching, when we let the next cycle run at
+        the end of the subject. To see why, consider the pattern /(?<=abc)def/,
+        which partially matches "abc", even though the string does not contain
+        the starting character "d". If we have not reached the true end of the
+        subject (PCRE2_FIRSTLINE caused end_subject to be temporarily modified)
+        we also let the cycle run, because the matching string is legitimately
+        allowed to start with the first code unit of a newline. */
 
         if (mb->partial == 0 && start_match >= mb->end_subject)
           {
index ba17a26d2eeb2ca9fe029dbc30060012d5de05d0..cec1a035d19d1bbb6401e1d4eb80c13e465f1c62 100644 (file)
@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2020 University of Cambridge
+          New API code Copyright (c) 2016-2018 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -90,7 +90,7 @@ if (codes == NULL || serialized_bytes == NULL || serialized_size == NULL)
 if (number_of_codes <= 0) return PCRE2_ERROR_BADDATA;
 
 /* Compute total size. */
-total_size = sizeof(pcre2_serialized_data) + TABLES_LENGTH;
+total_size = sizeof(pcre2_serialized_data) + tables_length;
 tables = NULL;
 
 for (i = 0; i < number_of_codes; i++)
@@ -121,8 +121,8 @@ data->number_of_codes = number_of_codes;
 
 /* Copy all compiled code data. */
 dst_bytes = bytes + sizeof(pcre2_serialized_data);
-memcpy(dst_bytes, tables, TABLES_LENGTH);
-dst_bytes += TABLES_LENGTH;
+memcpy(dst_bytes, tables, tables_length);
+dst_bytes += tables_length;
 
 for (i = 0; i < number_of_codes; i++)
   {
@@ -189,12 +189,12 @@ src_bytes = bytes + sizeof(pcre2_serialized_data);
 /* Decode tables. The reference count for the tables is stored immediately
 following them. */
 
-tables = memctl->malloc(TABLES_LENGTH + sizeof(PCRE2_SIZE), memctl->memory_data);
+tables = memctl->malloc(tables_length + sizeof(PCRE2_SIZE), memctl->memory_data);
 if (tables == NULL) return PCRE2_ERROR_NOMEMORY;
 
-memcpy(tables, src_bytes, TABLES_LENGTH);
-*(PCRE2_SIZE *)(tables + TABLES_LENGTH) = number_of_codes;
-src_bytes += TABLES_LENGTH;
+memcpy(tables, src_bytes, tables_length);
+*(PCRE2_SIZE *)(tables + tables_length) = number_of_codes;
+src_bytes += tables_length;
 
 /* Decode the byte stream. We must not try to read the size from the compiled
 code block in the stream, because it might be unaligned, which causes errors on
index 9bbb37570f8e7ae89b7cd122ef65dbb83700f39a..2883868618d9c8d3ae1d489420d4255dd16f6f47 100644 (file)
@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2020 University of Cambridge
+          New API code Copyright (c) 2016-2019 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -58,7 +58,7 @@ collecting data (e.g. minimum matching length). */
 
 /* Returns from set_start_bits() */
 
-enum { SSB_FAIL, SSB_DONE, SSB_CONTINUE, SSB_UNKNOWN, SSB_TOODEEP };
+enum { SSB_FAIL, SSB_DONE, SSB_CONTINUE, SSB_UNKNOWN };
 
 
 /*************************************************
@@ -772,19 +772,15 @@ Arguments:
   p             points to the first code unit of the character
   caseless      TRUE if caseless
   utf           TRUE for UTF mode
-  ucp           TRUE for UCP mode
 
 Returns:        pointer after the character
 */
 
 static PCRE2_SPTR
-set_table_bit(pcre2_real_code *re, PCRE2_SPTR p, BOOL caseless, BOOL utf,
-  BOOL ucp)
+set_table_bit(pcre2_real_code *re, PCRE2_SPTR p, BOOL caseless, BOOL utf)
 {
 uint32_t c = *p++;   /* First code unit */
-
-(void)utf;           /* Stop compiler warnings when UTF not supported */
-(void)ucp;
+(void)utf;           /* Stop compiler warning when UTF not supported */
 
 /* In 16-bit and 32-bit modes, code units greater than 0xff set the bit for
 0xff. */
@@ -814,26 +810,22 @@ if (utf)
 if (caseless)
   {
 #ifdef SUPPORT_UNICODE
-  if (utf || ucp)
+  if (utf)
     {
-    c = UCD_OTHERCASE(c);
 #if PCRE2_CODE_UNIT_WIDTH == 8
-    if (utf)
-      {
-      PCRE2_UCHAR buff[6];
-      (void)PRIV(ord2utf)(c, buff);
-      SET_BIT(buff[0]);
-      }
-    else if (c < 256) SET_BIT(c);
+    PCRE2_UCHAR buff[6];
+    c = UCD_OTHERCASE(c);
+    (void)PRIV(ord2utf)(c, buff);
+    SET_BIT(buff[0]);
 #else  /* 16-bit or 32-bit mode */
+    c = UCD_OTHERCASE(c);
     if (c > 0xff) SET_BIT(0xff); else SET_BIT(c);
 #endif
     }
-
   else
 #endif  /* SUPPORT_UNICODE */
 
-  /* Not UTF or UCP */
+  /* Not UTF */
 
   if (MAX_255(c)) SET_BIT(re->tables[fcc_offset + c]);
   }
@@ -932,26 +924,19 @@ The SSB_CONTINUE return is useful for parenthesized groups in patterns such as
 must continue at the outer level to find at least one mandatory code unit. At
 the outermost level, this function fails unless the result is SSB_DONE.
 
-We restrict recursion (for nested groups) to 1000 to avoid stack overflow
-issues.
-
 Arguments:
   re           points to the compiled regex block
   code         points to an expression
   utf          TRUE if in UTF mode
-  ucp          TRUE if in UCP mode
-  depthptr     pointer to recurse depth
 
 Returns:       SSB_FAIL     => Failed to find any starting code units
                SSB_DONE     => Found mandatory starting code units
                SSB_CONTINUE => Found optional starting code units
                SSB_UNKNOWN  => Hit an unrecognized opcode
-               SSB_TOODEEP  => Recursion is too deep
 */
 
 static int
-set_start_bits(pcre2_real_code *re, PCRE2_SPTR code, BOOL utf, BOOL ucp,
-  int *depthptr)
+set_start_bits(pcre2_real_code *re, PCRE2_SPTR code, BOOL utf)
 {
 uint32_t c;
 int yield = SSB_DONE;
@@ -962,9 +947,6 @@ int table_limit = utf? 16:32;
 int table_limit = 32;
 #endif
 
-*depthptr += 1;
-if (*depthptr > 1000) return SSB_TOODEEP;
-
 do
   {
   BOOL try_next = TRUE;
@@ -1121,17 +1103,13 @@ do
       case OP_SCRIPT_RUN:
       case OP_ASSERT:
       case OP_ASSERT_NA:
-      rc = set_start_bits(re, tcode, utf, ucp, depthptr);
-      if (rc == SSB_DONE)
-        {
-        try_next = FALSE;
-        }
-      else if (rc == SSB_CONTINUE)
+      rc = set_start_bits(re, tcode, utf);
+      if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc;
+      if (rc == SSB_DONE) try_next = FALSE; else
         {
         do tcode += GET(tcode, 1); while (*tcode == OP_ALT);
         tcode += 1 + LINK_SIZE;
         }
-      else return rc;   /* FAIL, UNKNOWN, or TOODEEP */
       break;
 
       /* If we hit ALT or KET, it means we haven't found anything mandatory in
@@ -1177,8 +1155,8 @@ do
       case OP_BRAZERO:
       case OP_BRAMINZERO:
       case OP_BRAPOSZERO:
-      rc = set_start_bits(re, ++tcode, utf, ucp, depthptr);
-      if (rc == SSB_FAIL || rc == SSB_UNKNOWN || rc == SSB_TOODEEP) return rc;
+      rc = set_start_bits(re, ++tcode, utf);
+      if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc;
       do tcode += GET(tcode,1); while (*tcode == OP_ALT);
       tcode += 1 + LINK_SIZE;
       break;
@@ -1199,7 +1177,7 @@ do
       case OP_QUERY:
       case OP_MINQUERY:
       case OP_POSQUERY:
-      tcode = set_table_bit(re, tcode + 1, FALSE, utf, ucp);
+      tcode = set_table_bit(re, tcode + 1, FALSE, utf);
       break;
 
       case OP_STARI:
@@ -1208,7 +1186,7 @@ do
       case OP_QUERYI:
       case OP_MINQUERYI:
       case OP_POSQUERYI:
-      tcode = set_table_bit(re, tcode + 1, TRUE, utf, ucp);
+      tcode = set_table_bit(re, tcode + 1, TRUE, utf);
       break;
 
       /* Single-char upto sets the bit and tries the next */
@@ -1216,13 +1194,13 @@ do
       case OP_UPTO:
       case OP_MINUPTO:
       case OP_POSUPTO:
-      tcode = set_table_bit(re, tcode + 1 + IMM2_SIZE, FALSE, utf, ucp);
+      tcode = set_table_bit(re, tcode + 1 + IMM2_SIZE, FALSE, utf);
       break;
 
       case OP_UPTOI:
       case OP_MINUPTOI:
       case OP_POSUPTOI:
-      tcode = set_table_bit(re, tcode + 1 + IMM2_SIZE, TRUE, utf, ucp);
+      tcode = set_table_bit(re, tcode + 1 + IMM2_SIZE, TRUE, utf);
       break;
 
       /* At least one single char sets the bit and stops */
@@ -1234,7 +1212,7 @@ do
       case OP_PLUS:
       case OP_MINPLUS:
       case OP_POSPLUS:
-      (void)set_table_bit(re, tcode + 1, FALSE, utf, ucp);
+      (void)set_table_bit(re, tcode + 1, FALSE, utf);
       try_next = FALSE;
       break;
 
@@ -1245,7 +1223,7 @@ do
       case OP_PLUSI:
       case OP_MINPLUSI:
       case OP_POSPLUSI:
-      (void)set_table_bit(re, tcode + 1, TRUE, utf, ucp);
+      (void)set_table_bit(re, tcode + 1, TRUE, utf);
       try_next = FALSE;
       break;
 
@@ -1674,7 +1652,6 @@ PRIV(study)(pcre2_real_code *re)
 int count = 0;
 PCRE2_UCHAR *code;
 BOOL utf = (re->overall_options & PCRE2_UTF) != 0;
-BOOL ucp = (re->overall_options & PCRE2_UCP) != 0;
 
 /* Find start of compiled code */
 
@@ -1687,8 +1664,7 @@ code units. */
 
 if ((re->flags & (PCRE2_FIRSTSET|PCRE2_STARTLINE)) == 0)
   {
-  int depth = 0;
-  int rc = set_start_bits(re, code, utf, ucp, &depth);
+  int rc = set_start_bits(re, code, utf);
   if (rc == SSB_UNKNOWN) return 1;
 
   /* If a list of starting code units was set up, scan the list to see if only
@@ -1736,27 +1712,27 @@ if ((re->flags & (PCRE2_FIRSTSET|PCRE2_STARTLINE)) == 0)
           }
 
         /* c contains the code unit value, in the range 0-255. In 8-bit UTF
-        mode, only values < 128 can be used. In all the other cases, c is a
-        character value. */
+        mode, only values < 128 can be used. */
 
 #if PCRE2_CODE_UNIT_WIDTH == 8
-        if (utf && c > 127) goto DONE;
+        if (c > 127) goto DONE;
 #endif
-        if (a < 0) a = c;   /* First one found, save in a */
+        if (a < 0) a = c;   /* First one found */
         else if (b < 0)     /* Second one found */
           {
           int d = TABLE_GET((unsigned int)c, re->tables + fcc_offset, c);
 
 #ifdef SUPPORT_UNICODE
-          if (utf || ucp)
-            {
-            if (UCD_CASESET(c) != 0) goto DONE;     /* Multiple case set */
-            if (c > 127) d = UCD_OTHERCASE(c);
-            }
+#if PCRE2_CODE_UNIT_WIDTH == 8
+          if (utf && UCD_CASESET(c) != 0) goto DONE;   /* Multiple case set */
+#else   /* 16-bit or 32-bit */
+          if (UCD_CASESET(c) != 0) goto DONE;     /* Multiple case set */
+          if (utf && c > 127) d = UCD_OTHERCASE(c);
+#endif  /* Code width */
 #endif  /* SUPPORT_UNICODE */
 
-          if (d != a) goto DONE;   /* Not the other case of a */
-          b = c;                   /* Save second in b */
+          if (d != a) goto DONE;   /* Not other case of a */
+          b = c;
           }
         else goto DONE;   /* More than two characters found */
         }
index 981a106a9f732365f6573308296a92e7b20e5b5d..ec3dd66df973cbd3d0f19ba3240d0f59088afa56 100644 (file)
@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2020 University of Cambridge
+          New API code Copyright (c) 2016-2019 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -49,9 +49,8 @@ POSSIBILITY OF SUCH DAMAGE.
 
 #define SUBSTITUTE_OPTIONS \
   (PCRE2_SUBSTITUTE_EXTENDED|PCRE2_SUBSTITUTE_GLOBAL| \
-   PCRE2_SUBSTITUTE_LITERAL|PCRE2_SUBSTITUTE_MATCHED| \
-   PCRE2_SUBSTITUTE_OVERFLOW_LENGTH|PCRE2_SUBSTITUTE_REPLACEMENT_ONLY| \
-   PCRE2_SUBSTITUTE_UNKNOWN_UNSET|PCRE2_SUBSTITUTE_UNSET_EMPTY)
+   PCRE2_SUBSTITUTE_OVERFLOW_LENGTH|PCRE2_SUBSTITUTE_UNKNOWN_UNSET| \
+   PCRE2_SUBSTITUTE_UNSET_EMPTY)
 
 
 
@@ -195,7 +194,6 @@ overflow, either give an error immediately, or keep on, accumulating the
 length. */
 
 #define CHECKMEMCPY(from,length) \
-  { \
   if (!overflowed && lengthleft < length) \
     { \
     if ((suboptions & PCRE2_SUBSTITUTE_OVERFLOW_LENGTH) == 0) goto NOROOM; \
@@ -211,8 +209,7 @@ length. */
     memcpy(buffer + buff_offset, from, CU2BYTES(length)); \
     buff_offset += length; \
     lengthleft -= length; \
-    } \
-  }
+    }
 
 /* Here's the function */
 
@@ -229,14 +226,11 @@ int forcecasereset = 0;
 uint32_t ovector_count;
 uint32_t goptions = 0;
 uint32_t suboptions;
-pcre2_match_data *internal_match_data = NULL;
-BOOL escaped_literal = FALSE;
+BOOL match_data_created = FALSE;
+BOOL literal = FALSE;
 BOOL overflowed = FALSE;
-BOOL use_existing_match;
-BOOL replacement_only;
 #ifdef SUPPORT_UNICODE
 BOOL utf = (code->overall_options & PCRE2_UTF) != 0;
-BOOL ucp = (code->overall_options & PCRE2_UCP) != 0;
 #endif
 PCRE2_UCHAR temp[6];
 PCRE2_SPTR ptr;
@@ -254,54 +248,23 @@ lengthleft = buff_length = *blength;
 *blength = PCRE2_UNSET;
 ovecsave[0] = ovecsave[1] = ovecsave[2] = PCRE2_UNSET;
 
-/* Partial matching is not valid. This must come after setting *blength to
+/* Partial matching is not valid. This must come after setting *blength to 
 PCRE2_UNSET, so as not to imply an offset in the replacement. */
 
 if ((options & (PCRE2_PARTIAL_HARD|PCRE2_PARTIAL_SOFT)) != 0)
   return PCRE2_ERROR_BADOPTION;
 
-/* Check for using a match that has already happened. Note that the subject
-pointer in the match data may be NULL after a no-match. */
-
-use_existing_match = ((options & PCRE2_SUBSTITUTE_MATCHED) != 0);
-replacement_only = ((options & PCRE2_SUBSTITUTE_REPLACEMENT_ONLY) != 0);
-
-/* If starting from an existing match, there must be an externally provided
-match data block. We create an internal match_data block in two cases: (a) an
-external one is not supplied (and we are not starting from an existing match);
-(b) an existing match is to be used for the first substitution. In the latter
-case, we copy the existing match into the internal block. This ensures that no
-changes are made to the existing match data block. */
+/* If no match data block is provided, create one. */
 
 if (match_data == NULL)
-  {
-  pcre2_general_context *gcontext;
-  if (use_existing_match) return PCRE2_ERROR_NULL;
-  gcontext = (mcontext == NULL)?
-    (pcre2_general_context *)code :
-    (pcre2_general_context *)mcontext;
-  match_data = internal_match_data =
-    pcre2_match_data_create_from_pattern(code, gcontext);
-  if (internal_match_data == NULL) return PCRE2_ERROR_NOMEMORY;
-  }
-
-else if (use_existing_match)
   {
   pcre2_general_context *gcontext = (mcontext == NULL)?
     (pcre2_general_context *)code :
     (pcre2_general_context *)mcontext;
-  int pairs = (code->top_bracket + 1 < match_data->oveccount)?
-    code->top_bracket + 1 : match_data->oveccount;
-  internal_match_data = pcre2_match_data_create(match_data->oveccount,
-    gcontext);
-  if (internal_match_data == NULL) return PCRE2_ERROR_NOMEMORY;
-  memcpy(internal_match_data, match_data, offsetof(pcre2_match_data, ovector)
-    + 2*pairs*sizeof(PCRE2_SIZE));
-  match_data = internal_match_data;
+  match_data = pcre2_match_data_create_from_pattern(code, gcontext);
+  if (match_data == NULL) return PCRE2_ERROR_NOMEMORY;
+  match_data_created = TRUE;
   }
-
-/* Remember ovector details */
-
 ovector = pcre2_get_ovector_pointer(match_data);
 ovector_count = pcre2_get_ovector_count(match_data);
 
@@ -323,7 +286,7 @@ repend = replacement + rlength;
 #ifdef SUPPORT_UNICODE
 if (utf && (options & PCRE2_NO_UTF_CHECK) == 0)
   {
-  rc = PRIV(valid_utf)(replacement, rlength, &(match_data->startchar));
+  rc = PRIV(valid_utf)(replacement, rlength, &(match_data->rightchar));
   if (rc != 0)
     {
     match_data->leftchar = 0;
@@ -337,7 +300,7 @@ if (utf && (options & PCRE2_NO_UTF_CHECK) == 0)
 suboptions = options & SUBSTITUTE_OPTIONS;
 options &= ~SUBSTITUTE_OPTIONS;
 
-/* Error if the start match offset is greater than the length of the subject. */
+/* Copy up to the start offset */
 
 if (start_offset > length)
   {
@@ -345,13 +308,9 @@ if (start_offset > length)
   rc = PCRE2_ERROR_BADOFFSET;
   goto EXIT;
   }
+CHECKMEMCPY(subject, start_offset);
 
-/* Copy up to the start offset, unless only the replacement is required. */
-
-if (!replacement_only) CHECKMEMCPY(subject, start_offset);
-
-/* Loop for global substituting. If PCRE2_SUBSTITUTE_MATCHED is set, the first
-match is taken from the match_data that was passed in. */
+/* Loop for global substituting. */
 
 subs = 0;
 do
@@ -359,12 +318,7 @@ do
   PCRE2_SPTR ptrstack[PTR_STACK_SIZE];
   uint32_t ptrstackptr = 0;
 
-  if (use_existing_match)
-    {
-    rc = match_data->rc;
-    use_existing_match = FALSE;
-    }
-  else rc = pcre2_match(code, subject, length, start_offset, options|goptions,
+  rc = pcre2_match(code, subject, length, start_offset, options|goptions,
     match_data, mcontext);
 
 #ifdef SUPPORT_UNICODE
@@ -410,44 +364,44 @@ do
 #endif
       }
 
-    /* Copy what we have advanced past (unless not required), reset the special
-    global options, and continue to the next match. */
+    /* Copy what we have advanced past, reset the special global options, and
+    continue to the next match. */
 
     fraglength = start_offset - save_start;
-    if (!replacement_only) CHECKMEMCPY(subject + save_start, fraglength);
+    CHECKMEMCPY(subject + save_start, fraglength);
     goptions = 0;
     continue;
     }
 
   /* Handle a successful match. Matches that use \K to end before they start
   or start before the current point in the subject are not supported. */
-
+  
   if (ovector[1] < ovector[0] || ovector[0] < start_offset)
     {
     rc = PCRE2_ERROR_BADSUBSPATTERN;
     goto EXIT;
     }
-
-  /* Check for the same match as previous. This is legitimate after matching an
+    
+  /* Check for the same match as previous. This is legitimate after matching an 
   empty string that starts after the initial match offset. We have tried again
   at the match point in case the pattern is one like /(?<=\G.)/ which can never
   match at its starting point, so running the match achieves the bumpalong. If
   we do get the same (null) match at the original match point, it isn't such a
   pattern, so we now do the empty string magic. In all other cases, a repeat
   match should never occur. */
-
+    
   if (ovecsave[0] == ovector[0] && ovecsave[1] == ovector[1])
-    {
-    if (ovector[0] == ovector[1] && ovecsave[2] != start_offset)
-      {
-      goptions = PCRE2_NOTEMPTY_ATSTART | PCRE2_ANCHORED;
-      ovecsave[2] = start_offset;
-      continue;    /* Back to the top of the loop */
+    {                                                                        
+    if (ovector[0] == ovector[1] && ovecsave[2] != start_offset)     
+      {                                                                   
+      goptions = PCRE2_NOTEMPTY_ATSTART | PCRE2_ANCHORED;                 
+      ovecsave[2] = start_offset;                                     
+      continue;    /* Back to the top of the loop */                        
       }
     rc = PCRE2_ERROR_INTERNAL_DUPMATCH;
-    goto EXIT;
-    }
-
+    goto EXIT;   
+    }   
+    
   /* Count substitutions with a paranoid check for integer overflow; surely no
   real call to this function would ever hit this! */
 
@@ -458,30 +412,21 @@ do
     }
   subs++;
 
-  /* Copy the text leading up to the match (unless not required), and remember
-  where the insert begins and how many ovector pairs are set. */
+  /* Copy the text leading up to the match, and remember where the insert
+  begins and how many ovector pairs are set. */
 
   if (rc == 0) rc = ovector_count;
   fraglength = ovector[0] - start_offset;
-  if (!replacement_only) CHECKMEMCPY(subject + start_offset, fraglength);
+  CHECKMEMCPY(subject + start_offset, fraglength);
   scb.output_offsets[0] = buff_offset;
   scb.oveccount = rc;
 
-  /* Process the replacement string. If the entire replacement is literal, just
-  copy it with length check. */
+  /* Process the replacement string. Literal mode is set by \Q, but only in
+  extended mode when backslashes are being interpreted. In extended mode we
+  must handle nested substrings that are to be reprocessed. */
 
   ptr = replacement;
-  if ((suboptions & PCRE2_SUBSTITUTE_LITERAL) != 0)
-    {
-    CHECKMEMCPY(ptr, rlength);
-    }
-
-  /* Within a non-literal replacement, which must be scanned character by
-  character, local literal mode can be set by \Q, but only in extended mode
-  when backslashes are being interpreted. In extended mode we must handle
-  nested substrings that are to be reprocessed. */
-
-  else for (;;)
+  for (;;)
     {
     uint32_t ch;
     unsigned int chlen;
@@ -498,11 +443,11 @@ do
 
     /* Handle the next character */
 
-    if (escaped_literal)
+    if (literal)
       {
       if (ptr[0] == CHAR_BACKSLASH && ptr < repend - 1 && ptr[1] == CHAR_E)
         {
-        escaped_literal = FALSE;
+        literal = FALSE;
         ptr += 2;
         continue;
         }
@@ -759,7 +704,7 @@ do
           if (forcecase != 0)
             {
 #ifdef SUPPORT_UNICODE
-            if (utf || ucp)
+            if (utf)
               {
               uint32_t type = UCD_CHARTYPE(ch);
               if (PRIV(ucp_gentype)[type] == ucp_L &&
@@ -839,7 +784,7 @@ do
         continue;
 
         case ESC_Q:
-        escaped_literal = TRUE;
+        literal = TRUE;
         continue;
 
         case 0:      /* Data character */
@@ -861,7 +806,7 @@ do
       if (forcecase != 0)
         {
 #ifdef SUPPORT_UNICODE
-        if (utf || ucp)
+        if (utf)
           {
           uint32_t type = UCD_CHARTYPE(ch);
           if (PRIV(ucp_gentype)[type] == ucp_L &&
@@ -890,59 +835,53 @@ do
       } /* End handling a literal code unit */
     }   /* End of loop for scanning the replacement. */
 
-  /* The replacement has been copied to the output, or its size has been
-  remembered. Do the callout if there is one and we have done an actual
+  /* The replacement has been copied to the output, or its size has been 
+  remembered. Do the callout if there is one and we have done an actual 
   replacement. */
-
+  
   if (!overflowed && mcontext != NULL && mcontext->substitute_callout != NULL)
     {
-    scb.subscount = subs;
+    scb.subscount = subs;  
     scb.output_offsets[1] = buff_offset;
-    rc = mcontext->substitute_callout(&scb, mcontext->substitute_callout_data);
+    rc = mcontext->substitute_callout(&scb, mcontext->substitute_callout_data); 
 
-    /* A non-zero return means cancel this substitution. Instead, copy the
+    /* A non-zero return means cancel this substitution. Instead, copy the 
     matched string fragment. */
 
     if (rc != 0)
       {
       PCRE2_SIZE newlength = scb.output_offsets[1] - scb.output_offsets[0];
       PCRE2_SIZE oldlength = ovector[1] - ovector[0];
-
+      
       buff_offset -= newlength;
       lengthleft += newlength;
-      if (!replacement_only) CHECKMEMCPY(subject + ovector[0], oldlength);
-
+      CHECKMEMCPY(subject + ovector[0], oldlength);    
+      
       /* A negative return means do not do any more. */
-
+      
       if (rc < 0) suboptions &= (~PCRE2_SUBSTITUTE_GLOBAL);
       }
-    }
-
+    }   
   /* Save the details of this match. See above for how this data is used. If we
-  matched an empty string, do the magic for global matches. Update the start
-  offset to point to the rest of the subject string. If we re-used an existing
-  match for the first match, switch to the internal match data block. */
-
-  ovecsave[0] = ovector[0];
-  ovecsave[1] = ovector[1];
+  matched an empty string, do the magic for global matches. Finally, update the
+  start offset to point to the rest of the subject string. */
+  
+  ovecsave[0] = ovector[0];                                
+  ovecsave[1] = ovector[1];                                        
   ovecsave[2] = start_offset;
-
+   
   goptions = (ovector[0] != ovector[1] || ovector[0] > start_offset)? 0 :
     PCRE2_ANCHORED|PCRE2_NOTEMPTY_ATSTART;
   start_offset = ovector[1];
   } while ((suboptions & PCRE2_SUBSTITUTE_GLOBAL) != 0);  /* Repeat "do" loop */
 
-/* Copy the rest of the subject unless not required, and terminate the output
-with a binary zero. */
-
-if (!replacement_only)
-  {
-  fraglength = length - start_offset;
-  CHECKMEMCPY(subject + start_offset, fraglength);
-  }
+/* Copy the rest of the subject. */
 
+fraglength = length - start_offset;
+CHECKMEMCPY(subject + start_offset, fraglength);
 temp[0] = 0;
-CHECKMEMCPY(temp, 1);
+CHECKMEMCPY(temp , 1);
 
 /* If overflowed is set it means the PCRE2_SUBSTITUTE_OVERFLOW_LENGTH is set,
 and matching has carried on after a full buffer, in order to compute the length
@@ -964,7 +903,7 @@ else
   }
 
 EXIT:
-if (internal_match_data != NULL) pcre2_match_data_free(internal_match_data);
+if (match_data_created) pcre2_match_data_free(match_data);
   else match_data->rc = rc;
 return rc;
 
index b10de45efbf97abf3dd75ca18bd735d00d07ed1f..25531d98c6890dc27c2e21a759fdf5940ee053a3 100644 (file)
@@ -265,7 +265,6 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */
 #define STRING_Chakma0 STR_C STR_h STR_a STR_k STR_m STR_a "\0"
 #define STRING_Cham0 STR_C STR_h STR_a STR_m "\0"
 #define STRING_Cherokee0 STR_C STR_h STR_e STR_r STR_o STR_k STR_e STR_e "\0"
-#define STRING_Chorasmian0 STR_C STR_h STR_o STR_r STR_a STR_s STR_m STR_i STR_a STR_n "\0"
 #define STRING_Cn0 STR_C STR_n "\0"
 #define STRING_Co0 STR_C STR_o "\0"
 #define STRING_Common0 STR_C STR_o STR_m STR_m STR_o STR_n "\0"
@@ -276,7 +275,6 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */
 #define STRING_Cyrillic0 STR_C STR_y STR_r STR_i STR_l STR_l STR_i STR_c "\0"
 #define STRING_Deseret0 STR_D STR_e STR_s STR_e STR_r STR_e STR_t "\0"
 #define STRING_Devanagari0 STR_D STR_e STR_v STR_a STR_n STR_a STR_g STR_a STR_r STR_i "\0"
-#define STRING_Dives_Akuru0 STR_D STR_i STR_v STR_e STR_s STR_UNDERSCORE STR_A STR_k STR_u STR_r STR_u "\0"
 #define STRING_Dogra0 STR_D STR_o STR_g STR_r STR_a "\0"
 #define STRING_Duployan0 STR_D STR_u STR_p STR_l STR_o STR_y STR_a STR_n "\0"
 #define STRING_Egyptian_Hieroglyphs0 STR_E STR_g STR_y STR_p STR_t STR_i STR_a STR_n STR_UNDERSCORE STR_H STR_i STR_e STR_r STR_o STR_g STR_l STR_y STR_p STR_h STR_s "\0"
@@ -308,7 +306,6 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */
 #define STRING_Katakana0 STR_K STR_a STR_t STR_a STR_k STR_a STR_n STR_a "\0"
 #define STRING_Kayah_Li0 STR_K STR_a STR_y STR_a STR_h STR_UNDERSCORE STR_L STR_i "\0"
 #define STRING_Kharoshthi0 STR_K STR_h STR_a STR_r STR_o STR_s STR_h STR_t STR_h STR_i "\0"
-#define STRING_Khitan_Small_Script0 STR_K STR_h STR_i STR_t STR_a STR_n STR_UNDERSCORE STR_S STR_m STR_a STR_l STR_l STR_UNDERSCORE STR_S STR_c STR_r STR_i STR_p STR_t "\0"
 #define STRING_Khmer0 STR_K STR_h STR_m STR_e STR_r "\0"
 #define STRING_Khojki0 STR_K STR_h STR_o STR_j STR_k STR_i "\0"
 #define STRING_Khudawadi0 STR_K STR_h STR_u STR_d STR_a STR_w STR_a STR_d STR_i "\0"
@@ -432,7 +429,6 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */
 #define STRING_Xsp0 STR_X STR_s STR_p "\0"
 #define STRING_Xuc0 STR_X STR_u STR_c "\0"
 #define STRING_Xwd0 STR_X STR_w STR_d "\0"
-#define STRING_Yezidi0 STR_Y STR_e STR_z STR_i STR_d STR_i "\0"
 #define STRING_Yi0 STR_Y STR_i "\0"
 #define STRING_Z0 STR_Z "\0"
 #define STRING_Zanabazar_Square0 STR_Z STR_a STR_n STR_a STR_b STR_a STR_z STR_a STR_r STR_UNDERSCORE STR_S STR_q STR_u STR_a STR_r STR_e "\0"
@@ -468,7 +464,6 @@ const char PRIV(utt_names)[] =
   STRING_Chakma0
   STRING_Cham0
   STRING_Cherokee0
-  STRING_Chorasmian0
   STRING_Cn0
   STRING_Co0
   STRING_Common0
@@ -479,7 +474,6 @@ const char PRIV(utt_names)[] =
   STRING_Cyrillic0
   STRING_Deseret0
   STRING_Devanagari0
-  STRING_Dives_Akuru0
   STRING_Dogra0
   STRING_Duployan0
   STRING_Egyptian_Hieroglyphs0
@@ -511,7 +505,6 @@ const char PRIV(utt_names)[] =
   STRING_Katakana0
   STRING_Kayah_Li0
   STRING_Kharoshthi0
-  STRING_Khitan_Small_Script0
   STRING_Khmer0
   STRING_Khojki0
   STRING_Khudawadi0
@@ -635,7 +628,6 @@ const char PRIV(utt_names)[] =
   STRING_Xsp0
   STRING_Xuc0
   STRING_Xwd0
-  STRING_Yezidi0
   STRING_Yi0
   STRING_Z0
   STRING_Zanabazar_Square0
@@ -671,180 +663,176 @@ const ucp_type_table PRIV(utt)[] = {
   { 203, PT_SC, ucp_Chakma },
   { 210, PT_SC, ucp_Cham },
   { 215, PT_SC, ucp_Cherokee },
-  { 224, PT_SC, ucp_Chorasmian },
-  { 235, PT_PC, ucp_Cn },
-  { 238, PT_PC, ucp_Co },
-  { 241, PT_SC, ucp_Common },
-  { 248, PT_SC, ucp_Coptic },
-  { 255, PT_PC, ucp_Cs },
-  { 258, PT_SC, ucp_Cuneiform },
-  { 268, PT_SC, ucp_Cypriot },
-  { 276, PT_SC, ucp_Cyrillic },
-  { 285, PT_SC, ucp_Deseret },
-  { 293, PT_SC, ucp_Devanagari },
-  { 304, PT_SC, ucp_Dives_Akuru },
-  { 316, PT_SC, ucp_Dogra },
-  { 322, PT_SC, ucp_Duployan },
-  { 331, PT_SC, ucp_Egyptian_Hieroglyphs },
-  { 352, PT_SC, ucp_Elbasan },
-  { 360, PT_SC, ucp_Elymaic },
-  { 368, PT_SC, ucp_Ethiopic },
-  { 377, PT_SC, ucp_Georgian },
-  { 386, PT_SC, ucp_Glagolitic },
-  { 397, PT_SC, ucp_Gothic },
-  { 404, PT_SC, ucp_Grantha },
-  { 412, PT_SC, ucp_Greek },
-  { 418, PT_SC, ucp_Gujarati },
-  { 427, PT_SC, ucp_Gunjala_Gondi },
-  { 441, PT_SC, ucp_Gurmukhi },
-  { 450, PT_SC, ucp_Han },
-  { 454, PT_SC, ucp_Hangul },
-  { 461, PT_SC, ucp_Hanifi_Rohingya },
-  { 477, PT_SC, ucp_Hanunoo },
-  { 485, PT_SC, ucp_Hatran },
-  { 492, PT_SC, ucp_Hebrew },
-  { 499, PT_SC, ucp_Hiragana },
-  { 508, PT_SC, ucp_Imperial_Aramaic },
-  { 525, PT_SC, ucp_Inherited },
-  { 535, PT_SC, ucp_Inscriptional_Pahlavi },
-  { 557, PT_SC, ucp_Inscriptional_Parthian },
-  { 580, PT_SC, ucp_Javanese },
-  { 589, PT_SC, ucp_Kaithi },
-  { 596, PT_SC, ucp_Kannada },
-  { 604, PT_SC, ucp_Katakana },
-  { 613, PT_SC, ucp_Kayah_Li },
-  { 622, PT_SC, ucp_Kharoshthi },
-  { 633, PT_SC, ucp_Khitan_Small_Script },
-  { 653, PT_SC, ucp_Khmer },
-  { 659, PT_SC, ucp_Khojki },
-  { 666, PT_SC, ucp_Khudawadi },
-  { 676, PT_GC, ucp_L },
-  { 678, PT_LAMP, 0 },
-  { 681, PT_SC, ucp_Lao },
-  { 685, PT_SC, ucp_Latin },
-  { 691, PT_SC, ucp_Lepcha },
-  { 698, PT_SC, ucp_Limbu },
-  { 704, PT_SC, ucp_Linear_A },
-  { 713, PT_SC, ucp_Linear_B },
-  { 722, PT_SC, ucp_Lisu },
-  { 727, PT_PC, ucp_Ll },
-  { 730, PT_PC, ucp_Lm },
-  { 733, PT_PC, ucp_Lo },
-  { 736, PT_PC, ucp_Lt },
-  { 739, PT_PC, ucp_Lu },
-  { 742, PT_SC, ucp_Lycian },
-  { 749, PT_SC, ucp_Lydian },
-  { 756, PT_GC, ucp_M },
-  { 758, PT_SC, ucp_Mahajani },
-  { 767, PT_SC, ucp_Makasar },
-  { 775, PT_SC, ucp_Malayalam },
-  { 785, PT_SC, ucp_Mandaic },
-  { 793, PT_SC, ucp_Manichaean },
-  { 804, PT_SC, ucp_Marchen },
-  { 812, PT_SC, ucp_Masaram_Gondi },
-  { 826, PT_PC, ucp_Mc },
-  { 829, PT_PC, ucp_Me },
-  { 832, PT_SC, ucp_Medefaidrin },
-  { 844, PT_SC, ucp_Meetei_Mayek },
-  { 857, PT_SC, ucp_Mende_Kikakui },
-  { 871, PT_SC, ucp_Meroitic_Cursive },
-  { 888, PT_SC, ucp_Meroitic_Hieroglyphs },
-  { 909, PT_SC, ucp_Miao },
-  { 914, PT_PC, ucp_Mn },
-  { 917, PT_SC, ucp_Modi },
-  { 922, PT_SC, ucp_Mongolian },
-  { 932, PT_SC, ucp_Mro },
-  { 936, PT_SC, ucp_Multani },
-  { 944, PT_SC, ucp_Myanmar },
-  { 952, PT_GC, ucp_N },
-  { 954, PT_SC, ucp_Nabataean },
-  { 964, PT_SC, ucp_Nandinagari },
-  { 976, PT_PC, ucp_Nd },
-  { 979, PT_SC, ucp_New_Tai_Lue },
-  { 991, PT_SC, ucp_Newa },
-  { 996, PT_SC, ucp_Nko },
-  { 1000, PT_PC, ucp_Nl },
-  { 1003, PT_PC, ucp_No },
-  { 1006, PT_SC, ucp_Nushu },
-  { 1012, PT_SC, ucp_Nyiakeng_Puachue_Hmong },
-  { 1035, PT_SC, ucp_Ogham },
-  { 1041, PT_SC, ucp_Ol_Chiki },
-  { 1050, PT_SC, ucp_Old_Hungarian },
-  { 1064, PT_SC, ucp_Old_Italic },
-  { 1075, PT_SC, ucp_Old_North_Arabian },
-  { 1093, PT_SC, ucp_Old_Permic },
-  { 1104, PT_SC, ucp_Old_Persian },
-  { 1116, PT_SC, ucp_Old_Sogdian },
-  { 1128, PT_SC, ucp_Old_South_Arabian },
-  { 1146, PT_SC, ucp_Old_Turkic },
-  { 1157, PT_SC, ucp_Oriya },
-  { 1163, PT_SC, ucp_Osage },
-  { 1169, PT_SC, ucp_Osmanya },
-  { 1177, PT_GC, ucp_P },
-  { 1179, PT_SC, ucp_Pahawh_Hmong },
-  { 1192, PT_SC, ucp_Palmyrene },
-  { 1202, PT_SC, ucp_Pau_Cin_Hau },
-  { 1214, PT_PC, ucp_Pc },
-  { 1217, PT_PC, ucp_Pd },
-  { 1220, PT_PC, ucp_Pe },
-  { 1223, PT_PC, ucp_Pf },
-  { 1226, PT_SC, ucp_Phags_Pa },
-  { 1235, PT_SC, ucp_Phoenician },
-  { 1246, PT_PC, ucp_Pi },
-  { 1249, PT_PC, ucp_Po },
-  { 1252, PT_PC, ucp_Ps },
-  { 1255, PT_SC, ucp_Psalter_Pahlavi },
-  { 1271, PT_SC, ucp_Rejang },
-  { 1278, PT_SC, ucp_Runic },
-  { 1284, PT_GC, ucp_S },
-  { 1286, PT_SC, ucp_Samaritan },
-  { 1296, PT_SC, ucp_Saurashtra },
-  { 1307, PT_PC, ucp_Sc },
-  { 1310, PT_SC, ucp_Sharada },
-  { 1318, PT_SC, ucp_Shavian },
-  { 1326, PT_SC, ucp_Siddham },
-  { 1334, PT_SC, ucp_SignWriting },
-  { 1346, PT_SC, ucp_Sinhala },
-  { 1354, PT_PC, ucp_Sk },
-  { 1357, PT_PC, ucp_Sm },
-  { 1360, PT_PC, ucp_So },
-  { 1363, PT_SC, ucp_Sogdian },
-  { 1371, PT_SC, ucp_Sora_Sompeng },
-  { 1384, PT_SC, ucp_Soyombo },
-  { 1392, PT_SC, ucp_Sundanese },
-  { 1402, PT_SC, ucp_Syloti_Nagri },
-  { 1415, PT_SC, ucp_Syriac },
-  { 1422, PT_SC, ucp_Tagalog },
-  { 1430, PT_SC, ucp_Tagbanwa },
-  { 1439, PT_SC, ucp_Tai_Le },
-  { 1446, PT_SC, ucp_Tai_Tham },
-  { 1455, PT_SC, ucp_Tai_Viet },
-  { 1464, PT_SC, ucp_Takri },
-  { 1470, PT_SC, ucp_Tamil },
-  { 1476, PT_SC, ucp_Tangut },
-  { 1483, PT_SC, ucp_Telugu },
-  { 1490, PT_SC, ucp_Thaana },
-  { 1497, PT_SC, ucp_Thai },
-  { 1502, PT_SC, ucp_Tibetan },
-  { 1510, PT_SC, ucp_Tifinagh },
-  { 1519, PT_SC, ucp_Tirhuta },
-  { 1527, PT_SC, ucp_Ugaritic },
-  { 1536, PT_SC, ucp_Unknown },
-  { 1544, PT_SC, ucp_Vai },
-  { 1548, PT_SC, ucp_Wancho },
-  { 1555, PT_SC, ucp_Warang_Citi },
-  { 1567, PT_ALNUM, 0 },
-  { 1571, PT_PXSPACE, 0 },
-  { 1575, PT_SPACE, 0 },
-  { 1579, PT_UCNC, 0 },
-  { 1583, PT_WORD, 0 },
-  { 1587, PT_SC, ucp_Yezidi },
-  { 1594, PT_SC, ucp_Yi },
-  { 1597, PT_GC, ucp_Z },
-  { 1599, PT_SC, ucp_Zanabazar_Square },
-  { 1616, PT_PC, ucp_Zl },
-  { 1619, PT_PC, ucp_Zp },
-  { 1622, PT_PC, ucp_Zs }
+  { 224, PT_PC, ucp_Cn },
+  { 227, PT_PC, ucp_Co },
+  { 230, PT_SC, ucp_Common },
+  { 237, PT_SC, ucp_Coptic },
+  { 244, PT_PC, ucp_Cs },
+  { 247, PT_SC, ucp_Cuneiform },
+  { 257, PT_SC, ucp_Cypriot },
+  { 265, PT_SC, ucp_Cyrillic },
+  { 274, PT_SC, ucp_Deseret },
+  { 282, PT_SC, ucp_Devanagari },
+  { 293, PT_SC, ucp_Dogra },
+  { 299, PT_SC, ucp_Duployan },
+  { 308, PT_SC, ucp_Egyptian_Hieroglyphs },
+  { 329, PT_SC, ucp_Elbasan },
+  { 337, PT_SC, ucp_Elymaic },
+  { 345, PT_SC, ucp_Ethiopic },
+  { 354, PT_SC, ucp_Georgian },
+  { 363, PT_SC, ucp_Glagolitic },
+  { 374, PT_SC, ucp_Gothic },
+  { 381, PT_SC, ucp_Grantha },
+  { 389, PT_SC, ucp_Greek },
+  { 395, PT_SC, ucp_Gujarati },
+  { 404, PT_SC, ucp_Gunjala_Gondi },
+  { 418, PT_SC, ucp_Gurmukhi },
+  { 427, PT_SC, ucp_Han },
+  { 431, PT_SC, ucp_Hangul },
+  { 438, PT_SC, ucp_Hanifi_Rohingya },
+  { 454, PT_SC, ucp_Hanunoo },
+  { 462, PT_SC, ucp_Hatran },
+  { 469, PT_SC, ucp_Hebrew },
+  { 476, PT_SC, ucp_Hiragana },
+  { 485, PT_SC, ucp_Imperial_Aramaic },
+  { 502, PT_SC, ucp_Inherited },
+  { 512, PT_SC, ucp_Inscriptional_Pahlavi },
+  { 534, PT_SC, ucp_Inscriptional_Parthian },
+  { 557, PT_SC, ucp_Javanese },
+  { 566, PT_SC, ucp_Kaithi },
+  { 573, PT_SC, ucp_Kannada },
+  { 581, PT_SC, ucp_Katakana },
+  { 590, PT_SC, ucp_Kayah_Li },
+  { 599, PT_SC, ucp_Kharoshthi },
+  { 610, PT_SC, ucp_Khmer },
+  { 616, PT_SC, ucp_Khojki },
+  { 623, PT_SC, ucp_Khudawadi },
+  { 633, PT_GC, ucp_L },
+  { 635, PT_LAMP, 0 },
+  { 638, PT_SC, ucp_Lao },
+  { 642, PT_SC, ucp_Latin },
+  { 648, PT_SC, ucp_Lepcha },
+  { 655, PT_SC, ucp_Limbu },
+  { 661, PT_SC, ucp_Linear_A },
+  { 670, PT_SC, ucp_Linear_B },
+  { 679, PT_SC, ucp_Lisu },
+  { 684, PT_PC, ucp_Ll },
+  { 687, PT_PC, ucp_Lm },
+  { 690, PT_PC, ucp_Lo },
+  { 693, PT_PC, ucp_Lt },
+  { 696, PT_PC, ucp_Lu },
+  { 699, PT_SC, ucp_Lycian },
+  { 706, PT_SC, ucp_Lydian },
+  { 713, PT_GC, ucp_M },
+  { 715, PT_SC, ucp_Mahajani },
+  { 724, PT_SC, ucp_Makasar },
+  { 732, PT_SC, ucp_Malayalam },
+  { 742, PT_SC, ucp_Mandaic },
+  { 750, PT_SC, ucp_Manichaean },
+  { 761, PT_SC, ucp_Marchen },
+  { 769, PT_SC, ucp_Masaram_Gondi },
+  { 783, PT_PC, ucp_Mc },
+  { 786, PT_PC, ucp_Me },
+  { 789, PT_SC, ucp_Medefaidrin },
+  { 801, PT_SC, ucp_Meetei_Mayek },
+  { 814, PT_SC, ucp_Mende_Kikakui },
+  { 828, PT_SC, ucp_Meroitic_Cursive },
+  { 845, PT_SC, ucp_Meroitic_Hieroglyphs },
+  { 866, PT_SC, ucp_Miao },
+  { 871, PT_PC, ucp_Mn },
+  { 874, PT_SC, ucp_Modi },
+  { 879, PT_SC, ucp_Mongolian },
+  { 889, PT_SC, ucp_Mro },
+  { 893, PT_SC, ucp_Multani },
+  { 901, PT_SC, ucp_Myanmar },
+  { 909, PT_GC, ucp_N },
+  { 911, PT_SC, ucp_Nabataean },
+  { 921, PT_SC, ucp_Nandinagari },
+  { 933, PT_PC, ucp_Nd },
+  { 936, PT_SC, ucp_New_Tai_Lue },
+  { 948, PT_SC, ucp_Newa },
+  { 953, PT_SC, ucp_Nko },
+  { 957, PT_PC, ucp_Nl },
+  { 960, PT_PC, ucp_No },
+  { 963, PT_SC, ucp_Nushu },
+  { 969, PT_SC, ucp_Nyiakeng_Puachue_Hmong },
+  { 992, PT_SC, ucp_Ogham },
+  { 998, PT_SC, ucp_Ol_Chiki },
+  { 1007, PT_SC, ucp_Old_Hungarian },
+  { 1021, PT_SC, ucp_Old_Italic },
+  { 1032, PT_SC, ucp_Old_North_Arabian },
+  { 1050, PT_SC, ucp_Old_Permic },
+  { 1061, PT_SC, ucp_Old_Persian },
+  { 1073, PT_SC, ucp_Old_Sogdian },
+  { 1085, PT_SC, ucp_Old_South_Arabian },
+  { 1103, PT_SC, ucp_Old_Turkic },
+  { 1114, PT_SC, ucp_Oriya },
+  { 1120, PT_SC, ucp_Osage },
+  { 1126, PT_SC, ucp_Osmanya },
+  { 1134, PT_GC, ucp_P },
+  { 1136, PT_SC, ucp_Pahawh_Hmong },
+  { 1149, PT_SC, ucp_Palmyrene },
+  { 1159, PT_SC, ucp_Pau_Cin_Hau },
+  { 1171, PT_PC, ucp_Pc },
+  { 1174, PT_PC, ucp_Pd },
+  { 1177, PT_PC, ucp_Pe },
+  { 1180, PT_PC, ucp_Pf },
+  { 1183, PT_SC, ucp_Phags_Pa },
+  { 1192, PT_SC, ucp_Phoenician },
+  { 1203, PT_PC, ucp_Pi },
+  { 1206, PT_PC, ucp_Po },
+  { 1209, PT_PC, ucp_Ps },
+  { 1212, PT_SC, ucp_Psalter_Pahlavi },
+  { 1228, PT_SC, ucp_Rejang },
+  { 1235, PT_SC, ucp_Runic },
+  { 1241, PT_GC, ucp_S },
+  { 1243, PT_SC, ucp_Samaritan },
+  { 1253, PT_SC, ucp_Saurashtra },
+  { 1264, PT_PC, ucp_Sc },
+  { 1267, PT_SC, ucp_Sharada },
+  { 1275, PT_SC, ucp_Shavian },
+  { 1283, PT_SC, ucp_Siddham },
+  { 1291, PT_SC, ucp_SignWriting },
+  { 1303, PT_SC, ucp_Sinhala },
+  { 1311, PT_PC, ucp_Sk },
+  { 1314, PT_PC, ucp_Sm },
+  { 1317, PT_PC, ucp_So },
+  { 1320, PT_SC, ucp_Sogdian },
+  { 1328, PT_SC, ucp_Sora_Sompeng },
+  { 1341, PT_SC, ucp_Soyombo },
+  { 1349, PT_SC, ucp_Sundanese },
+  { 1359, PT_SC, ucp_Syloti_Nagri },
+  { 1372, PT_SC, ucp_Syriac },
+  { 1379, PT_SC, ucp_Tagalog },
+  { 1387, PT_SC, ucp_Tagbanwa },
+  { 1396, PT_SC, ucp_Tai_Le },
+  { 1403, PT_SC, ucp_Tai_Tham },
+  { 1412, PT_SC, ucp_Tai_Viet },
+  { 1421, PT_SC, ucp_Takri },
+  { 1427, PT_SC, ucp_Tamil },
+  { 1433, PT_SC, ucp_Tangut },
+  { 1440, PT_SC, ucp_Telugu },
+  { 1447, PT_SC, ucp_Thaana },
+  { 1454, PT_SC, ucp_Thai },
+  { 1459, PT_SC, ucp_Tibetan },
+  { 1467, PT_SC, ucp_Tifinagh },
+  { 1476, PT_SC, ucp_Tirhuta },
+  { 1484, PT_SC, ucp_Ugaritic },
+  { 1493, PT_SC, ucp_Unknown },
+  { 1501, PT_SC, ucp_Vai },
+  { 1505, PT_SC, ucp_Wancho },
+  { 1512, PT_SC, ucp_Warang_Citi },
+  { 1524, PT_ALNUM, 0 },
+  { 1528, PT_PXSPACE, 0 },
+  { 1532, PT_SPACE, 0 },
+  { 1536, PT_UCNC, 0 },
+  { 1540, PT_WORD, 0 },
+  { 1544, PT_SC, ucp_Yi },
+  { 1547, PT_GC, ucp_Z },
+  { 1549, PT_SC, ucp_Zanabazar_Square },
+  { 1566, PT_PC, ucp_Zl },
+  { 1569, PT_PC, ucp_Zp },
+  { 1572, PT_PC, ucp_Zs }
 };
 
 const size_t PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table);
index 46e23ff06b29f75315e323722065cbc509109563..55ba03bd43304dc0c11d62eb0d69627740dcbe17 100644 (file)
@@ -20,7 +20,7 @@ needed. */
 
 /* Unicode character database. */
 /* This file was autogenerated by the MultiStage2.py script. */
-/* Total size: 101044 bytes, block size: 128. */
+/* Total size: 99316 bytes, block size: 128. */
 
 /* The tables herein are needed only when UCP support is built,
 and in PCRE2 that happens automatically with UTF support.
@@ -39,7 +39,7 @@ const uint16_t PRIV(ucd_stage2)[] = {0};
 const uint32_t PRIV(ucd_caseless_sets)[] = {0};
 #else
 
-const char *PRIV(unicode_version) = "13.0.0";
+const char *PRIV(unicode_version) = "12.1.0";
 
 /* If the 32-bit library is run in non-32-bit mode, character values
 greater than 0x10ffff may be encountered. For these we set up a
@@ -116,16 +116,15 @@ set of decimal digits. It is used to ensure that all the digits in
 a script run come from the same set. */
 
 const uint32_t PRIV(ucd_digit_sets)[] = {
-  65,  /* Number of subsequent values */
+  63,  /* Number of subsequent values */
   0x00039, 0x00669, 0x006f9, 0x007c9, 0x0096f, 0x009ef, 0x00a6f, 0x00aef,
   0x00b6f, 0x00bef, 0x00c6f, 0x00cef, 0x00d6f, 0x00def, 0x00e59, 0x00ed9,
   0x00f29, 0x01049, 0x01099, 0x017e9, 0x01819, 0x0194f, 0x019d9, 0x01a89,
   0x01a99, 0x01b59, 0x01bb9, 0x01c49, 0x01c59, 0x0a629, 0x0a8d9, 0x0a909,
   0x0a9d9, 0x0a9f9, 0x0aa59, 0x0abf9, 0x0ff19, 0x104a9, 0x10d39, 0x1106f,
   0x110f9, 0x1113f, 0x111d9, 0x112f9, 0x11459, 0x114d9, 0x11659, 0x116c9,
-  0x11739, 0x118e9, 0x11959, 0x11c59, 0x11d59, 0x11da9, 0x16a69, 0x16b59,
-  0x1d7d7, 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e149, 0x1e2f9, 0x1e959,
-  0x1fbf9,
+  0x11739, 0x118e9, 0x11c59, 0x11d59, 0x11da9, 0x16a69, 0x16b59, 0x1d7d7,
+  0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e149, 0x1e2f9, 0x1e959,
 };
 
 /* This vector is a list of lists of scripts for the Script Extension
@@ -137,14 +136,14 @@ const uint8_t PRIV(ucd_script_sets)[] = {
   /*   4 */   1, 144,   0,
   /*   7 */   1,  50,   0,
   /*  10 */   1,  56,   0,
-  /*  13 */   3,  15,   0,
-  /*  16 */   4,  23,   0,
-  /*  19 */   6,  84,   0,
-  /*  22 */  12,  36,   0,
-  /*  25 */  13,  18,   0,
-  /*  28 */  13,  34,   0,
-  /*  31 */  13, 118,   0,
-  /*  34 */  13,  50,   0,
+  /*  13 */   2,  17,   0,
+  /*  16 */   3,  15,   0,
+  /*  19 */   4,  23,   0,
+  /*  22 */   6,  84,   0,
+  /*  25 */  12,  36,   0,
+  /*  28 */  13,  18,   0,
+  /*  31 */  13,  34,   0,
+  /*  34 */  13, 118,   0,
   /*  37 */  15, 107,   0,
   /*  40 */  15, 150,   0,
   /*  43 */  15, 100,   0,
@@ -153,37 +152,35 @@ const uint8_t PRIV(ucd_script_sets)[] = {
   /*  52 */ 107,  54,   0,
   /*  55 */  21, 108,   0,
   /*  58 */  22, 129,   0,
-  /*  61 */  23,  34,   0,
-  /*  64 */  27,  30,   0,
-  /*  67 */  29, 150,   0,
-  /*  70 */  34,  38,   0,
-  /*  73 */  38,  65,   0,
-  /*  76 */   1,  50,  56,   0,
-  /*  80 */   1,  56, 156,   0,
-  /*  84 */   3,  96,  49,   0,
-  /*  88 */  96,  39,  53,   0,
-  /*  92 */  12, 110,  36,   0,
-  /*  96 */  15, 107,  29,   0,
-  /* 100 */  15, 107,  34,   0,
-  /* 104 */  23,  27,  30,   0,
-  /* 108 */  69,  34,  39,   0,
-  /* 112 */   3,  15, 107,  29,   0,
-  /* 117 */   7,  25,  52,  51,   0,
-  /* 122 */  15, 142,  85, 111,   0,
-  /* 127 */   1, 144,  50,  56, 156,   0,
-  /* 133 */   4,  24,  23,  27,  30,   0,
-  /* 139 */   4,  24,  23,  27,  30,  61,   0,
-  /* 146 */  15,  29,  37,  44,  54,  55,   0,
-  /* 153 */ 132,   1,  95, 112, 121, 144, 148,  50,   0,
-  /* 162 */   3,  15, 107,  29, 150,  44,  55, 124,   0,
-  /* 171 */  15, 142,  21,  22, 108,  85, 111, 114, 109, 102, 124,   0,
-  /* 183 */   3,  15, 107,  21,  22,  29,  34,  37,  44,  54,  55, 124,   0,
-  /* 196 */   3,  15, 107,  21,  22,  29,  34,  37,  44, 100,  54,  55, 124,   0,
-  /* 210 */  15, 142,  21,  22, 108,  29,  85, 111, 114, 150, 109, 102, 124,   0,
-  /* 224 */  15, 142,  21,  22, 108,  29,  85, 111,  37, 114, 150, 109, 102, 124,   0,
-  /* 239 */   3,  15, 142, 143, 138, 107,  21,  22,  29, 111,  37, 150,  44, 109,  48,  49, 102,  54,  55, 124,   0,
-  /* 260 */   3,  15, 142, 143, 138, 107,  21,  22,  29,  35, 111,  37, 150,  44, 109,  48,  49, 102,  54,  55, 124,   0,
-  /* 282 */
+  /*  61 */  27,  30,   0,
+  /*  64 */  29, 150,   0,
+  /*  67 */  34,  38,   0,
+  /*  70 */  38,  65,   0,
+  /*  73 */   1,  50,  56,   0,
+  /*  77 */   3,  96,  49,   0,
+  /*  81 */  96,  39,  53,   0,
+  /*  85 */  12, 110,  36,   0,
+  /*  89 */  15, 107,  29,   0,
+  /*  93 */  15, 107,  34,   0,
+  /*  97 */  23,  27,  30,   0,
+  /* 101 */  69,  34,  39,   0,
+  /* 105 */   1, 144,  50,  56,   0,
+  /* 110 */   3,  15, 107,  29,   0,
+  /* 115 */   7,  25,  52,  51,   0,
+  /* 120 */  15, 142,  85, 111,   0,
+  /* 125 */   4,  24,  23,  27,  30,   0,
+  /* 131 */   4,  24,  23,  27,  30,  61,   0,
+  /* 138 */  15,  29,  37,  44,  54,  55,   0,
+  /* 145 */ 132,   1,  95, 112, 121, 144, 148,  50,   0,
+  /* 154 */   3,  15, 107,  29, 150,  44,  55, 124,   0,
+  /* 163 */  15, 142,  21,  22, 108,  85, 111, 114, 109, 102, 124,   0,
+  /* 175 */   3,  15, 107,  21,  22,  29,  34,  37,  44,  54,  55, 124,   0,
+  /* 188 */   3,  15, 107,  21,  22,  29,  34,  37,  44, 100,  54,  55, 124,   0,
+  /* 202 */  15, 142,  21,  22, 108,  29,  85, 111, 114, 150, 109, 102, 124,   0,
+  /* 216 */  15, 142,  21,  22, 108,  29,  85, 111,  37, 114, 150, 109, 102, 124,   0,
+  /* 231 */   3,  15, 142, 143, 138, 107,  21,  22,  29, 111,  37, 150,  44, 109,  48,  49, 102,  54,  55, 124,   0,
+  /* 252 */   3,  15, 142, 143, 138, 107,  21,  22,  29,  35, 111,  37, 150,  44, 109,  48,  49, 102,  54,  55, 124,   0,
+  /* 274 */
 };
 
 /* These are the main two-stage UCD tables. The fields in each record are:
@@ -192,7 +189,7 @@ offset to multichar other cases or zero (8 bits), offset to other case
 or zero (32 bits, signed), script extension (16 bits, signed), and a dummy
 16-bit field to make the whole thing a multiple of 4 bytes. */
 
-const ucd_record PRIV(ucd_records)[] = { /* 11700 bytes, record size 12 */
+const ucd_record PRIV(ucd_records)[] = { /* 11508 bytes, record size 12 */
   {    10,      0,      2,      0,      0,     10,    256, }, /*   0 */
   {    10,      0,      2,      0,      0,     10,      0, }, /*   1 */
   {    10,      0,      1,      0,      0,     10,      0, }, /*   2 */
@@ -390,9 +387,9 @@ const ucd_record PRIV(ucd_records)[] = { /* 11700 bytes, record size 12 */
   {    13,      9,     12,     88,      1,     13,      0, }, /* 194 */
   {    13,      5,     12,     88,     -1,     13,      0, }, /* 195 */
   {    13,     26,     12,      0,      0,     13,      0, }, /* 196 */
-  {    13,     12,      3,      0,      0,    -31,      0, }, /* 197 */
-  {    13,     12,      3,      0,      0,    -25,      0, }, /* 198 */
-  {    28,     12,      3,      0,      0,    -28,      0, }, /* 199 */
+  {    13,     12,      3,      0,      0,    -34,      0, }, /* 197 */
+  {    13,     12,      3,      0,      0,    -28,      0, }, /* 198 */
+  {    28,     12,      3,      0,      0,    -31,      0, }, /* 199 */
   {    13,     11,      3,      0,      0,     13,      0, }, /* 200 */
   {    13,      9,     12,      0,     15,     13,      0, }, /* 201 */
   {    13,      5,     12,      0,    -15,     13,      0, }, /* 202 */
@@ -401,281 +398,281 @@ const ucd_record PRIV(ucd_records)[] = { /* 11700 bytes, record size 12 */
   {     2,     21,     12,      0,      0,      2,      0, }, /* 205 */
   {     2,      5,     12,      0,      0,      2,      0, }, /* 206 */
   {     2,      5,     12,      0,    -48,      2,      0, }, /* 207 */
-  {     2,     17,     12,      0,      0,      2,      0, }, /* 208 */
-  {     2,     26,     12,      0,      0,      2,      0, }, /* 209 */
-  {     2,     23,     12,      0,      0,      2,      0, }, /* 210 */
-  {    26,     12,      3,      0,      0,     26,      0, }, /* 211 */
-  {    26,     17,     12,      0,      0,     26,      0, }, /* 212 */
-  {    26,     21,     12,      0,      0,     26,      0, }, /* 213 */
-  {    26,      7,     12,      0,      0,     26,      0, }, /* 214 */
-  {     1,      1,      4,      0,      0,      1,      0, }, /* 215 */
-  {    10,      1,      4,      0,      0,     10,      0, }, /* 216 */
-  {     1,     25,     12,      0,      0,      1,      0, }, /* 217 */
-  {     1,     21,     12,      0,      0,      1,      0, }, /* 218 */
-  {     1,     23,     12,      0,      0,      1,      0, }, /* 219 */
-  {    10,     21,     12,      0,      0,   -127,      0, }, /* 220 */
-  {     1,     26,     12,      0,      0,      1,      0, }, /* 221 */
-  {     1,     12,      3,      0,      0,      1,      0, }, /* 222 */
-  {     1,      1,      2,      0,      0,    -76,      0, }, /* 223 */
-  {     1,      7,     12,      0,      0,      1,      0, }, /* 224 */
-  {    10,      6,     12,      0,      0,   -153,      0, }, /* 225 */
-  {    28,     12,      3,      0,      0,     -7,      0, }, /* 226 */
-  {     1,     13,     12,      0,      0,    -80,      0, }, /* 227 */
-  {     1,     21,     12,      0,      0,     -4,      0, }, /* 228 */
-  {     1,      6,     12,      0,      0,      1,      0, }, /* 229 */
-  {     1,     13,     12,      0,      0,      1,      0, }, /* 230 */
-  {    50,     21,     12,      0,      0,     50,      0, }, /* 231 */
-  {    50,      1,      4,      0,      0,     50,      0, }, /* 232 */
-  {    50,      7,     12,      0,      0,     50,      0, }, /* 233 */
-  {    50,     12,      3,      0,      0,     50,      0, }, /* 234 */
-  {    56,      7,     12,      0,      0,     56,      0, }, /* 235 */
-  {    56,     12,      3,      0,      0,     56,      0, }, /* 236 */
-  {    64,     13,     12,      0,      0,     64,      0, }, /* 237 */
-  {    64,      7,     12,      0,      0,     64,      0, }, /* 238 */
-  {    64,     12,      3,      0,      0,     64,      0, }, /* 239 */
-  {    64,      6,     12,      0,      0,     64,      0, }, /* 240 */
-  {    64,     26,     12,      0,      0,     64,      0, }, /* 241 */
-  {    64,     21,     12,      0,      0,     64,      0, }, /* 242 */
-  {    64,     23,     12,      0,      0,     64,      0, }, /* 243 */
-  {    90,      7,     12,      0,      0,     90,      0, }, /* 244 */
-  {    90,     12,      3,      0,      0,     90,      0, }, /* 245 */
-  {    90,      6,     12,      0,      0,     90,      0, }, /* 246 */
-  {    90,     21,     12,      0,      0,     90,      0, }, /* 247 */
-  {    95,      7,     12,      0,      0,     95,      0, }, /* 248 */
-  {    95,     12,      3,      0,      0,     95,      0, }, /* 249 */
-  {    95,     21,     12,      0,      0,     95,      0, }, /* 250 */
-  {    15,     12,      3,      0,      0,     15,      0, }, /* 251 */
-  {    15,     10,      5,      0,      0,     15,      0, }, /* 252 */
-  {    15,      7,     12,      0,      0,     15,      0, }, /* 253 */
-  {    28,     12,      3,      0,      0,   -196,      0, }, /* 254 */
-  {    28,     12,      3,      0,      0,   -183,      0, }, /* 255 */
-  {    10,     21,     12,      0,      0,   -239,      0, }, /* 256 */
-  {    10,     21,     12,      0,      0,   -260,      0, }, /* 257 */
-  {    15,     13,     12,      0,      0,   -122,      0, }, /* 258 */
-  {    15,     21,     12,      0,      0,     15,      0, }, /* 259 */
-  {    15,      6,     12,      0,      0,     15,      0, }, /* 260 */
-  {     3,      7,     12,      0,      0,      3,      0, }, /* 261 */
-  {     3,     12,      3,      0,      0,      3,      0, }, /* 262 */
-  {     3,     10,      5,      0,      0,      3,      0, }, /* 263 */
-  {     3,     10,      3,      0,      0,      3,      0, }, /* 264 */
-  {     3,     13,     12,      0,      0,    -84,      0, }, /* 265 */
-  {     3,     23,     12,      0,      0,      3,      0, }, /* 266 */
-  {     3,     15,     12,      0,      0,      3,      0, }, /* 267 */
-  {     3,     26,     12,      0,      0,      3,      0, }, /* 268 */
-  {     3,     21,     12,      0,      0,      3,      0, }, /* 269 */
-  {    22,     12,      3,      0,      0,     22,      0, }, /* 270 */
-  {    22,     10,      5,      0,      0,     22,      0, }, /* 271 */
-  {    22,      7,     12,      0,      0,     22,      0, }, /* 272 */
-  {    22,     13,     12,      0,      0,    -58,      0, }, /* 273 */
-  {    22,     21,     12,      0,      0,     22,      0, }, /* 274 */
-  {    21,     12,      3,      0,      0,     21,      0, }, /* 275 */
-  {    21,     10,      5,      0,      0,     21,      0, }, /* 276 */
-  {    21,      7,     12,      0,      0,     21,      0, }, /* 277 */
-  {    21,     13,     12,      0,      0,    -55,      0, }, /* 278 */
-  {    21,     21,     12,      0,      0,     21,      0, }, /* 279 */
-  {    21,     23,     12,      0,      0,     21,      0, }, /* 280 */
-  {    44,     12,      3,      0,      0,     44,      0, }, /* 281 */
-  {    44,     10,      5,      0,      0,     44,      0, }, /* 282 */
-  {    44,      7,     12,      0,      0,     44,      0, }, /* 283 */
-  {    44,     10,      3,      0,      0,     44,      0, }, /* 284 */
-  {    44,     13,     12,      0,      0,     44,      0, }, /* 285 */
-  {    44,     26,     12,      0,      0,     44,      0, }, /* 286 */
-  {    44,     15,     12,      0,      0,     44,      0, }, /* 287 */
-  {    54,     12,      3,      0,      0,     54,      0, }, /* 288 */
-  {    54,      7,     12,      0,      0,     54,      0, }, /* 289 */
-  {    54,     10,      3,      0,      0,     54,      0, }, /* 290 */
-  {    54,     10,      5,      0,      0,     54,      0, }, /* 291 */
-  {    54,     13,     12,      0,      0,    -52,      0, }, /* 292 */
-  {    54,     15,     12,      0,      0,    -52,      0, }, /* 293 */
-  {    54,     26,     12,      0,      0,    -52,      0, }, /* 294 */
-  {    54,     26,     12,      0,      0,     54,      0, }, /* 295 */
-  {    54,     23,     12,      0,      0,     54,      0, }, /* 296 */
-  {    55,     12,      3,      0,      0,     55,      0, }, /* 297 */
-  {    55,     10,      5,      0,      0,     55,      0, }, /* 298 */
-  {    55,      7,     12,      0,      0,     55,      0, }, /* 299 */
-  {    55,     13,     12,      0,      0,     55,      0, }, /* 300 */
-  {    55,     21,     12,      0,      0,     55,      0, }, /* 301 */
-  {    55,     15,     12,      0,      0,     55,      0, }, /* 302 */
-  {    55,     26,     12,      0,      0,     55,      0, }, /* 303 */
-  {    29,      7,     12,      0,      0,     29,      0, }, /* 304 */
-  {    29,     12,      3,      0,      0,     29,      0, }, /* 305 */
-  {    29,     10,      5,      0,      0,     29,      0, }, /* 306 */
-  {    29,     21,     12,      0,      0,     29,      0, }, /* 307 */
-  {    29,     10,      3,      0,      0,     29,      0, }, /* 308 */
-  {    29,     13,     12,      0,      0,    -67,      0, }, /* 309 */
-  {    37,     12,      3,      0,      0,     37,      0, }, /* 310 */
-  {    37,     10,      5,      0,      0,     37,      0, }, /* 311 */
-  {    37,      7,     12,      0,      0,     37,      0, }, /* 312 */
-  {    37,     10,      3,      0,      0,     37,      0, }, /* 313 */
-  {    37,      7,      4,      0,      0,     37,      0, }, /* 314 */
-  {    37,     26,     12,      0,      0,     37,      0, }, /* 315 */
-  {    37,     15,     12,      0,      0,     37,      0, }, /* 316 */
-  {    37,     13,     12,      0,      0,     37,      0, }, /* 317 */
-  {    48,     12,      3,      0,      0,     48,      0, }, /* 318 */
+  {    10,     21,     12,      0,      0,    -13,      0, }, /* 208 */
+  {     2,     17,     12,      0,      0,      2,      0, }, /* 209 */
+  {     2,     26,     12,      0,      0,      2,      0, }, /* 210 */
+  {     2,     23,     12,      0,      0,      2,      0, }, /* 211 */
+  {    26,     12,      3,      0,      0,     26,      0, }, /* 212 */
+  {    26,     17,     12,      0,      0,     26,      0, }, /* 213 */
+  {    26,     21,     12,      0,      0,     26,      0, }, /* 214 */
+  {    26,      7,     12,      0,      0,     26,      0, }, /* 215 */
+  {     1,      1,      4,      0,      0,      1,      0, }, /* 216 */
+  {    10,      1,      4,      0,      0,     10,      0, }, /* 217 */
+  {     1,     25,     12,      0,      0,      1,      0, }, /* 218 */
+  {     1,     21,     12,      0,      0,      1,      0, }, /* 219 */
+  {     1,     23,     12,      0,      0,      1,      0, }, /* 220 */
+  {    10,     21,     12,      0,      0,   -105,      0, }, /* 221 */
+  {     1,     26,     12,      0,      0,      1,      0, }, /* 222 */
+  {     1,     12,      3,      0,      0,      1,      0, }, /* 223 */
+  {     1,      1,      2,      0,      0,    -73,      0, }, /* 224 */
+  {     1,      7,     12,      0,      0,      1,      0, }, /* 225 */
+  {    10,      6,     12,      0,      0,   -145,      0, }, /* 226 */
+  {    28,     12,      3,      0,      0,     -7,      0, }, /* 227 */
+  {     1,     13,     12,      0,      0,    -10,      0, }, /* 228 */
+  {     1,     21,     12,      0,      0,     -4,      0, }, /* 229 */
+  {     1,      6,     12,      0,      0,      1,      0, }, /* 230 */
+  {     1,     13,     12,      0,      0,      1,      0, }, /* 231 */
+  {    50,     21,     12,      0,      0,     50,      0, }, /* 232 */
+  {    50,      1,      4,      0,      0,     50,      0, }, /* 233 */
+  {    50,      7,     12,      0,      0,     50,      0, }, /* 234 */
+  {    50,     12,      3,      0,      0,     50,      0, }, /* 235 */
+  {    56,      7,     12,      0,      0,     56,      0, }, /* 236 */
+  {    56,     12,      3,      0,      0,     56,      0, }, /* 237 */
+  {    64,     13,     12,      0,      0,     64,      0, }, /* 238 */
+  {    64,      7,     12,      0,      0,     64,      0, }, /* 239 */
+  {    64,     12,      3,      0,      0,     64,      0, }, /* 240 */
+  {    64,      6,     12,      0,      0,     64,      0, }, /* 241 */
+  {    64,     26,     12,      0,      0,     64,      0, }, /* 242 */
+  {    64,     21,     12,      0,      0,     64,      0, }, /* 243 */
+  {    64,     23,     12,      0,      0,     64,      0, }, /* 244 */
+  {    90,      7,     12,      0,      0,     90,      0, }, /* 245 */
+  {    90,     12,      3,      0,      0,     90,      0, }, /* 246 */
+  {    90,      6,     12,      0,      0,     90,      0, }, /* 247 */
+  {    90,     21,     12,      0,      0,     90,      0, }, /* 248 */
+  {    95,      7,     12,      0,      0,     95,      0, }, /* 249 */
+  {    95,     12,      3,      0,      0,     95,      0, }, /* 250 */
+  {    95,     21,     12,      0,      0,     95,      0, }, /* 251 */
+  {    15,     12,      3,      0,      0,     15,      0, }, /* 252 */
+  {    15,     10,      5,      0,      0,     15,      0, }, /* 253 */
+  {    15,      7,     12,      0,      0,     15,      0, }, /* 254 */
+  {    28,     12,      3,      0,      0,   -188,      0, }, /* 255 */
+  {    28,     12,      3,      0,      0,   -175,      0, }, /* 256 */
+  {    10,     21,     12,      0,      0,   -231,      0, }, /* 257 */
+  {    10,     21,     12,      0,      0,   -252,      0, }, /* 258 */
+  {    15,     13,     12,      0,      0,   -120,      0, }, /* 259 */
+  {    15,     21,     12,      0,      0,     15,      0, }, /* 260 */
+  {    15,      6,     12,      0,      0,     15,      0, }, /* 261 */
+  {     3,      7,     12,      0,      0,      3,      0, }, /* 262 */
+  {     3,     12,      3,      0,      0,      3,      0, }, /* 263 */
+  {     3,     10,      5,      0,      0,      3,      0, }, /* 264 */
+  {     3,     10,      3,      0,      0,      3,      0, }, /* 265 */
+  {     3,     13,     12,      0,      0,    -77,      0, }, /* 266 */
+  {     3,     23,     12,      0,      0,      3,      0, }, /* 267 */
+  {     3,     15,     12,      0,      0,      3,      0, }, /* 268 */
+  {     3,     26,     12,      0,      0,      3,      0, }, /* 269 */
+  {     3,     21,     12,      0,      0,      3,      0, }, /* 270 */
+  {    22,     12,      3,      0,      0,     22,      0, }, /* 271 */
+  {    22,     10,      5,      0,      0,     22,      0, }, /* 272 */
+  {    22,      7,     12,      0,      0,     22,      0, }, /* 273 */
+  {    22,     13,     12,      0,      0,    -58,      0, }, /* 274 */
+  {    22,     21,     12,      0,      0,     22,      0, }, /* 275 */
+  {    21,     12,      3,      0,      0,     21,      0, }, /* 276 */
+  {    21,     10,      5,      0,      0,     21,      0, }, /* 277 */
+  {    21,      7,     12,      0,      0,     21,      0, }, /* 278 */
+  {    21,     13,     12,      0,      0,    -55,      0, }, /* 279 */
+  {    21,     21,     12,      0,      0,     21,      0, }, /* 280 */
+  {    21,     23,     12,      0,      0,     21,      0, }, /* 281 */
+  {    44,     12,      3,      0,      0,     44,      0, }, /* 282 */
+  {    44,     10,      5,      0,      0,     44,      0, }, /* 283 */
+  {    44,      7,     12,      0,      0,     44,      0, }, /* 284 */
+  {    44,     10,      3,      0,      0,     44,      0, }, /* 285 */
+  {    44,     13,     12,      0,      0,     44,      0, }, /* 286 */
+  {    44,     26,     12,      0,      0,     44,      0, }, /* 287 */
+  {    44,     15,     12,      0,      0,     44,      0, }, /* 288 */
+  {    54,     12,      3,      0,      0,     54,      0, }, /* 289 */
+  {    54,      7,     12,      0,      0,     54,      0, }, /* 290 */
+  {    54,     10,      3,      0,      0,     54,      0, }, /* 291 */
+  {    54,     10,      5,      0,      0,     54,      0, }, /* 292 */
+  {    54,     13,     12,      0,      0,    -52,      0, }, /* 293 */
+  {    54,     15,     12,      0,      0,    -52,      0, }, /* 294 */
+  {    54,     26,     12,      0,      0,    -52,      0, }, /* 295 */
+  {    54,     26,     12,      0,      0,     54,      0, }, /* 296 */
+  {    54,     23,     12,      0,      0,     54,      0, }, /* 297 */
+  {    55,     12,      3,      0,      0,     55,      0, }, /* 298 */
+  {    55,     10,      5,      0,      0,     55,      0, }, /* 299 */
+  {    55,      7,     12,      0,      0,     55,      0, }, /* 300 */
+  {    55,     13,     12,      0,      0,     55,      0, }, /* 301 */
+  {    55,     21,     12,      0,      0,     55,      0, }, /* 302 */
+  {    55,     15,     12,      0,      0,     55,      0, }, /* 303 */
+  {    55,     26,     12,      0,      0,     55,      0, }, /* 304 */
+  {    29,      7,     12,      0,      0,     29,      0, }, /* 305 */
+  {    29,     12,      3,      0,      0,     29,      0, }, /* 306 */
+  {    29,     10,      5,      0,      0,     29,      0, }, /* 307 */
+  {    29,     21,     12,      0,      0,     29,      0, }, /* 308 */
+  {    29,     10,      3,      0,      0,     29,      0, }, /* 309 */
+  {    29,     13,     12,      0,      0,    -64,      0, }, /* 310 */
+  {    37,     12,      3,      0,      0,     37,      0, }, /* 311 */
+  {    37,     10,      5,      0,      0,     37,      0, }, /* 312 */
+  {    37,      7,     12,      0,      0,     37,      0, }, /* 313 */
+  {    37,     10,      3,      0,      0,     37,      0, }, /* 314 */
+  {    37,      7,      4,      0,      0,     37,      0, }, /* 315 */
+  {    37,     26,     12,      0,      0,     37,      0, }, /* 316 */
+  {    37,     15,     12,      0,      0,     37,      0, }, /* 317 */
+  {    37,     13,     12,      0,      0,     37,      0, }, /* 318 */
   {    48,     10,      5,      0,      0,     48,      0, }, /* 319 */
   {    48,      7,     12,      0,      0,     48,      0, }, /* 320 */
-  {    48,     10,      3,      0,      0,     48,      0, }, /* 321 */
-  {    48,     13,     12,      0,      0,     48,      0, }, /* 322 */
-  {    48,     21,     12,      0,      0,     48,      0, }, /* 323 */
-  {    57,      7,     12,      0,      0,     57,      0, }, /* 324 */
-  {    57,     12,      3,      0,      0,     57,      0, }, /* 325 */
-  {    57,      7,      5,      0,      0,     57,      0, }, /* 326 */
-  {    57,      6,     12,      0,      0,     57,      0, }, /* 327 */
-  {    57,     21,     12,      0,      0,     57,      0, }, /* 328 */
-  {    57,     13,     12,      0,      0,     57,      0, }, /* 329 */
-  {    33,      7,     12,      0,      0,     33,      0, }, /* 330 */
-  {    33,     12,      3,      0,      0,     33,      0, }, /* 331 */
-  {    33,      7,      5,      0,      0,     33,      0, }, /* 332 */
-  {    33,      6,     12,      0,      0,     33,      0, }, /* 333 */
-  {    33,     13,     12,      0,      0,     33,      0, }, /* 334 */
-  {    58,      7,     12,      0,      0,     58,      0, }, /* 335 */
-  {    58,     26,     12,      0,      0,     58,      0, }, /* 336 */
-  {    58,     21,     12,      0,      0,     58,      0, }, /* 337 */
-  {    58,     12,      3,      0,      0,     58,      0, }, /* 338 */
-  {    58,     13,     12,      0,      0,     58,      0, }, /* 339 */
-  {    58,     15,     12,      0,      0,     58,      0, }, /* 340 */
-  {    58,     22,     12,      0,      0,     58,      0, }, /* 341 */
-  {    58,     18,     12,      0,      0,     58,      0, }, /* 342 */
-  {    58,     10,      5,      0,      0,     58,      0, }, /* 343 */
-  {    39,      7,     12,      0,      0,     39,      0, }, /* 344 */
-  {    39,     10,     12,      0,      0,     39,      0, }, /* 345 */
-  {    39,     12,      3,      0,      0,     39,      0, }, /* 346 */
-  {    39,     10,      5,      0,      0,     39,      0, }, /* 347 */
-  {    39,     13,     12,      0,      0,    -88,      0, }, /* 348 */
-  {    39,     21,     12,      0,      0,     39,      0, }, /* 349 */
-  {    39,     13,     12,      0,      0,     39,      0, }, /* 350 */
-  {    39,     26,     12,      0,      0,     39,      0, }, /* 351 */
-  {    17,      9,     12,      0,   7264,     17,      0, }, /* 352 */
-  {    17,      5,     12,      0,   3008,     17,      0, }, /* 353 */
-  {    10,     21,     12,      0,      0,    -49,      0, }, /* 354 */
-  {    17,      6,     12,      0,      0,     17,      0, }, /* 355 */
-  {    24,      7,      6,      0,      0,     24,      0, }, /* 356 */
-  {    24,      7,      7,      0,      0,     24,      0, }, /* 357 */
-  {    24,      7,      8,      0,      0,     24,      0, }, /* 358 */
-  {    16,      7,     12,      0,      0,     16,      0, }, /* 359 */
-  {    16,     12,      3,      0,      0,     16,      0, }, /* 360 */
-  {    16,     21,     12,      0,      0,     16,      0, }, /* 361 */
-  {    16,     15,     12,      0,      0,     16,      0, }, /* 362 */
-  {    16,     26,     12,      0,      0,     16,      0, }, /* 363 */
-  {     9,      9,     12,      0,  38864,      9,      0, }, /* 364 */
-  {     9,      9,     12,      0,      8,      9,      0, }, /* 365 */
-  {     9,      5,     12,      0,     -8,      9,      0, }, /* 366 */
-  {     8,     17,     12,      0,      0,      8,      0, }, /* 367 */
-  {     8,      7,     12,      0,      0,      8,      0, }, /* 368 */
-  {     8,     26,     12,      0,      0,      8,      0, }, /* 369 */
-  {     8,     21,     12,      0,      0,      8,      0, }, /* 370 */
-  {    41,     29,     12,      0,      0,     41,      0, }, /* 371 */
-  {    41,      7,     12,      0,      0,     41,      0, }, /* 372 */
-  {    41,     22,     12,      0,      0,     41,      0, }, /* 373 */
-  {    41,     18,     12,      0,      0,     41,      0, }, /* 374 */
-  {    46,      7,     12,      0,      0,     46,      0, }, /* 375 */
-  {    46,     14,     12,      0,      0,     46,      0, }, /* 376 */
-  {    51,      7,     12,      0,      0,     51,      0, }, /* 377 */
-  {    51,     12,      3,      0,      0,     51,      0, }, /* 378 */
-  {    25,      7,     12,      0,      0,     25,      0, }, /* 379 */
-  {    25,     12,      3,      0,      0,     25,      0, }, /* 380 */
-  {    10,     21,     12,      0,      0,   -117,      0, }, /* 381 */
-  {     7,      7,     12,      0,      0,      7,      0, }, /* 382 */
-  {     7,     12,      3,      0,      0,      7,      0, }, /* 383 */
-  {    52,      7,     12,      0,      0,     52,      0, }, /* 384 */
-  {    52,     12,      3,      0,      0,     52,      0, }, /* 385 */
-  {    32,      7,     12,      0,      0,     32,      0, }, /* 386 */
-  {    32,     12,      3,      0,      0,     32,      0, }, /* 387 */
-  {    32,     10,      5,      0,      0,     32,      0, }, /* 388 */
-  {    32,     21,     12,      0,      0,     32,      0, }, /* 389 */
-  {    32,      6,     12,      0,      0,     32,      0, }, /* 390 */
-  {    32,     23,     12,      0,      0,     32,      0, }, /* 391 */
-  {    32,     13,     12,      0,      0,     32,      0, }, /* 392 */
-  {    32,     15,     12,      0,      0,     32,      0, }, /* 393 */
-  {    38,     21,     12,      0,      0,     38,      0, }, /* 394 */
-  {    10,     21,     12,      0,      0,    -73,      0, }, /* 395 */
-  {    38,     17,     12,      0,      0,     38,      0, }, /* 396 */
-  {    38,     12,      3,      0,      0,     38,      0, }, /* 397 */
-  {    38,      1,      2,      0,      0,     38,      0, }, /* 398 */
-  {    38,     13,     12,      0,      0,     38,      0, }, /* 399 */
-  {    38,      7,     12,      0,      0,     38,      0, }, /* 400 */
-  {    38,      6,     12,      0,      0,     38,      0, }, /* 401 */
-  {    35,      7,     12,      0,      0,     35,      0, }, /* 402 */
-  {    35,     12,      3,      0,      0,     35,      0, }, /* 403 */
-  {    35,     10,      5,      0,      0,     35,      0, }, /* 404 */
-  {    35,     26,     12,      0,      0,     35,      0, }, /* 405 */
-  {    35,     21,     12,      0,      0,     35,      0, }, /* 406 */
-  {    35,     13,     12,      0,      0,     35,      0, }, /* 407 */
-  {    53,      7,     12,      0,      0,     53,      0, }, /* 408 */
-  {    40,      7,     12,      0,      0,     40,      0, }, /* 409 */
-  {    40,     13,     12,      0,      0,     40,      0, }, /* 410 */
-  {    40,     15,     12,      0,      0,     40,      0, }, /* 411 */
-  {    40,     26,     12,      0,      0,     40,      0, }, /* 412 */
-  {    32,     26,     12,      0,      0,     32,      0, }, /* 413 */
-  {     6,      7,     12,      0,      0,      6,      0, }, /* 414 */
-  {     6,     12,      3,      0,      0,      6,      0, }, /* 415 */
-  {     6,     10,      5,      0,      0,      6,      0, }, /* 416 */
-  {     6,     21,     12,      0,      0,      6,      0, }, /* 417 */
-  {    91,      7,     12,      0,      0,     91,      0, }, /* 418 */
-  {    91,     10,      5,      0,      0,     91,      0, }, /* 419 */
-  {    91,     12,      3,      0,      0,     91,      0, }, /* 420 */
-  {    91,     10,     12,      0,      0,     91,      0, }, /* 421 */
-  {    91,     13,     12,      0,      0,     91,      0, }, /* 422 */
-  {    91,     21,     12,      0,      0,     91,      0, }, /* 423 */
-  {    91,      6,     12,      0,      0,     91,      0, }, /* 424 */
-  {    28,     11,      3,      0,      0,     28,      0, }, /* 425 */
-  {    62,     12,      3,      0,      0,     62,      0, }, /* 426 */
-  {    62,     10,      5,      0,      0,     62,      0, }, /* 427 */
-  {    62,      7,     12,      0,      0,     62,      0, }, /* 428 */
-  {    62,     10,      3,      0,      0,     62,      0, }, /* 429 */
-  {    62,     13,     12,      0,      0,     62,      0, }, /* 430 */
-  {    62,     21,     12,      0,      0,     62,      0, }, /* 431 */
-  {    62,     26,     12,      0,      0,     62,      0, }, /* 432 */
-  {    76,     12,      3,      0,      0,     76,      0, }, /* 433 */
-  {    76,     10,      5,      0,      0,     76,      0, }, /* 434 */
-  {    76,      7,     12,      0,      0,     76,      0, }, /* 435 */
-  {    76,     13,     12,      0,      0,     76,      0, }, /* 436 */
-  {    93,      7,     12,      0,      0,     93,      0, }, /* 437 */
-  {    93,     12,      3,      0,      0,     93,      0, }, /* 438 */
-  {    93,     10,      5,      0,      0,     93,      0, }, /* 439 */
-  {    93,     21,     12,      0,      0,     93,      0, }, /* 440 */
-  {    70,      7,     12,      0,      0,     70,      0, }, /* 441 */
-  {    70,     10,      5,      0,      0,     70,      0, }, /* 442 */
-  {    70,     12,      3,      0,      0,     70,      0, }, /* 443 */
-  {    70,     21,     12,      0,      0,     70,      0, }, /* 444 */
-  {    70,     13,     12,      0,      0,     70,      0, }, /* 445 */
-  {    73,     13,     12,      0,      0,     73,      0, }, /* 446 */
-  {    73,      7,     12,      0,      0,     73,      0, }, /* 447 */
-  {    73,      6,     12,      0,      0,     73,      0, }, /* 448 */
-  {    73,     21,     12,      0,      0,     73,      0, }, /* 449 */
-  {    13,      5,     12,     63,  -6222,     13,      0, }, /* 450 */
-  {    13,      5,     12,     67,  -6221,     13,      0, }, /* 451 */
-  {    13,      5,     12,     71,  -6212,     13,      0, }, /* 452 */
-  {    13,      5,     12,     75,  -6210,     13,      0, }, /* 453 */
-  {    13,      5,     12,     79,  -6210,     13,      0, }, /* 454 */
-  {    13,      5,     12,     79,  -6211,     13,      0, }, /* 455 */
-  {    13,      5,     12,     84,  -6204,     13,      0, }, /* 456 */
-  {    13,      5,     12,     88,  -6180,     13,      0, }, /* 457 */
-  {    13,      5,     12,    108,  35267,     13,      0, }, /* 458 */
-  {    17,      9,     12,      0,  -3008,     17,      0, }, /* 459 */
-  {    76,     21,     12,      0,      0,     76,      0, }, /* 460 */
-  {    28,     12,      3,      0,      0,   -112,      0, }, /* 461 */
-  {    28,     12,      3,      0,      0,     15,      0, }, /* 462 */
-  {    10,     21,     12,      0,      0,    -37,      0, }, /* 463 */
-  {    28,     12,      3,      0,      0,    -13,      0, }, /* 464 */
-  {    28,     12,      3,      0,      0,    -43,      0, }, /* 465 */
-  {    28,     12,      3,      0,      0,   -146,      0, }, /* 466 */
-  {    10,     10,      5,      0,      0,    -13,      0, }, /* 467 */
-  {    10,      7,     12,      0,      0,    -40,      0, }, /* 468 */
-  {    10,      7,     12,      0,      0,    -13,      0, }, /* 469 */
-  {    10,      7,     12,      0,      0,     15,      0, }, /* 470 */
-  {    10,      7,     12,      0,      0,   -162,      0, }, /* 471 */
-  {    10,      7,     12,      0,      0,    -37,      0, }, /* 472 */
-  {    28,     12,      3,      0,      0,    -96,      0, }, /* 473 */
-  {    10,     10,      5,      0,      0,      3,      0, }, /* 474 */
-  {    28,     12,      3,      0,      0,    -37,      0, }, /* 475 */
-  {    10,      7,     12,      0,      0,    150,      0, }, /* 476 */
-  {    13,      5,     12,      0,      0,     13,      0, }, /* 477 */
-  {    13,      6,     12,      0,      0,     13,      0, }, /* 478 */
-  {    34,      5,     12,      0,  35332,     34,      0, }, /* 479 */
-  {    34,      5,     12,      0,   3814,     34,      0, }, /* 480 */
-  {    34,      5,     12,      0,  35384,     34,      0, }, /* 481 */
-  {    28,     12,      3,      0,      0,    -34,      0, }, /* 482 */
+  {    48,     12,      3,      0,      0,     48,      0, }, /* 321 */
+  {    48,     10,      3,      0,      0,     48,      0, }, /* 322 */
+  {    48,     13,     12,      0,      0,     48,      0, }, /* 323 */
+  {    48,     21,     12,      0,      0,     48,      0, }, /* 324 */
+  {    57,      7,     12,      0,      0,     57,      0, }, /* 325 */
+  {    57,     12,      3,      0,      0,     57,      0, }, /* 326 */
+  {    57,      7,      5,      0,      0,     57,      0, }, /* 327 */
+  {    57,      6,     12,      0,      0,     57,      0, }, /* 328 */
+  {    57,     21,     12,      0,      0,     57,      0, }, /* 329 */
+  {    57,     13,     12,      0,      0,     57,      0, }, /* 330 */
+  {    33,      7,     12,      0,      0,     33,      0, }, /* 331 */
+  {    33,     12,      3,      0,      0,     33,      0, }, /* 332 */
+  {    33,      7,      5,      0,      0,     33,      0, }, /* 333 */
+  {    33,      6,     12,      0,      0,     33,      0, }, /* 334 */
+  {    33,     13,     12,      0,      0,     33,      0, }, /* 335 */
+  {    58,      7,     12,      0,      0,     58,      0, }, /* 336 */
+  {    58,     26,     12,      0,      0,     58,      0, }, /* 337 */
+  {    58,     21,     12,      0,      0,     58,      0, }, /* 338 */
+  {    58,     12,      3,      0,      0,     58,      0, }, /* 339 */
+  {    58,     13,     12,      0,      0,     58,      0, }, /* 340 */
+  {    58,     15,     12,      0,      0,     58,      0, }, /* 341 */
+  {    58,     22,     12,      0,      0,     58,      0, }, /* 342 */
+  {    58,     18,     12,      0,      0,     58,      0, }, /* 343 */
+  {    58,     10,      5,      0,      0,     58,      0, }, /* 344 */
+  {    39,      7,     12,      0,      0,     39,      0, }, /* 345 */
+  {    39,     10,     12,      0,      0,     39,      0, }, /* 346 */
+  {    39,     12,      3,      0,      0,     39,      0, }, /* 347 */
+  {    39,     10,      5,      0,      0,     39,      0, }, /* 348 */
+  {    39,     13,     12,      0,      0,    -81,      0, }, /* 349 */
+  {    39,     21,     12,      0,      0,     39,      0, }, /* 350 */
+  {    39,     13,     12,      0,      0,     39,      0, }, /* 351 */
+  {    39,     26,     12,      0,      0,     39,      0, }, /* 352 */
+  {    17,      9,     12,      0,   7264,     17,      0, }, /* 353 */
+  {    17,      5,     12,      0,   3008,     17,      0, }, /* 354 */
+  {    10,     21,     12,      0,      0,    -49,      0, }, /* 355 */
+  {    17,      6,     12,      0,      0,     17,      0, }, /* 356 */
+  {    24,      7,      6,      0,      0,     24,      0, }, /* 357 */
+  {    24,      7,      7,      0,      0,     24,      0, }, /* 358 */
+  {    24,      7,      8,      0,      0,     24,      0, }, /* 359 */
+  {    16,      7,     12,      0,      0,     16,      0, }, /* 360 */
+  {    16,     12,      3,      0,      0,     16,      0, }, /* 361 */
+  {    16,     21,     12,      0,      0,     16,      0, }, /* 362 */
+  {    16,     15,     12,      0,      0,     16,      0, }, /* 363 */
+  {    16,     26,     12,      0,      0,     16,      0, }, /* 364 */
+  {     9,      9,     12,      0,  38864,      9,      0, }, /* 365 */
+  {     9,      9,     12,      0,      8,      9,      0, }, /* 366 */
+  {     9,      5,     12,      0,     -8,      9,      0, }, /* 367 */
+  {     8,     17,     12,      0,      0,      8,      0, }, /* 368 */
+  {     8,      7,     12,      0,      0,      8,      0, }, /* 369 */
+  {     8,     26,     12,      0,      0,      8,      0, }, /* 370 */
+  {     8,     21,     12,      0,      0,      8,      0, }, /* 371 */
+  {    41,     29,     12,      0,      0,     41,      0, }, /* 372 */
+  {    41,      7,     12,      0,      0,     41,      0, }, /* 373 */
+  {    41,     22,     12,      0,      0,     41,      0, }, /* 374 */
+  {    41,     18,     12,      0,      0,     41,      0, }, /* 375 */
+  {    46,      7,     12,      0,      0,     46,      0, }, /* 376 */
+  {    46,     14,     12,      0,      0,     46,      0, }, /* 377 */
+  {    51,      7,     12,      0,      0,     51,      0, }, /* 378 */
+  {    51,     12,      3,      0,      0,     51,      0, }, /* 379 */
+  {    25,      7,     12,      0,      0,     25,      0, }, /* 380 */
+  {    25,     12,      3,      0,      0,     25,      0, }, /* 381 */
+  {    10,     21,     12,      0,      0,   -115,      0, }, /* 382 */
+  {     7,      7,     12,      0,      0,      7,      0, }, /* 383 */
+  {     7,     12,      3,      0,      0,      7,      0, }, /* 384 */
+  {    52,      7,     12,      0,      0,     52,      0, }, /* 385 */
+  {    52,     12,      3,      0,      0,     52,      0, }, /* 386 */
+  {    32,      7,     12,      0,      0,     32,      0, }, /* 387 */
+  {    32,     12,      3,      0,      0,     32,      0, }, /* 388 */
+  {    32,     10,      5,      0,      0,     32,      0, }, /* 389 */
+  {    32,     21,     12,      0,      0,     32,      0, }, /* 390 */
+  {    32,      6,     12,      0,      0,     32,      0, }, /* 391 */
+  {    32,     23,     12,      0,      0,     32,      0, }, /* 392 */
+  {    32,     13,     12,      0,      0,     32,      0, }, /* 393 */
+  {    32,     15,     12,      0,      0,     32,      0, }, /* 394 */
+  {    38,     21,     12,      0,      0,     38,      0, }, /* 395 */
+  {    10,     21,     12,      0,      0,    -70,      0, }, /* 396 */
+  {    38,     17,     12,      0,      0,     38,      0, }, /* 397 */
+  {    38,     12,      3,      0,      0,     38,      0, }, /* 398 */
+  {    38,      1,      2,      0,      0,     38,      0, }, /* 399 */
+  {    38,     13,     12,      0,      0,     38,      0, }, /* 400 */
+  {    38,      7,     12,      0,      0,     38,      0, }, /* 401 */
+  {    38,      6,     12,      0,      0,     38,      0, }, /* 402 */
+  {    35,      7,     12,      0,      0,     35,      0, }, /* 403 */
+  {    35,     12,      3,      0,      0,     35,      0, }, /* 404 */
+  {    35,     10,      5,      0,      0,     35,      0, }, /* 405 */
+  {    35,     26,     12,      0,      0,     35,      0, }, /* 406 */
+  {    35,     21,     12,      0,      0,     35,      0, }, /* 407 */
+  {    35,     13,     12,      0,      0,     35,      0, }, /* 408 */
+  {    53,      7,     12,      0,      0,     53,      0, }, /* 409 */
+  {    40,      7,     12,      0,      0,     40,      0, }, /* 410 */
+  {    40,     13,     12,      0,      0,     40,      0, }, /* 411 */
+  {    40,     15,     12,      0,      0,     40,      0, }, /* 412 */
+  {    40,     26,     12,      0,      0,     40,      0, }, /* 413 */
+  {    32,     26,     12,      0,      0,     32,      0, }, /* 414 */
+  {     6,      7,     12,      0,      0,      6,      0, }, /* 415 */
+  {     6,     12,      3,      0,      0,      6,      0, }, /* 416 */
+  {     6,     10,      5,      0,      0,      6,      0, }, /* 417 */
+  {     6,     21,     12,      0,      0,      6,      0, }, /* 418 */
+  {    91,      7,     12,      0,      0,     91,      0, }, /* 419 */
+  {    91,     10,      5,      0,      0,     91,      0, }, /* 420 */
+  {    91,     12,      3,      0,      0,     91,      0, }, /* 421 */
+  {    91,     10,     12,      0,      0,     91,      0, }, /* 422 */
+  {    91,     13,     12,      0,      0,     91,      0, }, /* 423 */
+  {    91,     21,     12,      0,      0,     91,      0, }, /* 424 */
+  {    91,      6,     12,      0,      0,     91,      0, }, /* 425 */
+  {    28,     11,      3,      0,      0,     28,      0, }, /* 426 */
+  {    62,     12,      3,      0,      0,     62,      0, }, /* 427 */
+  {    62,     10,      5,      0,      0,     62,      0, }, /* 428 */
+  {    62,      7,     12,      0,      0,     62,      0, }, /* 429 */
+  {    62,     10,      3,      0,      0,     62,      0, }, /* 430 */
+  {    62,     13,     12,      0,      0,     62,      0, }, /* 431 */
+  {    62,     21,     12,      0,      0,     62,      0, }, /* 432 */
+  {    62,     26,     12,      0,      0,     62,      0, }, /* 433 */
+  {    76,     12,      3,      0,      0,     76,      0, }, /* 434 */
+  {    76,     10,      5,      0,      0,     76,      0, }, /* 435 */
+  {    76,      7,     12,      0,      0,     76,      0, }, /* 436 */
+  {    76,     13,     12,      0,      0,     76,      0, }, /* 437 */
+  {    93,      7,     12,      0,      0,     93,      0, }, /* 438 */
+  {    93,     12,      3,      0,      0,     93,      0, }, /* 439 */
+  {    93,     10,      5,      0,      0,     93,      0, }, /* 440 */
+  {    93,     21,     12,      0,      0,     93,      0, }, /* 441 */
+  {    70,      7,     12,      0,      0,     70,      0, }, /* 442 */
+  {    70,     10,      5,      0,      0,     70,      0, }, /* 443 */
+  {    70,     12,      3,      0,      0,     70,      0, }, /* 444 */
+  {    70,     21,     12,      0,      0,     70,      0, }, /* 445 */
+  {    70,     13,     12,      0,      0,     70,      0, }, /* 446 */
+  {    73,     13,     12,      0,      0,     73,      0, }, /* 447 */
+  {    73,      7,     12,      0,      0,     73,      0, }, /* 448 */
+  {    73,      6,     12,      0,      0,     73,      0, }, /* 449 */
+  {    73,     21,     12,      0,      0,     73,      0, }, /* 450 */
+  {    13,      5,     12,     63,  -6222,     13,      0, }, /* 451 */
+  {    13,      5,     12,     67,  -6221,     13,      0, }, /* 452 */
+  {    13,      5,     12,     71,  -6212,     13,      0, }, /* 453 */
+  {    13,      5,     12,     75,  -6210,     13,      0, }, /* 454 */
+  {    13,      5,     12,     79,  -6210,     13,      0, }, /* 455 */
+  {    13,      5,     12,     79,  -6211,     13,      0, }, /* 456 */
+  {    13,      5,     12,     84,  -6204,     13,      0, }, /* 457 */
+  {    13,      5,     12,     88,  -6180,     13,      0, }, /* 458 */
+  {    13,      5,     12,    108,  35267,     13,      0, }, /* 459 */
+  {    17,      9,     12,      0,  -3008,     17,      0, }, /* 460 */
+  {    76,     21,     12,      0,      0,     76,      0, }, /* 461 */
+  {    28,     12,      3,      0,      0,   -110,      0, }, /* 462 */
+  {    28,     12,      3,      0,      0,     15,      0, }, /* 463 */
+  {    10,     21,     12,      0,      0,    -37,      0, }, /* 464 */
+  {    28,     12,      3,      0,      0,    -16,      0, }, /* 465 */
+  {    28,     12,      3,      0,      0,    -43,      0, }, /* 466 */
+  {    28,     12,      3,      0,      0,   -138,      0, }, /* 467 */
+  {    10,     10,      5,      0,      0,    -16,      0, }, /* 468 */
+  {    10,      7,     12,      0,      0,    -40,      0, }, /* 469 */
+  {    10,      7,     12,      0,      0,    -16,      0, }, /* 470 */
+  {    10,      7,     12,      0,      0,     15,      0, }, /* 471 */
+  {    10,      7,     12,      0,      0,   -154,      0, }, /* 472 */
+  {    10,      7,     12,      0,      0,    -37,      0, }, /* 473 */
+  {    28,     12,      3,      0,      0,    -89,      0, }, /* 474 */
+  {    10,     10,      5,      0,      0,      3,      0, }, /* 475 */
+  {    28,     12,      3,      0,      0,    -37,      0, }, /* 476 */
+  {    10,      7,     12,      0,      0,    150,      0, }, /* 477 */
+  {    13,      5,     12,      0,      0,     13,      0, }, /* 478 */
+  {    13,      6,     12,      0,      0,     13,      0, }, /* 479 */
+  {    34,      5,     12,      0,  35332,     34,      0, }, /* 480 */
+  {    34,      5,     12,      0,   3814,     34,      0, }, /* 481 */
+  {    34,      5,     12,      0,  35384,     34,      0, }, /* 482 */
   {    34,      9,     12,     92,      1,     34,      0, }, /* 483 */
   {    34,      5,     12,     92,     -1,     34,      0, }, /* 484 */
   {    34,      5,     12,     92,    -58,     34,      0, }, /* 485 */
@@ -702,10 +699,10 @@ const ucd_record PRIV(ucd_records)[] = { /* 11700 bytes, record size 12 */
   {    28,      1,     13,      0,      0,     28,      0, }, /* 506 */
   {    10,     27,      2,      0,      0,     10,      0, }, /* 507 */
   {    10,     28,      2,      0,      0,     10,      0, }, /* 508 */
-  {    10,     29,     12,      0,      0,    -70,      0, }, /* 509 */
+  {    10,     29,     12,      0,      0,    -67,      0, }, /* 509 */
   {    10,     21,     14,      0,      0,     10,      0, }, /* 510 */
   {     0,      2,      2,      0,      0,      0,      0, }, /* 511 */
-  {    28,     12,      3,      0,      0,   -100,      0, }, /* 512 */
+  {    28,     12,      3,      0,      0,    -93,      0, }, /* 512 */
   {    10,      9,     12,      0,      0,     10,      0, }, /* 513 */
   {    10,      5,     12,      0,      0,     10,      0, }, /* 514 */
   {    20,      9,     12,     96,  -7517,     20,      0, }, /* 515 */
@@ -746,31 +743,31 @@ const ucd_record PRIV(ucd_records)[] = { /* 11700 bytes, record size 12 */
   {    59,     21,     12,      0,      0,     59,      0, }, /* 550 */
   {    59,     12,      3,      0,      0,     59,      0, }, /* 551 */
   {    13,     12,      3,      0,      0,     13,      0, }, /* 552 */
-  {    10,     21,     12,      0,      0,    -25,      0, }, /* 553 */
+  {    10,     21,     12,      0,      0,    -28,      0, }, /* 553 */
   {    23,     26,     12,      0,      0,     23,      0, }, /* 554 */
-  {    10,     21,     12,      0,      0,   -139,      0, }, /* 555 */
-  {    10,     21,     12,      0,      0,   -133,      0, }, /* 556 */
+  {    10,     21,     12,      0,      0,   -131,      0, }, /* 555 */
+  {    10,     21,     12,      0,      0,   -125,      0, }, /* 556 */
   {    23,      6,     12,      0,      0,     23,      0, }, /* 557 */
   {    10,      7,     12,      0,      0,     23,      0, }, /* 558 */
   {    23,     14,     12,      0,      0,     23,      0, }, /* 559 */
-  {    10,     22,     12,      0,      0,   -139,      0, }, /* 560 */
-  {    10,     18,     12,      0,      0,   -139,      0, }, /* 561 */
-  {    10,     26,     12,      0,      0,   -133,      0, }, /* 562 */
-  {    10,     17,     12,      0,      0,   -133,      0, }, /* 563 */
-  {    10,     22,     12,      0,      0,   -133,      0, }, /* 564 */
-  {    10,     18,     12,      0,      0,   -133,      0, }, /* 565 */
-  {    28,     12,      3,      0,      0,    -16,      0, }, /* 566 */
+  {    10,     22,     12,      0,      0,   -131,      0, }, /* 560 */
+  {    10,     18,     12,      0,      0,   -131,      0, }, /* 561 */
+  {    10,     26,     12,      0,      0,   -125,      0, }, /* 562 */
+  {    10,     17,     12,      0,      0,   -125,      0, }, /* 563 */
+  {    10,     22,     12,      0,      0,   -125,      0, }, /* 564 */
+  {    10,     18,     12,      0,      0,   -125,      0, }, /* 565 */
+  {    28,     12,      3,      0,      0,    -19,      0, }, /* 566 */
   {    24,     10,      3,      0,      0,     24,      0, }, /* 567 */
-  {    10,     17,     14,      0,      0,   -133,      0, }, /* 568 */
-  {    10,      6,     12,      0,      0,    -64,      0, }, /* 569 */
-  {    10,      7,     12,      0,      0,   -104,      0, }, /* 570 */
-  {    10,     21,     14,      0,      0,   -104,      0, }, /* 571 */
+  {    10,     17,     14,      0,      0,   -125,      0, }, /* 568 */
+  {    10,      6,     12,      0,      0,    -61,      0, }, /* 569 */
+  {    10,      7,     12,      0,      0,    -97,      0, }, /* 570 */
+  {    10,     21,     14,      0,      0,    -97,      0, }, /* 571 */
   {    10,     26,     12,      0,      0,     23,      0, }, /* 572 */
   {    27,      7,     12,      0,      0,     27,      0, }, /* 573 */
-  {    28,     12,      3,      0,      0,    -64,      0, }, /* 574 */
-  {    10,     24,     12,      0,      0,    -64,      0, }, /* 575 */
+  {    28,     12,      3,      0,      0,    -61,      0, }, /* 574 */
+  {    10,     24,     12,      0,      0,    -61,      0, }, /* 575 */
   {    27,      6,     12,      0,      0,     27,      0, }, /* 576 */
-  {    10,     17,     12,      0,      0,    -64,      0, }, /* 577 */
+  {    10,     17,     12,      0,      0,    -61,      0, }, /* 577 */
   {    30,      7,     12,      0,      0,     30,      0, }, /* 578 */
   {    30,      6,     12,      0,      0,     30,      0, }, /* 579 */
   {     4,      7,     12,      0,      0,      4,      0, }, /* 580 */
@@ -798,376 +795,360 @@ const ucd_record PRIV(ucd_records)[] = { /* 11700 bytes, record size 12 */
   {    79,     14,     12,      0,      0,     79,      0, }, /* 602 */
   {    79,     12,      3,      0,      0,     79,      0, }, /* 603 */
   {    79,     21,     12,      0,      0,     79,      0, }, /* 604 */
-  {    10,     24,     12,      0,      0,    -61,      0, }, /* 605 */
-  {    34,      9,     12,      0, -35332,     34,      0, }, /* 606 */
-  {    34,      9,     12,      0, -42280,     34,      0, }, /* 607 */
-  {    34,      5,     12,      0,     48,     34,      0, }, /* 608 */
-  {    34,      9,     12,      0, -42308,     34,      0, }, /* 609 */
-  {    34,      9,     12,      0, -42319,     34,      0, }, /* 610 */
-  {    34,      9,     12,      0, -42315,     34,      0, }, /* 611 */
-  {    34,      9,     12,      0, -42305,     34,      0, }, /* 612 */
-  {    34,      9,     12,      0, -42258,     34,      0, }, /* 613 */
-  {    34,      9,     12,      0, -42282,     34,      0, }, /* 614 */
-  {    34,      9,     12,      0, -42261,     34,      0, }, /* 615 */
-  {    34,      9,     12,      0,    928,     34,      0, }, /* 616 */
-  {    34,      9,     12,      0,    -48,     34,      0, }, /* 617 */
-  {    34,      9,     12,      0, -42307,     34,      0, }, /* 618 */
-  {    34,      9,     12,      0, -35384,     34,      0, }, /* 619 */
-  {    49,      7,     12,      0,      0,     49,      0, }, /* 620 */
-  {    49,     12,      3,      0,      0,     49,      0, }, /* 621 */
-  {    49,     10,      5,      0,      0,     49,      0, }, /* 622 */
-  {    49,     26,     12,      0,      0,     49,      0, }, /* 623 */
-  {    10,     15,     12,      0,      0,   -224,      0, }, /* 624 */
-  {    10,     15,     12,      0,      0,   -210,      0, }, /* 625 */
-  {    10,     26,     12,      0,      0,   -171,      0, }, /* 626 */
-  {    10,     23,     12,      0,      0,   -171,      0, }, /* 627 */
-  {    65,      7,     12,      0,      0,     65,      0, }, /* 628 */
-  {    65,     21,     12,      0,      0,     65,      0, }, /* 629 */
-  {    75,     10,      5,      0,      0,     75,      0, }, /* 630 */
-  {    75,      7,     12,      0,      0,     75,      0, }, /* 631 */
-  {    75,     12,      3,      0,      0,     75,      0, }, /* 632 */
-  {    75,     21,     12,      0,      0,     75,      0, }, /* 633 */
-  {    75,     13,     12,      0,      0,     75,      0, }, /* 634 */
-  {    15,     12,      3,      0,      0,    -13,      0, }, /* 635 */
-  {    15,      7,     12,      0,      0,    -46,      0, }, /* 636 */
-  {    69,     13,     12,      0,      0,     69,      0, }, /* 637 */
-  {    69,      7,     12,      0,      0,     69,      0, }, /* 638 */
-  {    69,     12,      3,      0,      0,     69,      0, }, /* 639 */
-  {    10,     21,     12,      0,      0,   -108,      0, }, /* 640 */
-  {    69,     21,     12,      0,      0,     69,      0, }, /* 641 */
-  {    74,      7,     12,      0,      0,     74,      0, }, /* 642 */
-  {    74,     12,      3,      0,      0,     74,      0, }, /* 643 */
-  {    74,     10,      5,      0,      0,     74,      0, }, /* 644 */
-  {    74,     21,     12,      0,      0,     74,      0, }, /* 645 */
-  {    84,     12,      3,      0,      0,     84,      0, }, /* 646 */
-  {    84,     10,      5,      0,      0,     84,      0, }, /* 647 */
-  {    84,      7,     12,      0,      0,     84,      0, }, /* 648 */
-  {    84,     21,     12,      0,      0,     84,      0, }, /* 649 */
-  {    10,      6,     12,      0,      0,    -19,      0, }, /* 650 */
-  {    84,     13,     12,      0,      0,     84,      0, }, /* 651 */
-  {    39,      6,     12,      0,      0,     39,      0, }, /* 652 */
-  {    68,      7,     12,      0,      0,     68,      0, }, /* 653 */
-  {    68,     12,      3,      0,      0,     68,      0, }, /* 654 */
-  {    68,     10,      5,      0,      0,     68,      0, }, /* 655 */
-  {    68,     13,     12,      0,      0,     68,      0, }, /* 656 */
-  {    68,     21,     12,      0,      0,     68,      0, }, /* 657 */
-  {    92,      7,     12,      0,      0,     92,      0, }, /* 658 */
-  {    92,     12,      3,      0,      0,     92,      0, }, /* 659 */
-  {    92,      6,     12,      0,      0,     92,      0, }, /* 660 */
-  {    92,     21,     12,      0,      0,     92,      0, }, /* 661 */
-  {    87,      7,     12,      0,      0,     87,      0, }, /* 662 */
-  {    87,     10,      5,      0,      0,     87,      0, }, /* 663 */
-  {    87,     12,      3,      0,      0,     87,      0, }, /* 664 */
-  {    87,     21,     12,      0,      0,     87,      0, }, /* 665 */
-  {    87,      6,     12,      0,      0,     87,      0, }, /* 666 */
-  {    34,      5,     12,      0,   -928,     34,      0, }, /* 667 */
-  {     9,      5,     12,      0, -38864,      9,      0, }, /* 668 */
-  {    87,     13,     12,      0,      0,     87,      0, }, /* 669 */
-  {    24,      7,      9,      0,      0,     24,      0, }, /* 670 */
-  {    24,      7,     10,      0,      0,     24,      0, }, /* 671 */
-  {     0,      4,     12,      0,      0,      0,      0, }, /* 672 */
-  {     0,      3,     12,      0,      0,      0,      0, }, /* 673 */
-  {    26,     25,     12,      0,      0,     26,      0, }, /* 674 */
-  {     1,     24,     12,      0,      0,      1,      0, }, /* 675 */
-  {     1,      7,     12,      0,      0,    -10,      0, }, /* 676 */
-  {     1,     26,     12,      0,      0,    -10,      0, }, /* 677 */
-  {    10,      6,      3,      0,      0,    -64,      0, }, /* 678 */
-  {    36,      7,     12,      0,      0,     36,      0, }, /* 679 */
-  {    10,     21,     12,      0,      0,    -22,      0, }, /* 680 */
-  {    10,     15,     12,      0,      0,    -92,      0, }, /* 681 */
-  {    10,     26,     12,      0,      0,    -22,      0, }, /* 682 */
-  {    20,     14,     12,      0,      0,     20,      0, }, /* 683 */
-  {    20,     15,     12,      0,      0,     20,      0, }, /* 684 */
-  {    20,     26,     12,      0,      0,     20,      0, }, /* 685 */
-  {    71,      7,     12,      0,      0,     71,      0, }, /* 686 */
-  {    67,      7,     12,      0,      0,     67,      0, }, /* 687 */
-  {    28,     12,      3,      0,      0,     -1,      0, }, /* 688 */
-  {    10,     15,     12,      0,      0,     -1,      0, }, /* 689 */
-  {    42,      7,     12,      0,      0,     42,      0, }, /* 690 */
-  {    42,     15,     12,      0,      0,     42,      0, }, /* 691 */
-  {    19,      7,     12,      0,      0,     19,      0, }, /* 692 */
-  {    19,     14,     12,      0,      0,     19,      0, }, /* 693 */
-  {   118,      7,     12,      0,      0,    118,      0, }, /* 694 */
-  {   118,     12,      3,      0,      0,    118,      0, }, /* 695 */
-  {    60,      7,     12,      0,      0,     60,      0, }, /* 696 */
-  {    60,     21,     12,      0,      0,     60,      0, }, /* 697 */
-  {    43,      7,     12,      0,      0,     43,      0, }, /* 698 */
-  {    43,     21,     12,      0,      0,     43,      0, }, /* 699 */
-  {    43,     14,     12,      0,      0,     43,      0, }, /* 700 */
-  {    14,      9,     12,      0,     40,     14,      0, }, /* 701 */
-  {    14,      5,     12,      0,    -40,     14,      0, }, /* 702 */
-  {    47,      7,     12,      0,      0,     47,      0, }, /* 703 */
-  {    45,      7,     12,      0,      0,     45,      0, }, /* 704 */
-  {    45,     13,     12,      0,      0,     45,      0, }, /* 705 */
-  {   136,      9,     12,      0,     40,    136,      0, }, /* 706 */
-  {   136,      5,     12,      0,    -40,    136,      0, }, /* 707 */
-  {   106,      7,     12,      0,      0,    106,      0, }, /* 708 */
-  {   104,      7,     12,      0,      0,    104,      0, }, /* 709 */
-  {   104,     21,     12,      0,      0,    104,      0, }, /* 710 */
-  {   110,      7,     12,      0,      0,    110,      0, }, /* 711 */
-  {    12,      7,     12,      0,      0,     12,      0, }, /* 712 */
-  {    81,      7,     12,      0,      0,     81,      0, }, /* 713 */
-  {    81,     21,     12,      0,      0,     81,      0, }, /* 714 */
-  {    81,     15,     12,      0,      0,     81,      0, }, /* 715 */
-  {   120,      7,     12,      0,      0,    120,      0, }, /* 716 */
-  {   120,     26,     12,      0,      0,    120,      0, }, /* 717 */
-  {   120,     15,     12,      0,      0,    120,      0, }, /* 718 */
-  {   116,      7,     12,      0,      0,    116,      0, }, /* 719 */
-  {   116,     15,     12,      0,      0,    116,      0, }, /* 720 */
-  {   128,      7,     12,      0,      0,    128,      0, }, /* 721 */
-  {   128,     15,     12,      0,      0,    128,      0, }, /* 722 */
-  {    66,      7,     12,      0,      0,     66,      0, }, /* 723 */
-  {    66,     15,     12,      0,      0,     66,      0, }, /* 724 */
-  {    66,     21,     12,      0,      0,     66,      0, }, /* 725 */
-  {    72,      7,     12,      0,      0,     72,      0, }, /* 726 */
-  {    72,     21,     12,      0,      0,     72,      0, }, /* 727 */
-  {    98,      7,     12,      0,      0,     98,      0, }, /* 728 */
-  {    97,      7,     12,      0,      0,     97,      0, }, /* 729 */
-  {    97,     15,     12,      0,      0,     97,      0, }, /* 730 */
-  {    31,      7,     12,      0,      0,     31,      0, }, /* 731 */
-  {    31,     12,      3,      0,      0,     31,      0, }, /* 732 */
-  {    31,     15,     12,      0,      0,     31,      0, }, /* 733 */
-  {    31,     21,     12,      0,      0,     31,      0, }, /* 734 */
-  {    88,      7,     12,      0,      0,     88,      0, }, /* 735 */
-  {    88,     15,     12,      0,      0,     88,      0, }, /* 736 */
-  {    88,     21,     12,      0,      0,     88,      0, }, /* 737 */
-  {   117,      7,     12,      0,      0,    117,      0, }, /* 738 */
-  {   117,     15,     12,      0,      0,    117,      0, }, /* 739 */
-  {   112,      7,     12,      0,      0,    112,      0, }, /* 740 */
-  {   112,     26,     12,      0,      0,    112,      0, }, /* 741 */
-  {   112,     12,      3,      0,      0,    112,      0, }, /* 742 */
-  {   112,     15,     12,      0,      0,    112,      0, }, /* 743 */
-  {   112,     21,     12,      0,      0,    112,      0, }, /* 744 */
-  {    78,      7,     12,      0,      0,     78,      0, }, /* 745 */
-  {    78,     21,     12,      0,      0,     78,      0, }, /* 746 */
-  {    83,      7,     12,      0,      0,     83,      0, }, /* 747 */
-  {    83,     15,     12,      0,      0,     83,      0, }, /* 748 */
-  {    82,      7,     12,      0,      0,     82,      0, }, /* 749 */
-  {    82,     15,     12,      0,      0,     82,      0, }, /* 750 */
-  {   121,      7,     12,      0,      0,    121,      0, }, /* 751 */
-  {   121,     21,     12,      0,      0,    121,      0, }, /* 752 */
-  {   121,     15,     12,      0,      0,    121,      0, }, /* 753 */
-  {    89,      7,     12,      0,      0,     89,      0, }, /* 754 */
-  {   130,      9,     12,      0,     64,    130,      0, }, /* 755 */
-  {   130,      5,     12,      0,    -64,    130,      0, }, /* 756 */
-  {   130,     15,     12,      0,      0,    130,      0, }, /* 757 */
-  {   144,      7,     12,      0,      0,    144,      0, }, /* 758 */
-  {   144,     12,      3,      0,      0,    144,      0, }, /* 759 */
-  {   144,     13,     12,      0,      0,    144,      0, }, /* 760 */
-  {     1,     15,     12,      0,      0,      1,      0, }, /* 761 */
-  {   156,      7,     12,      0,      0,    156,      0, }, /* 762 */
-  {   156,     12,      3,      0,      0,    156,      0, }, /* 763 */
-  {   156,     17,     12,      0,      0,    156,      0, }, /* 764 */
-  {   147,      7,     12,      0,      0,    147,      0, }, /* 765 */
-  {   147,     15,     12,      0,      0,    147,      0, }, /* 766 */
-  {   148,      7,     12,      0,      0,    148,      0, }, /* 767 */
-  {   148,     12,      3,      0,      0,    148,      0, }, /* 768 */
-  {   148,     15,     12,      0,      0,    148,      0, }, /* 769 */
-  {   148,     21,     12,      0,      0,    148,      0, }, /* 770 */
-  {   153,      7,     12,      0,      0,    153,      0, }, /* 771 */
-  {   153,     15,     12,      0,      0,    153,      0, }, /* 772 */
-  {   149,      7,     12,      0,      0,    149,      0, }, /* 773 */
-  {    94,     10,      5,      0,      0,     94,      0, }, /* 774 */
-  {    94,     12,      3,      0,      0,     94,      0, }, /* 775 */
-  {    94,      7,     12,      0,      0,     94,      0, }, /* 776 */
-  {    94,     21,     12,      0,      0,     94,      0, }, /* 777 */
-  {    94,     15,     12,      0,      0,     94,      0, }, /* 778 */
-  {    94,     13,     12,      0,      0,     94,      0, }, /* 779 */
-  {    85,     12,      3,      0,      0,     85,      0, }, /* 780 */
-  {    85,     10,      5,      0,      0,     85,      0, }, /* 781 */
-  {    85,      7,     12,      0,      0,     85,      0, }, /* 782 */
-  {    85,     21,     12,      0,      0,     85,      0, }, /* 783 */
-  {    85,      1,      4,      0,      0,     85,      0, }, /* 784 */
-  {   101,      7,     12,      0,      0,    101,      0, }, /* 785 */
-  {   101,     13,     12,      0,      0,    101,      0, }, /* 786 */
-  {    96,     12,      3,      0,      0,     96,      0, }, /* 787 */
-  {    96,      7,     12,      0,      0,     96,      0, }, /* 788 */
-  {    96,     10,      5,      0,      0,     96,      0, }, /* 789 */
-  {    96,     13,     12,      0,      0,     96,      0, }, /* 790 */
-  {    96,     21,     12,      0,      0,     96,      0, }, /* 791 */
-  {   111,      7,     12,      0,      0,    111,      0, }, /* 792 */
-  {   111,     12,      3,      0,      0,    111,      0, }, /* 793 */
-  {   111,     21,     12,      0,      0,    111,      0, }, /* 794 */
-  {   100,     12,      3,      0,      0,    100,      0, }, /* 795 */
-  {   100,     10,      5,      0,      0,    100,      0, }, /* 796 */
-  {   100,      7,     12,      0,      0,    100,      0, }, /* 797 */
-  {   100,      7,      4,      0,      0,    100,      0, }, /* 798 */
-  {   100,     21,     12,      0,      0,    100,      0, }, /* 799 */
-  {   100,     13,     12,      0,      0,    100,      0, }, /* 800 */
-  {    48,     15,     12,      0,      0,     48,      0, }, /* 801 */
-  {   108,      7,     12,      0,      0,    108,      0, }, /* 802 */
-  {   108,     10,      5,      0,      0,    108,      0, }, /* 803 */
-  {   108,     12,      3,      0,      0,    108,      0, }, /* 804 */
-  {   108,     21,     12,      0,      0,    108,      0, }, /* 805 */
-  {   129,      7,     12,      0,      0,    129,      0, }, /* 806 */
-  {   129,     21,     12,      0,      0,    129,      0, }, /* 807 */
-  {   109,      7,     12,      0,      0,    109,      0, }, /* 808 */
-  {   109,     12,      3,      0,      0,    109,      0, }, /* 809 */
-  {   109,     10,      5,      0,      0,    109,      0, }, /* 810 */
-  {   109,     13,     12,      0,      0,    109,      0, }, /* 811 */
-  {   107,     12,      3,      0,      0,    107,      0, }, /* 812 */
-  {   107,     12,      3,      0,      0,    -52,      0, }, /* 813 */
-  {   107,     10,      5,      0,      0,    107,      0, }, /* 814 */
-  {   107,     10,      5,      0,      0,    -52,      0, }, /* 815 */
-  {   107,      7,     12,      0,      0,    107,      0, }, /* 816 */
-  {    28,     12,      3,      0,      0,    -52,      0, }, /* 817 */
-  {   107,     10,      3,      0,      0,    107,      0, }, /* 818 */
-  {   135,      7,     12,      0,      0,    135,      0, }, /* 819 */
-  {   135,     10,      5,      0,      0,    135,      0, }, /* 820 */
-  {   135,     12,      3,      0,      0,    135,      0, }, /* 821 */
-  {   135,     21,     12,      0,      0,    135,      0, }, /* 822 */
-  {   135,     13,     12,      0,      0,    135,      0, }, /* 823 */
-  {   124,      7,     12,      0,      0,    124,      0, }, /* 824 */
-  {   124,     10,      3,      0,      0,    124,      0, }, /* 825 */
-  {   124,     10,      5,      0,      0,    124,      0, }, /* 826 */
-  {   124,     12,      3,      0,      0,    124,      0, }, /* 827 */
-  {   124,     21,     12,      0,      0,    124,      0, }, /* 828 */
-  {   124,     13,     12,      0,      0,    124,      0, }, /* 829 */
-  {   123,      7,     12,      0,      0,    123,      0, }, /* 830 */
-  {   123,     10,      3,      0,      0,    123,      0, }, /* 831 */
-  {   123,     10,      5,      0,      0,    123,      0, }, /* 832 */
-  {   123,     12,      3,      0,      0,    123,      0, }, /* 833 */
-  {   123,     21,     12,      0,      0,    123,      0, }, /* 834 */
-  {   114,      7,     12,      0,      0,    114,      0, }, /* 835 */
-  {   114,     10,      5,      0,      0,    114,      0, }, /* 836 */
-  {   114,     12,      3,      0,      0,    114,      0, }, /* 837 */
-  {   114,     21,     12,      0,      0,    114,      0, }, /* 838 */
-  {   114,     13,     12,      0,      0,    114,      0, }, /* 839 */
-  {   102,      7,     12,      0,      0,    102,      0, }, /* 840 */
-  {   102,     12,      3,      0,      0,    102,      0, }, /* 841 */
-  {   102,     10,      5,      0,      0,    102,      0, }, /* 842 */
-  {   102,     13,     12,      0,      0,    102,      0, }, /* 843 */
-  {   126,      7,     12,      0,      0,    126,      0, }, /* 844 */
-  {   126,     12,      3,      0,      0,    126,      0, }, /* 845 */
-  {   126,     10,      5,      0,      0,    126,      0, }, /* 846 */
-  {   126,     13,     12,      0,      0,    126,      0, }, /* 847 */
-  {   126,     15,     12,      0,      0,    126,      0, }, /* 848 */
-  {   126,     21,     12,      0,      0,    126,      0, }, /* 849 */
-  {   126,     26,     12,      0,      0,    126,      0, }, /* 850 */
-  {   142,      7,     12,      0,      0,    142,      0, }, /* 851 */
-  {   142,     10,      5,      0,      0,    142,      0, }, /* 852 */
-  {   142,     12,      3,      0,      0,    142,      0, }, /* 853 */
-  {   142,     21,     12,      0,      0,    142,      0, }, /* 854 */
-  {   125,      9,     12,      0,     32,    125,      0, }, /* 855 */
-  {   125,      5,     12,      0,    -32,    125,      0, }, /* 856 */
-  {   125,     13,     12,      0,      0,    125,      0, }, /* 857 */
-  {   125,     15,     12,      0,      0,    125,      0, }, /* 858 */
-  {   125,      7,     12,      0,      0,    125,      0, }, /* 859 */
-  {   154,      7,     12,      0,      0,    154,      0, }, /* 860 */
-  {   154,     10,      3,      0,      0,    154,      0, }, /* 861 */
-  {   154,     10,      5,      0,      0,    154,      0, }, /* 862 */
-  {   154,     12,      3,      0,      0,    154,      0, }, /* 863 */
-  {   154,      7,      4,      0,      0,    154,      0, }, /* 864 */
-  {   154,     21,     12,      0,      0,    154,      0, }, /* 865 */
-  {   154,     13,     12,      0,      0,    154,      0, }, /* 866 */
-  {   150,      7,     12,      0,      0,    150,      0, }, /* 867 */
-  {   150,     10,      5,      0,      0,    150,      0, }, /* 868 */
-  {   150,     12,      3,      0,      0,    150,      0, }, /* 869 */
-  {   150,     21,     12,      0,      0,    150,      0, }, /* 870 */
-  {   141,      7,     12,      0,      0,    141,      0, }, /* 871 */
-  {   141,     12,      3,      0,      0,    141,      0, }, /* 872 */
-  {   141,     10,      5,      0,      0,    141,      0, }, /* 873 */
-  {   141,      7,      4,      0,      0,    141,      0, }, /* 874 */
-  {   141,     21,     12,      0,      0,    141,      0, }, /* 875 */
-  {   140,      7,     12,      0,      0,    140,      0, }, /* 876 */
-  {   140,     12,      3,      0,      0,    140,      0, }, /* 877 */
-  {   140,     10,      5,      0,      0,    140,      0, }, /* 878 */
-  {   140,      7,      4,      0,      0,    140,      0, }, /* 879 */
-  {   140,     21,     12,      0,      0,    140,      0, }, /* 880 */
-  {   122,      7,     12,      0,      0,    122,      0, }, /* 881 */
-  {   133,      7,     12,      0,      0,    133,      0, }, /* 882 */
-  {   133,     10,      5,      0,      0,    133,      0, }, /* 883 */
-  {   133,     12,      3,      0,      0,    133,      0, }, /* 884 */
-  {   133,     21,     12,      0,      0,    133,      0, }, /* 885 */
-  {   133,     13,     12,      0,      0,    133,      0, }, /* 886 */
-  {   133,     15,     12,      0,      0,    133,      0, }, /* 887 */
-  {   134,     21,     12,      0,      0,    134,      0, }, /* 888 */
-  {   134,      7,     12,      0,      0,    134,      0, }, /* 889 */
-  {   134,     12,      3,      0,      0,    134,      0, }, /* 890 */
-  {   134,     10,      5,      0,      0,    134,      0, }, /* 891 */
-  {   138,      7,     12,      0,      0,    138,      0, }, /* 892 */
-  {   138,     12,      3,      0,      0,    138,      0, }, /* 893 */
-  {   138,      7,      4,      0,      0,    138,      0, }, /* 894 */
-  {   138,     13,     12,      0,      0,    138,      0, }, /* 895 */
-  {   143,      7,     12,      0,      0,    143,      0, }, /* 896 */
-  {   143,     10,      5,      0,      0,    143,      0, }, /* 897 */
-  {   143,     12,      3,      0,      0,    143,      0, }, /* 898 */
-  {   143,     13,     12,      0,      0,    143,      0, }, /* 899 */
-  {   145,      7,     12,      0,      0,    145,      0, }, /* 900 */
-  {   145,     12,      3,      0,      0,    145,      0, }, /* 901 */
-  {   145,     10,      5,      0,      0,    145,      0, }, /* 902 */
-  {   145,     21,     12,      0,      0,    145,      0, }, /* 903 */
-  {    54,     15,     12,      0,      0,     54,      0, }, /* 904 */
-  {    54,     21,     12,      0,      0,     54,      0, }, /* 905 */
-  {    63,      7,     12,      0,      0,     63,      0, }, /* 906 */
-  {    63,     14,     12,      0,      0,     63,      0, }, /* 907 */
-  {    63,     21,     12,      0,      0,     63,      0, }, /* 908 */
-  {    80,      7,     12,      0,      0,     80,      0, }, /* 909 */
-  {    80,      1,      2,      0,      0,     80,      0, }, /* 910 */
-  {   127,      7,     12,      0,      0,    127,      0, }, /* 911 */
-  {   115,      7,     12,      0,      0,    115,      0, }, /* 912 */
-  {   115,     13,     12,      0,      0,    115,      0, }, /* 913 */
-  {   115,     21,     12,      0,      0,    115,      0, }, /* 914 */
-  {   103,      7,     12,      0,      0,    103,      0, }, /* 915 */
-  {   103,     12,      3,      0,      0,    103,      0, }, /* 916 */
-  {   103,     21,     12,      0,      0,    103,      0, }, /* 917 */
-  {   119,      7,     12,      0,      0,    119,      0, }, /* 918 */
-  {   119,     12,      3,      0,      0,    119,      0, }, /* 919 */
-  {   119,     21,     12,      0,      0,    119,      0, }, /* 920 */
-  {   119,     26,     12,      0,      0,    119,      0, }, /* 921 */
-  {   119,      6,     12,      0,      0,    119,      0, }, /* 922 */
-  {   119,     13,     12,      0,      0,    119,      0, }, /* 923 */
-  {   119,     15,     12,      0,      0,    119,      0, }, /* 924 */
-  {   146,      9,     12,      0,     32,    146,      0, }, /* 925 */
-  {   146,      5,     12,      0,    -32,    146,      0, }, /* 926 */
-  {   146,     15,     12,      0,      0,    146,      0, }, /* 927 */
-  {   146,     21,     12,      0,      0,    146,      0, }, /* 928 */
-  {    99,      7,     12,      0,      0,     99,      0, }, /* 929 */
-  {    99,     12,      3,      0,      0,     99,      0, }, /* 930 */
-  {    99,     10,      5,      0,      0,     99,      0, }, /* 931 */
-  {    99,      6,     12,      0,      0,     99,      0, }, /* 932 */
-  {   137,      6,     12,      0,      0,    137,      0, }, /* 933 */
-  {   139,      6,     12,      0,      0,    139,      0, }, /* 934 */
-  {   155,     12,      3,      0,      0,    155,      0, }, /* 935 */
-  {    23,     10,      5,      0,      0,     23,      0, }, /* 936 */
-  {   137,      7,     12,      0,      0,    137,      0, }, /* 937 */
-  {   155,      7,     12,      0,      0,    155,      0, }, /* 938 */
-  {   139,      7,     12,      0,      0,    139,      0, }, /* 939 */
-  {   105,      7,     12,      0,      0,    105,      0, }, /* 940 */
-  {   105,     26,     12,      0,      0,    105,      0, }, /* 941 */
-  {   105,     12,      3,      0,      0,    105,      0, }, /* 942 */
-  {   105,     21,     12,      0,      0,    105,      0, }, /* 943 */
-  {    10,      1,      2,      0,      0,    105,      0, }, /* 944 */
-  {    10,     10,      3,      0,      0,     10,      0, }, /* 945 */
-  {    10,     10,      5,      0,      0,     10,      0, }, /* 946 */
-  {    20,     12,      3,      0,      0,     20,      0, }, /* 947 */
-  {   131,     26,     12,      0,      0,    131,      0, }, /* 948 */
-  {   131,     12,      3,      0,      0,    131,      0, }, /* 949 */
-  {   131,     21,     12,      0,      0,    131,      0, }, /* 950 */
-  {    18,     12,      3,      0,      0,     18,      0, }, /* 951 */
-  {   151,      7,     12,      0,      0,    151,      0, }, /* 952 */
-  {   151,     12,      3,      0,      0,    151,      0, }, /* 953 */
-  {   151,      6,     12,      0,      0,    151,      0, }, /* 954 */
-  {   151,     13,     12,      0,      0,    151,      0, }, /* 955 */
-  {   151,     26,     12,      0,      0,    151,      0, }, /* 956 */
-  {   152,      7,     12,      0,      0,    152,      0, }, /* 957 */
-  {   152,     12,      3,      0,      0,    152,      0, }, /* 958 */
-  {   152,     13,     12,      0,      0,    152,      0, }, /* 959 */
-  {   152,     23,     12,      0,      0,    152,      0, }, /* 960 */
-  {   113,      7,     12,      0,      0,    113,      0, }, /* 961 */
-  {   113,     15,     12,      0,      0,    113,      0, }, /* 962 */
-  {   113,     12,      3,      0,      0,    113,      0, }, /* 963 */
-  {   132,      9,     12,      0,     34,    132,      0, }, /* 964 */
-  {   132,      5,     12,      0,    -34,    132,      0, }, /* 965 */
-  {   132,     12,      3,      0,      0,    132,      0, }, /* 966 */
-  {   132,      6,     12,      0,      0,    132,      0, }, /* 967 */
-  {   132,     13,     12,      0,      0,    132,      0, }, /* 968 */
-  {   132,     21,     12,      0,      0,    132,      0, }, /* 969 */
-  {     0,      2,     14,      0,      0,      0,      0, }, /* 970 */
-  {    10,     26,     11,      0,      0,     10,      0, }, /* 971 */
-  {    27,     26,     12,      0,      0,     27,      0, }, /* 972 */
-  {    10,     24,      3,      0,      0,     10,      0, }, /* 973 */
-  {    10,      1,      3,      0,      0,     10,      0, }, /* 974 */
+  {    34,      9,     12,      0, -35332,     34,      0, }, /* 605 */
+  {    34,      9,     12,      0, -42280,     34,      0, }, /* 606 */
+  {    34,      5,     12,      0,     48,     34,      0, }, /* 607 */
+  {    34,      9,     12,      0, -42308,     34,      0, }, /* 608 */
+  {    34,      9,     12,      0, -42319,     34,      0, }, /* 609 */
+  {    34,      9,     12,      0, -42315,     34,      0, }, /* 610 */
+  {    34,      9,     12,      0, -42305,     34,      0, }, /* 611 */
+  {    34,      9,     12,      0, -42258,     34,      0, }, /* 612 */
+  {    34,      9,     12,      0, -42282,     34,      0, }, /* 613 */
+  {    34,      9,     12,      0, -42261,     34,      0, }, /* 614 */
+  {    34,      9,     12,      0,    928,     34,      0, }, /* 615 */
+  {    34,      9,     12,      0,    -48,     34,      0, }, /* 616 */
+  {    34,      9,     12,      0, -42307,     34,      0, }, /* 617 */
+  {    34,      9,     12,      0, -35384,     34,      0, }, /* 618 */
+  {    49,      7,     12,      0,      0,     49,      0, }, /* 619 */
+  {    49,     12,      3,      0,      0,     49,      0, }, /* 620 */
+  {    49,     10,      5,      0,      0,     49,      0, }, /* 621 */
+  {    49,     26,     12,      0,      0,     49,      0, }, /* 622 */
+  {    10,     15,     12,      0,      0,   -216,      0, }, /* 623 */
+  {    10,     15,     12,      0,      0,   -202,      0, }, /* 624 */
+  {    10,     26,     12,      0,      0,   -163,      0, }, /* 625 */
+  {    10,     23,     12,      0,      0,   -163,      0, }, /* 626 */
+  {    65,      7,     12,      0,      0,     65,      0, }, /* 627 */
+  {    65,     21,     12,      0,      0,     65,      0, }, /* 628 */
+  {    75,     10,      5,      0,      0,     75,      0, }, /* 629 */
+  {    75,      7,     12,      0,      0,     75,      0, }, /* 630 */
+  {    75,     12,      3,      0,      0,     75,      0, }, /* 631 */
+  {    75,     21,     12,      0,      0,     75,      0, }, /* 632 */
+  {    75,     13,     12,      0,      0,     75,      0, }, /* 633 */
+  {    15,     12,      3,      0,      0,    -16,      0, }, /* 634 */
+  {    15,      7,     12,      0,      0,    -46,      0, }, /* 635 */
+  {    69,     13,     12,      0,      0,     69,      0, }, /* 636 */
+  {    69,      7,     12,      0,      0,     69,      0, }, /* 637 */
+  {    69,     12,      3,      0,      0,     69,      0, }, /* 638 */
+  {    10,     21,     12,      0,      0,   -101,      0, }, /* 639 */
+  {    69,     21,     12,      0,      0,     69,      0, }, /* 640 */
+  {    74,      7,     12,      0,      0,     74,      0, }, /* 641 */
+  {    74,     12,      3,      0,      0,     74,      0, }, /* 642 */
+  {    74,     10,      5,      0,      0,     74,      0, }, /* 643 */
+  {    74,     21,     12,      0,      0,     74,      0, }, /* 644 */
+  {    84,     12,      3,      0,      0,     84,      0, }, /* 645 */
+  {    84,     10,      5,      0,      0,     84,      0, }, /* 646 */
+  {    84,      7,     12,      0,      0,     84,      0, }, /* 647 */
+  {    84,     21,     12,      0,      0,     84,      0, }, /* 648 */
+  {    10,      6,     12,      0,      0,    -22,      0, }, /* 649 */
+  {    84,     13,     12,      0,      0,     84,      0, }, /* 650 */
+  {    39,      6,     12,      0,      0,     39,      0, }, /* 651 */
+  {    68,      7,     12,      0,      0,     68,      0, }, /* 652 */
+  {    68,     12,      3,      0,      0,     68,      0, }, /* 653 */
+  {    68,     10,      5,      0,      0,     68,      0, }, /* 654 */
+  {    68,     13,     12,      0,      0,     68,      0, }, /* 655 */
+  {    68,     21,     12,      0,      0,     68,      0, }, /* 656 */
+  {    92,      7,     12,      0,      0,     92,      0, }, /* 657 */
+  {    92,     12,      3,      0,      0,     92,      0, }, /* 658 */
+  {    92,      6,     12,      0,      0,     92,      0, }, /* 659 */
+  {    92,     21,     12,      0,      0,     92,      0, }, /* 660 */
+  {    87,      7,     12,      0,      0,     87,      0, }, /* 661 */
+  {    87,     10,      5,      0,      0,     87,      0, }, /* 662 */
+  {    87,     12,      3,      0,      0,     87,      0, }, /* 663 */
+  {    87,     21,     12,      0,      0,     87,      0, }, /* 664 */
+  {    87,      6,     12,      0,      0,     87,      0, }, /* 665 */
+  {    34,      5,     12,      0,   -928,     34,      0, }, /* 666 */
+  {     9,      5,     12,      0, -38864,      9,      0, }, /* 667 */
+  {    87,     13,     12,      0,      0,     87,      0, }, /* 668 */
+  {    24,      7,      9,      0,      0,     24,      0, }, /* 669 */
+  {    24,      7,     10,      0,      0,     24,      0, }, /* 670 */
+  {     0,      4,     12,      0,      0,      0,      0, }, /* 671 */
+  {     0,      3,     12,      0,      0,      0,      0, }, /* 672 */
+  {    26,     25,     12,      0,      0,     26,      0, }, /* 673 */
+  {     1,     24,     12,      0,      0,      1,      0, }, /* 674 */
+  {     1,      7,     12,      0,      0,    -10,      0, }, /* 675 */
+  {     1,     26,     12,      0,      0,    -10,      0, }, /* 676 */
+  {    10,      6,      3,      0,      0,    -61,      0, }, /* 677 */
+  {    36,      7,     12,      0,      0,     36,      0, }, /* 678 */
+  {    10,     21,     12,      0,      0,    -25,      0, }, /* 679 */
+  {    10,     15,     12,      0,      0,    -85,      0, }, /* 680 */
+  {    10,     26,     12,      0,      0,    -25,      0, }, /* 681 */
+  {    20,     14,     12,      0,      0,     20,      0, }, /* 682 */
+  {    20,     15,     12,      0,      0,     20,      0, }, /* 683 */
+  {    20,     26,     12,      0,      0,     20,      0, }, /* 684 */
+  {    71,      7,     12,      0,      0,     71,      0, }, /* 685 */
+  {    67,      7,     12,      0,      0,     67,      0, }, /* 686 */
+  {    28,     12,      3,      0,      0,     -1,      0, }, /* 687 */
+  {    10,     15,     12,      0,      0,     -1,      0, }, /* 688 */
+  {    42,      7,     12,      0,      0,     42,      0, }, /* 689 */
+  {    42,     15,     12,      0,      0,     42,      0, }, /* 690 */
+  {    19,      7,     12,      0,      0,     19,      0, }, /* 691 */
+  {    19,     14,     12,      0,      0,     19,      0, }, /* 692 */
+  {   118,      7,     12,      0,      0,    118,      0, }, /* 693 */
+  {   118,     12,      3,      0,      0,    118,      0, }, /* 694 */
+  {    60,      7,     12,      0,      0,     60,      0, }, /* 695 */
+  {    60,     21,     12,      0,      0,     60,      0, }, /* 696 */
+  {    43,      7,     12,      0,      0,     43,      0, }, /* 697 */
+  {    43,     21,     12,      0,      0,     43,      0, }, /* 698 */
+  {    43,     14,     12,      0,      0,     43,      0, }, /* 699 */
+  {    14,      9,     12,      0,     40,     14,      0, }, /* 700 */
+  {    14,      5,     12,      0,    -40,     14,      0, }, /* 701 */
+  {    47,      7,     12,      0,      0,     47,      0, }, /* 702 */
+  {    45,      7,     12,      0,      0,     45,      0, }, /* 703 */
+  {    45,     13,     12,      0,      0,     45,      0, }, /* 704 */
+  {   136,      9,     12,      0,     40,    136,      0, }, /* 705 */
+  {   136,      5,     12,      0,    -40,    136,      0, }, /* 706 */
+  {   106,      7,     12,      0,      0,    106,      0, }, /* 707 */
+  {   104,      7,     12,      0,      0,    104,      0, }, /* 708 */
+  {   104,     21,     12,      0,      0,    104,      0, }, /* 709 */
+  {   110,      7,     12,      0,      0,    110,      0, }, /* 710 */
+  {    12,      7,     12,      0,      0,     12,      0, }, /* 711 */
+  {    81,      7,     12,      0,      0,     81,      0, }, /* 712 */
+  {    81,     21,     12,      0,      0,     81,      0, }, /* 713 */
+  {    81,     15,     12,      0,      0,     81,      0, }, /* 714 */
+  {   120,      7,     12,      0,      0,    120,      0, }, /* 715 */
+  {   120,     26,     12,      0,      0,    120,      0, }, /* 716 */
+  {   120,     15,     12,      0,      0,    120,      0, }, /* 717 */
+  {   116,      7,     12,      0,      0,    116,      0, }, /* 718 */
+  {   116,     15,     12,      0,      0,    116,      0, }, /* 719 */
+  {   128,      7,     12,      0,      0,    128,      0, }, /* 720 */
+  {   128,     15,     12,      0,      0,    128,      0, }, /* 721 */
+  {    66,      7,     12,      0,      0,     66,      0, }, /* 722 */
+  {    66,     15,     12,      0,      0,     66,      0, }, /* 723 */
+  {    66,     21,     12,      0,      0,     66,      0, }, /* 724 */
+  {    72,      7,     12,      0,      0,     72,      0, }, /* 725 */
+  {    72,     21,     12,      0,      0,     72,      0, }, /* 726 */
+  {    98,      7,     12,      0,      0,     98,      0, }, /* 727 */
+  {    97,      7,     12,      0,      0,     97,      0, }, /* 728 */
+  {    97,     15,     12,      0,      0,     97,      0, }, /* 729 */
+  {    31,      7,     12,      0,      0,     31,      0, }, /* 730 */
+  {    31,     12,      3,      0,      0,     31,      0, }, /* 731 */
+  {    31,     15,     12,      0,      0,     31,      0, }, /* 732 */
+  {    31,     21,     12,      0,      0,     31,      0, }, /* 733 */
+  {    88,      7,     12,      0,      0,     88,      0, }, /* 734 */
+  {    88,     15,     12,      0,      0,     88,      0, }, /* 735 */
+  {    88,     21,     12,      0,      0,     88,      0, }, /* 736 */
+  {   117,      7,     12,      0,      0,    117,      0, }, /* 737 */
+  {   117,     15,     12,      0,      0,    117,      0, }, /* 738 */
+  {   112,      7,     12,      0,      0,    112,      0, }, /* 739 */
+  {   112,     26,     12,      0,      0,    112,      0, }, /* 740 */
+  {   112,     12,      3,      0,      0,    112,      0, }, /* 741 */
+  {   112,     15,     12,      0,      0,    112,      0, }, /* 742 */
+  {   112,     21,     12,      0,      0,    112,      0, }, /* 743 */
+  {    78,      7,     12,      0,      0,     78,      0, }, /* 744 */
+  {    78,     21,     12,      0,      0,     78,      0, }, /* 745 */
+  {    83,      7,     12,      0,      0,     83,      0, }, /* 746 */
+  {    83,     15,     12,      0,      0,     83,      0, }, /* 747 */
+  {    82,      7,     12,      0,      0,     82,      0, }, /* 748 */
+  {    82,     15,     12,      0,      0,     82,      0, }, /* 749 */
+  {   121,      7,     12,      0,      0,    121,      0, }, /* 750 */
+  {   121,     21,     12,      0,      0,    121,      0, }, /* 751 */
+  {   121,     15,     12,      0,      0,    121,      0, }, /* 752 */
+  {    89,      7,     12,      0,      0,     89,      0, }, /* 753 */
+  {   130,      9,     12,      0,     64,    130,      0, }, /* 754 */
+  {   130,      5,     12,      0,    -64,    130,      0, }, /* 755 */
+  {   130,     15,     12,      0,      0,    130,      0, }, /* 756 */
+  {   144,      7,     12,      0,      0,    144,      0, }, /* 757 */
+  {   144,     12,      3,      0,      0,    144,      0, }, /* 758 */
+  {   144,     13,     12,      0,      0,    144,      0, }, /* 759 */
+  {     1,     15,     12,      0,      0,      1,      0, }, /* 760 */
+  {   147,      7,     12,      0,      0,    147,      0, }, /* 761 */
+  {   147,     15,     12,      0,      0,    147,      0, }, /* 762 */
+  {   148,      7,     12,      0,      0,    148,      0, }, /* 763 */
+  {   148,     12,      3,      0,      0,    148,      0, }, /* 764 */
+  {   148,     15,     12,      0,      0,    148,      0, }, /* 765 */
+  {   148,     21,     12,      0,      0,    148,      0, }, /* 766 */
+  {   149,      7,     12,      0,      0,    149,      0, }, /* 767 */
+  {    94,     10,      5,      0,      0,     94,      0, }, /* 768 */
+  {    94,     12,      3,      0,      0,     94,      0, }, /* 769 */
+  {    94,      7,     12,      0,      0,     94,      0, }, /* 770 */
+  {    94,     21,     12,      0,      0,     94,      0, }, /* 771 */
+  {    94,     15,     12,      0,      0,     94,      0, }, /* 772 */
+  {    94,     13,     12,      0,      0,     94,      0, }, /* 773 */
+  {    85,     12,      3,      0,      0,     85,      0, }, /* 774 */
+  {    85,     10,      5,      0,      0,     85,      0, }, /* 775 */
+  {    85,      7,     12,      0,      0,     85,      0, }, /* 776 */
+  {    85,     21,     12,      0,      0,     85,      0, }, /* 777 */
+  {    85,      1,      4,      0,      0,     85,      0, }, /* 778 */
+  {   101,      7,     12,      0,      0,    101,      0, }, /* 779 */
+  {   101,     13,     12,      0,      0,    101,      0, }, /* 780 */
+  {    96,     12,      3,      0,      0,     96,      0, }, /* 781 */
+  {    96,      7,     12,      0,      0,     96,      0, }, /* 782 */
+  {    96,     10,      5,      0,      0,     96,      0, }, /* 783 */
+  {    96,     13,     12,      0,      0,     96,      0, }, /* 784 */
+  {    96,     21,     12,      0,      0,     96,      0, }, /* 785 */
+  {   111,      7,     12,      0,      0,    111,      0, }, /* 786 */
+  {   111,     12,      3,      0,      0,    111,      0, }, /* 787 */
+  {   111,     21,     12,      0,      0,    111,      0, }, /* 788 */
+  {   100,     12,      3,      0,      0,    100,      0, }, /* 789 */
+  {   100,     10,      5,      0,      0,    100,      0, }, /* 790 */
+  {   100,      7,     12,      0,      0,    100,      0, }, /* 791 */
+  {   100,      7,      4,      0,      0,    100,      0, }, /* 792 */
+  {   100,     21,     12,      0,      0,    100,      0, }, /* 793 */
+  {   100,     13,     12,      0,      0,    100,      0, }, /* 794 */
+  {    48,     15,     12,      0,      0,     48,      0, }, /* 795 */
+  {   108,      7,     12,      0,      0,    108,      0, }, /* 796 */
+  {   108,     10,      5,      0,      0,    108,      0, }, /* 797 */
+  {   108,     12,      3,      0,      0,    108,      0, }, /* 798 */
+  {   108,     21,     12,      0,      0,    108,      0, }, /* 799 */
+  {   129,      7,     12,      0,      0,    129,      0, }, /* 800 */
+  {   129,     21,     12,      0,      0,    129,      0, }, /* 801 */
+  {   109,      7,     12,      0,      0,    109,      0, }, /* 802 */
+  {   109,     12,      3,      0,      0,    109,      0, }, /* 803 */
+  {   109,     10,      5,      0,      0,    109,      0, }, /* 804 */
+  {   109,     13,     12,      0,      0,    109,      0, }, /* 805 */
+  {   107,     12,      3,      0,      0,    107,      0, }, /* 806 */
+  {   107,     12,      3,      0,      0,    -52,      0, }, /* 807 */
+  {   107,     10,      5,      0,      0,    107,      0, }, /* 808 */
+  {   107,     10,      5,      0,      0,    -52,      0, }, /* 809 */
+  {   107,      7,     12,      0,      0,    107,      0, }, /* 810 */
+  {    28,     12,      3,      0,      0,    -52,      0, }, /* 811 */
+  {   107,     10,      3,      0,      0,    107,      0, }, /* 812 */
+  {   135,      7,     12,      0,      0,    135,      0, }, /* 813 */
+  {   135,     10,      5,      0,      0,    135,      0, }, /* 814 */
+  {   135,     12,      3,      0,      0,    135,      0, }, /* 815 */
+  {   135,     21,     12,      0,      0,    135,      0, }, /* 816 */
+  {   135,     13,     12,      0,      0,    135,      0, }, /* 817 */
+  {   124,      7,     12,      0,      0,    124,      0, }, /* 818 */
+  {   124,     10,      3,      0,      0,    124,      0, }, /* 819 */
+  {   124,     10,      5,      0,      0,    124,      0, }, /* 820 */
+  {   124,     12,      3,      0,      0,    124,      0, }, /* 821 */
+  {   124,     21,     12,      0,      0,    124,      0, }, /* 822 */
+  {   124,     13,     12,      0,      0,    124,      0, }, /* 823 */
+  {   123,      7,     12,      0,      0,    123,      0, }, /* 824 */
+  {   123,     10,      3,      0,      0,    123,      0, }, /* 825 */
+  {   123,     10,      5,      0,      0,    123,      0, }, /* 826 */
+  {   123,     12,      3,      0,      0,    123,      0, }, /* 827 */
+  {   123,     21,     12,      0,      0,    123,      0, }, /* 828 */
+  {   114,      7,     12,      0,      0,    114,      0, }, /* 829 */
+  {   114,     10,      5,      0,      0,    114,      0, }, /* 830 */
+  {   114,     12,      3,      0,      0,    114,      0, }, /* 831 */
+  {   114,     21,     12,      0,      0,    114,      0, }, /* 832 */
+  {   114,     13,     12,      0,      0,    114,      0, }, /* 833 */
+  {   102,      7,     12,      0,      0,    102,      0, }, /* 834 */
+  {   102,     12,      3,      0,      0,    102,      0, }, /* 835 */
+  {   102,     10,      5,      0,      0,    102,      0, }, /* 836 */
+  {   102,     13,     12,      0,      0,    102,      0, }, /* 837 */
+  {   126,      7,     12,      0,      0,    126,      0, }, /* 838 */
+  {   126,     12,      3,      0,      0,    126,      0, }, /* 839 */
+  {   126,     10,      5,      0,      0,    126,      0, }, /* 840 */
+  {   126,     13,     12,      0,      0,    126,      0, }, /* 841 */
+  {   126,     15,     12,      0,      0,    126,      0, }, /* 842 */
+  {   126,     21,     12,      0,      0,    126,      0, }, /* 843 */
+  {   126,     26,     12,      0,      0,    126,      0, }, /* 844 */
+  {   142,      7,     12,      0,      0,    142,      0, }, /* 845 */
+  {   142,     10,      5,      0,      0,    142,      0, }, /* 846 */
+  {   142,     12,      3,      0,      0,    142,      0, }, /* 847 */
+  {   142,     21,     12,      0,      0,    142,      0, }, /* 848 */
+  {   125,      9,     12,      0,     32,    125,      0, }, /* 849 */
+  {   125,      5,     12,      0,    -32,    125,      0, }, /* 850 */
+  {   125,     13,     12,      0,      0,    125,      0, }, /* 851 */
+  {   125,     15,     12,      0,      0,    125,      0, }, /* 852 */
+  {   125,      7,     12,      0,      0,    125,      0, }, /* 853 */
+  {   150,      7,     12,      0,      0,    150,      0, }, /* 854 */
+  {   150,     10,      5,      0,      0,    150,      0, }, /* 855 */
+  {   150,     12,      3,      0,      0,    150,      0, }, /* 856 */
+  {   150,     21,     12,      0,      0,    150,      0, }, /* 857 */
+  {   141,      7,     12,      0,      0,    141,      0, }, /* 858 */
+  {   141,     12,      3,      0,      0,    141,      0, }, /* 859 */
+  {   141,     10,      5,      0,      0,    141,      0, }, /* 860 */
+  {   141,      7,      4,      0,      0,    141,      0, }, /* 861 */
+  {   141,     21,     12,      0,      0,    141,      0, }, /* 862 */
+  {   140,      7,     12,      0,      0,    140,      0, }, /* 863 */
+  {   140,     12,      3,      0,      0,    140,      0, }, /* 864 */
+  {   140,     10,      5,      0,      0,    140,      0, }, /* 865 */
+  {   140,      7,      4,      0,      0,    140,      0, }, /* 866 */
+  {   140,     21,     12,      0,      0,    140,      0, }, /* 867 */
+  {   122,      7,     12,      0,      0,    122,      0, }, /* 868 */
+  {   133,      7,     12,      0,      0,    133,      0, }, /* 869 */
+  {   133,     10,      5,      0,      0,    133,      0, }, /* 870 */
+  {   133,     12,      3,      0,      0,    133,      0, }, /* 871 */
+  {   133,     21,     12,      0,      0,    133,      0, }, /* 872 */
+  {   133,     13,     12,      0,      0,    133,      0, }, /* 873 */
+  {   133,     15,     12,      0,      0,    133,      0, }, /* 874 */
+  {   134,     21,     12,      0,      0,    134,      0, }, /* 875 */
+  {   134,      7,     12,      0,      0,    134,      0, }, /* 876 */
+  {   134,     12,      3,      0,      0,    134,      0, }, /* 877 */
+  {   134,     10,      5,      0,      0,    134,      0, }, /* 878 */
+  {   138,      7,     12,      0,      0,    138,      0, }, /* 879 */
+  {   138,     12,      3,      0,      0,    138,      0, }, /* 880 */
+  {   138,      7,      4,      0,      0,    138,      0, }, /* 881 */
+  {   138,     13,     12,      0,      0,    138,      0, }, /* 882 */
+  {   143,      7,     12,      0,      0,    143,      0, }, /* 883 */
+  {   143,     10,      5,      0,      0,    143,      0, }, /* 884 */
+  {   143,     12,      3,      0,      0,    143,      0, }, /* 885 */
+  {   143,     13,     12,      0,      0,    143,      0, }, /* 886 */
+  {   145,      7,     12,      0,      0,    145,      0, }, /* 887 */
+  {   145,     12,      3,      0,      0,    145,      0, }, /* 888 */
+  {   145,     10,      5,      0,      0,    145,      0, }, /* 889 */
+  {   145,     21,     12,      0,      0,    145,      0, }, /* 890 */
+  {    54,     15,     12,      0,      0,     54,      0, }, /* 891 */
+  {    54,     21,     12,      0,      0,     54,      0, }, /* 892 */
+  {    63,      7,     12,      0,      0,     63,      0, }, /* 893 */
+  {    63,     14,     12,      0,      0,     63,      0, }, /* 894 */
+  {    63,     21,     12,      0,      0,     63,      0, }, /* 895 */
+  {    80,      7,     12,      0,      0,     80,      0, }, /* 896 */
+  {    80,      1,      2,      0,      0,     80,      0, }, /* 897 */
+  {   127,      7,     12,      0,      0,    127,      0, }, /* 898 */
+  {   115,      7,     12,      0,      0,    115,      0, }, /* 899 */
+  {   115,     13,     12,      0,      0,    115,      0, }, /* 900 */
+  {   115,     21,     12,      0,      0,    115,      0, }, /* 901 */
+  {   103,      7,     12,      0,      0,    103,      0, }, /* 902 */
+  {   103,     12,      3,      0,      0,    103,      0, }, /* 903 */
+  {   103,     21,     12,      0,      0,    103,      0, }, /* 904 */
+  {   119,      7,     12,      0,      0,    119,      0, }, /* 905 */
+  {   119,     12,      3,      0,      0,    119,      0, }, /* 906 */
+  {   119,     21,     12,      0,      0,    119,      0, }, /* 907 */
+  {   119,     26,     12,      0,      0,    119,      0, }, /* 908 */
+  {   119,      6,     12,      0,      0,    119,      0, }, /* 909 */
+  {   119,     13,     12,      0,      0,    119,      0, }, /* 910 */
+  {   119,     15,     12,      0,      0,    119,      0, }, /* 911 */
+  {   146,      9,     12,      0,     32,    146,      0, }, /* 912 */
+  {   146,      5,     12,      0,    -32,    146,      0, }, /* 913 */
+  {   146,     15,     12,      0,      0,    146,      0, }, /* 914 */
+  {   146,     21,     12,      0,      0,    146,      0, }, /* 915 */
+  {    99,      7,     12,      0,      0,     99,      0, }, /* 916 */
+  {    99,     12,      3,      0,      0,     99,      0, }, /* 917 */
+  {    99,     10,      5,      0,      0,     99,      0, }, /* 918 */
+  {    99,      6,     12,      0,      0,     99,      0, }, /* 919 */
+  {   137,      6,     12,      0,      0,    137,      0, }, /* 920 */
+  {   139,      6,     12,      0,      0,    139,      0, }, /* 921 */
+  {   137,      7,     12,      0,      0,    137,      0, }, /* 922 */
+  {   139,      7,     12,      0,      0,    139,      0, }, /* 923 */
+  {   105,      7,     12,      0,      0,    105,      0, }, /* 924 */
+  {   105,     26,     12,      0,      0,    105,      0, }, /* 925 */
+  {   105,     12,      3,      0,      0,    105,      0, }, /* 926 */
+  {   105,     21,     12,      0,      0,    105,      0, }, /* 927 */
+  {    10,      1,      2,      0,      0,    105,      0, }, /* 928 */
+  {    10,     10,      3,      0,      0,     10,      0, }, /* 929 */
+  {    10,     10,      5,      0,      0,     10,      0, }, /* 930 */
+  {    20,     12,      3,      0,      0,     20,      0, }, /* 931 */
+  {   131,     26,     12,      0,      0,    131,      0, }, /* 932 */
+  {   131,     12,      3,      0,      0,    131,      0, }, /* 933 */
+  {   131,     21,     12,      0,      0,    131,      0, }, /* 934 */
+  {    18,     12,      3,      0,      0,     18,      0, }, /* 935 */
+  {   151,      7,     12,      0,      0,    151,      0, }, /* 936 */
+  {   151,     12,      3,      0,      0,    151,      0, }, /* 937 */
+  {   151,      6,     12,      0,      0,    151,      0, }, /* 938 */
+  {   151,     13,     12,      0,      0,    151,      0, }, /* 939 */
+  {   151,     26,     12,      0,      0,    151,      0, }, /* 940 */
+  {   152,      7,     12,      0,      0,    152,      0, }, /* 941 */
+  {   152,     12,      3,      0,      0,    152,      0, }, /* 942 */
+  {   152,     13,     12,      0,      0,    152,      0, }, /* 943 */
+  {   152,     23,     12,      0,      0,    152,      0, }, /* 944 */
+  {   113,      7,     12,      0,      0,    113,      0, }, /* 945 */
+  {   113,     15,     12,      0,      0,    113,      0, }, /* 946 */
+  {   113,     12,      3,      0,      0,    113,      0, }, /* 947 */
+  {   132,      9,     12,      0,     34,    132,      0, }, /* 948 */
+  {   132,      5,     12,      0,    -34,    132,      0, }, /* 949 */
+  {   132,     12,      3,      0,      0,    132,      0, }, /* 950 */
+  {   132,      6,     12,      0,      0,    132,      0, }, /* 951 */
+  {   132,     13,     12,      0,      0,    132,      0, }, /* 952 */
+  {   132,     21,     12,      0,      0,    132,      0, }, /* 953 */
+  {     0,      2,     14,      0,      0,      0,      0, }, /* 954 */
+  {    10,     26,     11,      0,      0,     10,      0, }, /* 955 */
+  {    27,     26,     12,      0,      0,     27,      0, }, /* 956 */
+  {    10,     24,      3,      0,      0,     10,      0, }, /* 957 */
+  {    10,      1,      3,      0,      0,     10,      0, }, /* 958 */
 };
 
 const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
@@ -1204,37 +1185,37 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F000 */
 126,126, 98, 98,127,128,129,130,131,131,132,133,134,135,136,137, /* U+F800 */
 138,139,140,141,142,143,144,145,146,147,148,142,149,149,150,142, /* U+10000 */
-151,152,153,154,155,156,157,158,159,160,161,142,162,163,164,165, /* U+10800 */
-166,167,168,169,170,171,172,142,173,174,142,175,176,177,178,142, /* U+11000 */
-179,180,181,182,183,184,142,142,185,186,187,188,142,189,142,190, /* U+11800 */
-191,191,191,191,191,191,191,192,193,191,194,142,142,142,142,142, /* U+12000 */
+151,152,153,154,155,156,157,158,159,160,161,142,162,142,163,164, /* U+10800 */
+165,166,167,168,169,170,171,142,172,173,142,174,175,176,177,142, /* U+11000 */
+178,179,142,180,181,182,142,142,183,184,185,186,142,187,142,188, /* U+11800 */
+189,189,189,189,189,189,189,190,191,189,192,142,142,142,142,142, /* U+12000 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+12800 */
-195,195,195,195,195,195,195,195,196,142,142,142,142,142,142,142, /* U+13000 */
+193,193,193,193,193,193,193,193,194,142,142,142,142,142,142,142, /* U+13000 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+13800 */
-142,142,142,142,142,142,142,142,197,197,197,197,198,142,142,142, /* U+14000 */
+142,142,142,142,142,142,142,142,195,195,195,195,196,142,142,142, /* U+14000 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+14800 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+15000 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+15800 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+16000 */
-199,199,199,199,200,201,202,203,142,142,142,142,204,205,206,207, /* U+16800 */
-208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208, /* U+17000 */
-208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208, /* U+17800 */
-208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,209, /* U+18000 */
-208,208,208,208,208,208,210,210,210,211,212,142,142,142,142,142, /* U+18800 */
+197,197,197,197,198,199,200,201,142,142,142,142,202,203,204,205, /* U+16800 */
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206, /* U+17000 */
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206, /* U+17800 */
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,207, /* U+18000 */
+206,206,206,206,206,208,142,142,142,142,142,142,142,142,142,142, /* U+18800 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+19000 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+19800 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1A000 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1A800 */
-213,214,215,216,216,217,142,142,142,142,142,142,142,142,142,142, /* U+1B000 */
-142,142,142,142,142,142,142,142,218,219,142,142,142,142,142,142, /* U+1B800 */
+209,210,211,212,212,213,142,142,142,142,142,142,142,142,142,142, /* U+1B000 */
+142,142,142,142,142,142,142,142,214,215,142,142,142,142,142,142, /* U+1B800 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1C000 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1C800 */
- 71,220,221,222,223,224,225,142,226,227,228,229,230,231,232,233, /* U+1D000 */
-234,234,234,234,235,236,142,142,142,142,142,142,142,142,142,142, /* U+1D800 */
-237,142,238,142,142,239,142,142,142,142,142,142,142,142,142,142, /* U+1E000 */
-240,241,242,142,142,142,142,142,243,244,245,142,246,247,142,142, /* U+1E800 */
-248,249,250,251,252,253,254,255,254,254,256,254,257,258,259,260, /* U+1F000 */
-261,262,263,264,265,266, 71,267,253,253,253,253,253,253,253,268, /* U+1F800 */
+ 71,216,217,218,219,220,221,142,222,223,224,225,226,227,228,229, /* U+1D000 */
+230,230,230,230,231,232,142,142,142,142,142,142,142,142,142,142, /* U+1D800 */
+233,142,234,142,142,235,142,142,142,142,142,142,142,142,142,142, /* U+1E000 */
+236,237,238,142,142,142,142,142,239,240,241,142,242,243,142,142, /* U+1E800 */
+244,245,246,247,248,249,250,251,250,250,252,250,253,254,255,256, /* U+1F000 */
+257,258,259,260,261,262,249,249,249,249,249,249,249,249,249,263, /* U+1F800 */
  98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20000 */
  98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20800 */
  98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+21000 */
@@ -1255,21 +1236,21 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
  98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+28800 */
  98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29000 */
  98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29800 */
- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,269, 98, 98, /* U+2A000 */
+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,264, 98, 98, /* U+2A000 */
  98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2A800 */
- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,270, 98, /* U+2B000 */
-271, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2B800 */
+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,265, 98, /* U+2B000 */
+266, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2B800 */
  98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2C000 */
- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,272, 98, 98, /* U+2C800 */
+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,267, 98, 98, /* U+2C800 */
  98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D000 */
  98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D800 */
  98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2E000 */
- 98, 98, 98, 98, 98, 98, 98,273,142,142,142,142,142,142,142,142, /* U+2E800 */
+ 98, 98, 98, 98, 98, 98, 98,268,142,142,142,142,142,142,142,142, /* U+2E800 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+2F000 */
- 98, 98, 98, 98,274,142,142,142,142,142,142,142,142,142,142,142, /* U+2F800 */
- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+30000 */
- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+30800 */
- 98, 98, 98, 98, 98, 98,275,142,142,142,142,142,142,142,142,142, /* U+31000 */
+ 98, 98, 98, 98,269,142,142,142,142,142,142,142,142,142,142,142, /* U+2F800 */
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+30000 */
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+30800 */
+142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+31000 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+31800 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+32000 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+32800 */
@@ -1619,8 +1600,8 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DE800 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DF000 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DF800 */
-276,277,278,279,277,277,277,277,277,277,277,277,277,277,277,277, /* U+E0000 */
-277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277, /* U+E0800 */
+270,271,272,273,271,271,271,271,271,271,271,271,271,271,271,271, /* U+E0000 */
+271,271,271,271,271,271,271,271,271,271,271,271,271,271,271,271, /* U+E0800 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E1000 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E1800 */
 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E2000 */
@@ -1682,7 +1663,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FE000 */
 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FE800 */
 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FF000 */
-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,280, /* U+FF800 */
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,274, /* U+FF800 */
 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+100000 */
 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+100800 */
 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+101000 */
@@ -1714,10 +1695,10 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10E000 */
 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10E800 */
 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10F000 */
-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,280, /* U+10F800 */
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,274, /* U+10F800 */
 };
 
-const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
+const uint16_t PRIV(ucd_stage2)[] = { /* 70400 bytes, block = 128 */
 /* block 0 */
   0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  3,  1,  1,
   1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
@@ -1829,474 +1810,474 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
 
 /* block 11 */
-207,207,207,207,207,207,207,206,206,205,208,120,120,209,209,210,
-120,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
-211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
-211,211,211,211,211,211,211,211,211,211,211,211,211,211,212,211,
-213,211,211,213,211,211,213,211,120,120,120,120,120,120,120,120,
-214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
-214,214,214,214,214,214,214,214,214,214,214,120,120,120,120,214,
-214,214,214,213,213,120,120,120,120,120,120,120,120,120,120,120,
+207,207,207,207,207,207,207,206,206,208,209,120,120,210,210,211,
+120,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,213,212,
+214,212,212,214,212,212,214,212,120,120,120,120,120,120,120,120,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,120,120,120,120,215,
+215,215,215,214,214,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 12 */
-215,215,215,215,215,216,217,217,217,218,218,219,220,218,221,221,
-222,222,222,222,222,222,222,222,222,222,222,220,223,120,218,220,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-225,224,224,224,224,224,224,224,224,224,224,226,226,226,226,226,
-226,226,226,226,226,226,222,222,222,222,222,222,222,222,222,222,
-227,227,227,227,227,227,227,227,227,227,218,218,218,218,224,224,
-226,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+216,216,216,216,216,217,218,218,218,219,219,220,221,219,222,222,
+223,223,223,223,223,223,223,223,223,223,223,221,224,120,219,221,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+226,225,225,225,225,225,225,225,225,225,225,227,227,227,227,227,
+227,227,227,227,227,227,223,223,223,223,223,223,223,223,223,223,
+228,228,228,228,228,228,228,228,228,228,219,219,219,219,225,225,
+227,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
 
 /* block 13 */
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,228,224,222,222,222,222,222,222,222,216,221,222,
-222,222,222,222,222,229,229,222,222,221,222,222,222,222,224,224,
-230,230,230,230,230,230,230,230,230,230,224,224,224,221,221,224,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,229,225,223,223,223,223,223,223,223,217,222,223,
+223,223,223,223,223,230,230,223,223,222,223,223,223,223,225,225,
+231,231,231,231,231,231,231,231,231,231,225,225,225,222,222,225,
 
 /* block 14 */
-231,231,231,231,231,231,231,231,231,231,231,231,231,231,120,232,
-233,234,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
-233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,120,233,
+234,235,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
 234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
-234,234,234,234,234,234,234,234,234,234,234,120,120,233,233,233,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,120,120,234,234,234,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
 
 /* block 15 */
-235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
-235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
-235,235,235,235,235,235,236,236,236,236,236,236,236,236,236,236,
-236,235,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-237,237,237,237,237,237,237,237,237,237,238,238,238,238,238,238,
-238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
-238,238,238,238,238,238,238,238,238,238,238,239,239,239,239,239,
-239,239,239,239,240,240,241,242,242,242,240,120,120,239,243,243,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,237,237,237,237,237,237,237,237,237,237,
+237,236,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+238,238,238,238,238,238,238,238,238,238,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,240,240,240,240,240,
+240,240,240,240,241,241,242,243,243,243,241,120,120,240,244,244,
 
 /* block 16 */
-244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
-244,244,244,244,244,244,245,245,245,245,246,245,245,245,245,245,
-245,245,245,245,246,245,245,245,246,245,245,245,245,245,120,120,
-247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,120,
-248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
-248,248,248,248,248,248,248,248,248,249,249,249,120,120,250,120,
-233,233,233,233,233,233,233,233,233,233,233,120,120,120,120,120,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,246,246,246,246,247,246,246,246,246,246,
+246,246,246,246,247,246,246,246,247,246,246,246,246,246,120,120,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,120,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,250,250,250,120,120,251,120,
+234,234,234,234,234,234,234,234,234,234,234,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 17 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,120,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,120,120,120,120,120,120,120,120,
-120,120,120,222,222,222,222,222,222,222,222,222,222,222,222,222,
-222,222,216,222,222,222,222,222,222,222,222,222,222,222,222,222,
-222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,120,225,225,225,225,225,225,225,225,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,217,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
 
 /* block 18 */
-251,251,251,252,253,253,253,253,253,253,253,253,253,253,253,253,
-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
-253,253,253,253,253,253,253,253,253,253,251,252,251,253,252,252,
-252,251,251,251,251,251,251,251,251,252,252,252,252,251,252,252,
-253,254,255,113,113,251,251,251,253,253,253,253,253,253,253,253,
-253,253,251,251,256,257,258,258,258,258,258,258,258,258,258,258,
-259,260,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+252,252,252,253,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,252,253,252,254,253,253,
+253,252,252,252,252,252,252,252,252,253,253,253,253,252,253,253,
+254,255,256,113,113,252,252,252,254,254,254,254,254,254,254,254,
+254,254,252,252,257,258,259,259,259,259,259,259,259,259,259,259,
+260,261,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
 
 /* block 19 */
-261,262,263,263,120,261,261,261,261,261,261,261,261,120,120,261,
-261,120,120,261,261,261,261,261,261,261,261,261,261,261,261,261,
-261,261,261,261,261,261,261,261,261,120,261,261,261,261,261,261,
-261,120,261,120,120,120,261,261,261,261,120,120,262,261,264,263,
-263,262,262,262,262,120,120,263,263,120,120,263,263,262,261,120,
-120,120,120,120,120,120,120,264,120,120,120,120,261,261,120,261,
-261,261,262,262,120,120,265,265,265,265,265,265,265,265,265,265,
-261,261,266,266,267,267,267,267,267,267,268,266,261,269,262,120,
+262,263,264,264,120,262,262,262,262,262,262,262,262,120,120,262,
+262,120,120,262,262,262,262,262,262,262,262,262,262,262,262,262,
+262,262,262,262,262,262,262,262,262,120,262,262,262,262,262,262,
+262,120,262,120,120,120,262,262,262,262,120,120,263,262,265,264,
+264,263,263,263,263,120,120,264,264,120,120,264,264,263,262,120,
+120,120,120,120,120,120,120,265,120,120,120,120,262,262,120,262,
+262,262,263,263,120,120,266,266,266,266,266,266,266,266,266,266,
+262,262,267,267,268,268,268,268,268,268,269,267,262,270,263,120,
 
 /* block 20 */
-120,270,270,271,120,272,272,272,272,272,272,120,120,120,120,272,
-272,120,120,272,272,272,272,272,272,272,272,272,272,272,272,272,
-272,272,272,272,272,272,272,272,272,120,272,272,272,272,272,272,
-272,120,272,272,120,272,272,120,272,272,120,120,270,120,271,271,
-271,270,270,120,120,120,120,270,270,120,120,270,270,270,120,120,
-120,270,120,120,120,120,120,120,120,272,272,272,272,120,272,120,
-120,120,120,120,120,120,273,273,273,273,273,273,273,273,273,273,
-270,270,272,272,272,270,274,120,120,120,120,120,120,120,120,120,
+120,271,271,272,120,273,273,273,273,273,273,120,120,120,120,273,
+273,120,120,273,273,273,273,273,273,273,273,273,273,273,273,273,
+273,273,273,273,273,273,273,273,273,120,273,273,273,273,273,273,
+273,120,273,273,120,273,273,120,273,273,120,120,271,120,272,272,
+272,271,271,120,120,120,120,271,271,120,120,271,271,271,120,120,
+120,271,120,120,120,120,120,120,120,273,273,273,273,120,273,120,
+120,120,120,120,120,120,274,274,274,274,274,274,274,274,274,274,
+271,271,273,273,273,271,275,120,120,120,120,120,120,120,120,120,
 
 /* block 21 */
-120,275,275,276,120,277,277,277,277,277,277,277,277,277,120,277,
-277,277,120,277,277,277,277,277,277,277,277,277,277,277,277,277,
-277,277,277,277,277,277,277,277,277,120,277,277,277,277,277,277,
-277,120,277,277,120,277,277,277,277,277,120,120,275,277,276,276,
-276,275,275,275,275,275,120,275,275,276,120,276,276,275,120,120,
-277,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-277,277,275,275,120,120,278,278,278,278,278,278,278,278,278,278,
-279,280,120,120,120,120,120,120,120,277,275,275,275,275,275,275,
+120,276,276,277,120,278,278,278,278,278,278,278,278,278,120,278,
+278,278,120,278,278,278,278,278,278,278,278,278,278,278,278,278,
+278,278,278,278,278,278,278,278,278,120,278,278,278,278,278,278,
+278,120,278,278,120,278,278,278,278,278,120,120,276,278,277,277,
+277,276,276,276,276,276,120,276,276,277,120,277,277,276,120,120,
+278,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+278,278,276,276,120,120,279,279,279,279,279,279,279,279,279,279,
+280,281,120,120,120,120,120,120,120,278,276,276,276,276,276,276,
 
 /* block 22 */
-120,281,282,282,120,283,283,283,283,283,283,283,283,120,120,283,
-283,120,120,283,283,283,283,283,283,283,283,283,283,283,283,283,
-283,283,283,283,283,283,283,283,283,120,283,283,283,283,283,283,
-283,120,283,283,120,283,283,283,283,283,120,120,281,283,284,281,
-282,281,281,281,281,120,120,282,282,120,120,282,282,281,120,120,
-120,120,120,120,120,281,281,284,120,120,120,120,283,283,120,283,
-283,283,281,281,120,120,285,285,285,285,285,285,285,285,285,285,
-286,283,287,287,287,287,287,287,120,120,120,120,120,120,120,120,
+120,282,283,283,120,284,284,284,284,284,284,284,284,120,120,284,
+284,120,120,284,284,284,284,284,284,284,284,284,284,284,284,284,
+284,284,284,284,284,284,284,284,284,120,284,284,284,284,284,284,
+284,120,284,284,120,284,284,284,284,284,120,120,282,284,285,282,
+283,282,282,282,282,120,120,283,283,120,120,283,283,282,120,120,
+120,120,120,120,120,120,282,285,120,120,120,120,284,284,120,284,
+284,284,282,282,120,120,286,286,286,286,286,286,286,286,286,286,
+287,284,288,288,288,288,288,288,120,120,120,120,120,120,120,120,
 
 /* block 23 */
-120,120,288,289,120,289,289,289,289,289,289,120,120,120,289,289,
-289,120,289,289,289,289,120,120,120,289,289,120,289,120,289,289,
-120,120,120,289,289,120,120,120,289,289,289,120,120,120,289,289,
-289,289,289,289,289,289,289,289,289,289,120,120,120,120,290,291,
-288,291,291,120,120,120,291,291,291,120,291,291,291,288,120,120,
-289,120,120,120,120,120,120,290,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,292,292,292,292,292,292,292,292,292,292,
-293,293,293,294,295,295,295,295,295,296,295,120,120,120,120,120,
+120,120,289,290,120,290,290,290,290,290,290,120,120,120,290,290,
+290,120,290,290,290,290,120,120,120,290,290,120,290,120,290,290,
+120,120,120,290,290,120,120,120,290,290,290,120,120,120,290,290,
+290,290,290,290,290,290,290,290,290,290,120,120,120,120,291,292,
+289,292,292,120,120,120,292,292,292,120,292,292,292,289,120,120,
+290,120,120,120,120,120,120,291,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,293,293,293,293,293,293,293,293,293,293,
+294,294,294,295,296,296,296,296,296,297,296,120,120,120,120,120,
 
 /* block 24 */
-297,298,298,298,297,299,299,299,299,299,299,299,299,120,299,299,
-299,120,299,299,299,299,299,299,299,299,299,299,299,299,299,299,
-299,299,299,299,299,299,299,299,299,120,299,299,299,299,299,299,
-299,299,299,299,299,299,299,299,299,299,120,120,120,299,297,297,
-297,298,298,298,298,120,297,297,297,120,297,297,297,297,120,120,
-120,120,120,120,120,297,297,120,299,299,299,120,120,120,120,120,
-299,299,297,297,120,120,300,300,300,300,300,300,300,300,300,300,
-120,120,120,120,120,120,120,301,302,302,302,302,302,302,302,303,
+298,299,299,299,298,300,300,300,300,300,300,300,300,120,300,300,
+300,120,300,300,300,300,300,300,300,300,300,300,300,300,300,300,
+300,300,300,300,300,300,300,300,300,120,300,300,300,300,300,300,
+300,300,300,300,300,300,300,300,300,300,120,120,120,300,298,298,
+298,299,299,299,299,120,298,298,298,120,298,298,298,298,120,120,
+120,120,120,120,120,298,298,120,300,300,300,120,120,120,120,120,
+300,300,298,298,120,120,301,301,301,301,301,301,301,301,301,301,
+120,120,120,120,120,120,120,302,303,303,303,303,303,303,303,304,
 
 /* block 25 */
-304,305,306,306,307,304,304,304,304,304,304,304,304,120,304,304,
-304,120,304,304,304,304,304,304,304,304,304,304,304,304,304,304,
-304,304,304,304,304,304,304,304,304,120,304,304,304,304,304,304,
-304,304,304,304,120,304,304,304,304,304,120,120,305,304,306,305,
-306,306,308,306,306,120,305,306,306,120,306,306,305,305,120,120,
-120,120,120,120,120,308,308,120,120,120,120,120,120,120,304,120,
-304,304,305,305,120,120,309,309,309,309,309,309,309,309,309,309,
-120,304,304,120,120,120,120,120,120,120,120,120,120,120,120,120,
+305,306,307,307,308,305,305,305,305,305,305,305,305,120,305,305,
+305,120,305,305,305,305,305,305,305,305,305,305,305,305,305,305,
+305,305,305,305,305,305,305,305,305,120,305,305,305,305,305,305,
+305,305,305,305,120,305,305,305,305,305,120,120,306,305,307,306,
+307,307,309,307,307,120,306,307,307,120,307,307,306,306,120,120,
+120,120,120,120,120,309,309,120,120,120,120,120,120,120,305,120,
+305,305,306,306,120,120,310,310,310,310,310,310,310,310,310,310,
+120,305,305,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 26 */
-310,310,311,311,312,312,312,312,312,312,312,312,312,120,312,312,
-312,120,312,312,312,312,312,312,312,312,312,312,312,312,312,312,
-312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,
-312,312,312,312,312,312,312,312,312,312,312,310,310,312,313,311,
-311,310,310,310,310,120,311,311,311,120,311,311,311,310,314,315,
-120,120,120,120,312,312,312,313,316,316,316,316,316,316,316,312,
-312,312,310,310,120,120,317,317,317,317,317,317,317,317,317,317,
-316,316,316,316,316,316,316,316,316,315,312,312,312,312,312,312,
+311,311,312,312,120,313,313,313,313,313,313,313,313,120,313,313,
+313,120,313,313,313,313,313,313,313,313,313,313,313,313,313,313,
+313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,
+313,313,313,313,313,313,313,313,313,313,313,311,311,313,314,312,
+312,311,311,311,311,120,312,312,312,120,312,312,312,311,315,316,
+120,120,120,120,313,313,313,314,317,317,317,317,317,317,317,313,
+313,313,311,311,120,120,318,318,318,318,318,318,318,318,318,318,
+317,317,317,317,317,317,317,317,317,316,313,313,313,313,313,313,
 
 /* block 27 */
-120,318,319,319,120,320,320,320,320,320,320,320,320,320,320,320,
+120,120,319,319,120,320,320,320,320,320,320,320,320,320,320,320,
 320,320,320,320,320,320,320,120,120,120,320,320,320,320,320,320,
 320,320,320,320,320,320,320,320,320,320,320,320,320,320,320,320,
 320,320,120,320,320,320,320,320,320,320,320,320,120,320,120,120,
-320,320,320,320,320,320,320,120,120,120,318,120,120,120,120,321,
-319,319,318,318,318,120,318,120,319,319,319,319,319,319,319,321,
-120,120,120,120,120,120,322,322,322,322,322,322,322,322,322,322,
-120,120,319,319,323,120,120,120,120,120,120,120,120,120,120,120,
+320,320,320,320,320,320,320,120,120,120,321,120,120,120,120,322,
+319,319,321,321,321,120,321,120,319,319,319,319,319,319,319,322,
+120,120,120,120,120,120,323,323,323,323,323,323,323,323,323,323,
+120,120,319,319,324,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 28 */
-120,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,325,324,326,325,325,325,325,325,325,325,120,120,120,120,  6,
-324,324,324,324,324,324,327,325,325,325,325,325,325,325,325,328,
-329,329,329,329,329,329,329,329,329,329,328,328,120,120,120,120,
+120,325,325,325,325,325,325,325,325,325,325,325,325,325,325,325,
+325,325,325,325,325,325,325,325,325,325,325,325,325,325,325,325,
+325,325,325,325,325,325,325,325,325,325,325,325,325,325,325,325,
+325,326,325,327,326,326,326,326,326,326,326,120,120,120,120,  6,
+325,325,325,325,325,325,328,326,326,326,326,326,326,326,326,329,
+330,330,330,330,330,330,330,330,330,330,329,329,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 29 */
-120,330,330,120,330,120,330,330,330,330,330,120,330,330,330,330,
-330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,
-330,330,330,330,120,330,120,330,330,330,330,330,330,330,330,330,
-330,331,330,332,331,331,331,331,331,331,331,331,331,330,120,120,
-330,330,330,330,330,120,333,120,331,331,331,331,331,331,120,120,
-334,334,334,334,334,334,334,334,334,334,120,120,330,330,330,330,
+120,331,331,120,331,120,331,331,331,331,331,120,331,331,331,331,
+331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,
+331,331,331,331,120,331,120,331,331,331,331,331,331,331,331,331,
+331,332,331,333,332,332,332,332,332,332,332,332,332,331,120,120,
+331,331,331,331,331,120,334,120,332,332,332,332,332,332,120,120,
+335,335,335,335,335,335,335,335,335,335,120,120,331,331,331,331,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 30 */
-335,336,336,336,337,337,337,337,337,337,337,337,337,337,337,337,
-337,337,337,336,337,336,336,336,338,338,336,336,336,336,336,336,
-339,339,339,339,339,339,339,339,339,339,340,340,340,340,340,340,
-340,340,340,340,336,338,336,338,336,338,341,342,341,342,343,343,
-335,335,335,335,335,335,335,335,120,335,335,335,335,335,335,335,
-335,335,335,335,335,335,335,335,335,335,335,335,335,335,335,335,
-335,335,335,335,335,335,335,335,335,335,335,335,335,120,120,120,
-120,338,338,338,338,338,338,338,338,338,338,338,338,338,338,343,
+336,337,337,337,338,338,338,338,338,338,338,338,338,338,338,338,
+338,338,338,337,338,337,337,337,339,339,337,337,337,337,337,337,
+340,340,340,340,340,340,340,340,340,340,341,341,341,341,341,341,
+341,341,341,341,337,339,337,339,337,339,342,343,342,343,344,344,
+336,336,336,336,336,336,336,336,120,336,336,336,336,336,336,336,
+336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,
+336,336,336,336,336,336,336,336,336,336,336,336,336,120,120,120,
+120,339,339,339,339,339,339,339,339,339,339,339,339,339,339,344,
 
 /* block 31 */
-338,338,338,338,338,337,338,338,335,335,335,335,335,338,338,338,
-338,338,338,338,338,338,338,338,120,338,338,338,338,338,338,338,
-338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,
-338,338,338,338,338,338,338,338,338,338,338,338,338,120,336,336,
-336,336,336,336,336,336,338,336,336,336,336,336,336,120,336,336,
-337,337,337,337,337, 20, 20, 20, 20,337,337,120,120,120,120,120,
+339,339,339,339,339,338,339,339,336,336,336,336,336,339,339,339,
+339,339,339,339,339,339,339,339,120,339,339,339,339,339,339,339,
+339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,
+339,339,339,339,339,339,339,339,339,339,339,339,339,120,337,337,
+337,337,337,337,337,337,339,337,337,337,337,337,337,120,337,337,
+338,338,338,338,338, 20, 20, 20, 20,338,338,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 32 */
-344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,
-344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,
-344,344,344,344,344,344,344,344,344,344,344,345,345,346,346,346,
-346,347,346,346,346,346,346,346,345,346,346,347,347,346,346,344,
-348,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349,
-344,344,344,344,344,344,347,347,346,346,344,344,344,344,346,346,
-346,344,345,345,345,344,344,345,345,345,345,345,345,345,344,344,
-344,346,346,346,346,344,344,344,344,344,344,344,344,344,344,344,
+345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,
+345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,
+345,345,345,345,345,345,345,345,345,345,345,346,346,347,347,347,
+347,348,347,347,347,347,347,347,346,347,347,348,348,347,347,345,
+349,349,349,349,349,349,349,349,349,349,350,350,350,350,350,350,
+345,345,345,345,345,345,348,348,347,347,345,345,345,345,347,347,
+347,345,346,346,346,345,345,346,346,346,346,346,346,346,345,345,
+345,347,347,347,347,345,345,345,345,345,345,345,345,345,345,345,
 
 /* block 33 */
-344,344,346,345,347,346,346,345,345,345,345,345,345,346,344,345,
-350,350,350,350,350,350,350,350,350,350,345,345,345,346,351,351,
-352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,
-352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,
-352,352,352,352,352,352,120,352,120,120,120,120,120,352,120,120,
+345,345,347,346,348,347,347,346,346,346,346,346,346,347,345,346,
+351,351,351,351,351,351,351,351,351,351,346,346,346,347,352,352,
 353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,
 353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,
-353,353,353,353,353,353,353,353,353,353,353,354,355,353,353,353,
+353,353,353,353,353,353,120,353,120,120,120,120,120,353,120,120,
+354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,
+354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,
+354,354,354,354,354,354,354,354,354,354,354,355,356,354,354,354,
 
 /* block 34 */
-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
 357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
 357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
-
-/* block 35 */
 357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
 357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
-357,357,357,357,357,357,357,357,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
+357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
+357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
 358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
 358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
+
+/* block 35 */
 358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
 358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-
-/* block 36 */
+358,358,358,358,358,358,358,358,359,359,359,359,359,359,359,359,
 359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
 359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
 359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
 359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
-359,359,359,359,359,359,359,359,359,120,359,359,359,359,120,120,
-359,359,359,359,359,359,359,120,359,120,359,359,359,359,120,120,
-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
 359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
 
+/* block 36 */
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,120,360,360,360,360,120,120,
+360,360,360,360,360,360,360,120,360,120,360,360,360,360,120,120,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+
 /* block 37 */
-359,359,359,359,359,359,359,359,359,120,359,359,359,359,120,120,
-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
-359,120,359,359,359,359,120,120,359,359,359,359,359,359,359,120,
-359,120,359,359,359,359,120,120,359,359,359,359,359,359,359,359,
-359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,359,
-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
+360,360,360,360,360,360,360,360,360,120,360,360,360,360,120,120,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,120,360,360,360,360,120,120,360,360,360,360,360,360,360,120,
+360,120,360,360,360,360,120,120,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
 
 /* block 38 */
-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
-359,120,359,359,359,359,120,120,359,359,359,359,359,359,359,359,
-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
-359,359,359,359,359,359,359,359,359,359,359,120,120,360,360,360,
-361,361,361,361,361,361,361,361,361,362,362,362,362,362,362,362,
-362,362,362,362,362,362,362,362,362,362,362,362,362,120,120,120,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,120,360,360,360,360,120,120,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,120,120,361,361,361,
+362,362,362,362,362,362,362,362,362,363,363,363,363,363,363,363,
+363,363,363,363,363,363,363,363,363,363,363,363,363,120,120,120,
 
 /* block 39 */
-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
-363,363,363,363,363,363,363,363,363,363,120,120,120,120,120,120,
-364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,
-364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,
-364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,
-364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,
-364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,
-365,365,365,365,365,365,120,120,366,366,366,366,366,366,120,120,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+364,364,364,364,364,364,364,364,364,364,120,120,120,120,120,120,
+365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
+365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
+365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
+365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
+365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
+366,366,366,366,366,366,120,120,367,367,367,367,367,367,120,120,
 
 /* block 40 */
-367,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
+368,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
 
 /* block 41 */
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
 
 /* block 42 */
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,369,370,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,370,371,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
 
 /* block 43 */
-371,372,372,372,372,372,372,372,372,372,372,372,372,372,372,372,
-372,372,372,372,372,372,372,372,372,372,372,373,374,120,120,120,
-375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,
-375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,
-375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,
-375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,
-375,375,375,375,375,375,375,375,375,375,375,  5,  5,  5,376,376,
-376,375,375,375,375,375,375,375,375,120,120,120,120,120,120,120,
+372,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,
+373,373,373,373,373,373,373,373,373,373,373,374,375,120,120,120,
+376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,
+376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,
+376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,
+376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,
+376,376,376,376,376,376,376,376,376,376,376,  5,  5,  5,377,377,
+377,376,376,376,376,376,376,376,376,120,120,120,120,120,120,120,
 
 /* block 44 */
-377,377,377,377,377,377,377,377,377,377,377,377,377,120,377,377,
-377,377,378,378,378,120,120,120,120,120,120,120,120,120,120,120,
-379,379,379,379,379,379,379,379,379,379,379,379,379,379,379,379,
-379,379,380,380,380,381,381,120,120,120,120,120,120,120,120,120,
-382,382,382,382,382,382,382,382,382,382,382,382,382,382,382,382,
-382,382,383,383,120,120,120,120,120,120,120,120,120,120,120,120,
-384,384,384,384,384,384,384,384,384,384,384,384,384,120,384,384,
-384,120,385,385,120,120,120,120,120,120,120,120,120,120,120,120,
+378,378,378,378,378,378,378,378,378,378,378,378,378,120,378,378,
+378,378,379,379,379,120,120,120,120,120,120,120,120,120,120,120,
+380,380,380,380,380,380,380,380,380,380,380,380,380,380,380,380,
+380,380,381,381,381,382,382,120,120,120,120,120,120,120,120,120,
+383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,
+383,383,384,384,120,120,120,120,120,120,120,120,120,120,120,120,
+385,385,385,385,385,385,385,385,385,385,385,385,385,120,385,385,
+385,120,386,386,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 45 */
-386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,
-386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,
-386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,
-386,386,386,386,387,387,388,387,387,387,387,387,387,387,388,388,
-388,388,388,388,388,388,387,388,388,387,387,387,387,387,387,387,
-387,387,387,387,389,389,389,390,389,389,389,391,386,387,120,120,
-392,392,392,392,392,392,392,392,392,392,120,120,120,120,120,120,
+387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,
+387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,
+387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,
+387,387,387,387,388,388,389,388,388,388,388,388,388,388,389,389,
+389,389,389,389,389,389,388,389,389,388,388,388,388,388,388,388,
+388,388,388,388,390,390,390,391,390,390,390,392,387,388,120,120,
 393,393,393,393,393,393,393,393,393,393,120,120,120,120,120,120,
+394,394,394,394,394,394,394,394,394,394,120,120,120,120,120,120,
 
 /* block 46 */
-394,394,395,395,394,395,396,394,394,394,394,397,397,397,398,120,
-399,399,399,399,399,399,399,399,399,399,120,120,120,120,120,120,
-400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,
-400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,
-400,400,400,401,400,400,400,400,400,400,400,400,400,400,400,400,
-400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,
-400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,
-400,400,400,400,400,400,400,400,400,120,120,120,120,120,120,120,
+395,395,396,396,395,396,397,395,395,395,395,398,398,398,399,120,
+400,400,400,400,400,400,400,400,400,400,120,120,120,120,120,120,
+401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,
+401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,
+401,401,401,402,401,401,401,401,401,401,401,401,401,401,401,401,
+401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,
+401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,
+401,401,401,401,401,401,401,401,401,120,120,120,120,120,120,120,
 
 /* block 47 */
-400,400,400,400,400,397,397,400,400,400,400,400,400,400,400,400,
-400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,
-400,400,400,400,400,400,400,400,400,397,400,120,120,120,120,120,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,120,120,120,120,120,120,120,120,120,120,
+401,401,401,401,401,398,398,401,401,401,401,401,401,401,401,401,
+401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,
+401,401,401,401,401,401,401,401,401,398,401,120,120,120,120,120,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,120,120,120,120,120,120,120,120,120,120,
 
 /* block 48 */
-402,402,402,402,402,402,402,402,402,402,402,402,402,402,402,402,
-402,402,402,402,402,402,402,402,402,402,402,402,402,402,402,120,
-403,403,403,404,404,404,404,403,403,404,404,404,120,120,120,120,
-404,404,403,404,404,404,404,404,404,403,403,403,120,120,120,120,
-405,120,120,120,406,406,407,407,407,407,407,407,407,407,407,407,
-408,408,408,408,408,408,408,408,408,408,408,408,408,408,408,408,
-408,408,408,408,408,408,408,408,408,408,408,408,408,408,120,120,
-408,408,408,408,408,120,120,120,120,120,120,120,120,120,120,120,
+403,403,403,403,403,403,403,403,403,403,403,403,403,403,403,403,
+403,403,403,403,403,403,403,403,403,403,403,403,403,403,403,120,
+404,404,404,405,405,405,405,404,404,405,405,405,120,120,120,120,
+405,405,404,405,405,405,405,405,405,404,404,404,120,120,120,120,
+406,120,120,120,407,407,408,408,408,408,408,408,408,408,408,408,
+409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,
+409,409,409,409,409,409,409,409,409,409,409,409,409,409,120,120,
+409,409,409,409,409,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 49 */
-409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,
-409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,
-409,409,409,409,409,409,409,409,409,409,409,409,120,120,120,120,
-409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,
-409,409,409,409,409,409,409,409,409,409,120,120,120,120,120,120,
-410,410,410,410,410,410,410,410,410,410,411,120,120,120,412,412,
-413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,
-413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,
+410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,
+410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,
+410,410,410,410,410,410,410,410,410,410,410,410,120,120,120,120,
+410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,
+410,410,410,410,410,410,410,410,410,410,120,120,120,120,120,120,
+411,411,411,411,411,411,411,411,411,411,412,120,120,120,413,413,
+414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,
+414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,
 
 /* block 50 */
-414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,
-414,414,414,414,414,414,414,415,415,416,416,415,120,120,417,417,
-418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,
-418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,
-418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,
-418,418,418,418,418,419,420,419,420,420,420,420,420,420,420,120,
-420,421,420,421,421,420,420,420,420,420,420,420,420,419,419,419,
-419,419,419,420,420,420,420,420,420,420,420,420,420,120,120,420,
+415,415,415,415,415,415,415,415,415,415,415,415,415,415,415,415,
+415,415,415,415,415,415,415,416,416,417,417,416,120,120,418,418,
+419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,
+419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,
+419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,
+419,419,419,419,419,420,421,420,421,421,421,421,421,421,421,120,
+421,422,421,422,422,421,421,421,421,421,421,421,421,420,420,420,
+420,420,420,421,421,421,421,421,421,421,421,421,421,120,120,421,
 
 /* block 51 */
-422,422,422,422,422,422,422,422,422,422,120,120,120,120,120,120,
-422,422,422,422,422,422,422,422,422,422,120,120,120,120,120,120,
-423,423,423,423,423,423,423,424,423,423,423,423,423,423,120,120,
-113,113,113,113,113,113,113,113,113,113,113,113,113,113,425,113,
-113,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+423,423,423,423,423,423,423,423,423,423,120,120,120,120,120,120,
+423,423,423,423,423,423,423,423,423,423,120,120,120,120,120,120,
+424,424,424,424,424,424,424,425,424,424,424,424,424,424,120,120,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,426,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 52 */
-426,426,426,426,427,428,428,428,428,428,428,428,428,428,428,428,
-428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,
-428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,
-428,428,428,428,426,429,426,426,426,426,426,427,426,427,427,427,
-427,427,426,427,427,428,428,428,428,428,428,428,120,120,120,120,
-430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431,
-431,432,432,432,432,432,432,432,432,432,432,426,426,426,426,426,
-426,426,426,426,432,432,432,432,432,432,432,432,432,120,120,120,
+427,427,427,427,428,429,429,429,429,429,429,429,429,429,429,429,
+429,429,429,429,429,429,429,429,429,429,429,429,429,429,429,429,
+429,429,429,429,429,429,429,429,429,429,429,429,429,429,429,429,
+429,429,429,429,427,430,427,427,427,427,427,428,427,428,428,428,
+428,428,427,428,428,429,429,429,429,429,429,429,120,120,120,120,
+431,431,431,431,431,431,431,431,431,431,432,432,432,432,432,432,
+432,433,433,433,433,433,433,433,433,433,433,427,427,427,427,427,
+427,427,427,427,433,433,433,433,433,433,433,433,433,120,120,120,
 
 /* block 53 */
-433,433,434,435,435,435,435,435,435,435,435,435,435,435,435,435,
-435,435,435,435,435,435,435,435,435,435,435,435,435,435,435,435,
-435,434,433,433,433,433,434,434,433,433,434,433,433,433,435,435,
-436,436,436,436,436,436,436,436,436,436,435,435,435,435,435,435,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,438,439,438,438,439,439,439,438,439,438,
-438,438,439,439,120,120,120,120,120,120,120,120,440,440,440,440,
+434,434,435,436,436,436,436,436,436,436,436,436,436,436,436,436,
+436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,
+436,435,434,434,434,434,435,435,434,434,435,434,434,434,436,436,
+437,437,437,437,437,437,437,437,437,437,436,436,436,436,436,436,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,439,440,439,439,440,440,440,439,440,439,
+439,439,440,440,120,120,120,120,120,120,120,120,441,441,441,441,
 
 /* block 54 */
-441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,
-441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,
-441,441,441,441,442,442,442,442,442,442,442,442,443,443,443,443,
-443,443,443,443,442,442,443,443,120,120,120,444,444,444,444,444,
-445,445,445,445,445,445,445,445,445,445,120,120,120,441,441,441,
-446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447,
-447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,
-447,447,447,447,447,447,447,447,448,448,448,448,448,448,449,449,
+442,442,442,442,442,442,442,442,442,442,442,442,442,442,442,442,
+442,442,442,442,442,442,442,442,442,442,442,442,442,442,442,442,
+442,442,442,442,443,443,443,443,443,443,443,443,444,444,444,444,
+444,444,444,444,443,443,444,444,120,120,120,445,445,445,445,445,
+446,446,446,446,446,446,446,446,446,446,120,120,120,442,442,442,
+447,447,447,447,447,447,447,447,447,447,448,448,448,448,448,448,
+448,448,448,448,448,448,448,448,448,448,448,448,448,448,448,448,
+448,448,448,448,448,448,448,448,449,449,449,449,449,449,450,450,
 
 /* block 55 */
-450,451,452,453,454,455,456,457,458,120,120,120,120,120,120,120,
-459,459,459,459,459,459,459,459,459,459,459,459,459,459,459,459,
-459,459,459,459,459,459,459,459,459,459,459,459,459,459,459,459,
-459,459,459,459,459,459,459,459,459,459,459,120,120,459,459,459,
-460,460,460,460,460,460,460,460,120,120,120,120,120,120,120,120,
-461,462,461,463,462,464,464,465,464,465,466,462,465,465,462,462,
-465,467,462,462,462,462,462,462,462,468,469,470,470,464,470,470,
-470,470,471,472,473,469,469,474,475,475,476,120,120,120,120,120,
+451,452,453,454,455,456,457,458,459,120,120,120,120,120,120,120,
+460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
+460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
+460,460,460,460,460,460,460,460,460,460,460,120,120,460,460,460,
+461,461,461,461,461,461,461,461,120,120,120,120,120,120,120,120,
+462,463,462,464,463,465,465,466,465,466,467,463,466,466,463,463,
+466,468,463,463,463,463,463,463,463,469,470,471,471,465,471,471,
+471,471,472,473,474,470,470,475,476,476,477,120,120,120,120,120,
 
 /* block 56 */
  35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
  35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35,128,128,128,128,128,477,110,110,110,110,
+ 35, 35, 35, 35, 35, 35,128,128,128,128,128,478,110,110,110,110,
 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
 110,110,110,110,110,110,110,110,110,110,110,110,110,121,121,121,
 121,121,110,110,110,110,121,121,121,121,121, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35,478,479, 35, 35, 35,480, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,479,480, 35, 35, 35,481, 35, 35,
 
 /* block 57 */
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,481, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,482, 35,
  35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,110,110,110,110,110,
 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,121,
 114,114,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
-113,113,113,113,113,113,113,113,482,113,120,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,120,113,113,113,113,113,
 
 /* block 58 */
  32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
@@ -2354,8 +2335,8 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
   6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
   6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-113,113,113,113,113,113,113,113,113,113,113,113,113,425,425,425,
-425,113,425,425,425,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,426,426,426,
+426,113,426,426,426,113,113,113,113,113,113,113,113,113,113,113,
 512,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 64 */
@@ -2530,7 +2511,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 
 /* block 81 */
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20,120, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20,120,120, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
@@ -2569,12 +2550,12 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 550,120,120,120,120,120,120,120,120,120,120,120,120,120,120,551,
 
 /* block 85 */
-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
-359,359,359,359,359,359,359,120,120,120,120,120,120,120,120,120,
-359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120,
-359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120,
-359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120,
-359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,120,120,120,120,120,120,120,120,120,
+360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120,
+360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120,
+360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120,
+360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120,
 552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
 552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
 
@@ -2584,7 +2565,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
  23, 27,  7,  8,  7,  8,  7,  8,  7,  8,  5,  5,  5,  5,  5,111,
   5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 10, 10,  5,  5,  5,  5,
  10,  5,  7,553,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
- 20, 20,  5,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
@@ -2652,7 +2633,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,120,
 572,572,582,582,582,582,572,572,572,572,572,572,572,572,572,572,
 580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,
-580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,
+580,580,580,580,580,580,580,580,580,580,580,120,120,120,120,120,
 572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
 572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
 572,572,572,572,120,120,120,120,120,120,120,120,120,120,120,120,
@@ -2712,7 +2693,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,120,120,120,120,120,120,120,120,120,120,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
@@ -2726,7 +2707,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
-586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 101 */
 587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
@@ -2776,11 +2757,11 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 192,193,192,193,192,193,192,193,192,193,597,598,192,193,192,193,
 192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
 192,193,192,193,192,193,192,193,192,193,192,193,192,193,599,198,
-200,200,200,600,552,552,552,552,552,552,552,552,552,552,600,478,
+200,200,200,600,552,552,552,552,552,552,552,552,552,552,600,479,
 
 /* block 106 */
 192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
-192,193,192,193,192,193,192,193,192,193,192,193,478,478,552,552,
+192,193,192,193,192,193,192,193,192,193,192,193,479,479,552,552,
 601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
 601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
 601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
@@ -2789,186 +2770,196 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 603,603,604,604,604,604,604,604,120,120,120,120,120,120,120,120,
 
 /* block 107 */
-605,605,605,605,605,605,605,605, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  15, 15, 15, 15, 15, 15, 15,111,111,111,111,111,111,111,111,111,
  15, 15, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
  35, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
  32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
  32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
  32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
-110, 35, 35, 35, 35, 35, 35, 35, 35, 32, 33, 32, 33,606, 32, 33,
+110, 35, 35, 35, 35, 35, 35, 35, 35, 32, 33, 32, 33,605, 32, 33,
 
 /* block 108 */
- 32, 33, 32, 33, 32, 33, 32, 33,111, 15, 15, 32, 33,607, 35, 22,
- 32, 33, 32, 33,608, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,609,610,611,612,609, 35,
-613,614,615,616, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
-120,120, 32, 33,617,618,619, 32, 33, 32, 33,120,120,120,120,120,
+ 32, 33, 32, 33, 32, 33, 32, 33,111, 15, 15, 32, 33,606, 35, 22,
+ 32, 33, 32, 33,607, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,608,609,610,611,608, 35,
+612,613,614,615, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
+120,120, 32, 33,616,617,618,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120, 32, 33, 22,110,110, 35, 22, 22, 22, 22, 22,
+120,120,120,120,120,120,120, 22,110,110, 35, 22, 22, 22, 22, 22,
 
 /* block 109 */
-620,620,621,620,620,620,621,620,620,620,620,621,620,620,620,620,
-620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,
-620,620,620,622,622,621,621,622,623,623,623,623,621,120,120,120,
-624,624,624,625,625,625,626,626,627,626,120,120,120,120,120,120,
-628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,
-628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,
-628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,
-628,628,628,628,629,629,629,629,120,120,120,120,120,120,120,120,
+619,619,620,619,619,619,620,619,619,619,619,620,619,619,619,619,
+619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,
+619,619,619,621,621,620,620,621,622,622,622,622,120,120,120,120,
+623,623,623,624,624,624,625,625,626,625,120,120,120,120,120,120,
+627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,
+627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,
+627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,
+627,627,627,627,628,628,628,628,120,120,120,120,120,120,120,120,
 
 /* block 110 */
-630,630,631,631,631,631,631,631,631,631,631,631,631,631,631,631,
-631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,
-631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,
-631,631,631,631,630,630,630,630,630,630,630,630,630,630,630,630,
-630,630,630,630,632,632,120,120,120,120,120,120,120,120,633,633,
-634,634,634,634,634,634,634,634,634,634,120,120,120,120,120,120,
-251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
-251,635,253,636,253,253,253,253,259,259,259,253,259,253,253,251,
+629,629,630,630,630,630,630,630,630,630,630,630,630,630,630,630,
+630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,
+630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,
+630,630,630,630,629,629,629,629,629,629,629,629,629,629,629,629,
+629,629,629,629,631,631,120,120,120,120,120,120,120,120,632,632,
+633,633,633,633,633,633,633,633,633,633,120,120,120,120,120,120,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,634,254,635,254,254,254,254,260,260,260,254,260,254,254,252,
 
 /* block 111 */
-637,637,637,637,637,637,637,637,637,637,638,638,638,638,638,638,
-638,638,638,638,638,638,638,638,638,638,638,638,638,638,638,638,
-638,638,638,638,638,638,639,639,639,639,639,639,639,639,640,641,
-642,642,642,642,642,642,642,642,642,642,642,642,642,642,642,642,
-642,642,642,642,642,642,642,643,643,643,643,643,643,643,643,643,
-643,643,644,644,120,120,120,120,120,120,120,120,120,120,120,645,
-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
-356,356,356,356,356,356,356,356,356,356,356,356,356,120,120,120,
+636,636,636,636,636,636,636,636,636,636,637,637,637,637,637,637,
+637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,
+637,637,637,637,637,637,638,638,638,638,638,638,638,638,639,640,
+641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,
+641,641,641,641,641,641,641,642,642,642,642,642,642,642,642,642,
+642,642,643,643,120,120,120,120,120,120,120,120,120,120,120,644,
+357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
+357,357,357,357,357,357,357,357,357,357,357,357,357,120,120,120,
 
 /* block 112 */
-646,646,646,647,648,648,648,648,648,648,648,648,648,648,648,648,
-648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,
-648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,
-648,648,648,646,647,647,646,646,646,646,647,647,646,646,647,647,
-647,649,649,649,649,649,649,649,649,649,649,649,649,649,120,650,
-651,651,651,651,651,651,651,651,651,651,120,120,120,120,649,649,
-344,344,344,344,344,346,652,344,344,344,344,344,344,344,344,344,
-350,350,350,350,350,350,350,350,350,350,344,344,344,344,344,120,
+645,645,645,646,647,647,647,647,647,647,647,647,647,647,647,647,
+647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,
+647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,
+647,647,647,645,646,646,645,645,645,645,646,646,645,645,646,646,
+646,648,648,648,648,648,648,648,648,648,648,648,648,648,120,649,
+650,650,650,650,650,650,650,650,650,650,120,120,120,120,648,648,
+345,345,345,345,345,347,651,345,345,345,345,345,345,345,345,345,
+351,351,351,351,351,351,351,351,351,351,345,345,345,345,345,120,
 
 /* block 113 */
-653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,
-653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,
-653,653,653,653,653,653,653,653,653,654,654,654,654,654,654,655,
-655,654,654,655,655,654,654,120,120,120,120,120,120,120,120,120,
-653,653,653,654,653,653,653,653,653,653,653,653,654,655,120,120,
-656,656,656,656,656,656,656,656,656,656,120,120,657,657,657,657,
-344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,
-652,344,344,344,344,344,344,351,351,351,344,345,346,345,344,344,
+652,652,652,652,652,652,652,652,652,652,652,652,652,652,652,652,
+652,652,652,652,652,652,652,652,652,652,652,652,652,652,652,652,
+652,652,652,652,652,652,652,652,652,653,653,653,653,653,653,654,
+654,653,653,654,654,653,653,120,120,120,120,120,120,120,120,120,
+652,652,652,653,652,652,652,652,652,652,652,652,653,654,120,120,
+655,655,655,655,655,655,655,655,655,655,120,120,656,656,656,656,
+345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,
+651,345,345,345,345,345,345,352,352,352,345,346,347,346,345,345,
 
 /* block 114 */
-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,
-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,
-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,
-659,658,659,659,659,658,658,659,659,658,658,658,658,658,659,659,
-658,659,658,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,658,658,660,661,661,
-662,662,662,662,662,662,662,662,662,662,662,663,664,664,663,663,
-665,665,662,666,666,663,664,120,120,120,120,120,120,120,120,120,
+657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
+657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
+657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
+658,657,658,658,658,657,657,658,658,657,657,657,657,657,658,658,
+657,658,657,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,657,657,659,660,660,
+661,661,661,661,661,661,661,661,661,661,661,662,663,663,662,662,
+664,664,661,665,665,662,663,120,120,120,120,120,120,120,120,120,
 
 /* block 115 */
-120,359,359,359,359,359,359,120,120,359,359,359,359,359,359,120,
-120,359,359,359,359,359,359,120,120,120,120,120,120,120,120,120,
-359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120,
+120,360,360,360,360,360,360,120,120,360,360,360,360,360,360,120,
+120,360,360,360,360,360,360,120,120,120,120,120,120,120,120,120,
+360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120,
  35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
  35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35,667, 35, 35, 35, 35, 35, 35, 35, 15,110,110,110,110,
- 35, 35, 35, 35, 35,128, 35, 35, 35,110, 15, 15,120,120,120,120,
-668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,
+ 35, 35, 35,666, 35, 35, 35, 35, 35, 35, 35, 15,110,110,110,110,
+ 35, 35, 35, 35, 35,128, 35, 35,120,120,120,120,120,120,120,120,
+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
 
 /* block 116 */
-668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,
-668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,
-668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,
-668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,
-662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,
-662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,
-662,662,662,663,663,664,663,663,664,663,663,665,663,664,120,120,
-669,669,669,669,669,669,669,669,669,669,120,120,120,120,120,120,
+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
+661,661,661,661,661,661,661,661,661,661,661,661,661,661,661,661,
+661,661,661,661,661,661,661,661,661,661,661,661,661,661,661,661,
+661,661,661,662,662,663,662,662,663,662,662,664,662,663,120,120,
+668,668,668,668,668,668,668,668,668,668,120,120,120,120,120,120,
 
 /* block 117 */
-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
 
 /* block 118 */
-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
 
 /* block 119 */
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
 
 /* block 120 */
-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
 
 /* block 121 */
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
 
 /* block 122 */
-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+
+/* block 123 */
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+
+/* block 124 */
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,120,120,120,120,120,120,120,120,120,120,120,120,
+358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
+358,358,358,358,358,358,358,120,120,120,120,359,359,359,359,359,
+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
+359,359,359,359,359,359,359,359,359,359,359,359,120,120,120,120,
+
+/* block 125 */
 671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,
 671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,
 671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,
-
-/* block 123 */
 671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,
 671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,
 671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,
 671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-
-/* block 124 */
-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,
 671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,120,120,120,120,120,120,120,120,120,120,120,120,
-357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
-357,357,357,357,357,357,357,120,120,120,120,358,358,358,358,358,
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,358,358,358,358,358,120,120,120,120,
 
-/* block 125 */
+/* block 126 */
 672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
 672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
 672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
@@ -2978,16 +2969,6 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
 672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
 
-/* block 126 */
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-
 /* block 127 */
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
@@ -3010,53 +2991,53 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 
 /* block 129 */
  35, 35, 35, 35, 35, 35, 35,120,120,120,120,120,120,120,120,120,
-120,120,120,206,206,206,206,206,120,120,120,120,120,214,211,214,
-214,214,214,214,214,214,214,214,214,674,214,214,214,214,214,214,
-214,214,214,214,214,214,214,120,214,214,214,214,214,120,214,120,
-214,214,120,214,214,120,214,214,214,214,214,214,214,214,214,214,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+120,120,120,206,206,206,206,206,120,120,120,120,120,215,212,215,
+215,215,215,215,215,215,215,215,215,673,215,215,215,215,215,215,
+215,215,215,215,215,215,215,120,215,215,215,215,215,120,215,120,
+215,215,120,215,215,120,215,215,215,215,215,215,215,215,215,215,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
 
 /* block 130 */
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,675,675,675,675,675,675,675,675,675,675,675,675,675,675,
-675,675,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,674,674,674,674,674,674,674,674,674,674,674,674,674,674,
+674,674,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
 
 /* block 131 */
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
 
 /* block 132 */
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,  8,  7,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,  8,  7,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
 
 /* block 133 */
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-120,120,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,120,120,120,120,120,120,120,120,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+120,120,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-224,224,676,224,224,224,224,224,224,224,224,224,219,677,120,120,
+225,225,675,225,225,225,225,225,225,225,225,225,220,676,120,120,
 
 /* block 134 */
 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
@@ -3066,17 +3047,17 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
   8,  7,  8,  7,  8,556,556,  7,  8,  5,  5,  5,  5, 16, 16, 16,
   5,  5,  5,120,  5,  5,  5,  5, 10,  7,  8,  7,  8,  7,  8,  5,
   5,  5,  9, 10,  9,  9,  9,120,  5,  6,  5,  5,120,120,120,120,
-224,224,224,224,224,120,224,224,224,224,224,224,224,224,224,224,
+225,225,225,225,225,120,225,225,225,225,225,225,225,225,225,225,
 
 /* block 135 */
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,120,120, 24,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,120,120, 24,
 
 /* block 136 */
 120,  5,  5,  5,  6,  5,  5,  5,  7,  8,  5,  9,  5, 10,  5,  5,
@@ -3090,7 +3071,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 
 /* block 137 */
 578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,678,678,
+578,578,578,578,578,578,578,578,578,578,578,578,578,578,677,677,
 581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
 581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,120,
 120,120,581,581,581,581,581,581,120,120,581,581,581,581,581,581,
@@ -3099,39 +3080,39 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 511,511,511,511,511,511,511,511,511, 24, 24, 24, 20, 20,120,120,
 
 /* block 138 */
-679,679,679,679,679,679,679,679,679,679,679,679,120,679,679,679,
-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,
-679,679,679,679,679,679,679,120,679,679,679,679,679,679,679,679,
-679,679,679,679,679,679,679,679,679,679,679,120,679,679,120,679,
-679,679,679,679,679,679,679,679,679,679,679,679,679,679,120,120,
-679,679,679,679,679,679,679,679,679,679,679,679,679,679,120,120,
+678,678,678,678,678,678,678,678,678,678,678,678,120,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,120,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,120,678,678,120,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,120,120,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 139 */
-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,
-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,
-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,
-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,
-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,
-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,
-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,
-679,679,679,679,679,679,679,679,679,679,679,120,120,120,120,120,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,120,120,120,120,120,
 
 /* block 140 */
-680,680,680,120,120,120,120,681,681,681,681,681,681,681,681,681,
-681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,
-681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,
-681,681,681,681,120,120,120,682,682,682,682,682,682,682,682,682,
-683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,
-683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,
-683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,
-683,683,683,683,683,684,684,684,684,685,685,685,685,685,685,685,
+679,679,679,120,120,120,120,680,680,680,680,680,680,680,680,680,
+680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,
+680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,
+680,680,680,680,120,120,120,681,681,681,681,681,681,681,681,681,
+682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,
+682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,
+682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,
+682,682,682,682,682,683,683,683,683,684,684,684,684,684,684,684,
 
 /* block 141 */
-685,685,685,685,685,685,685,685,685,685,684,684,685,685,685,120,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,
-685,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+684,684,684,684,684,684,684,684,684,684,683,683,684,684,684,120,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,
+684,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
@@ -3149,159 +3130,159 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 143 */
+685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,
+685,685,685,685,685,685,685,685,685,685,685,685,685,120,120,120,
+686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,
 686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,
-686,686,686,686,686,686,686,686,686,686,686,686,686,120,120,120,
-687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,
-687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,
-687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,
-687,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-688,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
-689,689,689,689,689,689,689,689,689,689,689,689,120,120,120,120,
+686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,
+686,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+687,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,
+688,688,688,688,688,688,688,688,688,688,688,688,120,120,120,120,
 
 /* block 144 */
-690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,
-690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,
-691,691,691,691,120,120,120,120,120,120,120,120,120,690,690,690,
-692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,
-692,693,692,692,692,692,692,692,692,692,693,120,120,120,120,120,
-694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,
-694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,
-694,694,694,694,694,694,695,695,695,695,695,120,120,120,120,120,
+689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
+689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
+690,690,690,690,120,120,120,120,120,120,120,120,120,689,689,689,
+691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
+691,692,691,691,691,691,691,691,691,691,692,120,120,120,120,120,
+693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,
+693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,
+693,693,693,693,693,693,694,694,694,694,694,120,120,120,120,120,
 
 /* block 145 */
-696,696,696,696,696,696,696,696,696,696,696,696,696,696,696,696,
-696,696,696,696,696,696,696,696,696,696,696,696,696,696,120,697,
-698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,
-698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,
-698,698,698,698,120,120,120,120,698,698,698,698,698,698,698,698,
-699,700,700,700,700,700,120,120,120,120,120,120,120,120,120,120,
+695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,
+695,695,695,695,695,695,695,695,695,695,695,695,695,695,120,696,
+697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
+697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
+697,697,697,697,120,120,120,120,697,697,697,697,697,697,697,697,
+698,699,699,699,699,699,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 146 */
+700,700,700,700,700,700,700,700,700,700,700,700,700,700,700,700,
+700,700,700,700,700,700,700,700,700,700,700,700,700,700,700,700,
+700,700,700,700,700,700,700,700,701,701,701,701,701,701,701,701,
 701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,
 701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,
-701,701,701,701,701,701,701,701,702,702,702,702,702,702,702,702,
 702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,
 702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,
-703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,
-703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,
-703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,
+702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,
 
 /* block 147 */
-704,704,704,704,704,704,704,704,704,704,704,704,704,704,704,704,
-704,704,704,704,704,704,704,704,704,704,704,704,704,704,120,120,
-705,705,705,705,705,705,705,705,705,705,120,120,120,120,120,120,
-706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,
+703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,
+703,703,703,703,703,703,703,703,703,703,703,703,703,703,120,120,
+704,704,704,704,704,704,704,704,704,704,120,120,120,120,120,120,
+705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,
+705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,
+705,705,705,705,120,120,120,120,706,706,706,706,706,706,706,706,
 706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,
-706,706,706,706,120,120,120,120,707,707,707,707,707,707,707,707,
-707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
-707,707,707,707,707,707,707,707,707,707,707,707,120,120,120,120,
+706,706,706,706,706,706,706,706,706,706,706,706,120,120,120,120,
 
 /* block 148 */
+707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
+707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
+707,707,707,707,707,707,707,707,120,120,120,120,120,120,120,120,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
 708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
 708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
-708,708,708,708,708,708,708,708,120,120,120,120,120,120,120,120,
-709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
-709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
-709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
-709,709,709,709,120,120,120,120,120,120,120,120,120,120,120,710,
+708,708,708,708,120,120,120,120,120,120,120,120,120,120,120,709,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 149 */
-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
 
 /* block 150 */
-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
-711,711,711,711,711,711,711,120,120,120,120,120,120,120,120,120,
-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
-711,711,711,711,711,711,120,120,120,120,120,120,120,120,120,120,
-711,711,711,711,711,711,711,711,120,120,120,120,120,120,120,120,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,120,120,120,120,120,120,120,120,120,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,120,120,120,120,120,120,120,120,120,120,
+710,710,710,710,710,710,710,710,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 151 */
-712,712,712,712,712,712,120,120,712,120,712,712,712,712,712,712,
-712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+711,711,711,711,711,711,120,120,711,120,711,711,711,711,711,711,
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+711,711,711,711,711,711,120,711,711,120,120,120,711,120,120,711,
 712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
-712,712,712,712,712,712,120,712,712,120,120,120,712,120,120,712,
-713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,
-713,713,713,713,713,713,120,714,715,715,715,715,715,715,715,715,
-716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,
-716,716,716,716,716,716,716,717,717,718,718,718,718,718,718,718,
+712,712,712,712,712,712,120,713,714,714,714,714,714,714,714,714,
+715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
+715,715,715,715,715,715,715,716,716,717,717,717,717,717,717,717,
 
 /* block 152 */
-719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,
-719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,120,
-120,120,120,120,120,120,120,720,720,720,720,720,720,720,720,720,
+718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,
+718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,120,
+120,120,120,120,120,120,120,719,719,719,719,719,719,719,719,719,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,
-721,721,721,120,721,721,120,120,120,120,120,722,722,722,722,722,
+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,
+720,720,720,120,720,720,120,120,120,120,120,721,721,721,721,721,
 
 /* block 153 */
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,724,724,724,724,724,724,120,120,120,725,
-726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,
-726,726,726,726,726,726,726,726,726,726,120,120,120,120,120,727,
+722,722,722,722,722,722,722,722,722,722,722,722,722,722,722,722,
+722,722,722,722,722,722,723,723,723,723,723,723,120,120,120,724,
+725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
+725,725,725,725,725,725,725,725,725,725,120,120,120,120,120,726,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 154 */
+727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,
+727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,
 728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,
-728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,
+728,728,728,728,728,728,728,728,120,120,120,120,729,729,728,728,
+729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,
+120,120,729,729,729,729,729,729,729,729,729,729,729,729,729,729,
+729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,
 729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,
-729,729,729,729,729,729,729,729,120,120,120,120,730,730,729,729,
-730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,
-120,120,730,730,730,730,730,730,730,730,730,730,730,730,730,730,
-730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,
-730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,
 
 /* block 155 */
-731,732,732,732,120,732,732,120,120,120,120,120,732,732,732,732,
-731,731,731,731,120,731,731,731,120,731,731,731,731,731,731,731,
-731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,
-731,731,731,731,731,731,120,120,732,732,732,120,120,120,120,732,
+730,731,731,731,120,731,731,120,120,120,120,120,731,731,731,731,
+730,730,730,730,120,730,730,730,120,730,730,730,730,730,730,730,
+730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,
+730,730,730,730,730,730,120,120,731,731,731,120,120,120,120,731,
+732,732,732,732,732,732,732,732,732,120,120,120,120,120,120,120,
 733,733,733,733,733,733,733,733,733,120,120,120,120,120,120,120,
-734,734,734,734,734,734,734,734,734,120,120,120,120,120,120,120,
-735,735,735,735,735,735,735,735,735,735,735,735,735,735,735,735,
-735,735,735,735,735,735,735,735,735,735,735,735,735,736,736,737,
+734,734,734,734,734,734,734,734,734,734,734,734,734,734,734,734,
+734,734,734,734,734,734,734,734,734,734,734,734,734,735,735,736,
 
 /* block 156 */
-738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,
-738,738,738,738,738,738,738,738,738,738,738,738,738,739,739,739,
+737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,
+737,737,737,737,737,737,737,737,737,737,737,737,737,738,738,738,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-740,740,740,740,740,740,740,740,741,740,740,740,740,740,740,740,
-740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,
-740,740,740,740,740,742,742,120,120,120,120,743,743,743,743,743,
-744,744,744,744,744,744,744,120,120,120,120,120,120,120,120,120,
+739,739,739,739,739,739,739,739,740,739,739,739,739,739,739,739,
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+739,739,739,739,739,741,741,120,120,120,120,742,742,742,742,742,
+743,743,743,743,743,743,743,120,120,120,120,120,120,120,120,120,
 
 /* block 157 */
-745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,
-745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,
-745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,
-745,745,745,745,745,745,120,120,120,746,746,746,746,746,746,746,
-747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,
-747,747,747,747,747,747,120,120,748,748,748,748,748,748,748,748,
-749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,
-749,749,749,120,120,120,120,120,750,750,750,750,750,750,750,750,
+744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,
+744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,
+744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,
+744,744,744,744,744,744,120,120,120,745,745,745,745,745,745,745,
+746,746,746,746,746,746,746,746,746,746,746,746,746,746,746,746,
+746,746,746,746,746,746,120,120,747,747,747,747,747,747,747,747,
+748,748,748,748,748,748,748,748,748,748,748,748,748,748,748,748,
+748,748,748,120,120,120,120,120,749,749,749,749,749,749,749,749,
 
 /* block 158 */
-751,751,751,751,751,751,751,751,751,751,751,751,751,751,751,751,
-751,751,120,120,120,120,120,120,120,752,752,752,752,120,120,120,
-120,120,120,120,120,120,120,120,120,753,753,753,753,753,753,753,
+750,750,750,750,750,750,750,750,750,750,750,750,750,750,750,750,
+750,750,120,120,120,120,120,120,120,751,751,751,751,120,120,120,
+120,120,120,120,120,120,120,120,120,752,752,752,752,752,752,752,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
@@ -3309,30 +3290,30 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 159 */
-754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
-754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
-754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
-754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
-754,754,754,754,754,754,754,754,754,120,120,120,120,120,120,120,
+753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,
+753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,
+753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,
+753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,
+753,753,753,753,753,753,753,753,753,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 160 */
+754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
+754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
+754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
+754,754,754,120,120,120,120,120,120,120,120,120,120,120,120,120,
 755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,
 755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,
 755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,
-755,755,755,120,120,120,120,120,120,120,120,120,120,120,120,120,
-756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,
-756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,
-756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,
-756,756,756,120,120,120,120,120,120,120,757,757,757,757,757,757,
+755,755,755,120,120,120,120,120,120,120,756,756,756,756,756,756,
 
 /* block 161 */
-758,758,758,758,758,758,758,758,758,758,758,758,758,758,758,758,
-758,758,758,758,758,758,758,758,758,758,758,758,758,758,758,758,
-758,758,758,758,759,759,759,759,120,120,120,120,120,120,120,120,
-760,760,760,760,760,760,760,760,760,760,120,120,120,120,120,120,
+757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,
+757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,
+757,757,757,757,758,758,758,758,120,120,120,120,120,120,120,120,
+759,759,759,759,759,759,759,759,759,759,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
@@ -3345,370 +3326,350 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,
-761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,120,
+760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,
+760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,120,
 
 /* block 163 */
-762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,
-762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,
-762,762,762,762,762,762,762,762,762,762,120,763,763,764,120,120,
-762,762,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,
+761,761,761,761,761,761,761,761,761,761,761,761,761,762,762,762,
+762,762,762,762,762,762,762,761,120,120,120,120,120,120,120,120,
+763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,
+763,763,763,763,763,763,764,764,764,764,764,764,764,764,764,764,
+764,765,765,765,765,766,766,766,766,766,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 164 */
-765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,
-765,765,765,765,765,765,765,765,765,765,765,765,765,766,766,766,
-766,766,766,766,766,766,766,765,120,120,120,120,120,120,120,120,
-767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,
-767,767,767,767,767,767,768,768,768,768,768,768,768,768,768,768,
-768,769,769,769,769,770,770,770,770,770,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-
-/* block 165 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,
-771,771,771,771,771,772,772,772,772,772,772,772,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-773,773,773,773,773,773,773,773,773,773,773,773,773,773,773,773,
-773,773,773,773,773,773,773,120,120,120,120,120,120,120,120,120,
+767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,
+767,767,767,767,767,767,767,120,120,120,120,120,120,120,120,120,
+
+/* block 165 */
+768,769,768,770,770,770,770,770,770,770,770,770,770,770,770,770,
+770,770,770,770,770,770,770,770,770,770,770,770,770,770,770,770,
+770,770,770,770,770,770,770,770,770,770,770,770,770,770,770,770,
+770,770,770,770,770,770,770,770,769,769,769,769,769,769,769,769,
+769,769,769,769,769,769,769,771,771,771,771,771,771,771,120,120,
+120,120,772,772,772,772,772,772,772,772,772,772,772,772,772,772,
+772,772,772,772,772,772,773,773,773,773,773,773,773,773,773,773,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,769,
 
 /* block 166 */
-774,775,774,776,776,776,776,776,776,776,776,776,776,776,776,776,
+774,774,775,776,776,776,776,776,776,776,776,776,776,776,776,776,
 776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,
 776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,
-776,776,776,776,776,776,776,776,775,775,775,775,775,775,775,775,
-775,775,775,775,775,775,775,777,777,777,777,777,777,777,120,120,
-120,120,778,778,778,778,778,778,778,778,778,778,778,778,778,778,
-778,778,778,778,778,778,779,779,779,779,779,779,779,779,779,779,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,775,
+775,775,775,774,774,774,774,775,775,774,774,777,777,778,777,777,
+777,777,120,120,120,120,120,120,120,120,120,120,120,778,120,120,
+779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,
+779,779,779,779,779,779,779,779,779,120,120,120,120,120,120,120,
+780,780,780,780,780,780,780,780,780,780,120,120,120,120,120,120,
 
 /* block 167 */
-780,780,781,782,782,782,782,782,782,782,782,782,782,782,782,782,
+781,781,781,782,782,782,782,782,782,782,782,782,782,782,782,782,
 782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,
-782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,
-781,781,781,780,780,780,780,781,781,780,780,783,783,784,783,783,
-783,783,120,120,120,120,120,120,120,120,120,120,120,784,120,120,
-785,785,785,785,785,785,785,785,785,785,785,785,785,785,785,785,
-785,785,785,785,785,785,785,785,785,120,120,120,120,120,120,120,
-786,786,786,786,786,786,786,786,786,786,120,120,120,120,120,120,
+782,782,782,782,782,782,782,781,781,781,781,781,783,781,781,781,
+781,781,781,781,781,120,784,784,784,784,784,784,784,784,784,784,
+785,785,785,785,782,783,783,120,120,120,120,120,120,120,120,120,
+786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,
+786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,
+786,786,786,787,788,788,786,120,120,120,120,120,120,120,120,120,
 
 /* block 168 */
-787,787,787,788,788,788,788,788,788,788,788,788,788,788,788,788,
-788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,
-788,788,788,788,788,788,788,787,787,787,787,787,789,787,787,787,
-787,787,787,787,787,120,790,790,790,790,790,790,790,790,790,790,
-791,791,791,791,788,789,789,788,120,120,120,120,120,120,120,120,
-792,792,792,792,792,792,792,792,792,792,792,792,792,792,792,792,
-792,792,792,792,792,792,792,792,792,792,792,792,792,792,792,792,
-792,792,792,793,794,794,792,120,120,120,120,120,120,120,120,120,
+789,789,790,791,791,791,791,791,791,791,791,791,791,791,791,791,
+791,791,791,791,791,791,791,791,791,791,791,791,791,791,791,791,
+791,791,791,791,791,791,791,791,791,791,791,791,791,791,791,791,
+791,791,791,790,790,790,789,789,789,789,789,789,789,789,789,790,
+790,791,792,792,791,793,793,793,793,789,789,789,789,793,120,120,
+794,794,794,794,794,794,794,794,794,794,791,793,791,793,793,793,
+120,795,795,795,795,795,795,795,795,795,795,795,795,795,795,795,
+795,795,795,795,795,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 169 */
-795,795,796,797,797,797,797,797,797,797,797,797,797,797,797,797,
-797,797,797,797,797,797,797,797,797,797,797,797,797,797,797,797,
-797,797,797,797,797,797,797,797,797,797,797,797,797,797,797,797,
-797,797,797,796,796,796,795,795,795,795,795,795,795,795,795,796,
-796,797,798,798,797,799,799,799,799,795,795,795,795,799,796,795,
-800,800,800,800,800,800,800,800,800,800,797,799,797,799,799,799,
-120,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,
-801,801,801,801,801,120,120,120,120,120,120,120,120,120,120,120,
-
-/* block 170 */
-802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,
-802,802,120,802,802,802,802,802,802,802,802,802,802,802,802,802,
-802,802,802,802,802,802,802,802,802,802,802,802,803,803,803,804,
-804,804,803,803,804,803,804,804,805,805,805,805,805,805,804,120,
+796,796,796,796,796,796,796,796,796,796,796,796,796,796,796,796,
+796,796,120,796,796,796,796,796,796,796,796,796,796,796,796,796,
+796,796,796,796,796,796,796,796,796,796,796,796,797,797,797,798,
+798,798,797,797,798,797,798,798,799,799,799,799,799,799,798,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
+/* block 170 */
+800,800,800,800,800,800,800,120,800,120,800,800,800,800,120,800,
+800,800,800,800,800,800,800,800,800,800,800,800,800,800,120,800,
+800,800,800,800,800,800,800,800,800,801,120,120,120,120,120,120,
+802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,
+802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,
+802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,803,
+804,804,804,803,803,803,803,803,803,803,803,120,120,120,120,120,
+805,805,805,805,805,805,805,805,805,805,120,120,120,120,120,120,
+
 /* block 171 */
-806,806,806,806,806,806,806,120,806,120,806,806,806,806,120,806,
-806,806,806,806,806,806,806,806,806,806,806,806,806,806,120,806,
-806,806,806,806,806,806,806,806,806,807,120,120,120,120,120,120,
-808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,
-808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,
-808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,809,
-810,810,810,809,809,809,809,809,809,809,809,120,120,120,120,120,
-811,811,811,811,811,811,811,811,811,811,120,120,120,120,120,120,
+806,807,808,809,120,810,810,810,810,810,810,810,810,120,120,810,
+810,120,120,810,810,810,810,810,810,810,810,810,810,810,810,810,
+810,810,810,810,810,810,810,810,810,120,810,810,810,810,810,810,
+810,120,810,810,120,810,810,810,810,810,120,811,807,810,812,808,
+806,808,808,808,808,120,120,808,808,120,120,808,808,808,120,120,
+810,120,120,120,120,120,120,812,120,120,120,120,120,810,810,810,
+810,810,808,808,120,120,806,806,806,806,806,806,806,120,120,120,
+806,806,806,806,806,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 172 */
-812,813,814,815,120,816,816,816,816,816,816,816,816,120,120,816,
-816,120,120,816,816,816,816,816,816,816,816,816,816,816,816,816,
-816,816,816,816,816,816,816,816,816,120,816,816,816,816,816,816,
-816,120,816,816,120,816,816,816,816,816,120,817,813,816,818,814,
-812,814,814,814,814,120,120,814,814,120,120,814,814,814,120,120,
-816,120,120,120,120,120,120,818,120,120,120,120,120,816,816,816,
-816,816,814,814,120,120,812,812,812,812,812,812,812,120,120,120,
-812,812,812,812,812,120,120,120,120,120,120,120,120,120,120,120,
+813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,
+813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,
+813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,
+813,813,813,813,813,814,814,814,815,815,815,815,815,815,815,815,
+814,814,815,815,815,814,815,813,813,813,813,816,816,816,816,816,
+817,817,817,817,817,817,817,817,817,817,120,816,120,816,815,813,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 173 */
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,820,820,820,821,821,821,821,821,821,821,821,
-820,820,821,821,821,820,821,819,819,819,819,822,822,822,822,822,
-823,823,823,823,823,823,823,823,823,823,822,822,120,822,821,819,
-819,819,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,
+818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,
+818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,
+819,820,820,821,821,821,821,821,821,820,821,820,820,819,820,821,
+821,820,821,821,818,818,822,818,120,120,120,120,120,120,120,120,
+823,823,823,823,823,823,823,823,823,823,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 174 */
 824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
 824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
-824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
-825,826,826,827,827,827,827,827,827,826,827,826,826,825,826,827,
-827,826,827,827,824,824,828,824,120,120,120,120,120,120,120,120,
-829,829,829,829,829,829,829,829,829,829,120,120,120,120,120,120,
+824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,825,
+826,826,827,827,827,827,120,120,826,826,826,826,827,827,826,827,
+827,828,828,828,828,828,828,828,828,828,828,828,828,828,828,828,
+828,828,828,828,828,828,828,828,824,824,824,824,827,827,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 175 */
-830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,
-830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,
-830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,831,
-832,832,833,833,833,833,120,120,832,832,832,832,833,833,832,833,
-833,834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,
-834,834,834,834,834,834,834,834,830,830,830,830,833,833,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,
+829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,
+829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,
+830,830,830,831,831,831,831,831,831,831,831,830,830,831,830,831,
+831,832,832,832,829,120,120,120,120,120,120,120,120,120,120,120,
+833,833,833,833,833,833,833,833,833,833,120,120,120,120,120,120,
+395,395,395,395,395,395,395,395,395,395,395,395,395,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 176 */
-835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,
-835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,
-835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,
-836,836,836,837,837,837,837,837,837,837,837,836,836,837,836,837,
-837,838,838,838,835,120,120,120,120,120,120,120,120,120,120,120,
-839,839,839,839,839,839,839,839,839,839,120,120,120,120,120,120,
-394,394,394,394,394,394,394,394,394,394,394,394,394,120,120,120,
+834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,
+834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,
+834,834,834,834,834,834,834,834,834,834,834,835,836,835,836,836,
+835,835,835,835,835,835,836,835,834,120,120,120,120,120,120,120,
+837,837,837,837,837,837,837,837,837,837,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 177 */
-840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
-840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
-840,840,840,840,840,840,840,840,840,840,840,841,842,841,842,842,
-841,841,841,841,841,841,842,841,840,120,120,120,120,120,120,120,
-843,843,843,843,843,843,843,843,843,843,120,120,120,120,120,120,
+838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
+838,838,838,838,838,838,838,838,838,838,838,120,120,839,839,839,
+840,840,839,839,839,839,840,839,839,839,839,839,120,120,120,120,
+841,841,841,841,841,841,841,841,841,841,842,842,843,843,843,844,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 178 */
-844,844,844,844,844,844,844,844,844,844,844,844,844,844,844,844,
-844,844,844,844,844,844,844,844,844,844,844,120,120,845,845,845,
-846,846,845,845,845,845,846,845,845,845,845,845,120,120,120,120,
-847,847,847,847,847,847,847,847,847,847,848,848,849,849,849,850,
+845,845,845,845,845,845,845,845,845,845,845,845,845,845,845,845,
+845,845,845,845,845,845,845,845,845,845,845,845,845,845,845,845,
+845,845,845,845,845,845,845,845,845,845,845,845,846,846,846,847,
+847,847,847,847,847,847,847,847,846,847,847,848,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 179 */
-851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,
-851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,
-851,851,851,851,851,851,851,851,851,851,851,851,852,852,852,853,
-853,853,853,853,853,853,853,853,852,853,853,854,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,
+849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,
+850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,
+850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,
+851,851,851,851,851,851,851,851,851,851,852,852,852,852,852,852,
+852,852,852,120,120,120,120,120,120,120,120,120,120,120,120,853,
 
 /* block 180 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-855,855,855,855,855,855,855,855,855,855,855,855,855,855,855,855,
-855,855,855,855,855,855,855,855,855,855,855,855,855,855,855,855,
-856,856,856,856,856,856,856,856,856,856,856,856,856,856,856,856,
-856,856,856,856,856,856,856,856,856,856,856,856,856,856,856,856,
-857,857,857,857,857,857,857,857,857,857,858,858,858,858,858,858,
-858,858,858,120,120,120,120,120,120,120,120,120,120,120,120,859,
+854,854,854,854,854,854,854,854,120,120,854,854,854,854,854,854,
+854,854,854,854,854,854,854,854,854,854,854,854,854,854,854,854,
+854,854,854,854,854,854,854,854,854,854,854,854,854,854,854,854,
+854,855,855,855,856,856,856,856,120,120,856,856,855,855,855,855,
+856,854,857,854,855,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 181 */
-860,860,860,860,860,860,860,120,120,860,120,120,860,860,860,860,
-860,860,860,860,120,860,860,120,860,860,860,860,860,860,860,860,
-860,860,860,860,860,860,860,860,860,860,860,860,860,860,860,860,
-861,862,862,862,862,862,120,862,862,120,120,863,863,862,863,864,
-862,864,862,863,865,865,865,120,120,120,120,120,120,120,120,120,
-866,866,866,866,866,866,866,866,866,866,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+858,859,859,859,859,859,859,859,859,859,859,858,858,858,858,858,
+858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
+858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
+858,858,858,859,859,859,859,859,859,860,861,859,859,859,859,862,
+862,862,862,862,862,862,862,859,120,120,120,120,120,120,120,120,
+863,864,864,864,864,864,864,865,865,864,864,864,863,863,863,863,
+863,863,863,863,863,863,863,863,863,863,863,863,863,863,863,863,
+863,863,863,863,863,863,863,863,863,863,863,863,863,863,863,863,
 
 /* block 182 */
+863,863,863,863,866,866,866,866,866,866,864,864,864,864,864,864,
+864,864,864,864,864,864,864,865,864,864,867,867,867,863,867,867,
+867,867,867,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-867,867,867,867,867,867,867,867,120,120,867,867,867,867,867,867,
-867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,
-867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,
-867,868,868,868,869,869,869,869,120,120,869,869,868,868,868,868,
-869,867,870,867,868,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,
+868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,
+868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,
+868,868,868,868,868,868,868,868,868,120,120,120,120,120,120,120,
 
 /* block 183 */
-871,872,872,872,872,872,872,872,872,872,872,871,871,871,871,871,
-871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,
-871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,
-871,871,871,872,872,872,872,872,872,873,874,872,872,872,872,875,
-875,875,875,875,875,875,875,872,120,120,120,120,120,120,120,120,
-876,877,877,877,877,877,877,878,878,877,877,877,876,876,876,876,
-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
+869,869,869,869,869,869,869,869,869,120,869,869,869,869,869,869,
+869,869,869,869,869,869,869,869,869,869,869,869,869,869,869,869,
+869,869,869,869,869,869,869,869,869,869,869,869,869,869,869,870,
+871,871,871,871,871,871,871,120,871,871,871,871,871,871,870,871,
+869,872,872,872,872,872,120,120,120,120,120,120,120,120,120,120,
+873,873,873,873,873,873,873,873,873,873,874,874,874,874,874,874,
+874,874,874,874,874,874,874,874,874,874,874,874,874,120,120,120,
+875,875,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
 
 /* block 184 */
-876,876,876,876,879,879,879,879,879,879,877,877,877,877,877,877,
-877,877,877,877,877,877,877,878,877,877,880,880,880,876,880,880,
-880,880,880,120,120,120,120,120,120,120,120,120,120,120,120,120,
+876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
+120,120,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
+877,877,877,877,877,877,877,877,120,878,877,877,877,877,877,877,
+877,878,877,877,878,877,877,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,
-881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,
-881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,
-881,881,881,881,881,881,881,881,881,120,120,120,120,120,120,120,
 
 /* block 185 */
-882,882,882,882,882,882,882,882,882,120,882,882,882,882,882,882,
-882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,
-882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,883,
-884,884,884,884,884,884,884,120,884,884,884,884,884,884,883,884,
-882,885,885,885,885,885,120,120,120,120,120,120,120,120,120,120,
-886,886,886,886,886,886,886,886,886,886,887,887,887,887,887,887,
-887,887,887,887,887,887,887,887,887,887,887,887,887,120,120,120,
-888,888,889,889,889,889,889,889,889,889,889,889,889,889,889,889,
+879,879,879,879,879,879,879,120,879,879,120,879,879,879,879,879,
+879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,
+879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,
+879,880,880,880,880,880,880,120,120,120,880,120,880,880,120,880,
+880,880,880,880,880,880,881,880,120,120,120,120,120,120,120,120,
+882,882,882,882,882,882,882,882,882,882,120,120,120,120,120,120,
+883,883,883,883,883,883,120,883,883,120,883,883,883,883,883,883,
+883,883,883,883,883,883,883,883,883,883,883,883,883,883,883,883,
 
 /* block 186 */
-889,889,889,889,889,889,889,889,889,889,889,889,889,889,889,889,
-120,120,890,890,890,890,890,890,890,890,890,890,890,890,890,890,
-890,890,890,890,890,890,890,890,120,891,890,890,890,890,890,890,
-890,891,890,890,891,890,890,120,120,120,120,120,120,120,120,120,
+883,883,883,883,883,883,883,883,883,883,884,884,884,884,884,120,
+885,885,120,884,884,885,884,885,883,120,120,120,120,120,120,120,
+886,886,886,886,886,886,886,886,886,886,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 187 */
-892,892,892,892,892,892,892,120,892,892,120,892,892,892,892,892,
-892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,
-892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,
-892,893,893,893,893,893,893,120,120,120,893,120,893,893,120,893,
-893,893,893,893,893,893,894,893,120,120,120,120,120,120,120,120,
-895,895,895,895,895,895,895,895,895,895,120,120,120,120,120,120,
-896,896,896,896,896,896,120,896,896,120,896,896,896,896,896,896,
-896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
-
-/* block 188 */
-896,896,896,896,896,896,896,896,896,896,897,897,897,897,897,120,
-898,898,120,897,897,898,897,898,896,120,120,120,120,120,120,120,
-899,899,899,899,899,899,899,899,899,899,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-
-/* block 189 */
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+887,887,887,887,887,887,887,887,887,887,887,887,887,887,887,887,
+887,887,887,888,888,889,889,890,890,120,120,120,120,120,120,120,
+
+/* block 188 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-900,900,900,900,900,900,900,900,900,900,900,900,900,900,900,900,
-900,900,900,901,901,902,902,903,903,120,120,120,120,120,120,120,
+891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,
+294,294,891,294,891,296,296,296,296,296,296,296,296,297,297,297,
+297,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,
+296,296,120,120,120,120,120,120,120,120,120,120,120,120,120,892,
+
+/* block 189 */
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
 
 /* block 190 */
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-590,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-904,904,904,904,904,904,904,904,904,904,904,904,904,904,904,904,
-293,293,904,293,904,295,295,295,295,295,295,295,295,296,296,296,
-296,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,
-295,295,120,120,120,120,120,120,120,120,120,120,120,120,120,905,
 
 /* block 191 */
-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,
-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,
-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,
-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,
-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,
-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,
-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,
-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,120,
+895,895,895,895,895,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 192 */
-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,
-906,906,906,906,906,906,906,906,906,906,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 193 */
-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,
-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,
-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,
-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,
-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,
-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,
-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,120,
-908,908,908,908,908,120,120,120,120,120,120,120,120,120,120,120,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
 
 /* block 194 */
-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,
-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,
-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,
-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,
-906,906,906,906,120,120,120,120,120,120,120,120,120,120,120,120,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,120,
+897,897,897,897,897,897,897,897,897,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 195 */
-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,
-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,
-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,
-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,
-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,
-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,
-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,
-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
 
 /* block 196 */
-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,
-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,
-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,120,
-910,910,910,910,910,910,910,910,910,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
 /* block 197 */
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-
-/* block 198 */
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-
-/* block 199 */
 601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
 601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
 601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
@@ -3718,38 +3679,38 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
 601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
 
-/* block 200 */
+/* block 198 */
 601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
 601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
 601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
 601,601,601,601,601,601,601,601,601,120,120,120,120,120,120,120,
-912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,
-912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,120,
-913,913,913,913,913,913,913,913,913,913,120,120,120,120,914,914,
+899,899,899,899,899,899,899,899,899,899,899,899,899,899,899,899,
+899,899,899,899,899,899,899,899,899,899,899,899,899,899,899,120,
+900,900,900,900,900,900,900,900,900,900,120,120,120,120,901,901,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 201 */
+/* block 199 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,120,120,
-916,916,916,916,916,917,120,120,120,120,120,120,120,120,120,120,
+902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
+902,902,902,902,902,902,902,902,902,902,902,902,902,902,120,120,
+903,903,903,903,903,904,120,120,120,120,120,120,120,120,120,120,
 
-/* block 202 */
-918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,
-918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,
-918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,
-919,919,919,919,919,919,919,920,920,920,920,920,921,921,921,921,
-922,922,922,922,920,921,120,120,120,120,120,120,120,120,120,120,
-923,923,923,923,923,923,923,923,923,923,120,924,924,924,924,924,
-924,924,120,918,918,918,918,918,918,918,918,918,918,918,918,918,
-918,918,918,918,918,918,918,918,120,120,120,120,120,918,918,918,
+/* block 200 */
+905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,
+905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,
+905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,
+906,906,906,906,906,906,906,907,907,907,907,907,908,908,908,908,
+909,909,909,909,907,908,120,120,120,120,120,120,120,120,120,120,
+910,910,910,910,910,910,910,910,910,910,120,911,911,911,911,911,
+911,911,120,905,905,905,905,905,905,905,905,905,905,905,905,905,
+905,905,905,905,905,905,905,905,120,120,120,120,120,905,905,905,
 
-/* block 203 */
-918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,
+/* block 201 */
+905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
@@ -3758,19 +3719,19 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 204 */
+/* block 202 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,
-925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,
-926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,
-926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,
+912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,
+912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,
+913,913,913,913,913,913,913,913,913,913,913,913,913,913,913,913,
+913,913,913,913,913,913,913,913,913,913,913,913,913,913,913,913,
 
-/* block 205 */
-927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,
-927,927,927,927,927,927,927,928,928,928,928,120,120,120,120,120,
+/* block 203 */
+914,914,914,914,914,914,914,914,914,914,914,914,914,914,914,914,
+914,914,914,914,914,914,914,915,915,915,915,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
@@ -3778,77 +3739,57 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 206 */
-929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,
-929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,
-929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,
-929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,
-929,929,929,929,929,929,929,929,929,929,929,120,120,120,120,930,
-929,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,
-931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,
-931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,
+/* block 204 */
+916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,
+916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,
+916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,
+916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,
+916,916,916,916,916,916,916,916,916,916,916,120,120,120,120,917,
+916,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,
+918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,
+918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,
 
-/* block 207 */
-931,931,931,931,931,931,931,931,120,120,120,120,120,120,120,930,
-930,930,930,932,932,932,932,932,932,932,932,932,932,932,932,932,
+/* block 205 */
+918,918,918,918,918,918,918,918,120,120,120,120,120,120,120,917,
+917,917,917,919,919,919,919,919,919,919,919,919,919,919,919,919,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-933,934,  5,111,935,120,120,120,120,120,120,120,120,120,120,120,
-936,936,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-
-/* block 208 */
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-
-/* block 209 */
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,
-937,937,937,937,937,937,937,937,120,120,120,120,120,120,120,120,
+920,921,  5,111,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 210 */
-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
+/* block 206 */
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
 
-/* block 211 */
-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
-938,938,938,938,938,938,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+/* block 207 */
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,120,120,120,120,120,120,120,120,
 
-/* block 212 */
-937,937,937,937,937,937,937,937,937,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+/* block 208 */
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 213 */
+/* block 209 */
 578,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
 573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
 573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
@@ -3858,7 +3799,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
 573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
 
-/* block 214 */
+/* block 210 */
 573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
 573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
 573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
@@ -3868,7 +3809,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
 573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
 
-/* block 215 */
+/* block 211 */
 573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
 573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
@@ -3876,49 +3817,49 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 573,573,573,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,578,578,578,578,120,120,120,120,120,120,120,120,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
 
-/* block 216 */
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
+/* block 212 */
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
 
-/* block 217 */
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,
-939,939,939,939,939,939,939,939,939,939,939,939,120,120,120,120,
+/* block 213 */
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,120,120,120,120,
 
-/* block 218 */
-940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,
-940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,
-940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,
-940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,
-940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,
-940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,
-940,940,940,940,940,940,940,940,940,940,940,120,120,120,120,120,
-940,940,940,940,940,940,940,940,940,940,940,940,940,120,120,120,
+/* block 214 */
+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
+924,924,924,924,924,924,924,924,924,924,924,120,120,120,120,120,
+924,924,924,924,924,924,924,924,924,924,924,924,924,120,120,120,
 
-/* block 219 */
-940,940,940,940,940,940,940,940,940,120,120,120,120,120,120,120,
-940,940,940,940,940,940,940,940,940,940,120,120,941,942,942,943,
-944,944,944,944,120,120,120,120,120,120,120,120,120,120,120,120,
+/* block 215 */
+924,924,924,924,924,924,924,924,924,120,120,120,120,120,120,120,
+924,924,924,924,924,924,924,924,924,924,120,120,925,926,926,927,
+928,928,928,928,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 220 */
+/* block 216 */
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
@@ -3928,17 +3869,17 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,120,
 
-/* block 221 */
+/* block 217 */
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20,120,120, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20,945,946,113,113,113, 20, 20, 20,946,945,945,
-945,945,945, 24, 24, 24, 24, 24, 24, 24, 24,113,113,113,113,113,
+ 20, 20, 20, 20, 20,929,930,113,113,113, 20, 20, 20,930,929,929,
+929,929,929, 24, 24, 24, 24, 24, 24, 24, 24,113,113,113,113,113,
 
-/* block 222 */
+/* block 218 */
 113,113,113, 20, 20,113,113,113,113,113,113,113, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20,113,113,113,113, 20, 20,
@@ -3948,17 +3889,17 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
  20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 223 */
-685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,
-685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,
-685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,
-685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,
-685,685,947,947,947,685,120,120,120,120,120,120,120,120,120,120,
+/* block 219 */
+684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,
+684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,
+684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,
+684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,
+684,684,931,931,931,684,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 224 */
+/* block 220 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
@@ -3968,7 +3909,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
  25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
  25, 25, 25, 25,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 225 */
+/* block 221 */
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
@@ -3978,7 +3919,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,
 582,582, 25, 25, 25, 25, 25, 25, 25,120,120,120,120,120,120,120,
 
-/* block 226 */
+/* block 222 */
 513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
 513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514,
 514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
@@ -3988,7 +3929,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 514,514,514,514,514,514,514,514,513,513,513,513,513,513,513,513,
 513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
 
-/* block 227 */
+/* block 223 */
 513,513,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
 514,514,514,514,514,514,514,514,514,514,514,514,513,120,513,513,
 120,120,513,120,120,513,513,120,120,513,513,513,513,120,513,513,
@@ -3998,7 +3939,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514,
 514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
 
-/* block 228 */
+/* block 224 */
 514,514,514,514,513,513,120,513,513,513,513,120,120,513,513,513,
 513,513,513,513,513,120,513,513,513,513,513,513,513,120,514,514,
 514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
@@ -4008,7 +3949,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 514,514,514,514,514,514,514,514,514,514,514,514,513,513,513,513,
 513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
 
-/* block 229 */
+/* block 225 */
 513,513,513,513,513,513,514,514,514,514,514,514,514,514,514,514,
 514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
 513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
@@ -4018,7 +3959,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 513,513,513,513,513,513,513,513,513,513,513,513,513,513,514,514,
 514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
 
-/* block 230 */
+/* block 226 */
 514,514,514,514,514,514,514,514,513,513,513,513,513,513,513,513,
 513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
 513,513,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
@@ -4028,7 +3969,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
 513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
 
-/* block 231 */
+/* block 227 */
 513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514,
 514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
 514,514,514,514,514,514,120,120,513,513,513,513,513,513,513,513,
@@ -4038,7 +3979,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 514,514,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
 513,513,513,513,513,513,513,513,513,513,513,  9,514,514,514,514,
 
-/* block 232 */
+/* block 228 */
 514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
 514,514,514,514,514,  9,514,514,514,514,514,514,513,513,513,513,
 513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
@@ -4048,7 +3989,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,  9,
 514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
 
-/* block 233 */
+/* block 229 */
 514,514,514,514,514,514,514,514,514,  9,514,514,514,514,514,514,
 513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
 513,513,513,513,513,513,513,513,513,  9,514,514,514,514,514,514,
@@ -4058,97 +3999,97 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
 
-/* block 234 */
-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,
-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,
-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,
-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,
-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,
-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,
-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,
-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,
+/* block 230 */
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
 
-/* block 235 */
-949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
-949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
-949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
-949,949,949,949,949,949,949,948,948,948,948,949,949,949,949,949,
-949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
-949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
-949,949,949,949,949,949,949,949,949,949,949,949,949,948,948,948,
-948,948,948,948,948,949,948,948,948,948,948,948,948,948,948,948,
+/* block 231 */
+933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,
+933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,
+933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,
+933,933,933,933,933,933,933,932,932,932,932,933,933,933,933,933,
+933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,
+933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,
+933,933,933,933,933,933,933,933,933,933,933,933,933,932,932,932,
+932,932,932,932,932,933,932,932,932,932,932,932,932,932,932,932,
 
-/* block 236 */
-948,948,948,948,949,948,948,950,950,950,950,950,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,949,949,949,949,949,
-120,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+/* block 232 */
+932,932,932,932,933,932,932,934,934,934,934,934,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,933,933,933,933,933,
+120,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 237 */
-951,951,951,951,951,951,951,120,951,951,951,951,951,951,951,951,
-951,951,951,951,951,951,951,951,951,120,120,951,951,951,951,951,
-951,951,120,951,951,120,951,951,951,951,951,120,120,120,120,120,
+/* block 233 */
+935,935,935,935,935,935,935,120,935,935,935,935,935,935,935,935,
+935,935,935,935,935,935,935,935,935,120,120,935,935,935,935,935,
+935,935,120,935,935,120,935,935,935,935,935,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 238 */
-952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
-952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
-952,952,952,952,952,952,952,952,952,952,952,952,952,120,120,120,
-953,953,953,953,953,953,953,954,954,954,954,954,954,954,120,120,
-955,955,955,955,955,955,955,955,955,955,120,120,120,120,952,956,
+/* block 234 */
+936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,
+936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,
+936,936,936,936,936,936,936,936,936,936,936,936,936,120,120,120,
+937,937,937,937,937,937,937,938,938,938,938,938,938,938,120,120,
+939,939,939,939,939,939,939,939,939,939,120,120,120,120,936,940,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 239 */
+/* block 235 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,
-957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,
-957,957,957,957,957,957,957,957,957,957,957,957,958,958,958,958,
-959,959,959,959,959,959,959,959,959,959,120,120,120,120,120,960,
+941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,
+941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,
+941,941,941,941,941,941,941,941,941,941,941,941,942,942,942,942,
+943,943,943,943,943,943,943,943,943,943,120,120,120,120,120,944,
 
-/* block 240 */
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
+/* block 236 */
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
 
-/* block 241 */
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,120,120,962,962,962,962,962,962,962,962,962,
-963,963,963,963,963,963,963,120,120,120,120,120,120,120,120,120,
+/* block 237 */
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,120,120,946,946,946,946,946,946,946,946,946,
+947,947,947,947,947,947,947,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 242 */
-964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,
-964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,
-964,964,965,965,965,965,965,965,965,965,965,965,965,965,965,965,
-965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,
-965,965,965,965,966,966,966,966,966,966,966,967,120,120,120,120,
-968,968,968,968,968,968,968,968,968,968,120,120,120,120,969,969,
+/* block 238 */
+948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,
+948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,
+948,948,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,950,950,950,950,950,950,950,951,120,120,120,120,
+952,952,952,952,952,952,952,952,952,952,120,120,120,120,953,953,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 243 */
+/* block 239 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
@@ -4158,7 +4099,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
 
-/* block 244 */
+/* block 240 */
  25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
  25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
  25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25, 25, 25,
@@ -4168,7 +4109,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 245 */
+/* block 241 */
 120, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
  25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
  25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25,
@@ -4178,87 +4119,87 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 246 */
-224,224,224,224,120,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-120,224,224,120,224,120,120,224,120,224,224,224,224,224,224,224,
-224,224,224,120,224,224,224,224,120,224,120,224,120,120,120,120,
-120,120,224,120,120,120,120,224,120,224,120,224,120,224,224,224,
-120,224,224,120,224,120,120,224,120,224,120,224,120,224,120,224,
-120,224,224,120,224,120,120,224,224,224,224,120,224,224,224,224,
-224,224,224,120,224,224,224,224,120,224,224,224,224,120,224,120,
+/* block 242 */
+225,225,225,225,120,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+120,225,225,120,225,120,120,225,120,225,225,225,225,225,225,225,
+225,225,225,120,225,225,225,225,120,225,120,225,120,120,120,120,
+120,120,225,120,120,120,120,225,120,225,120,225,120,225,225,225,
+120,225,225,120,225,120,120,225,120,225,120,225,120,225,120,225,
+120,225,225,120,225,120,120,225,225,225,225,120,225,225,225,225,
+225,225,225,120,225,225,225,225,120,225,225,225,225,120,225,120,
 
-/* block 247 */
-224,224,224,224,224,224,224,224,224,224,120,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,120,120,120,120,
-120,224,224,224,120,224,224,224,224,224,120,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,120,120,120,120,
+/* block 243 */
+225,225,225,225,225,225,225,225,225,225,120,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,120,120,120,120,
+120,225,225,225,120,225,225,225,225,225,120,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-217,217,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+218,218,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 248 */
+/* block 244 */
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,954,954,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
 
-/* block 249 */
+/* block 245 */
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,
-970, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-970, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-970, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954,954,954,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,
+954, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+954, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+954, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970,
+ 21, 21, 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954,
 
-/* block 250 */
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 21, 21, 21,
+/* block 246 */
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,954,954,954,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,954,954,954,
  21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21,
 
-/* block 251 */
+/* block 247 */
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20,
  20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,971,971,971,971,971,971,971,971,971,971,
-971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,955,955,955,955,955,955,955,955,955,955,
+955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,
 
-/* block 252 */
-972, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,970,
+/* block 248 */
+956, 21, 21,954,954,954,954,954,954,954,954,954,954,954,954,954,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,
- 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20,970,970,970,970,
- 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,970,
-584,584,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
- 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
+ 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20,954,954,954,954,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954,954,954,954,
+584,584,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+ 21, 21, 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
 
-/* block 253 */
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
+/* block 249 */
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
 
-/* block 254 */
+/* block 250 */
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
@@ -4268,7 +4209,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
 
-/* block 255 */
+/* block 251 */
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
@@ -4276,9 +4217,9 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,973,973,973,973,973,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,957,957,957,957,957,
 
-/* block 256 */
+/* block 252 */
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
@@ -4288,7 +4229,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
 
-/* block 257 */
+/* block 253 */
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
@@ -4298,17 +4239,17 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
 
-/* block 258 */
+/* block 254 */
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,
+ 21, 21, 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,954,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,954,954,954,
 
-/* block 259 */
+/* block 255 */
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
@@ -4316,109 +4257,99 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20,970,970,970,970,970,970,970,970,970,970,970,970,
+ 20, 20, 20, 20,954,954,954,954,954,954,954,954,954,954,954,954,
 
-/* block 260 */
+/* block 256 */
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 21, 21, 21, 21,970,970,970,970,970,970,970,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
+ 20, 20, 20, 20, 20, 21, 21, 21, 21,954,954,954,954,954,954,954,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
 
-/* block 261 */
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,
+/* block 257 */
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,970,970,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,
+ 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954,954,954,954,954,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954,954,954,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
 
-/* block 262 */
- 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,970,970,
+/* block 258 */
+ 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954,954,954,954,954,
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,
- 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
 
-/* block 263 */
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21,
+/* block 259 */
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21,970, 21, 21, 21, 21, 21, 21,
+ 21, 21,954, 21, 21, 21, 21,954,954,954, 21, 21, 21, 21, 21, 21,
 
-/* block 264 */
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+/* block 260 */
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21,954,954, 21, 21, 21, 21, 21, 21,954,954,954, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
 
-/* block 265 */
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+/* block 261 */
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,
- 21, 21, 21, 21, 21,970,970,970, 21, 21, 21,970,970,970,970,970,
-
-/* block 266 */
- 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,
- 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,
- 21, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,970,
- 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
+ 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954,954,954,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,
+ 21, 21, 21, 21,954,954,954,954, 21, 21, 21,954,954,954,954,954,
 
-/* block 267 */
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,120,120,120,120,120,120,
+/* block 262 */
+ 21, 21, 21,954,954,954,954,954,954,954,954,954,954,954,954,954,
+ 21, 21, 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
 
-/* block 268 */
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,
-970,970,970,970,970,970,970,970,970,970,970,970,970,970,120,120,
+/* block 263 */
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,120,120,
 
-/* block 269 */
+/* block 264 */
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
-586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,
+586,586,586,586,586,586,586,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 270 */
+/* block 265 */
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
@@ -4428,7 +4359,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 
-/* block 271 */
+/* block 266 */
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
@@ -4438,7 +4369,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 
-/* block 272 */
+/* block 267 */
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
@@ -4448,7 +4379,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 
-/* block 273 */
+/* block 268 */
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
@@ -4458,7 +4389,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 586,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 274 */
+/* block 269 */
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
 586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
@@ -4468,27 +4399,17 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
 
-/* block 275 */
-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
-586,586,586,586,586,586,586,586,586,586,586,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-
-/* block 276 */
+/* block 270 */
 511, 24,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
 511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
-974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,
-974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,
-974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,
-974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,
-974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,
-974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,
-
-/* block 277 */
+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
+
+/* block 271 */
 511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
 511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
 511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
@@ -4498,7 +4419,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
 511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
 
-/* block 278 */
+/* block 272 */
 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
@@ -4508,7 +4429,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
 
-/* block 279 */
+/* block 273 */
 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
@@ -4518,15 +4439,15 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */
 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
 511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
 
-/* block 280 */
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,120,120,
+/* block 274 */
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,120,120,
 
 };
 
index 9538062c710c70b18917dd9331982d0d598d2676..84b22fb06494ca070a7e5774157160094f74a492 100644 (file)
@@ -286,12 +286,7 @@ enum {
   ucp_Elymaic,
   ucp_Nandinagari,
   ucp_Nyiakeng_Puachue_Hmong,
-  ucp_Wancho,
-  /* New for Unicode 13.0.0 */
-  ucp_Chorasmian,
-  ucp_Dives_Akuru,
-  ucp_Khitan_Small_Script,
-  ucp_Yezidi
+  ucp_Wancho
 };
 
 #endif  /* PCRE2_UCP_H_IDEMPOTENT_GUARD */
index e47ea78f161aa1b88eec9276644f31512d12f42e..96e8bff99307b983d8e434895c5850df95741a22 100644 (file)
@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2020 University of Cambridge
+          New API code Copyright (c) 2016-2017 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -347,7 +347,7 @@ for (p = string; length > 0; p++)
     length--;
     if ((*p & 0xfc00) != 0xdc00)
       {
-      *erroroffset = p - string - 1;
+      *erroroffset = p - string;
       return PCRE2_ERROR_UTF16_ERR2;
       }
     }
index 4560450c1c0dc8b4f317d6cc222025d77dbb137c..d54b5e6f5440e274e9bb8e5995e75b038a1afb42 100644 (file)
 #ifndef _SLJIT_CONFIG_H_
 #define _SLJIT_CONFIG_H_
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* --------------------------------------------------------------------- */
 /*  Custom defines                                                       */
 /* --------------------------------------------------------------------- */
@@ -69,19 +65,12 @@ extern "C" {
 #define SLJIT_UTIL_GLOBAL_LOCK 1
 #endif
 
-/* Implements a stack like data structure (by using mmap / VirtualAlloc  */
-/* or a custom allocator). */
+/* Implements a stack like data structure (by using mmap / VirtualAlloc). */
 #ifndef SLJIT_UTIL_STACK
 /* Enabled by default */
 #define SLJIT_UTIL_STACK 1
 #endif
 
-/* Uses user provided allocator to allocate the stack (see SLJIT_UTIL_STACK) */
-#ifndef SLJIT_UTIL_SIMPLE_STACK_ALLOCATION
-/* Disabled by default */
-#define SLJIT_UTIL_SIMPLE_STACK_ALLOCATION 0
-#endif
-
 /* Single threaded application. Does not require any locks. */
 #ifndef SLJIT_SINGLE_THREADED
 /* Disabled by default. */
@@ -155,8 +144,4 @@ extern "C" {
 
 /* For further configurations, see the beginning of sljitConfigInternal.h */
 
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
 #endif
index 049ed2fe91ce67f0b74a13179cb1da3d861164aa..acba9da4be4d8a6e365287235d2a4320e999f257 100644 (file)
 #ifndef _SLJIT_CONFIG_INTERNAL_H_
 #define _SLJIT_CONFIG_INTERNAL_H_
 
-#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
-       || (defined SLJIT_DEBUG && SLJIT_DEBUG && (!defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE)))
-#include <stdio.h>
-#endif
-
-#if (defined SLJIT_DEBUG && SLJIT_DEBUG \
-       && (!defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE) || !defined(SLJIT_HALT_PROCESS)))
-#include <stdlib.h>
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
    SLJIT defines the following architecture dependent types and macros:
 
@@ -205,24 +191,6 @@ extern "C" {
 #define SLJIT_CONFIG_SPARC 1
 #endif
 
-/***********************************************************/
-/* Intel Control-flow Enforcement Technology (CET) spport. */
-/***********************************************************/
-
-#ifdef SLJIT_CONFIG_X86
-#if defined(__CET__)
-#define SLJIT_CONFIG_X86_CET 1
-#endif
-#if (defined SLJIT_CONFIG_X86_CET && SLJIT_CONFIG_X86_CET)
-#if defined(__GNUC__)
-#if !defined (__SHSTK__)
-#error "-mshstk is needed to compile with -fcf-protection"
-#endif
-#include <x86intrin.h>
-#endif
-#endif
-#endif
-
 /**********************************/
 /* External function definitions. */
 /**********************************/
@@ -297,7 +265,6 @@ extern "C" {
 /* Type of public API functions. */
 /*********************************/
 
-#ifndef SLJIT_API_FUNC_ATTRIBUTE 
 #if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC)
 /* Static ABI functions. For all-in-one programs. */
 
@@ -311,7 +278,6 @@ extern "C" {
 #else
 #define SLJIT_API_FUNC_ATTRIBUTE
 #endif /* (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) */
-#endif /* defined SLJIT_API_FUNC_ATTRIBUTE */
 
 /****************************/
 /* Instruction cache flush. */
@@ -321,7 +287,7 @@ extern "C" {
 #if __has_builtin(__builtin___clear_cache)
 
 #define SLJIT_CACHE_FLUSH(from, to) \
-       __builtin___clear_cache((char*)(from), (char*)(to))
+       __builtin___clear_cache((char*)from, (char*)to)
 
 #endif /* __has_builtin(__builtin___clear_cache) */
 #endif /* (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) */
@@ -352,7 +318,7 @@ extern "C" {
 #elif (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
 
 #define SLJIT_CACHE_FLUSH(from, to) \
-       __builtin___clear_cache((char*)(from), (char*)(to))
+       __builtin___clear_cache((char*)from, (char*)to)
 
 #elif defined __ANDROID__
 
@@ -485,25 +451,6 @@ typedef double sljit_f64;
 #define SLJIT_BIG_ENDIAN 1
 #endif
 
-#ifndef SLJIT_MIPS_REV
-
-/* Auto detecting mips revision. */
-#if (defined __mips_isa_rev) && (__mips_isa_rev >= 6)
-#define SLJIT_MIPS_REV 6
-#elif (defined __mips_isa_rev && __mips_isa_rev >= 1) \
-       || (defined __clang__ && defined _MIPS_ARCH_OCTEON) \
-       || (defined __clang__ && defined _MIPS_ARCH_P5600)
-/* clang either forgets to define (clang-7) __mips_isa_rev at all
- * or sets it to zero (clang-8,-9) for -march=octeon (MIPS64 R2+)
- * and -march=p5600 (MIPS32 R5).
- * It also sets the __mips macro to 64 or 32 for -mipsN when N <= 5
- * (should be set to N exactly) so we cannot rely on this too.
- */
-#define SLJIT_MIPS_REV 1
-#endif
-
-#endif /* !SLJIT_MIPS_REV */
-
 #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
 
 #define SLJIT_BIG_ENDIAN 1
@@ -732,16 +679,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
 /* Debug and verbose related macros. */
 /*************************************/
 
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+#include <stdio.h>
+#endif
+
 #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
 
 #if !defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE)
 
 /* SLJIT_HALT_PROCESS must halt the process. */
 #ifndef SLJIT_HALT_PROCESS
+#include <stdlib.h>
+
 #define SLJIT_HALT_PROCESS() \
        abort();
 #endif /* !SLJIT_HALT_PROCESS */
 
+#include <stdio.h>
+
 #endif /* !SLJIT_ASSERT || !SLJIT_UNREACHABLE */
 
 /* Feel free to redefine these two macros. */
@@ -787,8 +742,4 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
 
 #endif /* !SLJIT_COMPILE_ASSERT */
 
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
 #endif
index 76539072fef4af7eeba79f75c5b309fba3a52b77..92ddb94914382984dd9ddb65a361f86f9570a722 100644 (file)
@@ -106,10 +106,10 @@ static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size)
 
 static SLJIT_INLINE int get_map_jit_flag()
 {
-/* On macOS systems, returns MAP_JIT if it is defined _and_ we're running on a version
-   of macOS where it's OK to have more than one JIT block.
-   On non-macOS systems, returns MAP_JIT if it is defined. */
 #if TARGET_OS_OSX
+       /* On macOS systems, returns MAP_JIT if it is defined _and_ we're running on a version
+          of macOS where it's OK to have more than one JIT block. On non-macOS systems, returns
+          MAP_JIT if it is defined. */
        static int map_jit_flag = -1;
 
        /* The following code is thread safe because multiple initialization
@@ -124,19 +124,12 @@ static SLJIT_INLINE int get_map_jit_flag()
                /* Kernel version for 10.14.0 (Mojave) */
                if (atoi(name.release) >= 18) {
                        /* Only use MAP_JIT if a hardened runtime is used, because MAP_JIT is incompatible with fork(). */
-
-                       /* mirroring page size detection from sljit_allocate_stack */
-                       long page_size = sysconf(_SC_PAGESIZE);
-                       /* Should never happen */
-                       if (page_size < 0)
-                               page_size = 4096;
-
-                       void *ptr = mmap(NULL, page_size, PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0);
+                       void *ptr = mmap(NULL, getpagesize(), PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
 
                        if (ptr == MAP_FAILED) {
                                map_jit_flag = MAP_JIT;
                        } else {
-                               munmap(ptr, page_size);
+                               munmap(ptr, getpagesize());
                        }
                }
        }
index 86772cc1a5f45129b3998e50dd4126b792047f24..9bab0c3ec66baafad5258d2cab14c18d54976317 100644 (file)
@@ -926,8 +926,7 @@ static void sljit_verbose_fparam(struct sljit_compiler *compiler, sljit_s32 p, s
 
 static const char* op0_names[] = {
        (char*)"breakpoint", (char*)"nop", (char*)"lmul.uw", (char*)"lmul.sw",
-       (char*)"divmod.u", (char*)"divmod.s", (char*)"div.u", (char*)"div.s",
-       (char*)"endbr", (char*)"skip_frames_before_return"
+       (char*)"divmod.u", (char*)"divmod.s", (char*)"div.u", (char*)"div.s"
 };
 
 static const char* op1_names[] = {
@@ -944,12 +943,6 @@ static const char* op2_names[] = {
        (char*)"shl", (char*)"lshr", (char*)"ashr",
 };
 
-static const char* op_src_names[] = {
-       (char*)"fast_return", (char*)"skip_frames_before_fast_return",
-       (char*)"prefetch_l1", (char*)"prefetch_l2",
-       (char*)"prefetch_l3", (char*)"prefetch_once",
-};
-
 static const char* fop1_names[] = {
        (char*)"mov", (char*)"conv", (char*)"conv", (char*)"conv",
        (char*)"conv", (char*)"conv", (char*)"cmp", (char*)"neg",
@@ -1159,21 +1152,37 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fast_enter(struct sljit_c
        CHECK_RETURN_OK;
 }
 
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+       FUNCTION_CHECK_SRC(src, srcw);
+       CHECK_ARGUMENT(src != SLJIT_IMM);
+       compiler->last_flags = 0;
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+       if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+               fprintf(compiler->verbose, "  fast_return ");
+               sljit_verbose_param(compiler, src, srcw);
+               fprintf(compiler->verbose, "\n");
+       }
+#endif
+       CHECK_RETURN_OK;
+}
+
 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
 {
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
        CHECK_ARGUMENT((op >= SLJIT_BREAKPOINT && op <= SLJIT_LMUL_SW)
-               || ((op & ~SLJIT_I32_OP) >= SLJIT_DIVMOD_UW && (op & ~SLJIT_I32_OP) <= SLJIT_DIV_SW)
-               || (op >= SLJIT_ENDBR && op <= SLJIT_SKIP_FRAMES_BEFORE_RETURN));
-       CHECK_ARGUMENT(GET_OPCODE(op) < SLJIT_LMUL_UW || GET_OPCODE(op) >= SLJIT_ENDBR || compiler->scratches >= 2);
-       if ((GET_OPCODE(op) >= SLJIT_LMUL_UW && GET_OPCODE(op) <= SLJIT_DIV_SW) || op == SLJIT_SKIP_FRAMES_BEFORE_RETURN)
+               || ((op & ~SLJIT_I32_OP) >= SLJIT_DIVMOD_UW && (op & ~SLJIT_I32_OP) <= SLJIT_DIV_SW));
+       CHECK_ARGUMENT(op < SLJIT_LMUL_UW || compiler->scratches >= 2);
+       if (op >= SLJIT_LMUL_UW)
                compiler->last_flags = 0;
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
        if (SLJIT_UNLIKELY(!!compiler->verbose))
        {
                fprintf(compiler->verbose, "  %s", op0_names[GET_OPCODE(op) - SLJIT_OP0_BASE]);
-               if (GET_OPCODE(op) >= SLJIT_DIVMOD_UW && GET_OPCODE(op) <= SLJIT_DIV_SW) {
+               if (GET_OPCODE(op) >= SLJIT_DIVMOD_UW) {
                        fprintf(compiler->verbose, (op & SLJIT_I32_OP) ? "32" : "w");
                }
                fprintf(compiler->verbose, "\n");
@@ -1215,7 +1224,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op1(struct sljit_compiler
                break;
        }
 
-       FUNCTION_CHECK_DST(dst, dstw, HAS_FLAGS(op));
+       FUNCTION_CHECK_DST(dst, dstw, 1);
        FUNCTION_CHECK_SRC(src, srcw);
 
        if (GET_OPCODE(op) >= SLJIT_NOT) {
@@ -1295,7 +1304,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op2(struct sljit_compiler
                break;
        }
 
-       FUNCTION_CHECK_DST(dst, dstw, HAS_FLAGS(op));
+       FUNCTION_CHECK_DST(dst, dstw, 1);
        FUNCTION_CHECK_SRC(src1, src1w);
        FUNCTION_CHECK_SRC(src2, src2w);
        compiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP | SLJIT_SET_Z));
@@ -1316,33 +1325,6 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op2(struct sljit_compiler
        CHECK_RETURN_OK;
 }
 
-static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
-       sljit_s32 src, sljit_sw srcw)
-{
-#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
-       CHECK_ARGUMENT(op >= SLJIT_FAST_RETURN && op <= SLJIT_PREFETCH_ONCE);
-       FUNCTION_CHECK_SRC(src, srcw);
-
-       if (op == SLJIT_FAST_RETURN || op == SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN)
-       {
-               CHECK_ARGUMENT(src != SLJIT_IMM);
-               compiler->last_flags = 0;
-       }
-       else if (op >= SLJIT_PREFETCH_L1 && op <= SLJIT_PREFETCH_ONCE)
-       {
-               CHECK_ARGUMENT(src & SLJIT_MEM);
-       }
-#endif
-#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
-       if (SLJIT_UNLIKELY(!!compiler->verbose)) {
-               fprintf(compiler->verbose, "  %s ", op_src_names[op - SLJIT_OP_SRC_BASE]);
-               sljit_verbose_param(compiler, src, srcw);
-               fprintf(compiler->verbose, "\n");
-       }
-#endif
-       CHECK_RETURN_OK;
-}
-
 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_register_index(sljit_s32 reg)
 {
        SLJIT_UNUSED_ARG(reg);
@@ -2034,7 +2016,7 @@ static SLJIT_INLINE sljit_s32 emit_mov_before_return(struct sljit_compiler *comp
 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
                || (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \
                || (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \
-               || ((defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) && !(defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1))
+               || ((defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) && !(defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1))
 
 static SLJIT_INLINE sljit_s32 sljit_emit_cmov_generic(struct sljit_compiler *compiler, sljit_s32 type,
        sljit_s32 dst_reg,
@@ -2399,6 +2381,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *
        return SLJIT_ERR_UNSUPPORTED;
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
+{
+       SLJIT_UNUSED_ARG(compiler);
+       SLJIT_UNUSED_ARG(src);
+       SLJIT_UNUSED_ARG(srcw);
+       SLJIT_UNREACHABLE();
+       return SLJIT_ERR_UNSUPPORTED;
+}
+
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
 {
        SLJIT_UNUSED_ARG(compiler);
@@ -2438,17 +2429,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile
        return SLJIT_ERR_UNSUPPORTED;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
-       sljit_s32 src, sljit_sw srcw)
-{
-       SLJIT_UNUSED_ARG(compiler);
-       SLJIT_UNUSED_ARG(op);
-       SLJIT_UNUSED_ARG(src);
-       SLJIT_UNUSED_ARG(srcw);
-       SLJIT_UNREACHABLE();
-       return SLJIT_ERR_UNSUPPORTED;
-}
-
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
 {
        SLJIT_UNREACHABLE();
@@ -2569,13 +2549,6 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw
        SLJIT_UNREACHABLE();
 }
 
-SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_label, struct sljit_label *label)
-{
-       SLJIT_UNUSED_ARG(put_label);
-       SLJIT_UNUSED_ARG(label);
-       SLJIT_UNREACHABLE();
-}
-
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)
 {
        SLJIT_UNUSED_ARG(compiler);
index 72595bb2711157cd983bb3a4017d4e8bdd8554b6..836d25cf71a5386a8a96ae2f5d53072d97d77d77 100644 (file)
@@ -80,10 +80,6 @@ of sljitConfigInternal.h */
 
 #include "sljitConfigInternal.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* --------------------------------------------------------------------- */
 /*  Error codes                                                          */
 /* --------------------------------------------------------------------- */
@@ -158,10 +154,10 @@ extern "C" {
 */
 
 /* When SLJIT_UNUSED is specified as the destination of sljit_emit_op1
-   or sljit_emit_op2 operations the result is discarded. Some status
-   flags must be set when the destination is SLJIT_UNUSED, because the
-   operation would have no effect otherwise. Other SLJIT operations do
-   not support SLJIT_UNUSED as a destination operand. */
+   or sljit_emit_op2 operations the result is discarded. If no status
+   flags are set, no instructions are emitted for these operations. Data
+   prefetch is a special exception, see SLJIT_MOV operation. Other SLJIT
+   operations do not support SLJIT_UNUSED as a destination operand. */
 #define SLJIT_UNUSED           0
 
 /* Scratch registers. */
@@ -571,14 +567,10 @@ static SLJIT_INLINE sljit_uw sljit_get_generated_code_size(struct sljit_compiler
 #define SLJIT_HAS_FPU                  0
 /* [Limitation] Some registers are virtual registers. */
 #define SLJIT_HAS_VIRTUAL_REGISTERS    1
-/* [Emulated] Has zero register (setting a memory location to zero is efficient). */
-#define SLJIT_HAS_ZERO_REGISTER                2
 /* [Emulated] Count leading zero is supported. */
-#define SLJIT_HAS_CLZ                  3
-/* [Emulated] Conditional move is supported. */
-#define SLJIT_HAS_CMOV                 4
+#define SLJIT_HAS_CLZ                  2
 /* [Emulated] Conditional move is supported. */
-#define SLJIT_HAS_PREFETCH             5
+#define SLJIT_HAS_CMOV                 3
 
 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
 /* [Not emulated] SSE2 support is available on x86. */
@@ -666,10 +658,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *comp
        sljit_s32 src, sljit_sw srcw);
 
 /* Generating entry and exit points for fast call functions (see SLJIT_FAST_CALL).
-   Both sljit_emit_fast_enter and SLJIT_FAST_RETURN operations preserve the
+   Both sljit_emit_fast_enter and sljit_emit_fast_return functions preserve the
    values of all registers and stack frame. The return address is stored in the
    dst argument of sljit_emit_fast_enter, and this return address can be passed
-   to SLJIT_FAST_RETURN to continue the execution after the fast call.
+   to sljit_emit_fast_return to continue the execution after the fast call.
 
    Fast calls are cheap operations (usually only a single call instruction is
    emitted) but they do not preserve any registers. However the callee function
@@ -677,15 +669,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *comp
    efficiently exploited by various optimizations. Registers can be saved
    manually by the callee function if needed.
 
-   Although returning to different address by SLJIT_FAST_RETURN is possible,
+   Although returning to different address by sljit_emit_fast_return is possible,
    this address usually cannot be predicted by the return address predictor of
-   modern CPUs which may reduce performance. Furthermore certain security
-   enhancement technologies such as Intel Control-flow Enforcement Technology
-   (CET) may disallow returning to a different address.
+   modern CPUs which may reduce performance. Furthermore using sljit_emit_ijump
+   to return is also inefficient since return address prediction is usually
+   triggered by a specific form of ijump.
 
    Flags: - (does not modify flags). */
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw);
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw);
 
 /*
    Source and destination operands for arithmetical instructions
@@ -894,14 +887,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *
          the behaviour is undefined. */
 #define SLJIT_DIV_SW                   (SLJIT_OP0_BASE + 7)
 #define SLJIT_DIV_S32                  (SLJIT_DIV_SW | SLJIT_I32_OP)
-/* Flags: - (does not modify flags)
-   ENDBR32 instruction for x86-32 and ENDBR64 instruction for x86-64
-   when Intel Control-flow Enforcement Technology (CET) is enabled.
-   No instruction for other architectures.  */
-#define SLJIT_ENDBR                    (SLJIT_OP0_BASE + 8)
-/* Flags: - (may destroy flags)
-   Skip stack frames before return.  */
-#define SLJIT_SKIP_FRAMES_BEFORE_RETURN        (SLJIT_OP0_BASE + 9)
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op);
 
@@ -919,6 +904,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile
    U32 - unsigned int (32 bit) data transfer
    S32 - signed int (32 bit) data transfer
    P   - pointer (sljit_p) data transfer
+
+   If the destination of a MOV instruction is SLJIT_UNUSED and the source
+   operand is a memory address the compiler emits a prefetch instruction
+   if this instruction is supported by the current CPU. Higher data sizes
+   bring the data closer to the core: a MOV with word size loads the data
+   into a higher level cache than a byte size. Otherwise the type does not
+   affect the prefetch instruction. Furthermore a prefetch instruction
+   never fails, so it can be used to prefetch a data from an address and
+   check whether that address is NULL afterwards.
 */
 
 /* Flags: - (does not modify flags) */
@@ -1023,46 +1017,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile
        sljit_s32 src1, sljit_sw src1w,
        sljit_s32 src2, sljit_sw src2w);
 
-/* Starting index of opcodes for sljit_emit_op2. */
-#define SLJIT_OP_SRC_BASE              128
-
-/* Note: src cannot be an immedate value
-   Flags: - (does not modify flags) */
-#define SLJIT_FAST_RETURN              (SLJIT_OP_SRC_BASE + 0)
-/* Skip stack frames before fast return.
-   Note: src cannot be an immedate value
-   Flags: may destroy flags. */
-#define SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN   (SLJIT_OP_SRC_BASE + 1)
-/* Prefetch value into the level 1 data cache
-   Note: if the target CPU does not support data prefetch,
-         no instructions are emitted.
-   Note: this instruction never fails, even if the memory address is invalid.
-   Flags: - (does not modify flags) */
-#define SLJIT_PREFETCH_L1              (SLJIT_OP_SRC_BASE + 2)
-/* Prefetch value into the level 2 data cache
-   Note: same as SLJIT_PREFETCH_L1 if the target CPU
-         does not support this instruction form.
-   Note: this instruction never fails, even if the memory address is invalid.
-   Flags: - (does not modify flags) */
-#define SLJIT_PREFETCH_L2              (SLJIT_OP_SRC_BASE + 3)
-/* Prefetch value into the level 3 data cache
-   Note: same as SLJIT_PREFETCH_L2 if the target CPU
-         does not support this instruction form.
-   Note: this instruction never fails, even if the memory address is invalid.
-   Flags: - (does not modify flags) */
-#define SLJIT_PREFETCH_L3              (SLJIT_OP_SRC_BASE + 4)
-/* Prefetch a value which is only used once (and can be discarded afterwards)
-   Note: same as SLJIT_PREFETCH_L1 if the target CPU
-         does not support this instruction form.
-   Note: this instruction never fails, even if the memory address is invalid.
-   Flags: - (does not modify flags) */
-#define SLJIT_PREFETCH_ONCE            (SLJIT_OP_SRC_BASE + 5)
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
-       sljit_s32 src, sljit_sw srcw);
-
 /* Starting index of opcodes for sljit_emit_fop1. */
-#define SLJIT_FOP1_BASE                        160
+#define SLJIT_FOP1_BASE                        128
 
 /* Flags: - (does not modify flags) */
 #define SLJIT_MOV_F64                  (SLJIT_FOP1_BASE + 0)
@@ -1101,7 +1057,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compil
        sljit_s32 src, sljit_sw srcw);
 
 /* Starting index of opcodes for sljit_emit_fop2. */
-#define SLJIT_FOP2_BASE                        192
+#define SLJIT_FOP2_BASE                        160
 
 /* Flags: - (does not modify flags) */
 #define SLJIT_ADD_F64                  (SLJIT_FOP2_BASE + 0)
@@ -1205,7 +1161,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
 
 /* Unconditional jump types. */
 #define SLJIT_JUMP                     24
-       /* Fast calling method. See sljit_emit_fast_enter / SLJIT_FAST_RETURN. */
+       /* Fast calling method. See sljit_emit_fast_enter / sljit_emit_fast_return. */
 #define SLJIT_FAST_CALL                        25
        /* Called function must be declared with the SLJIT_FUNC attribute. */
 #define SLJIT_CALL                     26
@@ -1534,8 +1490,4 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *c
 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler,
        sljit_s32 current_flags);
 
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
 #endif /* _SLJIT_LIR_H_ */
index 5d180c2e2f724327839d3612255cd30bee15d1a1..71f7bcdadbef8dd40c8cd6a60df9d778e7bd1b53 100644 (file)
@@ -666,8 +666,6 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
                                                        label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
                                                        label->size = code_ptr - code;
                                                        label = label->next;
-
-                                                       next_addr = compute_next_addr(label, jump, const_, put_label);
                                                }
                                        }
                                }
@@ -872,9 +870,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
 
        case SLJIT_HAS_CLZ:
        case SLJIT_HAS_CMOV:
-#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
-       case SLJIT_HAS_PREFETCH:
-#endif
                return 1;
 
        default:
@@ -1681,9 +1676,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile
                                                | (saved_reg_list[0] << 12) /* ldr rX, [sp], #8/16 */);
                }
                return SLJIT_SUCCESS;
-       case SLJIT_ENDBR:
-       case SLJIT_SKIP_FRAMES_BEFORE_RETURN:
-               return SLJIT_SUCCESS;
        }
 
        return SLJIT_SUCCESS;
@@ -1698,6 +1690,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile
        ADJUST_LOCAL_OFFSET(dst, dstw);
        ADJUST_LOCAL_OFFSET(src, srcw);
 
+       if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) {
+#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
+               if (op <= SLJIT_MOV_P && (src & SLJIT_MEM))
+                       return emit_op_mem(compiler, PRELOAD | LOAD_DATA, TMP_PC, src, srcw, TMP_REG1);
+#endif
+               return SLJIT_SUCCESS;
+       }
+
        switch (GET_OPCODE(op)) {
        case SLJIT_MOV:
        case SLJIT_MOV_U32:
@@ -1779,40 +1779,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile
        return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
-       sljit_s32 src, sljit_sw srcw)
-{
-       CHECK_ERROR();
-       CHECK(check_sljit_emit_op_src(compiler, op, src, srcw));
-       ADJUST_LOCAL_OFFSET(src, srcw);
-
-       switch (op) {
-       case SLJIT_FAST_RETURN:
-               SLJIT_ASSERT(reg_map[TMP_REG2] == 14);
-
-               if (FAST_IS_REG(src))
-                       FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(src)));
-               else
-                       FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG2, src, srcw, TMP_REG1));
-
-               return push_inst(compiler, BX | RM(TMP_REG2));
-       case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN:
-               return SLJIT_SUCCESS;
-       case SLJIT_PREFETCH_L1:
-       case SLJIT_PREFETCH_L2:
-       case SLJIT_PREFETCH_L3:
-       case SLJIT_PREFETCH_ONCE:
-#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
-               SLJIT_ASSERT(src & SLJIT_MEM);
-               return emit_op_mem(compiler, PRELOAD | LOAD_DATA, TMP_PC, src, srcw, TMP_REG1);
-#else /* !SLJIT_CONFIG_ARM_V7 */
-               return SLJIT_SUCCESS;
-#endif /* SLJIT_CONFIG_ARM_V7 */
-       }
-
-       return SLJIT_SUCCESS;
-}
-
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
 {
        CHECK_REG_INDEX(check_sljit_get_register_index(reg));
@@ -2075,6 +2041,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *
        return emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1);
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
+{
+       CHECK_ERROR();
+       CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
+       ADJUST_LOCAL_OFFSET(src, srcw);
+
+       SLJIT_ASSERT(reg_map[TMP_REG2] == 14);
+
+       if (FAST_IS_REG(src))
+               FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(src)));
+       else
+               FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG2, src, srcw, TMP_REG1));
+
+       return push_inst(compiler, BX | RM(TMP_REG2));
+}
+
 /* --------------------------------------------------------------------- */
 /*  Conditional instructions                                             */
 /* --------------------------------------------------------------------- */
@@ -2633,11 +2615,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile
        }
        else {
                if (is_type1_transfer) {
-                       if (memw > 4095 || memw < -4095)
+                       if (memw > 4095 && memw < -4095)
                                return SLJIT_ERR_UNSUPPORTED;
                }
                else {
-                       if (memw > 255 || memw < -255)
+                       if (memw > 255 && memw < -255)
                                return SLJIT_ERR_UNSUPPORTED;
                }
        }
index eaca095a2b50d807a0e40fccd97f2b6a0bc690db..e15b3451e802200e4bd2271fb62349e41b9edb04 100644 (file)
@@ -396,7 +396,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
 
        case SLJIT_HAS_CLZ:
        case SLJIT_HAS_CMOV:
-       case SLJIT_HAS_PREFETCH:
                return 1;
 
        default:
@@ -1155,9 +1154,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile
        case SLJIT_DIV_UW:
        case SLJIT_DIV_SW:
                return push_inst(compiler, ((op == SLJIT_DIV_UW ? UDIV : SDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1));
-       case SLJIT_ENDBR:
-       case SLJIT_SKIP_FRAMES_BEFORE_RETURN:
-               return SLJIT_SUCCESS;
        }
 
        return SLJIT_SUCCESS;
@@ -1175,6 +1171,23 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile
        ADJUST_LOCAL_OFFSET(dst, dstw);
        ADJUST_LOCAL_OFFSET(src, srcw);
 
+       if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) {
+               if (op <= SLJIT_MOV_P && (src & SLJIT_MEM)) {
+                       SLJIT_ASSERT(reg_map[1] == 0 && reg_map[3] == 2 && reg_map[5] == 4);
+
+                       if (op >= SLJIT_MOV_U8 && op <= SLJIT_MOV_S8)
+                               dst = 5;
+                       else if (op >= SLJIT_MOV_U16 && op <= SLJIT_MOV_S16)
+                               dst = 3;
+                       else
+                               dst = 1;
+
+                       /* Signed word sized load is the prefetch instruction. */
+                       return emit_op_mem(compiler, WORD_SIZE | SIGNED, dst, src, srcw, TMP_REG1);
+               }
+               return SLJIT_SUCCESS;
+       }
+
        dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1;
 
        op = GET_OPCODE(op);
@@ -1314,46 +1327,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile
        return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
-       sljit_s32 src, sljit_sw srcw)
-{
-       CHECK_ERROR();
-       CHECK(check_sljit_emit_op_src(compiler, op, src, srcw));
-       ADJUST_LOCAL_OFFSET(src, srcw);
-
-       switch (op) {
-       case SLJIT_FAST_RETURN:
-               if (FAST_IS_REG(src))
-                       FAIL_IF(push_inst(compiler, ORR | RD(TMP_LR) | RN(TMP_ZERO) | RM(src)));
-               else
-                       FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_LR, src, srcw, TMP_REG1));
-
-               return push_inst(compiler, RET | RN(TMP_LR));
-       case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN:
-               return SLJIT_SUCCESS;
-       case SLJIT_PREFETCH_L1:
-       case SLJIT_PREFETCH_L2:
-       case SLJIT_PREFETCH_L3:
-       case SLJIT_PREFETCH_ONCE:
-               SLJIT_ASSERT(reg_map[1] == 0 && reg_map[3] == 2 && reg_map[5] == 4);
-
-               /* The reg_map[op] should provide the appropriate constant. */
-               if (op == SLJIT_PREFETCH_L1)
-                       op = 1;
-               else if (op == SLJIT_PREFETCH_L2)
-                       op = 3;
-               else if (op == SLJIT_PREFETCH_L3)
-                       op = 5;
-               else
-                       op = 2;
-
-               /* Signed word sized load is the prefetch instruction. */
-               return emit_op_mem(compiler, WORD_SIZE | SIGNED, op, src, srcw, TMP_REG1);
-       }
-
-       return SLJIT_SUCCESS;
-}
-
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
 {
        CHECK_REG_INDEX(check_sljit_get_register_index(reg));
@@ -1605,6 +1578,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *
        return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_LR, dst, dstw, TMP_REG1);
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
+{
+       CHECK_ERROR();
+       CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
+       ADJUST_LOCAL_OFFSET(src, srcw);
+
+       if (FAST_IS_REG(src))
+               FAIL_IF(push_inst(compiler, ORR | RD(TMP_LR) | RN(TMP_ZERO) | RM(src)));
+       else
+               FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_LR, src, srcw, TMP_REG1));
+
+       return push_inst(compiler, RET | RN(TMP_LR));
+}
+
 /* --------------------------------------------------------------------- */
 /*  Conditional instructions                                             */
 /* --------------------------------------------------------------------- */
@@ -1878,7 +1865,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile
        CHECK_ERROR();
        CHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw));
 
-       if ((mem & OFFS_REG_MASK) || (memw > 255 || memw < -256))
+       if ((mem & OFFS_REG_MASK) || (memw > 255 && memw < -256))
                return SLJIT_ERR_UNSUPPORTED;
 
        if (type & SLJIT_MEM_SUPP)
@@ -1928,7 +1915,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compil
        CHECK_ERROR();
        CHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw));
 
-       if ((mem & OFFS_REG_MASK) || (memw > 255 || memw < -256))
+       if ((mem & OFFS_REG_MASK) || (memw > 255 && memw < -256))
                return SLJIT_ERR_UNSUPPORTED;
 
        if (type & SLJIT_MEM_SUPP)
index a81e008a8b4cbc7046f988b64fa60a451baeb5e4..cdfe4a4d24a93790b0739287d62171341d8883e9 100644 (file)
@@ -480,7 +480,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
 
        case SLJIT_HAS_CLZ:
        case SLJIT_HAS_CMOV:
-       case SLJIT_HAS_PREFETCH:
                return 1;
 
        default:
@@ -1329,9 +1328,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile
                }
                return SLJIT_SUCCESS;
 #endif /* __ARM_FEATURE_IDIV || __ARM_ARCH_EXT_IDIV__ */
-       case SLJIT_ENDBR:
-       case SLJIT_SKIP_FRAMES_BEFORE_RETURN:
-               return SLJIT_SUCCESS;
        }
 
        return SLJIT_SUCCESS;
@@ -1349,6 +1345,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile
        ADJUST_LOCAL_OFFSET(dst, dstw);
        ADJUST_LOCAL_OFFSET(src, srcw);
 
+       if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) {
+               /* Since TMP_PC has index 15, IS_2_LO_REGS and IS_3_LO_REGS checks always fail. */
+               if (op <= SLJIT_MOV_P && (src & SLJIT_MEM))
+                       return emit_op_mem(compiler, PRELOAD, TMP_PC, src, srcw, TMP_REG1);
+               return SLJIT_SUCCESS;
+       }
+
        dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1;
 
        op = GET_OPCODE(op);
@@ -1472,35 +1475,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile
        return emit_op_mem(compiler, WORD_SIZE | STORE, dst_reg, dst, dstw, TMP_REG2);
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
-       sljit_s32 src, sljit_sw srcw)
-{
-       CHECK_ERROR();
-       CHECK(check_sljit_emit_op_src(compiler, op, src, srcw));
-       ADJUST_LOCAL_OFFSET(src, srcw);
-
-       switch (op) {
-       case SLJIT_FAST_RETURN:
-               SLJIT_ASSERT(reg_map[TMP_REG2] == 14);
-
-               if (FAST_IS_REG(src))
-                       FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(TMP_REG2, src)));
-               else
-                       FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, src, srcw, TMP_REG2));
-
-               return push_inst16(compiler, BX | RN3(TMP_REG2));
-       case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN:
-               return SLJIT_SUCCESS;
-       case SLJIT_PREFETCH_L1:
-       case SLJIT_PREFETCH_L2:
-       case SLJIT_PREFETCH_L3:
-       case SLJIT_PREFETCH_ONCE:
-               return emit_op_mem(compiler, PRELOAD, TMP_PC, src, srcw, TMP_REG1);
-       }
-
-       return SLJIT_SUCCESS;
-}
-
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
 {
        CHECK_REG_INDEX(check_sljit_get_register_index(reg));
@@ -1754,6 +1728,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *
        return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG2, dst, dstw, TMP_REG1);
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
+{
+       CHECK_ERROR();
+       CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
+       ADJUST_LOCAL_OFFSET(src, srcw);
+
+       SLJIT_ASSERT(reg_map[TMP_REG2] == 14);
+
+       if (FAST_IS_REG(src))
+               FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(TMP_REG2, src)));
+       else
+               FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, src, srcw, TMP_REG2));
+
+       return push_inst16(compiler, BX | RN3(TMP_REG2));
+}
+
 /* --------------------------------------------------------------------- */
 /*  Conditional instructions                                             */
 /* --------------------------------------------------------------------- */
@@ -2274,7 +2264,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile
        CHECK_ERROR();
        CHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw));
 
-       if ((mem & OFFS_REG_MASK) || (memw > 255 || memw < -255))
+       if ((mem & OFFS_REG_MASK) || (memw > 255 && memw < -255))
                return SLJIT_ERR_UNSUPPORTED;
 
        if (type & SLJIT_MEM_SUPP)
index 777627bb7f04a9e6085de557840784cdfacc077e..16dec052fe75fe7e345f197b245875f203101a54 100644 (file)
@@ -86,12 +86,12 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl
                SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
                if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
                        if (op == SLJIT_MOV_S8) {
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
                                return push_inst(compiler, SEB | T(src2) | D(dst), DR(dst));
-#else /* SLJIT_MIPS_REV < 1 */
+#else
                                FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(24), DR(dst)));
                                return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(24), DR(dst));
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif
                        }
                        return push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xff), DR(dst));
                }
@@ -105,12 +105,12 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl
                SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
                if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
                        if (op == SLJIT_MOV_S16) {
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
                                return push_inst(compiler, SEH | T(src2) | D(dst), DR(dst));
-#else /* SLJIT_MIPS_REV < 1 */
+#else
                                FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(16), DR(dst)));
                                return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(16), DR(dst));
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif
                        }
                        return push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xffff), DR(dst));
                }
@@ -129,12 +129,12 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl
 
        case SLJIT_CLZ:
                SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
                if (op & SLJIT_SET_Z)
                        FAIL_IF(push_inst(compiler, CLZ | S(src2) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));
                if (!(flags & UNUSED_DEST))
                        FAIL_IF(push_inst(compiler, CLZ | S(src2) | T(dst) | D(dst), DR(dst)));
-#else /* SLJIT_MIPS_REV < 1 */
+#else
                if (SLJIT_UNLIKELY(flags & UNUSED_DEST)) {
                        FAIL_IF(push_inst(compiler, SRL | T(src2) | DA(EQUAL_FLAG) | SH_IMM(31), EQUAL_FLAG));
                        return push_inst(compiler, XORI | SA(EQUAL_FLAG) | TA(EQUAL_FLAG) | IMM(1), EQUAL_FLAG);
@@ -149,7 +149,7 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl
                FAIL_IF(push_inst(compiler, ADDIU | S(dst) | T(dst) | IMM(1), DR(dst)));
                FAIL_IF(push_inst(compiler, BGEZ | S(TMP_REG1) | IMM(-2), UNMOVABLE_INS));
                FAIL_IF(push_inst(compiler, SLL | T(TMP_REG1) | D(TMP_REG1) | SH_IMM(1), UNMOVABLE_INS));
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif
                return SLJIT_SUCCESS;
 
        case SLJIT_ADD:
@@ -368,22 +368,21 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl
                SLJIT_ASSERT(!(flags & SRC2_IMM));
 
                if (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) {
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) || (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
                        return push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst));
-#else /* SLJIT_MIPS_REV < 1 */
+#else /* !SLJIT_MIPS_R1 && !SLJIT_MIPS_R6 */
                        FAIL_IF(push_inst(compiler, MULT | S(src1) | T(src2), MOVABLE_INS));
                        return push_inst(compiler, MFLO | D(dst), DR(dst));
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif /* SLJIT_MIPS_R1 || SLJIT_MIPS_R6 */
                }
-
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
                FAIL_IF(push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst)));
                FAIL_IF(push_inst(compiler, MUH | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));
-#else /* SLJIT_MIPS_REV < 6 */
+#else /* !SLJIT_MIPS_R6 */
                FAIL_IF(push_inst(compiler, MULT | S(src1) | T(src2), MOVABLE_INS));
                FAIL_IF(push_inst(compiler, MFHI | DA(EQUAL_FLAG), EQUAL_FLAG));
                FAIL_IF(push_inst(compiler, MFLO | D(dst), DR(dst)));
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
                FAIL_IF(push_inst(compiler, SRA | T(dst) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG));
                return push_inst(compiler, SUBU | SA(EQUAL_FLAG) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG);
 
index 479244d707bace688c68a809168b4e7eee4ecebb..a6a2bcc0c9aa29d0b6bf1325e2796cc9ff48b748 100644 (file)
@@ -220,12 +220,12 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl
 
        case SLJIT_CLZ:
                SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
                if (op & SLJIT_SET_Z)
                        FAIL_IF(push_inst(compiler, SELECT_OP(DCLZ, CLZ) | S(src2) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));
                if (!(flags & UNUSED_DEST))
                        FAIL_IF(push_inst(compiler, SELECT_OP(DCLZ, CLZ) | S(src2) | T(dst) | D(dst), DR(dst)));
-#else /* SLJIT_MIPS_REV < 1 */
+#else
                if (SLJIT_UNLIKELY(flags & UNUSED_DEST)) {
                        FAIL_IF(push_inst(compiler, SELECT_OP(DSRL32, SRL) | T(src2) | DA(EQUAL_FLAG) | SH_IMM(31), EQUAL_FLAG));
                        return push_inst(compiler, XORI | SA(EQUAL_FLAG) | TA(EQUAL_FLAG) | IMM(1), EQUAL_FLAG);
@@ -240,7 +240,7 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl
                FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(dst) | T(dst) | IMM(1), DR(dst)));
                FAIL_IF(push_inst(compiler, BGEZ | S(TMP_REG1) | IMM(-2), UNMOVABLE_INS));
                FAIL_IF(push_inst(compiler, SELECT_OP(DSLL, SLL) | T(TMP_REG1) | D(TMP_REG1) | SH_IMM(1), UNMOVABLE_INS));
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif
                return SLJIT_SUCCESS;
 
        case SLJIT_ADD:
@@ -459,27 +459,26 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl
                SLJIT_ASSERT(!(flags & SRC2_IMM));
 
                if (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) {
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
                        return push_inst(compiler, SELECT_OP(DMUL, MUL) | S(src1) | T(src2) | D(dst), DR(dst));
-#elif (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#elif (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
                        if (op & SLJIT_I32_OP)
                                return push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst));
                        FAIL_IF(push_inst(compiler, DMULT | S(src1) | T(src2), MOVABLE_INS));
                        return push_inst(compiler, MFLO | D(dst), DR(dst));
-#else /* SLJIT_MIPS_REV < 1 */
+#else /* !SLJIT_MIPS_R6 && !SLJIT_MIPS_R1 */
                        FAIL_IF(push_inst(compiler, SELECT_OP(DMULT, MULT) | S(src1) | T(src2), MOVABLE_INS));
                        return push_inst(compiler, MFLO | D(dst), DR(dst));
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
                }
-
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
                FAIL_IF(push_inst(compiler, SELECT_OP(DMUL, MUL) | S(src1) | T(src2) | D(dst), DR(dst)));
                FAIL_IF(push_inst(compiler, SELECT_OP(DMUH, MUH) | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));
-#else /* SLJIT_MIPS_REV < 6 */
+#else /* !SLJIT_MIPS_R6 */
                FAIL_IF(push_inst(compiler, SELECT_OP(DMULT, MULT) | S(src1) | T(src2), MOVABLE_INS));
                FAIL_IF(push_inst(compiler, MFHI | DA(EQUAL_FLAG), EQUAL_FLAG));
                FAIL_IF(push_inst(compiler, MFLO | D(dst), DR(dst)));
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
                FAIL_IF(push_inst(compiler, SELECT_OP(DSRA32, SRA) | T(dst) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG));
                return push_inst(compiler, SELECT_OP(DSUBU, SUBU) | SA(EQUAL_FLAG) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG);
 
index 88df904e24a77ade5e9d31d7eb95fe5a8b36378d..7d1d08749693cf697bf1b671b74646ad68328c23 100644 (file)
  */
 
 /* Latest MIPS architecture. */
+/* Automatically detect SLJIT_MIPS_R1 */
 
-#ifndef __mips_hard_float
-/* Disable automatic detection, covers both -msoft-float and -mno-float */
-#undef SLJIT_IS_FPU_AVAILABLE
-#define SLJIT_IS_FPU_AVAILABLE 0
+#if (defined __mips_isa_rev) && (__mips_isa_rev >= 6)
+#define SLJIT_MIPS_R6 1
 #endif
 
 SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)
 {
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
 
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
        return "MIPS32-R6" SLJIT_CPUINFO;
@@ -42,7 +41,7 @@ SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)
        return "MIPS64-R6" SLJIT_CPUINFO;
 #endif /* SLJIT_CONFIG_MIPS_32 */
 
-#elif (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#elif (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
 
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
        return "MIPS32-R1" SLJIT_CPUINFO;
@@ -50,9 +49,9 @@ SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)
        return "MIPS64-R1" SLJIT_CPUINFO;
 #endif /* SLJIT_CONFIG_MIPS_32 */
 
-#else /* SLJIT_MIPS_REV < 1 */
+#else /* SLJIT_MIPS_R1 */
        return "MIPS III" SLJIT_CPUINFO;
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
 }
 
 /* Length of an instruction word
@@ -118,11 +117,11 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {
 #define FR(dr)         (freg_map[dr])
 #define HI(opcode)     ((opcode) << 26)
 #define LO(opcode)     (opcode)
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
 /* CMP.cond.fmt */
 /* S = (20 << 21) D = (21 << 21) */
 #define CMP_FMT_S      (20 << 21)
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
 /* S = (16 << 21) D = (17 << 21) */
 #define FMT_S          (16 << 21)
 #define FMT_D          (17 << 21)
@@ -135,13 +134,13 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {
 #define ANDI           (HI(12))
 #define B              (HI(4))
 #define BAL            (HI(1) | (17 << 16))
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
 #define BC1EQZ         (HI(17) | (9 << 21) | FT(TMP_FREG3))
 #define BC1NEZ         (HI(17) | (13 << 21) | FT(TMP_FREG3))
-#else /* SLJIT_MIPS_REV < 6 */
+#else /* !SLJIT_MIPS_R6 */
 #define BC1F           (HI(17) | (8 << 21))
 #define BC1T           (HI(17) | (8 << 21) | (1 << 16))
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
 #define BEQ            (HI(4))
 #define BGEZ           (HI(1) | (1 << 16))
 #define BGTZ           (HI(7))
@@ -150,23 +149,23 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {
 #define BNE            (HI(5))
 #define BREAK          (HI(0) | LO(13))
 #define CFC1           (HI(17) | (2 << 21))
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
 #define C_UEQ_S                (HI(17) | CMP_FMT_S | LO(3))
 #define C_ULE_S                (HI(17) | CMP_FMT_S | LO(7))
 #define C_ULT_S                (HI(17) | CMP_FMT_S | LO(5))
 #define C_UN_S         (HI(17) | CMP_FMT_S | LO(1))
 #define C_FD           (FD(TMP_FREG3))
-#else /* SLJIT_MIPS_REV < 6 */
+#else /* !SLJIT_MIPS_R6 */
 #define C_UEQ_S                (HI(17) | FMT_S | LO(51))
 #define C_ULE_S                (HI(17) | FMT_S | LO(55))
 #define C_ULT_S                (HI(17) | FMT_S | LO(53))
 #define C_UN_S         (HI(17) | FMT_S | LO(49))
 #define C_FD           (0)
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
 #define CVT_S_S                (HI(17) | FMT_S | LO(32))
 #define DADDIU         (HI(25))
 #define DADDU          (HI(0) | LO(45))
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
 #define DDIV           (HI(0) | (2 << 6) | LO(30))
 #define DDIVU          (HI(0) | (2 << 6) | LO(31))
 #define DMOD           (HI(0) | (3 << 6) | LO(30))
@@ -177,14 +176,14 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {
 #define DMUHU          (HI(0) | (3 << 6) | LO(29))
 #define DMUL           (HI(0) | (2 << 6) | LO(28))
 #define DMULU          (HI(0) | (2 << 6) | LO(29))
-#else /* SLJIT_MIPS_REV < 6 */
+#else /* !SLJIT_MIPS_R6 */
 #define DDIV           (HI(0) | LO(30))
 #define DDIVU          (HI(0) | LO(31))
 #define DIV            (HI(0) | LO(26))
 #define DIVU           (HI(0) | LO(27))
 #define DMULT          (HI(0) | LO(28))
 #define DMULTU         (HI(0) | LO(29))
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
 #define DIV_S          (HI(17) | FMT_S | LO(3))
 #define DSLL           (HI(0) | LO(56))
 #define DSLL32         (HI(0) | LO(60))
@@ -199,33 +198,33 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {
 #define J              (HI(2))
 #define JAL            (HI(3))
 #define JALR           (HI(0) | LO(9))
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
 #define JR             (HI(0) | LO(9))
-#else /* SLJIT_MIPS_REV < 6 */
+#else /* !SLJIT_MIPS_R6 */
 #define JR             (HI(0) | LO(8))
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
 #define LD             (HI(55))
 #define LUI            (HI(15))
 #define LW             (HI(35))
 #define MFC1           (HI(17))
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
-#define MOD            (HI(0) | (3 << 6) | LO(26))
-#define MODU           (HI(0) | (3 << 6) | LO(27))
-#else /* SLJIT_MIPS_REV < 6 */
+#if !(defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
 #define MFHI           (HI(0) | LO(16))
 #define MFLO           (HI(0) | LO(18))
-#endif /* SLJIT_MIPS_REV >= 6 */
+#else /* SLJIT_MIPS_R6 */
+#define MOD            (HI(0) | (3 << 6) | LO(26))
+#define MODU           (HI(0) | (3 << 6) | LO(27))
+#endif /* !SLJIT_MIPS_R6 */
 #define MOV_S          (HI(17) | FMT_S | LO(6))
 #define MTC1           (HI(17) | (4 << 21))
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
 #define MUH            (HI(0) | (3 << 6) | LO(24))
 #define MUHU           (HI(0) | (3 << 6) | LO(25))
 #define MUL            (HI(0) | (2 << 6) | LO(24))
 #define MULU           (HI(0) | (2 << 6) | LO(25))
-#else /* SLJIT_MIPS_REV < 6 */
+#else /* !SLJIT_MIPS_R6 */
 #define MULT           (HI(0) | LO(24))
 #define MULTU          (HI(0) | LO(25))
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
 #define MUL_S          (HI(17) | FMT_S | LO(2))
 #define NEG_S          (HI(17) | FMT_S | LO(7))
 #define NOP            (HI(0) | LO(0))
@@ -252,23 +251,23 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {
 #define XOR            (HI(0) | LO(38))
 #define XORI           (HI(14))
 
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) || (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
 #define CLZ            (HI(28) | LO(32))
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
 #define DCLZ           (LO(18))
-#else /* SLJIT_MIPS_REV < 6 */
+#else /* !SLJIT_MIPS_R6 */
 #define DCLZ           (HI(28) | LO(36))
 #define MOVF           (HI(0) | (0 << 16) | LO(1))
 #define MOVN           (HI(0) | LO(11))
 #define MOVT           (HI(0) | (1 << 16) | LO(1))
 #define MOVZ           (HI(0) | LO(10))
 #define MUL            (HI(28) | LO(2))
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
 #define PREF           (HI(51))
 #define PREFX          (HI(19) | LO(15))
 #define SEB            (HI(31) | (16 << 6) | LO(32))
 #define SEH            (HI(31) | (24 << 6) | LO(32))
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif
 
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
 #define ADDU_W         ADDU
@@ -304,10 +303,10 @@ static SLJIT_INLINE sljit_ins invert_branch(sljit_s32 flags)
 {
        if (flags & IS_BIT26_COND)
                return (1 << 26);
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
        if (flags & IS_BIT23_COND)
                return (1 << 23);
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
        return (1 << 16);
 }
 
@@ -684,15 +683,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
 #else
 #error "FIR check is not implemented for this architecture"
 #endif
-       case SLJIT_HAS_ZERO_REGISTER:
-               return 1;
 
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
        case SLJIT_HAS_CLZ:
        case SLJIT_HAS_CMOV:
-       case SLJIT_HAS_PREFETCH:
                return 1;
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif
 
        default:
                return fir;
@@ -1234,7 +1230,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile
                return push_inst(compiler, NOP, UNMOVABLE_INS);
        case SLJIT_LMUL_UW:
        case SLJIT_LMUL_SW:
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
                FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMULU : DMUL) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3)));
                FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMUHU : DMUH) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG1), DR(TMP_REG1)));
@@ -1244,7 +1240,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile
 #endif /* SLJIT_CONFIG_MIPS_64 */
                FAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | TA(0) | D(SLJIT_R0), DR(SLJIT_R0)));
                return push_inst(compiler, ADDU_W | S(TMP_REG1) | TA(0) | D(SLJIT_R1), DR(SLJIT_R1));
-#else /* SLJIT_MIPS_REV < 6 */
+#else /* !SLJIT_MIPS_R6 */
 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
                FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMULTU : DMULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
 #else /* !SLJIT_CONFIG_MIPS_64 */
@@ -1252,13 +1248,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile
 #endif /* SLJIT_CONFIG_MIPS_64 */
                FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0)));
                return push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1));
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
        case SLJIT_DIVMOD_UW:
        case SLJIT_DIVMOD_SW:
        case SLJIT_DIV_UW:
        case SLJIT_DIV_SW:
                SLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments);
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
                if (int_op) {
                        FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3)));
@@ -1274,11 +1270,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile
 #endif /* SLJIT_CONFIG_MIPS_64 */
                FAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | TA(0) | D(SLJIT_R0), DR(SLJIT_R0)));
                return (op >= SLJIT_DIV_UW) ? SLJIT_SUCCESS : push_inst(compiler, ADDU_W | S(TMP_REG1) | TA(0) | D(SLJIT_R1), DR(SLJIT_R1));
-#else /* SLJIT_MIPS_REV < 6 */
-#if !(defined SLJIT_MIPS_REV)
+#else /* !SLJIT_MIPS_R6 */
+#if !(defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
                FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
                FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
-#endif /* !SLJIT_MIPS_REV */
+#endif /* !SLJIT_MIPS_R1 */
 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
                if (int_op)
                        FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
@@ -1289,16 +1285,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile
 #endif /* SLJIT_CONFIG_MIPS_64 */
                FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0)));
                return (op >= SLJIT_DIV_UW) ? SLJIT_SUCCESS : push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1));
-#endif /* SLJIT_MIPS_REV >= 6 */
-       case SLJIT_ENDBR:
-       case SLJIT_SKIP_FRAMES_BEFORE_RETURN:
-               return SLJIT_SUCCESS;
+#endif /* SLJIT_MIPS_R6 */
        }
 
        return SLJIT_SUCCESS;
 }
 
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
 static sljit_s32 emit_prefetch(struct sljit_compiler *compiler,
         sljit_s32 src, sljit_sw srcw)
 {
@@ -1319,7 +1312,7 @@ static sljit_s32 emit_prefetch(struct sljit_compiler *compiler,
 
        return push_inst(compiler, PREFX | S(src & REG_MASK) | T(OFFS_REG(src)), MOVABLE_INS);
 }
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
        sljit_s32 dst, sljit_sw dstw,
@@ -1336,6 +1329,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile
        ADJUST_LOCAL_OFFSET(dst, dstw);
        ADJUST_LOCAL_OFFSET(src, srcw);
 
+       if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) {
+#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
+               if (op <= SLJIT_MOV_P && (src & SLJIT_MEM))
+                       return emit_prefetch(compiler, src, srcw);
+#endif
+               return SLJIT_SUCCESS;
+       }
+
 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
        if ((op & SLJIT_I32_OP) && GET_OPCODE(op) >= SLJIT_NOT)
                flags |= INT_DATA | SIGNED_DATA;
@@ -1462,38 +1463,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile
 #endif
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
-       sljit_s32 src, sljit_sw srcw)
-{
-       CHECK_ERROR();
-       CHECK(check_sljit_emit_op_src(compiler, op, src, srcw));
-       ADJUST_LOCAL_OFFSET(src, srcw);
-
-       switch (op) {
-       case SLJIT_FAST_RETURN:
-               if (FAST_IS_REG(src))
-                       FAIL_IF(push_inst(compiler, ADDU_W | S(src) | TA(0) | DA(RETURN_ADDR_REG), RETURN_ADDR_REG));
-               else
-                       FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RETURN_ADDR_REG, src, srcw));
-
-               FAIL_IF(push_inst(compiler, JR | SA(RETURN_ADDR_REG), UNMOVABLE_INS));
-               return push_inst(compiler, NOP, UNMOVABLE_INS);
-       case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN:
-               return SLJIT_SUCCESS;
-       case SLJIT_PREFETCH_L1:
-       case SLJIT_PREFETCH_L2:
-       case SLJIT_PREFETCH_L3:
-       case SLJIT_PREFETCH_ONCE:
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
-               return emit_prefetch(compiler, src, srcw);
-#else /* SLJIT_MIPS_REV < 1 */
-               return SLJIT_SUCCESS;
-#endif /* SLJIT_MIPS_REV >= 1 */
-       }
-
-       return SLJIT_SUCCESS;
-}
-
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
 {
        CHECK_REG_INDEX(check_sljit_get_register_index(reg));
@@ -1763,12 +1732,25 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *
        ADJUST_LOCAL_OFFSET(dst, dstw);
 
        if (FAST_IS_REG(dst))
-               return push_inst(compiler, ADDU_W | SA(RETURN_ADDR_REG) | TA(0) | D(dst), UNMOVABLE_INS);
+               return push_inst(compiler, ADDU_W | SA(RETURN_ADDR_REG) | TA(0) | D(dst), DR(dst));
 
        /* Memory. */
-       FAIL_IF(emit_op_mem(compiler, WORD_DATA, RETURN_ADDR_REG, dst, dstw));
-       compiler->delay_slot = UNMOVABLE_INS;
-       return SLJIT_SUCCESS;
+       return emit_op_mem(compiler, WORD_DATA, RETURN_ADDR_REG, dst, dstw);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
+{
+       CHECK_ERROR();
+       CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
+       ADJUST_LOCAL_OFFSET(src, srcw);
+
+       if (FAST_IS_REG(src))
+               FAIL_IF(push_inst(compiler, ADDU_W | S(src) | TA(0) | DA(RETURN_ADDR_REG), RETURN_ADDR_REG));
+       else
+               FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RETURN_ADDR_REG, src, srcw));
+
+       FAIL_IF(push_inst(compiler, JR | SA(RETURN_ADDR_REG), UNMOVABLE_INS));
+       return push_inst(compiler, NOP, UNMOVABLE_INS);
 }
 
 /* --------------------------------------------------------------------- */
@@ -1808,7 +1790,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
        flags = IS_BIT26_COND; \
        delay_check = src;
 
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
 
 #define BR_T() \
        inst = BC1NEZ; \
@@ -1819,7 +1801,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
        flags = IS_BIT23_COND; \
        delay_check = FCSR_FCC;
 
-#else /* SLJIT_MIPS_REV < 6 */
+#else /* !SLJIT_MIPS_R6 */
 
 #define BR_T() \
        inst = BC1T | JUMP_LENGTH; \
@@ -1830,7 +1812,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
        flags = IS_BIT16_COND; \
        delay_check = FCSR_FCC;
 
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
 
 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
 {
@@ -2141,11 +2123,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co
        case SLJIT_GREATER_EQUAL_F64:
        case SLJIT_UNORDERED_F64:
        case SLJIT_ORDERED_F64:
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
+#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6)
                FAIL_IF(push_inst(compiler, MFC1 | TA(dst_ar) | FS(TMP_FREG3), dst_ar));
-#else /* SLJIT_MIPS_REV < 6 */
+#else /* !SLJIT_MIPS_R6 */
                FAIL_IF(push_inst(compiler, CFC1 | TA(dst_ar) | DA(FCSR_REG), dst_ar));
-#endif /* SLJIT_MIPS_REV >= 6 */
+#endif /* SLJIT_MIPS_R6 */
                FAIL_IF(push_inst(compiler, SRL | TA(dst_ar) | DA(dst_ar) | SH_IMM(23), dst_ar));
                FAIL_IF(push_inst(compiler, ANDI | SA(dst_ar) | TA(dst_ar) | IMM(1), dst_ar));
                src_ar = dst_ar;
@@ -2185,14 +2167,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil
        sljit_s32 dst_reg,
        sljit_s32 src, sljit_sw srcw)
 {
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
        sljit_ins ins;
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif
 
        CHECK_ERROR();
        CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));
 
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
 
        if (SLJIT_UNLIKELY(src & SLJIT_IMM)) {
 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
@@ -2249,9 +2231,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil
 
        return push_inst(compiler, ins | S(src) | D(dst_reg), DR(dst_reg));
 
-#else /* SLJIT_MIPS_REV < 1 */
+#else
        return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif
 }
 
 SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
index 590f91c2588d169e9efcad4b6156efd8a3da276d..e8275143153d09affc641c12bfbc7b1cec2c2efe 100644 (file)
@@ -626,10 +626,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
                return 1;
 #endif
 
-       /* A saved register is set to a zero value. */
-       case SLJIT_HAS_ZERO_REGISTER:
        case SLJIT_HAS_CLZ:
-       case SLJIT_HAS_PREFETCH:
                return 1;
 
        default:
@@ -1161,9 +1158,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile
 #else
                return push_inst(compiler, (op == SLJIT_DIV_UW ? DIVWU : DIVW) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1));
 #endif
-       case SLJIT_ENDBR:
-       case SLJIT_SKIP_FRAMES_BEFORE_RETURN:
-               return SLJIT_SUCCESS;
        }
 
        return SLJIT_SUCCESS;
@@ -1209,6 +1203,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile
        ADJUST_LOCAL_OFFSET(dst, dstw);
        ADJUST_LOCAL_OFFSET(src, srcw);
 
+       if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) {
+               if (op <= SLJIT_MOV_P && (src & SLJIT_MEM))
+                       return emit_prefetch(compiler, src, srcw);
+
+               return SLJIT_SUCCESS;
+       }
+
        op = GET_OPCODE(op);
        if ((src & SLJIT_IMM) && srcw == 0)
                src = TMP_ZERO;
@@ -1535,35 +1536,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile
        return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
-       sljit_s32 src, sljit_sw srcw)
-{
-       CHECK_ERROR();
-       CHECK(check_sljit_emit_op_src(compiler, op, src, srcw));
-       ADJUST_LOCAL_OFFSET(src, srcw);
-
-       switch (op) {
-       case SLJIT_FAST_RETURN:
-               if (FAST_IS_REG(src))
-                       FAIL_IF(push_inst(compiler, MTLR | S(src)));
-               else {
-                       FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_REG2, 0, TMP_REG1, 0, src, srcw));
-                       FAIL_IF(push_inst(compiler, MTLR | S(TMP_REG2)));
-               }
-
-               return push_inst(compiler, BLR);
-       case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN:
-               return SLJIT_SUCCESS;
-       case SLJIT_PREFETCH_L1:
-       case SLJIT_PREFETCH_L2:
-       case SLJIT_PREFETCH_L3:
-       case SLJIT_PREFETCH_ONCE:
-               return emit_prefetch(compiler, src, srcw);
-       }
-
-       return SLJIT_SUCCESS;
-}
-
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
 {
        CHECK_REG_INDEX(check_sljit_get_register_index(reg));
@@ -1882,6 +1854,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *
        return emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0);
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
+{
+       CHECK_ERROR();
+       CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
+       ADJUST_LOCAL_OFFSET(src, srcw);
+
+       if (FAST_IS_REG(src))
+               FAIL_IF(push_inst(compiler, MTLR | S(src)));
+       else {
+               FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_REG2, 0, TMP_REG1, 0, src, srcw));
+               FAIL_IF(push_inst(compiler, MTLR | S(TMP_REG2)));
+       }
+
+       return push_inst(compiler, BLR);
+}
+
 /* --------------------------------------------------------------------- */
 /*  Conditional instructions                                             */
 /* --------------------------------------------------------------------- */
index 7d6be6ca3c161aa3e031e6dce188ceb48724c072..bfa4ecede2f84258e41e24b9b82ddd55c505b354 100644 (file)
@@ -451,9 +451,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
                return 1;
 #endif
 
-       case SLJIT_HAS_ZERO_REGISTER:
-               return 1;
-
 #if (defined SLJIT_CONFIG_SPARC_64 && SLJIT_CONFIG_SPARC_64)
        case SLJIT_HAS_CMOV:
                return 1;
@@ -875,9 +872,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile
 #else
 #error "Implementation required"
 #endif
-       case SLJIT_ENDBR:
-       case SLJIT_SKIP_FRAMES_BEFORE_RETURN:
-               return SLJIT_SUCCESS;
        }
 
        return SLJIT_SUCCESS;
@@ -894,6 +888,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile
        ADJUST_LOCAL_OFFSET(dst, dstw);
        ADJUST_LOCAL_OFFSET(src, srcw);
 
+       if (dst == SLJIT_UNUSED && !HAS_FLAGS(op))
+               return SLJIT_SUCCESS;
+
        op = GET_OPCODE(op);
        switch (op) {
        case SLJIT_MOV:
@@ -974,33 +971,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile
        return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
-       sljit_s32 src, sljit_sw srcw)
-{
-       CHECK_ERROR();
-       CHECK(check_sljit_emit_op_src(compiler, op, src, srcw));
-       ADJUST_LOCAL_OFFSET(src, srcw);
-
-       switch (op) {
-       case SLJIT_FAST_RETURN:
-               if (FAST_IS_REG(src))
-                       FAIL_IF(push_inst(compiler, OR | D(TMP_LINK) | S1(0) | S2(src), DR(TMP_LINK)));
-               else
-                       FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_LINK, src, srcw));
-
-               FAIL_IF(push_inst(compiler, JMPL | D(0) | S1(TMP_LINK) | IMM(8), UNMOVABLE_INS));
-               return push_inst(compiler, NOP, UNMOVABLE_INS);
-       case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN:
-       case SLJIT_PREFETCH_L1:
-       case SLJIT_PREFETCH_L2:
-       case SLJIT_PREFETCH_L3:
-       case SLJIT_PREFETCH_ONCE:
-               return SLJIT_SUCCESS;
-       }
-
-       return SLJIT_SUCCESS;
-}
-
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
 {
        CHECK_REG_INDEX(check_sljit_get_register_index(reg));
@@ -1245,12 +1215,25 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *
        ADJUST_LOCAL_OFFSET(dst, dstw);
 
        if (FAST_IS_REG(dst))
-               return push_inst(compiler, OR | D(dst) | S1(0) | S2(TMP_LINK), UNMOVABLE_INS);
+               return push_inst(compiler, OR | D(dst) | S1(0) | S2(TMP_LINK), DR(dst));
 
        /* Memory. */
-       FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_LINK, dst, dstw));
-       compiler->delay_slot = UNMOVABLE_INS;
-       return SLJIT_SUCCESS;
+       return emit_op_mem(compiler, WORD_DATA, TMP_LINK, dst, dstw);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
+{
+       CHECK_ERROR();
+       CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
+       ADJUST_LOCAL_OFFSET(src, srcw);
+
+       if (FAST_IS_REG(src))
+               FAIL_IF(push_inst(compiler, OR | D(TMP_LINK) | S1(0) | S2(src), DR(TMP_LINK)));
+       else
+               FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_LINK, src, srcw));
+
+       FAIL_IF(push_inst(compiler, JMPL | D(0) | S1(TMP_LINK) | IMM(8), UNMOVABLE_INS));
+       return push_inst(compiler, NOP, UNMOVABLE_INS);
 }
 
 /* --------------------------------------------------------------------- */
index d69ecd6170759e5d8ed9842cfbfdac8572114aa3..003f43a79091dd7370953feb4e71aff3a13b8f0e 100644 (file)
@@ -1564,6 +1564,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *
        return emit_op_mem(compiler, WORD_DATA, RA, dst, dstw);
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
+{
+       CHECK_ERROR();
+       CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
+       ADJUST_LOCAL_OFFSET(src, srcw);
+
+       if (FAST_IS_REG(src))
+               FAIL_IF(ADD(RA, reg_map[src], ZERO));
+
+       else if (src & SLJIT_MEM)
+               FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RA, src, srcw));
+
+       else if (src & SLJIT_IMM)
+               FAIL_IF(load_immediate(compiler, RA, srcw));
+
+       return JR(RA);
+}
+
 static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, sljit_s32 dst, sljit_s32 src1, sljit_sw src2)
 {
        sljit_s32 overflow_ra = 0;
@@ -2166,9 +2184,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile
        case SLJIT_DIV_UW:
        case SLJIT_DIV_SW:
                SLJIT_UNREACHABLE();
-       case SLJIT_ENDBR:
-       case SLJIT_SKIP_FRAMES_BEFORE_RETURN:
-               return SLJIT_SUCCESS;
        }
 
        return SLJIT_SUCCESS;
@@ -2278,29 +2293,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile
        return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
-       sljit_s32 src, sljit_sw srcw)
-{
-       CHECK_ERROR();
-       CHECK(check_sljit_emit_op_src(compiler, op, src, srcw));
-       ADJUST_LOCAL_OFFSET(src, srcw);
-
-       switch (op) {
-       case SLJIT_FAST_RETURN:
-               if (FAST_IS_REG(src))
-                       FAIL_IF(ADD(RA, reg_map[src], ZERO));
-
-               else
-                       FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RA, src, srcw));
-
-               return JR(RA);
-       case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN:
-               return SLJIT_SUCCESS;
-       }
-
-       return SLJIT_SUCCESS;
-}
-
 SLJIT_API_FUNC_ATTRIBUTE struct sljit_label * sljit_emit_label(struct sljit_compiler *compiler)
 {
        struct sljit_label *label;
index 79a7e8bba59e5daec0bdc308431be8082dbbd556..34a3a3d940247ab513b8a2d2c283b1edd823b16a 100644 (file)
@@ -76,9 +76,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi
        CHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));
        set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);
 
-       /* Emit ENDBR32 at function entry if needed.  */
-       FAIL_IF(emit_endbranch(compiler));
-
        args = get_arg_count(arg_types);
        compiler->args = args;
 
@@ -310,11 +307,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *comp
                SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, compiler->local_size));
 #endif
 
-       size = 2 + (compiler->scratches > 9 ? (compiler->scratches - 9) : 0) +
+       size = 2 + (compiler->scratches > 7 ? (compiler->scratches - 7) : 0) +
                (compiler->saveds <= 3 ? compiler->saveds : 3);
 #if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
        if (compiler->args > 2)
                size += 2;
+#else
+       if (compiler->args > 0)
+               size += 2;
 #endif
        inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
        FAIL_IF(!inst);
@@ -367,8 +367,6 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_s32
        SLJIT_ASSERT((flags & (EX86_PREF_F2 | EX86_PREF_F3)) != (EX86_PREF_F2 | EX86_PREF_F3)
                && (flags & (EX86_PREF_F2 | EX86_PREF_66)) != (EX86_PREF_F2 | EX86_PREF_66)
                && (flags & (EX86_PREF_F3 | EX86_PREF_66)) != (EX86_PREF_F3 | EX86_PREF_66));
-       /* We don't support (%ebp). */
-       SLJIT_ASSERT(!(b & SLJIT_MEM) || immb || reg_map[b & REG_MASK] != 5);
 
        size &= 0xf;
        inst_size = size;
@@ -865,10 +863,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *
        return SLJIT_SUCCESS;
 }
 
-static sljit_s32 emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
 {
        sljit_u8 *inst;
 
+       CHECK_ERROR();
+       CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
+       ADJUST_LOCAL_OFFSET(src, srcw);
+
        CHECK_EXTRA_REGS(src, srcw, (void)0);
 
        if (FAST_IS_REG(src)) {
@@ -892,37 +894,3 @@ static sljit_s32 emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src
        RET();
        return SLJIT_SUCCESS;
 }
-
-static sljit_s32 skip_frames_before_return(struct sljit_compiler *compiler)
-{
-       sljit_s32 size, saved_size;
-       sljit_s32 has_f64_aligment;
-
-       /* Don't adjust shadow stack if it isn't enabled.  */
-       if (!cpu_has_shadow_stack ())
-               return SLJIT_SUCCESS;
-
-       SLJIT_ASSERT(compiler->args >= 0);
-       SLJIT_ASSERT(compiler->local_size > 0);
-
-#if !defined(__APPLE__)
-       has_f64_aligment = compiler->options & SLJIT_F64_ALIGNMENT;
-#else
-       has_f64_aligment = 0;
-#endif
-
-       size = compiler->local_size;
-       saved_size = (1 + (compiler->scratches > 9 ? (compiler->scratches - 9) : 0) + (compiler->saveds <= 3 ? compiler->saveds : 3)) * sizeof(sljit_uw);
-       if (has_f64_aligment) {
-               /* mov TMP_REG1, [esp + local_size].  */
-               EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), size);
-               /* mov TMP_REG1, [TMP_REG1+ saved_size].  */
-               EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(TMP_REG1), saved_size);
-               /* Move return address to [esp]. */
-               EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), 0, TMP_REG1, 0);
-               size = 0;
-       } else
-               size += saved_size;
-
-       return adjust_shadow_stack(compiler, SLJIT_UNUSED, 0, SLJIT_SP, size);
-}
index e85b56a61a50b0c6fc9666af5e980a1f872fe2b1..5758711954047bef243de23c85beb060b60eca7c 100644 (file)
@@ -135,9 +135,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi
        CHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));
        set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);
 
-       /* Emit ENDBR64 at function entry if needed.  */
-       FAIL_IF(emit_endbranch(compiler));
-
        compiler->mode32 = 0;
 
 #ifdef _WIN64
@@ -799,10 +796,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *
        return SLJIT_SUCCESS;
 }
 
-static sljit_s32 emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
 {
        sljit_u8 *inst;
 
+       CHECK_ERROR();
+       CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
+       ADJUST_LOCAL_OFFSET(src, srcw);
+
        if (FAST_IS_REG(src)) {
                if (reg_map[src] < 8) {
                        inst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 1);
@@ -897,22 +898,3 @@ static sljit_s32 emit_mov_int(struct sljit_compiler *compiler, sljit_s32 sign,
 
        return SLJIT_SUCCESS;
 }
-
-static sljit_s32 skip_frames_before_return(struct sljit_compiler *compiler)
-{
-       sljit_s32 tmp, size;
-
-       /* Don't adjust shadow stack if it isn't enabled.  */
-       if (!cpu_has_shadow_stack ())
-               return SLJIT_SUCCESS;
-
-       size = compiler->local_size;
-       tmp = compiler->scratches;
-       if (tmp >= SLJIT_FIRST_SAVED_REG)
-               size += (tmp - SLJIT_FIRST_SAVED_REG + 1) * sizeof(sljit_uw);
-       tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG;
-       if (SLJIT_S0 >= tmp)
-               size += (SLJIT_S0 - tmp + 1) * sizeof(sljit_uw);
-
-       return adjust_shadow_stack(compiler, SLJIT_UNUSED, 0, SLJIT_SP, size);
-}
index 74965e32515f232203e6e9f3834bc604af1d1f14..6296da538225191d6d24bab3d8a7e904b14e829a 100644 (file)
@@ -657,9 +657,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
                        get_cpu_features();
                return cpu_has_cmov;
 
-       case SLJIT_HAS_PREFETCH:
-               return 1;
-
        case SLJIT_HAS_SSE2:
 #if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2)
                if (cpu_has_sse2 == -1)
@@ -705,171 +702,6 @@ static SLJIT_INLINE sljit_s32 emit_sse2_store(struct sljit_compiler *compiler,
 static SLJIT_INLINE sljit_s32 emit_sse2_load(struct sljit_compiler *compiler,
        sljit_s32 single, sljit_s32 dst, sljit_s32 src, sljit_sw srcw);
 
-static sljit_s32 emit_cmp_binary(struct sljit_compiler *compiler,
-       sljit_s32 src1, sljit_sw src1w,
-       sljit_s32 src2, sljit_sw src2w);
-
-static SLJIT_INLINE sljit_s32 emit_endbranch(struct sljit_compiler *compiler)
-{
-#if (defined SLJIT_CONFIG_X86_CET && SLJIT_CONFIG_X86_CET)
-       /* Emit endbr32/endbr64 when CET is enabled.  */
-       sljit_u8 *inst;
-       inst = (sljit_u8*)ensure_buf(compiler, 1 + 4);
-       FAIL_IF(!inst);
-       INC_SIZE(4);
-       *inst++ = 0xf3;
-       *inst++ = 0x0f;
-       *inst++ = 0x1e;
-#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-       *inst = 0xfb;
-#else
-       *inst = 0xfa;
-#endif
-#else
-       SLJIT_UNUSED_ARG(compiler);
-#endif
-       return SLJIT_SUCCESS;
-}
-
-static SLJIT_INLINE sljit_s32 emit_rdssp(struct sljit_compiler *compiler, sljit_s32 reg)
-{
-#if (defined SLJIT_CONFIG_X86_CET && SLJIT_CONFIG_X86_CET)
-       sljit_u8 *inst;
-       sljit_s32 size;
-
-#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-       size = 5;
-#else
-       size = 4;
-#endif
-
-       inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
-       FAIL_IF(!inst);
-       INC_SIZE(size);
-       *inst++ = 0xf3;
-#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-       *inst++ = REX_W | (reg_map[reg] <= 7 ? 0 : REX_B);
-#endif
-       *inst++ = 0x0f;
-       *inst++ = 0x1e;
-       *inst = (0x3 << 6) | (0x1 << 3) | (reg_map[reg] & 0x7);
-#else
-       SLJIT_UNUSED_ARG(compiler);
-       SLJIT_UNUSED_ARG(reg);
-#endif
-       return SLJIT_SUCCESS;
-}
-
-static SLJIT_INLINE sljit_s32 emit_incssp(struct sljit_compiler *compiler, sljit_s32 reg)
-{
-#if (defined SLJIT_CONFIG_X86_CET && SLJIT_CONFIG_X86_CET)
-       sljit_u8 *inst;
-       sljit_s32 size;
-
-#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-       size = 5;
-#else
-       size = 4;
-#endif
-
-       inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
-       FAIL_IF(!inst);
-       INC_SIZE(size);
-       *inst++ = 0xf3;
-#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-       *inst++ = REX_W | (reg_map[reg] <= 7 ? 0 : REX_B);
-#endif
-       *inst++ = 0x0f;
-       *inst++ = 0xae;
-       *inst = (0x3 << 6) | (0x5 << 3) | (reg_map[reg] & 0x7);
-#else
-       SLJIT_UNUSED_ARG(compiler);
-       SLJIT_UNUSED_ARG(reg);
-#endif
-       return SLJIT_SUCCESS;
-}
-
-static SLJIT_INLINE sljit_s32 cpu_has_shadow_stack(void)
-{
-#if (defined SLJIT_CONFIG_X86_CET && SLJIT_CONFIG_X86_CET)
-       return _get_ssp() != 0;
-#else
-       return 0;
-#endif
-}
-
-static SLJIT_INLINE sljit_s32 adjust_shadow_stack(struct sljit_compiler *compiler,
-       sljit_s32 src, sljit_sw srcw, sljit_s32 base, sljit_sw disp)
-{
-#if (defined SLJIT_CONFIG_X86_CET && SLJIT_CONFIG_X86_CET)
-       sljit_u8 *inst;
-
-       sljit_s32 size_before_rdssp_inst = compiler->size;
-
-       /* Generate "RDSSP TMP_REG1". */
-       FAIL_IF(emit_rdssp(compiler, TMP_REG1));
-
-       /* Load return address on shadow stack into TMP_REG1. */
-#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-       SLJIT_ASSERT(reg_map[TMP_REG1] == 5);
-
-       /* Hand code unsupported "mov 0x0(%ebp),%ebp". */
-       inst = (sljit_u8*)ensure_buf(compiler, 1 + 3);
-       FAIL_IF(!inst);
-       INC_SIZE(3);
-       *inst++ = 0x8b;
-       *inst++ = 0x6d;
-       *inst = 0;
-#else /* !SLJIT_CONFIG_X86_32 */
-       EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(TMP_REG1), 0);
-#endif /* SLJIT_CONFIG_X86_32 */
-
-       if (src == SLJIT_UNUSED) {
-               /* Return address is on stack.  */
-               src = SLJIT_MEM1(base);
-               srcw = disp;
-       }
-
-       /* Compare return address against TMP_REG1. */
-       FAIL_IF(emit_cmp_binary (compiler, TMP_REG1, 0, src, srcw));
-
-       /* Generate JZ to skip shadow stack ajdustment when shadow
-          stack matches normal stack. */
-       inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
-       FAIL_IF(!inst);
-       INC_SIZE(2);
-       *inst++ = get_jump_code(SLJIT_EQUAL) - 0x10;
-       sljit_uw size_jz_after_cmp_inst = compiler->size;
-       sljit_u8 *jz_after_cmp_inst = inst;
-
-#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-       /* REX_W is not necessary. */
-       compiler->mode32 = 1;
-#endif
-       /* Load 1 into TMP_REG1. */
-       EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, 1);
-
-       /* Generate "INCSSP TMP_REG1". */
-       FAIL_IF(emit_incssp(compiler, TMP_REG1));
-
-       /* Jump back to "RDSSP TMP_REG1" to check shadow stack again. */
-       inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
-       FAIL_IF(!inst);
-       INC_SIZE(2);
-       *inst++ = JMP_i8;
-       *inst = size_before_rdssp_inst - compiler->size;
-
-       *jz_after_cmp_inst = compiler->size - size_jz_after_cmp_inst;
-#else /* SLJIT_CONFIG_X86_CET */
-       SLJIT_UNUSED_ARG(compiler);
-       SLJIT_UNUSED_ARG(src);
-       SLJIT_UNUSED_ARG(srcw);
-       SLJIT_UNUSED_ARG(base);
-       SLJIT_UNUSED_ARG(disp);
-#endif /* SLJIT_CONFIG_X86_CET */
-       return SLJIT_SUCCESS;
-}
-
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 #include "sljitNativeX86_32.c"
 #else
@@ -1073,10 +905,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile
                        EMIT_MOV(compiler, SLJIT_R1, 0, TMP_REG1, 0);
 #endif
                break;
-       case SLJIT_ENDBR:
-               return emit_endbranch(compiler);
-       case SLJIT_SKIP_FRAMES_BEFORE_RETURN:
-               return skip_frames_before_return(compiler);
        }
 
        return SLJIT_SUCCESS;
@@ -1246,12 +1074,12 @@ static sljit_s32 emit_prefetch(struct sljit_compiler *compiler, sljit_s32 op,
        *inst++ = GROUP_0F;
        *inst++ = PREFETCH;
 
-       if (op == SLJIT_PREFETCH_L1)
-               *inst |= (1 << 3);
-       else if (op == SLJIT_PREFETCH_L2)
-               *inst |= (2 << 3);
-       else if (op == SLJIT_PREFETCH_L3)
+       if (op >= SLJIT_MOV_U8 && op <= SLJIT_MOV_S8)
                *inst |= (3 << 3);
+       else if (op >= SLJIT_MOV_U16 && op <= SLJIT_MOV_S16)
+               *inst |= (2 << 3);
+       else
+               *inst |= (1 << 3);
 
        return SLJIT_SUCCESS;
 }
@@ -1456,6 +1284,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile
        compiler->mode32 = op_flags & SLJIT_I32_OP;
 #endif
 
+       if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) {
+               if (op <= SLJIT_MOV_P && (src & SLJIT_MEM))
+                       return emit_prefetch(compiler, op, src, srcw);
+               return SLJIT_SUCCESS;
+       }
+
        op = GET_OPCODE(op);
 
        if (op >= SLJIT_MOV && op <= SLJIT_MOV_P) {
@@ -2316,10 +2150,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile
                if (!HAS_FLAGS(op)) {
                        if ((src2 & SLJIT_IMM) && emit_lea_binary(compiler, dst, dstw, src1, src1w, SLJIT_IMM, -src2w) != SLJIT_ERR_UNSUPPORTED)
                                return compiler->error;
-                       if (SLOW_IS_REG(dst) && src2 == dst) {
-                               FAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), dst, 0, dst, 0, src1, src1w));
-                               return emit_unary(compiler, NEG_rm, dst, 0, dst, 0);
-                       }
                }
 
                if (dst == SLJIT_UNUSED)
@@ -2356,33 +2186,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile
        return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
-       sljit_s32 src, sljit_sw srcw)
-{
-       CHECK_ERROR();
-       CHECK(check_sljit_emit_op_src(compiler, op, src, srcw));
-       ADJUST_LOCAL_OFFSET(src, srcw);
-
-       CHECK_EXTRA_REGS(src, srcw, (void)0);
-
-       switch (op) {
-       case SLJIT_FAST_RETURN:
-               return emit_fast_return(compiler, src, srcw);
-       case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN:
-               /* Don't adjust shadow stack if it isn't enabled.  */
-               if (!cpu_has_shadow_stack ())
-                       return SLJIT_SUCCESS;
-               return adjust_shadow_stack(compiler, src, srcw, SLJIT_UNUSED, 0);
-       case SLJIT_PREFETCH_L1:
-       case SLJIT_PREFETCH_L2:
-       case SLJIT_PREFETCH_L3:
-       case SLJIT_PREFETCH_ONCE:
-               return emit_prefetch(compiler, op, src, srcw);
-       }
-
-       return SLJIT_SUCCESS;
-}
-
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
 {
        CHECK_REG_INDEX(check_sljit_get_register_index(reg));
index 3f412fe68f7932395156bdde40a294df529199cc..8a5b2b3cfe699801358aa914e9a49885d3c24006 100644 (file)
@@ -70,6 +70,7 @@
 
 struct chunk_header {
        void *executable;
+       int fd;
 };
 
 /*
@@ -95,20 +96,8 @@ struct chunk_header {
 #endif
 #endif
 
-#if !(defined(__NetBSD__) && defined(MAP_REMAPDUP))
 int mkostemp(char *template, int flags);
-
-#ifdef __NetBSD__
-/*
- * this is a workaround for NetBSD < 8 that lacks a system provided
- * secure_getenv function.
- * ideally this should never be used, as the standard allocator is
- * a preferred option for those systems and should be used instead.
- */
-#define secure_getenv(name) issetugid() ?  NULL : getenv(name)
-#else
 char *secure_getenv(const char *name);
-#endif
 
 static SLJIT_INLINE int create_tempfile(void)
 {
@@ -119,13 +108,6 @@ static SLJIT_INLINE int create_tempfile(void)
        char *dir;
        size_t len;
 
-#ifdef HAVE_MEMFD_CREATE
-       /* this is a GNU extension, make sure to use -D_GNU_SOURCE */
-       fd = memfd_create("sljit", MFD_CLOEXEC);
-       if (fd != -1)
-               return fd;
-#endif
-
 #ifdef P_tmpdir
        len = (P_tmpdir != NULL) ? strlen(P_tmpdir) : 0;
 
@@ -143,7 +125,6 @@ static SLJIT_INLINE int create_tempfile(void)
 #endif
 
        dir = secure_getenv("TMPDIR");
-
        if (dir) {
                len = strlen(dir);
                if (len > 0 && len < sizeof(tmp_name)) {
@@ -208,50 +189,23 @@ static SLJIT_INLINE struct chunk_header* alloc_chunk(sljit_uw size)
        retval->executable = mmap(NULL, size, PROT_READ | PROT_EXEC, MAP_SHARED, fd, 0);
 
        if (retval->executable == MAP_FAILED) {
-               munmap((void *)retval, size);
+               munmap(retval, size);
                close(fd);
                return NULL;
        }
 
-       close(fd);
-       return retval;
-}
-#else
-static SLJIT_INLINE struct chunk_header* alloc_chunk(sljit_uw size)
-{
-       struct chunk_header *retval;
-       void *maprx;
-
-       retval = (struct chunk_header *)mmap(NULL, size,
-                       PROT_MPROTECT(PROT_EXEC|PROT_WRITE|PROT_READ),
-                       MAP_ANON, -1, 0);
-
-       if (retval == MAP_FAILED)
-               return NULL;
-
-       maprx = mremap(retval, size, NULL, size, MAP_REMAPDUP);
-       if (maprx == MAP_FAILED) {
-               munmap((void *)retval, size);
-               return NULL;
-       }
-
-       if (mprotect(retval, size, PROT_READ | PROT_WRITE) == -1 ||
-               mprotect(maprx, size, PROT_READ | PROT_EXEC) == -1) {
-               munmap(maprx, size);
-               munmap((void *)retval, size);
-               return NULL;
-       }
-       retval->executable = maprx;
+       retval->fd = fd;
        return retval;
 }
-#endif /* NetBSD >= 8 */
 
 static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size)
 {
        struct chunk_header *header = ((struct chunk_header *)chunk) - 1;
 
+       int fd = header->fd;
        munmap(header->executable, size);
-       munmap((void *)header, size);
+       munmap(header, size);
+       close(fd);
 }
 
 /* --------------------------------------------------------------------- */
@@ -431,9 +385,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr)
                if (total_size - free_block->size > (allocated_size * 3 / 2)) {
                        total_size -= free_block->size;
                        sljit_remove_free_block(free_block);
-                       free_chunk(free_block, free_block->size +
-                               sizeof(struct chunk_header) +
-                               sizeof(struct block_header));
+                       free_chunk(free_block, free_block->size + sizeof(struct block_header));
                }
        }
 
@@ -454,9 +406,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void)
                                AS_BLOCK_HEADER(free_block, free_block->size)->size == 1) {
                        total_size -= free_block->size;
                        sljit_remove_free_block(free_block);
-                       free_chunk(free_block, free_block->size +
-                               sizeof(struct chunk_header) +
-                               sizeof(struct block_header));
+                       free_chunk(free_block, free_block->size + sizeof(struct block_header));
                }
                free_block = next_free_block;
        }
index 0276fa1b8b8d43ae5e8617c19b37061ae26ea6d5..857492a174811450e0db613429a4c04a51e38261 100644 (file)
@@ -152,23 +152,15 @@ SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_release_lock(void)
 
 #ifdef _WIN32
 #include "windows.h"
-#else /* !_WIN32 */
+#else
 /* Provides mmap function. */
 #include <sys/types.h>
 #include <sys/mman.h>
-
 #ifndef MAP_ANON
 #ifdef MAP_ANONYMOUS
 #define MAP_ANON MAP_ANONYMOUS
-#endif /* MAP_ANONYMOUS */
-#endif /* !MAP_ANON */
-
-#ifndef MADV_DONTNEED
-#ifdef POSIX_MADV_DONTNEED
-#define MADV_DONTNEED POSIX_MADV_DONTNEED
-#endif /* POSIX_MADV_DONTNEED */
-#endif /* !MADV_DONTNEED */
-
+#endif
+#endif
 /* For detecting the page size. */
 #include <unistd.h>
 
@@ -206,85 +198,35 @@ static SLJIT_INLINE sljit_s32 open_dev_zero(void)
 
 #endif /* SLJIT_SINGLE_THREADED */
 
-#endif /* !MAP_ANON */
+#endif
 
-#endif /* _WIN32 */
+#endif
 
 #endif /* SLJIT_UTIL_STACK || SLJIT_EXECUTABLE_ALLOCATOR */
 
-#endif /* SLJIT_EXECUTABLE_ALLOCATOR || SLJIT_UTIL_GLOBAL_LOCK */
-
 #if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK)
 
-#if (defined SLJIT_UTIL_SIMPLE_STACK_ALLOCATION && SLJIT_UTIL_SIMPLE_STACK_ALLOCATION)
+/* Planning to make it even more clever in the future. */
+static sljit_sw sljit_page_align = 0;
 
 SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_FUNC sljit_allocate_stack(sljit_uw start_size, sljit_uw max_size, void *allocator_data)
 {
        struct sljit_stack *stack;
        void *ptr;
+#ifdef _WIN32
+       SYSTEM_INFO si;
+#endif
 
        SLJIT_UNUSED_ARG(allocator_data);
-
        if (start_size > max_size || start_size < 1)
                return NULL;
 
-       stack = (struct sljit_stack*)SLJIT_MALLOC(sizeof(struct sljit_stack), allocator_data);
-       if (stack == NULL)
-               return NULL;
-
-       ptr = SLJIT_MALLOC(max_size, allocator_data);
-       if (ptr == NULL) {
-               SLJIT_FREE(stack, allocator_data);
-               return NULL;
-       }
-
-       stack->min_start = (sljit_u8 *)ptr;
-       stack->end = stack->min_start + max_size;
-       stack->start = stack->end - start_size;
-       stack->top = stack->end;
-       return stack;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_free_stack(struct sljit_stack *stack, void *allocator_data)
-{
-       SLJIT_UNUSED_ARG(allocator_data);
-       SLJIT_FREE((void*)stack->min_start, allocator_data);
-       SLJIT_FREE(stack, allocator_data);
-}
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_u8 *SLJIT_FUNC sljit_stack_resize(struct sljit_stack *stack, sljit_u8 *new_start)
-{
-       if ((new_start < stack->min_start) || (new_start >= stack->end))
-               return NULL;
-       stack->start = new_start;
-       return new_start;
-}
-
-#else /* !SLJIT_UTIL_SIMPLE_STACK_ALLOCATION */
-
 #ifdef _WIN32
-
-SLJIT_INLINE static sljit_sw get_page_alignment(void) {
-       SYSTEM_INFO si;
-       static sljit_sw sljit_page_align;
        if (!sljit_page_align) {
                GetSystemInfo(&si);
                sljit_page_align = si.dwPageSize - 1;
        }
-       return sljit_page_align;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_free_stack(struct sljit_stack *stack, void *allocator_data)
-{
-       SLJIT_UNUSED_ARG(allocator_data);
-       VirtualFree((void*)stack->min_start, 0, MEM_RELEASE);
-       SLJIT_FREE(stack, allocator_data);
-}
-
-#else /* ! defined _WIN32 */
-
-SLJIT_INLINE static sljit_sw get_page_alignment(void) {
-       static sljit_sw sljit_page_align;
+#else
        if (!sljit_page_align) {
                sljit_page_align = sysconf(_SC_PAGESIZE);
                /* Should never happen. */
@@ -292,36 +234,14 @@ SLJIT_INLINE static sljit_sw get_page_alignment(void) {
                        sljit_page_align = 4096;
                sljit_page_align--;
        }
-       return sljit_page_align;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_free_stack(struct sljit_stack *stack, void *allocator_data)
-{
-       SLJIT_UNUSED_ARG(allocator_data);
-       munmap((void*)stack->min_start, stack->end - stack->min_start);
-       SLJIT_FREE(stack, allocator_data);
-}
-
-#endif /* defined _WIN32 */
-
-SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_FUNC sljit_allocate_stack(sljit_uw start_size, sljit_uw max_size, void *allocator_data)
-{
-       struct sljit_stack *stack;
-       void *ptr;
-       sljit_sw page_align;
-
-       SLJIT_UNUSED_ARG(allocator_data);
-
-       if (start_size > max_size || start_size < 1)
-               return NULL;
+#endif
 
        stack = (struct sljit_stack*)SLJIT_MALLOC(sizeof(struct sljit_stack), allocator_data);
-       if (stack == NULL)
+       if (!stack)
                return NULL;
 
        /* Align max_size. */
-       page_align = get_page_alignment();
-       max_size = (max_size + page_align) & ~page_align;
+       max_size = (max_size + sljit_page_align) & ~sljit_page_align;
 
 #ifdef _WIN32
        ptr = VirtualAlloc(NULL, max_size, MEM_RESERVE, PAGE_READWRITE);
@@ -338,18 +258,18 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_FUNC sljit_allocate_stack(slj
                sljit_free_stack(stack, allocator_data);
                return NULL;
        }
-#else /* !_WIN32 */
+#else
 #ifdef MAP_ANON
        ptr = mmap(NULL, max_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
-#else /* !MAP_ANON */
+#else
        if (dev_zero < 0) {
-               if (open_dev_zero() != 0) {
+               if (open_dev_zero()) {
                        SLJIT_FREE(stack, allocator_data);
                        return NULL;
                }
        }
        ptr = mmap(NULL, max_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, dev_zero, 0);
-#endif /* MAP_ANON */
+#endif
        if (ptr == MAP_FAILED) {
                SLJIT_FREE(stack, allocator_data);
                return NULL;
@@ -357,28 +277,35 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_FUNC sljit_allocate_stack(slj
        stack->min_start = (sljit_u8 *)ptr;
        stack->end = stack->min_start + max_size;
        stack->start = stack->end - start_size;
-#endif /* _WIN32 */
-
+#endif
        stack->top = stack->end;
        return stack;
 }
 
+#undef PAGE_ALIGN
+
+SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_free_stack(struct sljit_stack *stack, void *allocator_data)
+{
+       SLJIT_UNUSED_ARG(allocator_data);
+#ifdef _WIN32
+       VirtualFree((void*)stack->min_start, 0, MEM_RELEASE);
+#else
+       munmap((void*)stack->min_start, stack->end - stack->min_start);
+#endif
+       SLJIT_FREE(stack, allocator_data);
+}
+
 SLJIT_API_FUNC_ATTRIBUTE sljit_u8 *SLJIT_FUNC sljit_stack_resize(struct sljit_stack *stack, sljit_u8 *new_start)
 {
-#if defined _WIN32 || defined(MADV_DONTNEED)
        sljit_uw aligned_old_start;
        sljit_uw aligned_new_start;
-       sljit_sw page_align;
-#endif
 
        if ((new_start < stack->min_start) || (new_start >= stack->end))
                return NULL;
 
 #ifdef _WIN32
-       page_align = get_page_alignment();
-
-       aligned_new_start = (sljit_uw)new_start & ~page_align;
-       aligned_old_start = ((sljit_uw)stack->start) & ~page_align;
+       aligned_new_start = (sljit_uw)new_start & ~sljit_page_align;
+       aligned_old_start = ((sljit_uw)stack->start) & ~sljit_page_align;
        if (aligned_new_start != aligned_old_start) {
                if (aligned_new_start < aligned_old_start) {
                        if (!VirtualAlloc((void*)aligned_new_start, aligned_old_start - aligned_new_start, MEM_COMMIT, PAGE_READWRITE))
@@ -389,22 +316,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_u8 *SLJIT_FUNC sljit_stack_resize(struct sljit_st
                                return NULL;
                }
        }
-#elif defined(MADV_DONTNEED)
+#else
        if (stack->start < new_start) {
-               page_align = get_page_alignment();
-
-               aligned_new_start = (sljit_uw)new_start & ~page_align;
-               aligned_old_start = ((sljit_uw)stack->start) & ~page_align;
+               aligned_new_start = (sljit_uw)new_start & ~sljit_page_align;
+               aligned_old_start = ((sljit_uw)stack->start) & ~sljit_page_align;
                /* If madvise is available, we release the unnecessary space. */
+#if defined(MADV_DONTNEED)
                if (aligned_new_start > aligned_old_start)
                        madvise((void*)aligned_old_start, aligned_new_start - aligned_old_start, MADV_DONTNEED);
+#elif defined(POSIX_MADV_DONTNEED)
+               if (aligned_new_start > aligned_old_start)
+                       posix_madvise((void*)aligned_old_start, aligned_new_start - aligned_old_start, POSIX_MADV_DONTNEED);
+#endif
        }
-#endif /* _WIN32 */
-
+#endif
        stack->start = new_start;
        return new_start;
 }
 
-#endif /* SLJIT_UTIL_SIMPLE_STACK_ALLOCATION */
-
 #endif /* SLJIT_UTIL_STACK */
+
+#endif