The data for the Unicode character mirroring was not up-to-date, because
the data table was fixed in the code. But new mirroring pairs were added
in Unicode 5.0.0 (10), 5.1.0 (5), 6.1.0 (1), 11.1.0 (28), 14.0.0 (4).

This patch fixes it.


2024-02-23  Bruno Haible  <br...@clisp.org>

        unictype/mirror: Update to Unicode 15.1.0.
        Reported by Daurnimator <q...@daurnimator.com> in
        
<https://lists.gnu.org/archive/html/bug-libunistring/2016-11/msg00010.html>.
        * lib/gen-uni-tables.c (struct mirror_pair): New type.
        (mirror_pairs): Don't initialize statically.
        (mirror_pairs_count): New variable.
        (fill_mirror): New function.
        (get_mirror_value): Update.
        (main): Expect the file name of BidiMirroring.txt as command-line
        argument. Invoke fill_mirror.
        * lib/unictype/mirror.h: Regenerated.

diff --git a/lib/gen-uni-tables.c b/lib/gen-uni-tables.c
index 90d33abab1..3ebcd833ff 100644
--- a/lib/gen-uni-tables.c
+++ b/lib/gen-uni-tables.c
@@ -26,6 +26,7 @@
                       
/usr/local/share/www.unicode.org/Public/15.1.0/ucd/Scripts.txt \
                       
/usr/local/share/www.unicode.org/Public/15.1.0/ucd/Blocks.txt \
                       
/usr/local/share/www.unicode.org/Public/3.0-Update1/PropList-3.0.1.txt \
+                      
/usr/local/share/www.unicode.org/Public/15.1.0/ucd/BidiMirroring.txt \
                       
/usr/local/share/www.unicode.org/Public/15.1.0/ucd/EastAsianWidth.txt \
                       
/usr/local/share/www.unicode.org/Public/15.1.0/ucd/LineBreak.txt \
                       
/usr/local/share/www.unicode.org/Public/15.1.0/ucd/auxiliary/WordBreakProperty.txt
 \
@@ -2440,63 +2441,167 @@ output_numeric (const char *filename, const char 
*version)
 /* See Unicode 3.0 book, section 4.7,
        UAX #9.  */
 
-/* List of mirrored character pairs.  This is a subset of the characters
-   having the BidiMirrored property.  */
-static unsigned int mirror_pairs[][2] =
-{
-  { 0x0028, 0x0029 },
-  { 0x003C, 0x003E },
-  { 0x005B, 0x005D },
-  { 0x007B, 0x007D },
-  { 0x00AB, 0x00BB },
-  { 0x2039, 0x203A },
-  { 0x2045, 0x2046 },
-  { 0x207D, 0x207E },
-  { 0x208D, 0x208E },
-  { 0x2208, 0x220B },
-  { 0x220A, 0x220D },
-  { 0x223C, 0x223D },
-  { 0x2243, 0x22CD },
-  { 0x2252, 0x2253 },
-  { 0x2254, 0x2255 },
-  { 0x2264, 0x2265 },
-  { 0x2266, 0x2267 },
-  { 0x226A, 0x226B },
-  { 0x2276, 0x2277 },
-  { 0x2278, 0x2279 },
-  { 0x227A, 0x227B },
-  { 0x227C, 0x227D },
-  { 0x2282, 0x2283 },
-  { 0x2286, 0x2287 },
-  { 0x228F, 0x2290 },
-  { 0x2291, 0x2292 },
-  { 0x22A2, 0x22A3 },
-  { 0x22B0, 0x22B1 },
-  { 0x22B2, 0x22B3 },
-  { 0x22B4, 0x22B5 },
-  { 0x22B6, 0x22B7 },
-  { 0x22C9, 0x22CA },
-  { 0x22CB, 0x22CC },
-  { 0x22D0, 0x22D1 },
-  { 0x22D6, 0x22D7 },
-  { 0x22D8, 0x22D9 },
-  { 0x22DA, 0x22DB },
-  { 0x22DC, 0x22DD },
-  { 0x22DE, 0x22DF },
-  { 0x22F0, 0x22F1 },
-  { 0x2308, 0x2309 },
-  { 0x230A, 0x230B },
-  { 0x2329, 0x232A },
-  { 0x3008, 0x3009 },
-  { 0x300A, 0x300B },
-  { 0x300C, 0x300D },
-  { 0x300E, 0x300F },
-  { 0x3010, 0x3011 },
-  { 0x3014, 0x3015 },
-  { 0x3016, 0x3017 },
-  { 0x3018, 0x3019 },
-  { 0x301A, 0x301B }
-};
+/* A pair of mirrored characters.  */
+struct mirror_pair { unsigned int uc[2]; };
+
+/* List of mirrored character pairs, from the BidiMirroring.txt file.
+   This is a subset of the characters having the BidiMirrored property.  */
+static struct mirror_pair mirror_pairs[1000];
+static unsigned int mirror_pairs_count;
+
+/* Stores in mirror_pairs[] the mirrored character pairs from the
+   BidiMirroring.txt file.  */
+static void
+fill_mirror (const char *bidimirroring_filename)
+{
+  FILE *stream;
+  char field0[FIELDLEN];
+  char field1[FIELDLEN];
+  char field2[FIELDLEN];
+  int lineno = 0;
+
+  stream = fopen (bidimirroring_filename, "r");
+  if (stream == NULL)
+    {
+      fprintf (stderr, "error during fopen of '%s'\n", bidimirroring_filename);
+      exit (1);
+    }
+
+  mirror_pairs_count = 0;
+  for (;;)
+    {
+      int n;
+      int c;
+      unsigned int uc1;
+      unsigned int uc2;
+      unsigned int i;
+
+      lineno++;
+      c = getc (stream);
+      if (c == EOF)
+        break;
+      if (c == '\n')
+        continue;
+      if (c == '#')
+        {
+          do c = getc (stream); while (c != EOF && c != '\n');
+          continue;
+        }
+      ungetc (c, stream);
+      n = getfield (stream, field0, ';');
+      do c = getc (stream); while (c == ' ');
+      ungetc (c, stream);
+      n += getfield (stream, field1, '#');
+      n += getfield (stream, field2, '\n');
+      if (n == 0)
+        break;
+      if (n != 3)
+        {
+          fprintf (stderr, "short line in '%s':%d\n",
+                   bidimirroring_filename, lineno);
+          exit (1);
+        }
+      /* Remove trailing spaces from field1.  */
+      while (strlen (field1) > 0 && field1[strlen (field1) - 1] == ' ')
+        field1[strlen (field1) - 1] = '\0';
+      /* The line should contain two characters.  */
+      uc1 = strtoul (field0, NULL, 16);
+      uc2 = strtoul (field1, NULL, 16);
+      if (uc1 == 0 || uc2 == 0 || uc1 == uc2)
+        {
+          fprintf (stderr, "parse error at '%s':%d\n",
+                   bidimirroring_filename, lineno);
+          exit (1);
+        }
+      /* Verify that uc1 and uc2 are in range.  */
+      if (!(uc1 < 0x110000))
+        {
+          fprintf (stderr, "%s mentions 0x%04X, which is out-of-range.\n",
+                   bidimirroring_filename, uc1);
+          exit (1);
+        }
+      if (!(uc2 < 0x110000))
+        {
+          fprintf (stderr, "%s mentions 0x%04X, which is out-of-range.\n",
+                   bidimirroring_filename, uc2);
+          exit (1);
+        }
+      /* Have we seen uc1 or uc2 already?  */
+      for (i = 0; i < mirror_pairs_count; i++)
+        {
+          if (uc1 == mirror_pairs[i].uc[0])
+            {
+              fprintf (stderr, "%s: mapping conflict for 0x%04X\n",
+                       bidimirroring_filename, uc1);
+              exit (1);
+            }
+          if (uc2 == mirror_pairs[i].uc[1])
+            {
+              fprintf (stderr, "%s: mapping conflict for 0x%04X\n",
+                       bidimirroring_filename, uc2);
+              exit (1);
+            }
+        }
+      for (i = 0; i < mirror_pairs_count; i++)
+        if (uc1 == mirror_pairs[i].uc[1] || uc2 == mirror_pairs[i].uc[0])
+          break;
+      if (i < mirror_pairs_count)
+        {
+          if (uc1 != mirror_pairs[i].uc[1])
+            {
+              /* uc1 != mirror_pairs[i].uc[1], uc2 == mirror_pairs[i].uc[0] */
+              fprintf (stderr, "%s: mapping conflict for 0x%04X\n",
+                       bidimirroring_filename, uc2);
+              exit (1);
+            }
+          if (uc2 != mirror_pairs[i].uc[0])
+            {
+              /* uc1 == mirror_pairs[i].uc[1], uc2 != mirror_pairs[i].uc[0] */
+              fprintf (stderr, "%s: mapping conflict for 0x%04X\n",
+                       bidimirroring_filename, uc1);
+              exit (1);
+            }
+          /* uc1 == mirror_pairs[i].uc[1], uc2 == mirror_pairs[i].uc[0].
+             (uc1, uc2) is the reverse pair of a pair that we already had
+             encountered: (uc2, uc1).  */
+        }
+      else
+        {
+          /* A new pair.  */
+          if (mirror_pairs_count == SIZEOF (mirror_pairs))
+            {
+              fprintf (stderr, "%s contains more pairs than expected, "
+                       "increase mirror_pairs' size.\n",
+                       bidimirroring_filename);
+              exit (1);
+            }
+          mirror_pairs[mirror_pairs_count].uc[0] = uc1;
+          mirror_pairs[mirror_pairs_count].uc[1] = uc2;
+          mirror_pairs_count++;
+        }
+      /* Verify that uc1 and uc2 have the BidiMirrored property.  */
+      if (!(unicode_attributes[uc1].name != NULL
+            && unicode_attributes[uc1].mirrored))
+        {
+          fprintf (stderr, "%s mentions 0x%04X, which is not BidiMirrored\n",
+                           bidimirroring_filename, uc1);
+          exit (1);
+        }
+      if (!(unicode_attributes[uc2].name != NULL
+            && unicode_attributes[uc2].mirrored))
+        {
+          fprintf (stderr, "%s mentions 0x%04X, which is not BidiMirrored\n",
+                           bidimirroring_filename, uc2);
+          exit (1);
+        }
+    }
+
+  if (ferror (stream) || fclose (stream))
+    {
+      fprintf (stderr, "error reading from '%s'\n", bidimirroring_filename);
+      exit (1);
+    }
+}
 
 static int
 get_mirror_value (unsigned int ch)
@@ -2508,15 +2613,15 @@ get_mirror_value (unsigned int ch)
   mirrored = (unicode_attributes[ch].name != NULL
               && unicode_attributes[ch].mirrored);
   mirror_char = 0xfffd;
-  for (i = 0; i < sizeof (mirror_pairs) / sizeof (mirror_pairs[0]); i++)
-    if (ch == mirror_pairs[i][0])
+  for (i = 0; i < mirror_pairs_count; i++)
+    if (ch == mirror_pairs[i].uc[0])
       {
-        mirror_char = mirror_pairs[i][1];
+        mirror_char = mirror_pairs[i].uc[1];
         break;
       }
-    else if (ch == mirror_pairs[i][1])
+    else if (ch == mirror_pairs[i].uc[1])
       {
-        mirror_char = mirror_pairs[i][0];
+        mirror_char = mirror_pairs[i].uc[0];
         break;
       }
   if (mirrored)
@@ -11829,6 +11934,7 @@ main (int argc, char * argv[])
   const char *scripts_filename;
   const char *blocks_filename;
   const char *proplist30_filename;
+  const char *bidimirroring_filename;
   const char *eastasianwidth_filename;
   const char *linebreak_filename;
   const char *wordbreakproperty_filename;
@@ -11838,9 +11944,9 @@ main (int argc, char * argv[])
   const char *casefolding_filename;
   const char *version;
 
-  if (argc != 17)
+  if (argc != 18)
     {
-      fprintf (stderr, "Usage: %s UnicodeData.txt PropList.txt 
DerivedCoreProperties.txt emoji-data.txt ArabicShaping.txt Scripts.txt 
Blocks.txt PropList-3.0.1.txt EastAsianWidth.txt LineBreak.txt 
WordBreakProperty.txt GraphemeBreakProperty.txt CompositionExclusions.txt 
SpecialCasing.txt CaseFolding.txt version\n",
+      fprintf (stderr, "Usage: %s UnicodeData.txt PropList.txt 
DerivedCoreProperties.txt emoji-data.txt ArabicShaping.txt Scripts.txt 
Blocks.txt PropList-3.0.1.txt BidiMirroring.txt EastAsianWidth.txt 
LineBreak.txt WordBreakProperty.txt GraphemeBreakProperty.txt 
CompositionExclusions.txt SpecialCasing.txt CaseFolding.txt version\n",
                argv[0]);
       exit (1);
     }
@@ -11853,14 +11959,15 @@ main (int argc, char * argv[])
   scripts_filename = argv[6];
   blocks_filename = argv[7];
   proplist30_filename = argv[8];
-  eastasianwidth_filename = argv[9];
-  linebreak_filename = argv[10];
-  wordbreakproperty_filename = argv[11];
-  graphemebreakproperty_filename = argv[12];
-  compositionexclusions_filename = argv[13];
-  specialcasing_filename = argv[14];
-  casefolding_filename = argv[15];
-  version = argv[16];
+  bidimirroring_filename = argv[9];
+  eastasianwidth_filename = argv[10];
+  linebreak_filename = argv[11];
+  wordbreakproperty_filename = argv[12];
+  graphemebreakproperty_filename = argv[13];
+  compositionexclusions_filename = argv[14];
+  specialcasing_filename = argv[15];
+  casefolding_filename = argv[16];
+  version = argv[17];
 
   fill_attributes (unicodedata_filename);
   clear_properties ();
@@ -11871,6 +11978,7 @@ main (int argc, char * argv[])
   fill_arabicshaping (arabicshaping_filename);
   fill_scripts (scripts_filename);
   fill_blocks (blocks_filename);
+  fill_mirror (bidimirroring_filename);
   fill_width (eastasianwidth_filename);
   fill_org_lbp (linebreak_filename);
   fill_org_wbp (wordbreakproperty_filename);
@@ -11954,6 +12062,7 @@ main (int argc, char * argv[])
  *        
/media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/15.1.0/ucd/Scripts.txt
 \\
  *        
/media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/15.1.0/ucd/Blocks.txt
 \\
  *        
/media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/3.0.1/PropList-3.0.1.txt
 \\
+ *        
/media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/15.1.0/ucd/BidiMirroring.txt
 \\
  *        
/media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/15.1.0/ucd/EastAsianWidth.txt
 \\
  *        
/media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/15.1.0/ucd/LineBreak.txt
 \\
  *        
/media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/15.1.0/ucd/auxiliary/WordBreakProperty.txt
 \\
diff --git a/lib/unictype/mirror.h b/lib/unictype/mirror.h
index 598fbc747b..b29241151c 100644
--- a/lib/unictype/mirror.h
+++ b/lib/unictype/mirror.h
@@ -210,7 +210,7 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0, 61635, 61634, 61633, 61632,     0,     0,
+        0,     0,     1,    -1,     1,    -1,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
@@ -222,7 +222,7 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0, 59746, 59745,     0,     0,     0,
+        0,     0,     0,     1,    -1,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
@@ -284,37 +284,37 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0, 56828, 56827, 56826, 56825,     0,     0,     0,
-        3, 56820,     3,    -3, 56817,    -3,     0,     0,
-        0, 56812,     0,     0,     0, 56808, 56807,     0,
-        0,     0, 56803, 56802, 56801, 56800,     0, 56798,
-    56797, 56796, 56795,     0, 56793,     0, 56791,     0,
+        3,     3,     3,    -3,    -3,    -3,     0,     0,
+        0, 56812,     0,     0,     0,  2016, 56807,     0,
+        0,     0, 56803, 56802, 56801, 56800,     0,  2527,
+     1923,  1914,  1918,     0,  2250,     0, 56791,     0,
         0,     0,     0, 56786, 56785, 56784, 56783, 56782,
     56781, 56780, 56779, 56778,     0,     0,     0,     0,
         0, 56772,     0, 56770,     1,    -1, 56767, 56766,
-    56765, 56764, 56763,   138, 56761, 56760, 56759, 56758,
-    56757, 56756, 56755, 56754, 56753,     0,     0,     0,
+    56765, 56764, 56763,   138, 56761,     7, 56759, 56758,
+    56757, 56756, 56755, 56754,    -7,     0,     0,     0,
         0,     0,     1,    -1,     1,    -1,     0,     0,
         0,     0,     0,     0,     0,     0,     0, 56734,
     56733,     0, 56731,     0,     1,    -1,     1,    -1,
-    56725, 56724,     1,    -1,     0,     0, 56719, 56718,
-    56717, 56716, 56715, 56714, 56713, 56712,     1,    -1,
-        1,    -1,     1,    -1,     1,    -1, 56703, 56702,
-    56701, 56700,     1,    -1, 56697, 56696,     1,    -1,
-    56693, 56692, 56691, 56690, 56689,     0,     0,     1,
+        1,    -1,     1,    -1,     0,     0,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     1,    -1, 56689,     0,     0,     1,
        -1,     1,    -1,     0,     0,     0,     0,     0,
-    56677,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     1,    -1,     0,     0, 56663, 56662,
-    56661, 56660, 56659, 56658, 56657, 56656, 56655, 56654,
+     1824,     0,     0,     0,     0,     0,     0,     0,
+        0,     0,     1,    -1,     0,     0,  2104, 56662,
+     2108,  2106, 56659,  2106, 56657, 56656, 56655, 56654,
         1,    -1,     1,    -1,     1,    -1,     1,    -1,
-    56645,     0,     0,     0,     0,     0, 56639, 56638,
+     1316,     0,     0,     0,     0,     0, 56639, 56638,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     1,    -1,     1,    -1,  -138,     0,     0,
         1,    -1,     0,     0,     0,     0,     1,    -1,
         1,    -1,     1,    -1,     1,    -1,     1,    -1,
-    56605, 56604, 56603, 56602, 56601, 56600, 56599, 56598,
-    56597, 56596, 56595, 56594, 56593, 56592,     0,     0,
-        1,    -1, 56587, 56586, 56585, 56584, 56583, 56582,
-    56581, 56580, 56579, 56578, 56577, 56576, 56575, 56574,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     0,     0,
+        1,    -1,     8,     8,     8, 56584,     7,     7,
+    56581, 56580,    -8,    -8,    -8,    -7,    -7, 56574,
         0,     0,     0,     0,     0,     0,     0,     0,
         1,    -1,     1,    -1,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
@@ -344,8 +344,8 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-    55445, 55444, 55443, 55442, 55441, 55440, 55439, 55438,
-    55437, 55436, 55435, 55434, 55433, 55432,     0,     0,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
@@ -355,62 +355,62 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-    55357,     0,     0, 55354, 55353, 55352, 55351,     0,
-    55349, 55348,     0, 55346, 55345, 55344,     0,     0,
-        0,     0,     0, 55338, 55337, 55336, 55335,     0,
-        0,     0,     0,     0, 55329, 55328, 55327,     0,
-        0,     0, 55323, 55322, 55321, 55320, 55319, 55318,
-    55317, 55316, 55315, 55314, 55313, 55312, 55311, 55310,
+    55357,     0,     0,     1,    -1,     1,    -1,     0,
+        1,    -1,     0,     2, 55345,    -2,     0,     0,
+        0,     0,     0, 55338, 55337,     1,    -1,     0,
+        0,     0,     0,     0, -1316,     1,    -1,     0,
+        0,     0,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0, 54906, 54905, 54904, 54903, 54902,
-    54901, 54900, 54899, 54898, 54897, 54896, 54895, 54894,
-    54893, 54892, 54891, 54890, 54889, 54888, 54887, 54886,
-    54885,     0,     0, 54882, 54881, 54880, 54879, 54878,
-    54877,     0, 54875, 54874, 54873, 54872, 54871, 54870,
-    54869, 54868, 54867, 54866, 54865, 54864, 54863, 54862,
+        0,     0,     0,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     3,     1,    -1,
+       -3,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     0,     0, -1914, 54881, 54880, 54879, 54878,
+    -1918,     0, 54875, -1923,     1,    -1, 54871, 54870,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
         0,     0,     0,     0,     0,     0,     0,     0,
-    54853,     0,     0,     0,     0,     0,     0,     0,
-    54845, 54844, 54843, 54842, 54841, 54840,     0,     0,
-        0, 54836,     0,     0,     0,     0, 54831, 54830,
-    54829, 54828, 54827,     0, 54825, 54824,     0,     0,
-    54821, 54820, 54819, 54818, 54817,     0,     0,     0,
+    -1824,     0,     0,     0,     0,     0,     0,     0,
+        1,    -1, 54843, 54842,     1,    -1,     0,     0,
+        0, 54836,     0,     0,     0,     0, 54831,     1,
+       -1,     1,    -1,     0,     1,    -1,     0,     0,
+        1,    -1,     1,    -1, 54817,     0,     0,     0,
         0, 54812,     0, 54810, 54809, 54808,     0,     0,
-    54805, 54804,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,     0, 54793, 54792, 54791, 54790,
-    54789, 54788,     0,     0, 54785, 54784,     0,     0,
+        1,    -1,     0,     0,     0,     0,     0,     0,
+        0,     0,     0,     0, 54793, -2016, 54791, 54790,
+        1,    -1,     0,     0,     1,    -1,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0, 54771, 54770, 54769, 54768, 54767, 54766,
     54765, 54764, 54763, 54762, 54761, 54760, 54759, 54758,
     54757, 54756, 54755, 54754, 54753,     0, 54751, 54750,
     54749, 54748,     0,     0, 54745,     0, 54743,     0,
-        0, 54740,     0, 54738, 54737, 54736, 54735,     0,
-        0,     0,     0,     0, 54729, 54728,     0,     0,
-        0,     0,     0,     0, 54721, 54720, 54719,     0,
+        0, 54740,     0,     1,    -1,     1,    -1,     0,
+        0,     0,     0,     0,     1,    -1,     0,     0,
+        0,     0,     0,     0,     1,    -1, 54719,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0, 54694,
     54693,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,     0, 54681, 54680,     0,     0,
+        0,     0,     0,     0,     1,    -1,     0,     0,
         0,     0, 54675, 54674, 54673, 54672,     0, 54670,
     54669,     0,     0, 54666, 54665,     0,     0,     0,
-        0, 54660, 54659, 54658, 54657, 54656, 54655, 54654,
-    54653, 54652, 54651, 54650, 54649, 54648, 54647, 54646,
-    54645, 54644, 54643, 54642, 54641, 54640, 54639, 54638,
-    54637, 54636, 54635, 54634, 54633, 54632, 54631, 54630,
-    54629, 54628, 54627, 54626, 54625, 54624, 54623, 54622,
-    54621, 54620, 54619, 54618,     0,     0, 54615, 54614,
-    54613, 54612, 54611, 54610, 54609, 54608,     0, 54606,
-    54605, 54604, 54603, 54602, 54601, 54600, 54599, 54598,
-    54597, 54596, 54595, 54594, 54593, 54592, 54591, 54590,
-    54589, 54588, 54587, 54586, 54585, 54584, 54583, 54582,
-    54581, 54580, 54579, 54578, 54577, 54576, 54575, 54574,
-    54573, 54572, 54571, 54570, 54569, 54568, 54567,     0,
-        0,     0,     0,     0, 54561,     0, 54559,     0,
-        0,     0, 54555, 54554, 54553, 54552, 54551,     0,
-        0,     0,     0,     0, 54545, 54544, 54543,     0,
-        0,     0,     0, 54538,     0,     0,     0, 54534,
-    54533, 54532, 54531, 54530,     0, 54528,     0,     0,
+        0,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1, 54618,     0,     0,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     0,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     0,
+        0,     0,     0,     0, 54561,     0, -2104,     0,
+        0,     0, 54555, -2106, -2108, -2106, 54551,     0,
+        0,     0,     0,     0,     1,    -1, -2250,     0,
+        0,     0,     0, 54538,     0,     0,     0,     1,
+       -1,     1,    -1, 54530,     0, 54528,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
@@ -426,19 +426,19 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,     0,     0,     0, 54271,     0,
-        0,     0, 53755, 53754, 53753, 53752,     0,     0,
-        0, 53748, 53747,     0, 53745, 53744,     0,     0,
+        0,     0,     0,     0,     0,     0, -2527,     0,
+        0,     0,     1,    -1,     1,    -1,     0,     0,
+        0,     1,    -1,     0,     1,    -1,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,     0, 53729, 53728,     0,     0,
-    53725, 53724, 53723, 53722, 53721, 53720, 53719, 53718,
-    53717, 53716,     0,     0,     0,     0,     0,     0,
+        0,     0,     0,     0,     1,    -1,     0,     0,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,     0,     0, 53672, 53671, 53670,
-    53669, 53668, 53667, 53666, 53665,     0,     0,     0,
+        0,     0,     0,     0,     0,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
@@ -470,24 +470,24 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,   420,   419,   418,   417,   416,   415,     0,
-        0,     0,     0,     0,   409,   408,     0,     0,
+        0,     1,    -1,     1,    -1,     1,    -1,     0,
+        0,     0,     0,     0,     1,    -1,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-      245,   244,     0,     0,     0,     0,     0,     0,
+        1,    -1,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,     0,   225,     0,   223,     0,
+        0,     0,     0,     0,     2,     0,    -2,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,   194,     0,   192,     0,     0,
+        0,     0,     0,     2,     0,    -2,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,   162,     0,   160,     0,   158,
-      157,     0,   155,   154,     0,     0,     0,     0,
+        0,     0,     0,     2,     0,    -2,     0,     1,
+       -1,     0,     1,    -1,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,




Reply via email to