speed up unicode normalization quick check
Hi,
Attached is a patch to use perfect hashing to speed up Unicode
normalization quick check.
0001 changes the set of multipliers attempted when generating the hash
function. The set in HEAD works for the current set of NFC codepoints,
but not for the other types. Also, the updated multipliers now all
compile to shift-and-add on most platform/compiler combinations
available on godbolt.org (earlier experiments found in [1]/messages/by-id/CACPNZCuVTiLhxAzXp9uCeHGUyHMa59h6_pmP+_W-SzXG0UyY9w@mail.gmail.com). The
existing keyword lists are fine with the new set, and don't seem to be
very picky in general. As a test, it also successfully finds a
function for the OS "words" file, the "D" sets of codepoints, and for
sets of the first n built-in OIDs, where n > 5.
0002 builds on top of the existing normprops infrastructure to use a
hash function for NFC quick check. Below are typical numbers in a
non-assert build:
select count(*) from (select md5(i::text) as t from
generate_series(1,100000) as i) s where t is nfc normalized;
HEAD 411ms 413ms 409ms
patch 296ms 297ms 299ms
The addition of "const" was to silence a compiler warning. Also, I
changed the formatting of the output file slightly to match pgindent.
0003 uses hashing for NFKC and removes binary search. This is split
out for readability. I gather NFKC is a less common use case, so this
could technically be left out. Since this set is larger, the
performance gains are a bit larger as well, at the cost of 19kB of
binary space:
HEAD 439ms 440ms 442ms
patch 299ms 301ms 301ms
I'll add this to the July commitfest.
[1]: /messages/by-id/CACPNZCuVTiLhxAzXp9uCeHGUyHMa59h6_pmP+_W-SzXG0UyY9w@mail.gmail.com
--
John Naylor https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Attachments:
v1-0001-Tweak-the-set-of-candidate-multipliers-for-genera.patchapplication/octet-stream; name=v1-0001-Tweak-the-set-of-candidate-multipliers-for-genera.patchDownload
From 195ad16c62e680b4bb3835991a7b7bd6ddbf7afc Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Tue, 12 May 2020 17:45:49 +0800
Subject: [PATCH v1 1/3] Tweak the set of candidate multipliers for generating
perfect hash functions
The previous set of multipliers were inadequate for large sets of short
keys. A future commit will have that as a use case, so increase the
maximum size of multipliers attempted.
Also make sure all multipliers compile to shift-and-add instructions
on most platforms. On x86-64 this was confirmed as far back as gcc 4.1
and clang 3.8.
---
src/tools/PerfectHash.pm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/tools/PerfectHash.pm b/src/tools/PerfectHash.pm
index 74fb1f2ef6..d6841589a3 100644
--- a/src/tools/PerfectHash.pm
+++ b/src/tools/PerfectHash.pm
@@ -81,13 +81,13 @@ sub generate_hash_function
# to calculate via shift-and-add, so don't change them without care.
# (Commonly, random seeds are tried, but we want reproducible results
# from this program so we don't do that.)
- my $hash_mult1 = 31;
+ my $hash_mult1 = 257;
my $hash_mult2;
my $hash_seed1;
my $hash_seed2;
my @subresult;
FIND_PARAMS:
- foreach (127, 257, 521, 1033, 2053)
+ foreach (17, 31, 127, 8191)
{
$hash_mult2 = $_; # "foreach $hash_mult2" doesn't work
for ($hash_seed1 = 0; $hash_seed1 < 10; $hash_seed1++)
--
2.22.0
v1-0002-Use-perfect-hashing-for-NFC-Unicode-normalization.patchapplication/octet-stream; name=v1-0002-Use-perfect-hashing-for-NFC-Unicode-normalization.patchDownload
From 8aea5020dc2bb472876cab6c468908b6c45e854d Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Fri, 15 May 2020 11:13:15 +0800
Subject: [PATCH v1 2/3] Use perfect hashing for NFC Unicode normalization
quick check
This makes the normalization check nearly 40% faster, while only adding 5kB
to the binary size. The hash lookup reuses the existing array of bitfields
used for binary search to get the quick check property and is generated as
part of make update-unicode. Since the hash function is part of the
repository, format it like pgindent would.
NFKC quick check still uses binary search.
---
.../generate-unicode_normprops_table.pl | 38 +-
src/common/unicode_norm.c | 36 +-
src/include/common/unicode_normprops_table.h | 344 ++++++++++++++++++
src/tools/PerfectHash.pm | 2 +-
4 files changed, 412 insertions(+), 8 deletions(-)
diff --git a/src/common/unicode/generate-unicode_normprops_table.pl b/src/common/unicode/generate-unicode_normprops_table.pl
index e8e5097c09..7f00cb0ae4 100644
--- a/src/common/unicode/generate-unicode_normprops_table.pl
+++ b/src/common/unicode/generate-unicode_normprops_table.pl
@@ -9,6 +9,10 @@
use strict;
use warnings;
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
my %data;
print
@@ -17,6 +21,8 @@ print
print <<EOS;
#include "common/unicode_norm.h"
+typedef int (*qc_hash_func) (const void *key);
+
/*
* We use a bit field here to save space.
*/
@@ -24,7 +30,14 @@ typedef struct
{
unsigned int codepoint:21;
signed int quickcheck:4; /* really UnicodeNormalizationQC */
-} pg_unicode_normprops;
+} pg_unicode_normprops;
+
+typedef struct
+{
+ const pg_unicode_normprops *normprops;
+ qc_hash_func hash;
+ int num_normprops;
+} unicode_norm_info;
EOS
foreach my $line (<ARGV>)
@@ -66,6 +79,7 @@ foreach my $prop (sort keys %data)
"static const pg_unicode_normprops UnicodeNormProps_${prop}[] = {\n";
my %subdata = %{ $data{$prop} };
+ my @cp_packed;
foreach my $cp (sort { $a <=> $b } keys %subdata)
{
my $qc;
@@ -82,7 +96,29 @@ foreach my $prop (sort keys %data)
die;
}
printf "\t{0x%04X, %s},\n", $cp, $qc;
+
+ # Save the bytes as a string in network order.
+ push @cp_packed, pack('N', $cp);
}
print "};\n";
+
+ # Emit the definition of the hash function.
+
+ # To save space, skip building the function for the larger "C" form.
+ next if $prop eq "NFKC_QC";
+
+ my $funcname = $prop . '_hash_func';
+
+ my $f = PerfectHash::generate_hash_function(\@cp_packed, $funcname,
+ fixed_key_length => 4);
+ print "\nstatic $f\n";
+
+ # Emit the struct that wraps the hash lookup info into one variable.
+ printf "static const unicode_norm_info ";
+ printf "UnicodeNormInfo_%s = {\n", $prop;
+ printf "\tUnicodeNormProps_%s,\n", $prop;
+ printf "\t%s,\n", $funcname;
+ printf "\t%d\n", scalar @cp_packed;
+ printf "};\n";
}
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index ab5ce59345..1714837e64 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -476,6 +476,34 @@ qc_compare(const void *p1, const void *p2)
return (v1 - v2);
}
+static const pg_unicode_normprops *
+qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
+{
+ int h;
+ uint32 hashkey;
+
+ /*
+ * Compute the hash function. The hash key is the codepoint with the bytes
+ * in network order.
+ */
+ hashkey = htonl(ch);
+ h = norminfo->hash(&hashkey);
+
+ /* An out-of-range result implies no match */
+ if (h < 0 || h >= norminfo->num_normprops)
+ return NULL;
+
+ /*
+ * Since it's a perfect hash, we need only match to the specific codepoint
+ * it identifies.
+ */
+ if (ch != norminfo->normprops[h].codepoint)
+ return NULL;
+
+ /* Success! */
+ return &norminfo->normprops[h];
+}
+
/*
* Look up the normalization quick check character property
*/
@@ -483,18 +511,14 @@ static UnicodeNormalizationQC
qc_is_allowed(UnicodeNormalizationForm form, pg_wchar ch)
{
pg_unicode_normprops key;
- pg_unicode_normprops *found = NULL;
+ const pg_unicode_normprops *found = NULL;
key.codepoint = ch;
switch (form)
{
case UNICODE_NFC:
- found = bsearch(&key,
- UnicodeNormProps_NFC_QC,
- lengthof(UnicodeNormProps_NFC_QC),
- sizeof(pg_unicode_normprops),
- qc_compare);
+ found = qc_hash_lookup(ch, &UnicodeNormInfo_NFC_QC);
break;
case UNICODE_NFKC:
found = bsearch(&key,
diff --git a/src/include/common/unicode_normprops_table.h b/src/include/common/unicode_normprops_table.h
index 93a2e55b75..4e8d2c46d6 100644
--- a/src/include/common/unicode_normprops_table.h
+++ b/src/include/common/unicode_normprops_table.h
@@ -2,6 +2,8 @@
#include "common/unicode_norm.h"
+typedef int (*qc_hash_func) (const void *key);
+
/*
* We use a bit field here to save space.
*/
@@ -11,6 +13,13 @@ typedef struct
signed int quickcheck:4; /* really UnicodeNormalizationQC */
} pg_unicode_normprops;
+typedef struct
+{
+ const pg_unicode_normprops *normprops;
+ qc_hash_func hash;
+ int num_normprops;
+} unicode_norm_info;
+
static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
{0x0300, UNICODE_NORM_QC_MAYBE},
{0x0301, UNICODE_NORM_QC_MAYBE},
@@ -1245,6 +1254,341 @@ static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
{0x2FA1D, UNICODE_NORM_QC_NO},
};
+static int
+NFC_QC_hash_func(const void *key)
+{
+ static const int16 h[2463] = {
+ 0, -2717, 0, 221, 1293, 223, 1295, 225,
+ 226, 241, 0, 229, 230, 231, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -386, 0, 0, 0, 0, 0, 0, 0,
+ -163, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -246, -175, 1260, 0, 0, 0, -174, -173,
+ 0, -172, 0, 0, 0, 0, 0, 0,
+ 1049, 0, 300, 301, 1071, 0, 1071, 0,
+ 1071, 1071, 1057, 0, 0, 0, 0, 1061,
+ 0, -1053, 1664, 0, 2956, 0, 0, -13,
+ 0, 0, 0, 0, 2156, 0, 0, 0,
+ 0, 0, 0, 0, 71, 0, 1082, 0,
+ 1083, 1083, 0, 1084, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 359, 360, 361,
+ -1091, 363, -762, -130, -129, -128, -127, -126,
+ 137, -124, -708, -707, -706, -120, -185, -705,
+ -117, -184, -1307, -114, -113, -112, -111, 0,
+ 386, 387, 388, 389, -90, 391, 171, 172,
+ 394, -94, -183, 397, 398, 399, -98, -225,
+ 402, -1019, -636, -1019, -225, 407, 408, 409,
+ 410, 411, 674, 413, -171, -170, -169, 417,
+ 352, -168, 420, 353, -770, 423, 424, 425,
+ 426, 427, 428, 32767, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 32767, 32767, 237, 32767, 236, 32767,
+ 32767, 234, 234, 234, 234, 617, 234, 234,
+ 234, -2483, 234, -1430, 1526, -1430, 1527, 47,
+ 48, 471, 230, 32767, 32767, 32767, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227,
+ -159, 227, 227, 227, 227, 227, 227, 227,
+ 64, 227, 227, 227, 227, 227, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227,
+ -19, 52, 1487, 227, 227, 227, 53, 54,
+ 227, 55, 227, 227, 227, 227, 227, 227,
+ 1276, 227, -989, 32767, 1296, 225, 1296, 225,
+ 1296, 1296, 1282, 225, 225, 225, 225, 1286,
+ 225, -828, 1889, 225, 3181, 225, 225, 212,
+ 225, 225, 225, 225, 2381, 225, 225, 225,
+ 225, 225, 225, 225, 296, 225, 1307, 225,
+ 1308, 1308, 225, 1309, 225, 225, 225, 225,
+ 225, 225, 225, 225, 225, 225, 225, 225,
+ 225, 225, 225, 225, 225, 584, 585, 586,
+ -866, 588, -537, 95, 96, 97, 98, 99,
+ 362, 101, -483, -482, -481, 105, 40, -480,
+ 108, 41, -1082, 111, 112, 113, 114, 225,
+ 611, 612, 613, 614, 135, 616, 396, 397,
+ 619, 131, 42, 622, 623, 624, 127, 0,
+ 627, -794, -411, -794, 0, 632, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ -272, 32767, 32767, 32767, 0, 32767, 32767, 32767,
+ 32767, 32767, -166, -165, 32767, 32767, 32767, 32767,
+ -164, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 397, 32767, 396, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 386,
+ 0, 386, 386, 386, 386, 386, 386, 386,
+ 223, 386, 386, 386, 32767, 385, 385, 385,
+ 385, 385, 32767, 384, 32767, 383, 383, 32767,
+ 382, 382, 32767, 381, 381, 381, 381, 381,
+ 135, 206, 1641, 381, 32767, 32767, 32767, 32767,
+ 32767, 32767, -160, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 1148, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 32767, 32767, 32767, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, -257, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, -910, -910, 32767, 32767,
+ 0, 32767, 0, 32767, 0, 32767, 0, 32767,
+ 147, 32767, 0, 32767, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 143, 32767, 144, 32767, 145,
+ 32767, 146, 32767, 0, 32767, 148, 32767, 149,
+ 32767, 32767, 32767, -160, 32767, 32767, 32767, 32767,
+ 32767, 32767, 15, 32767, 32767, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 145, 32767, 144, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, -148, 32767, 32767, 32767, 32767,
+ 32767, 32767, 2009, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 32767, 32767, 135, -918, 32767,
+ 151, 32767, 32767, 0, 1, 2, 3, 4,
+ 133, 5, 6, 7, 8, 9, 10, 11,
+ 32767, 32767, -1248, 32767, 13, 154, 188, 188,
+ 32767, 32767, 32767, 32767, 32767, 155, 16, 32767,
+ 32767, 32767, 32767, 32767, 32767, -1853, -1054, 18,
+ -1052, -1051, -1036, 22, 32767, 157, 32767, 28,
+ 23, 1077, 673, 25, -2930, 0, 32767, 32767,
+ 32767, 32767, 32767, 27, 32767, 155, 32767, 154,
+ 32767, 32767, -62, 28, -42, 30, -1051, 32,
+ -1050, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 34,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 129, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 672, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 0, 32767,
+ 32767, 32767, 32767, 32767, -156, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, -155, 32767, 32767,
+ 32767, 0, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 73, 32767, 32767, 32767, 32767, 74, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 675,
+ 32767, 32767, 32767, 32767, 32767, 75, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 165, 32767, 32767, 32767, 166, 167,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 170, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 689, 690, 691, 692, 693, 694, 695,
+ 696, 697, 698, 699, 700, 701, 702, 703,
+ 704, 705, 706, 707, 708, 709, 710, 711,
+ 712, 713, 714, 715, 716, 717, 718, 719,
+ 720, 721, 722, -304, -303, -302, -301, -300,
+ -299, -298, -297, 930, -295, -294, -293, -292,
+ -291, -290, -289, -288, -287, -286, -285, -284,
+ -283, -282, -281, -280, -279, -278, -277, -276,
+ -275, 753, 754, 755, 646, 757, -712, -1765,
+ 952, -712, 2244, -712, 2245, 765, 766, 767,
+ 768, 125, 770, 771, 772, 773, 774, 775,
+ 603, 777, 778, 779, 780, 781, 782, 783,
+ 784, 2011, 786, 787, 788, 789, 790, 791,
+ 792, 793, 794, 795, 796, 797, 798, 799,
+ 800, 801, 802, 803, 804, 805, 806, 603,
+ 603, 809, 603, 811, 603, 603, 814, 815,
+ 816, 817, 435, 819, 820, 821, 3539, 823,
+ 603, -468, 603, -468, 603, 603, 589, 831,
+ 603, 603, 603, 835, 836, 837, 838, 839,
+ 840, 841, 842, 843, 844, 845, 846, 847,
+ 848, 849, 850, 851, 852, 1239, 854, 855,
+ 856, 857, 858, 859, 860, 1024, 862, 863,
+ 864, 865, 866, 867, 868, 869, 870, 871,
+ 872, 873, 874, 875, 876, 877, 878, 879,
+ 880, 881, 882, 883, 884, 1131, 1061, -373,
+ 888, 889, 890, 1065, 1065, 893, 1066, 895,
+ 896, 897, 898, 899, 900, -148, 902, 603,
+ 603, -166, 906, -164, 908, -162, -161, -146,
+ 912, 913, 914, 915, -145, 917, 1971, -745,
+ 920, -2035, 922, 923, 937, 925, 926, 927,
+ 928, -1227, 930, 931, 932, 933, 934, 935,
+ 936, 866, 938, -143, 940, -142, -141, 943,
+ -140, 32767, 945, 946, 947, 948, 949, 950,
+ 951, 952, 953, 954, 955, 956, 957, 958,
+ 959, 960, 961, -65, -64, -63, -62, -61,
+ -60, -59, -58, 1169, -56, -55, -54, -53,
+ -52, -51, -50, -49, -48, -47, -46, -45,
+ -44, -43, -42, -41, -40, -39, -38, -37,
+ -36, 992, 993, 994, 885, 996, -473, -1526,
+ 1191, -473, 2483, -473, 2484, 1004, 1005, 1006,
+ 1007, 364, 1009, 1010, 1011, 1012, 1013, 1014,
+ 842, 1016, 1017, 1018, 1019, 1020, 1021, 1022,
+ 1023, 2250, 1025, 1026, 1027, 1028, 1029, 1030,
+ 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038,
+ 1039, 1040, 1041, 1042, 1043, 1044, 1045, 842,
+ 842, 1048, 842, 1050, 842, 842, 1053, 1054,
+ 1055, 1056, 674, 1058, 1059, 1060, 3778, 1062,
+ 842, -229, 842, -229, 842, 842, 828, 1070,
+ 842, 842, 842, 1074, 1075, 1076, 1077, 1078,
+ 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086,
+ 1087, 1088, 1089, 1090, 1091, 1478, 1093, 1094,
+ 1095, 1096, 1097, 1098, 1099, 1263, 1101, 1102,
+ 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110,
+ 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118,
+ 1119, 1120, 1121, 1122, 1123, 1370, 1300, -134,
+ 1127, 1128, 1129, 1304, 1304, 1132, 1305, 1134,
+ 1135, 1136, 1137, 1138, 1139, 91, 1141, 842,
+ 842, 73, 1145, 75, 1147, 77, 78, 93,
+ 1151, 1152, 1153, 1154, 94, 1156, 2210, -506,
+ 1159, -1796, 1161, 1162, 1176, 1164, 1165, 1166,
+ 1167, -988, 1169, 1170, 1171, 1172, 1173, 1174,
+ 1175, 1105, 1177, 96, 1179, 97, 98, 1182,
+ 99, 1184, 1185, 1186, 1187, 1188, 1189, 1190,
+ 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198,
+ 1199, 1200, 0, 174, 175, 176, 177, 178,
+ 179, 180, 181, 1408, 183, 184, 185, 186,
+ 187, 188, 189, 190, 191, 192, 193, 194,
+ 195, 196, 197, 198, 199, 200, 201, 202,
+ 203, 0, 0, 206, 0, 208, 0, 0,
+ 211, 212, 213, 214, -168, 216, 217, 218,
+ 2936, 220, 0, -1071, 0, -1071, 0, 0,
+ -14, 228, 0, 0, 0, 232, 233, 234,
+ 235, 236, 237, 238, 239, 240, 241, 242,
+ 243, 244, 245, 246, 247, 248, 249, 636,
+ 251, 252, 253, 254, 255, 256, 257, 421,
+ 259, 260, 261, 262, 263, 264, 265, 266,
+ 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 528,
+ 458, -976, 285, 286, 287, 462, 462, 290,
+ 463, 292, 293, 294, 295, 296, 297, -751,
+ 299, 0, 0, -769, 303, -767, 305, -765,
+ -764, -749, 309, 310, 311, 312, -748, 314,
+ 1368, -1348, 317, -2638, 319, 320, 334, 322,
+ 323, 324, 325, -1830, 327, 328, 329, 330,
+ 331, 332, 333, 263, 335, -746, 337, -745,
+ -744, 340, -743, 342, 343, 344, 345, 346,
+ 347, 348, 349, 350, 351, 352, 353, 354,
+ 355, 356, 357, 358, 0, 0, 0, 1453,
+ 0, 1126, 495, 495, 495, 495, 495, 233,
+ 495, 1080, 1080, 1080, 495, 561, 1082, 495,
+ 563, 1687, 495, 495, 495, 495, 385, 0,
+ 0, 0, 0, 480, 0, 221, 221, 0,
+ 489, 579, 0, 0, 0, 498, 626, 0,
+ 1422, 1040, 1424, 631, 0, 0, 0, 0,
+ 0, -262, 0, 585, 585, 585, 0, 66,
+ 587, 0, 68, 1192, 0, 0, 0, 0,
+ 0, 0, 32767, 32767, 32767, 32767, 669, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 670,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 142, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 115, 116, 117, 118, 119, 120,
+ 121, 122, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, 132, 133, 134, 135, 136,
+ 137, 138, 139, 140, 141, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, -199, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1027, 0, 0, 0, 110, 0,
+ 1470, 2524, -192, 1473, -1482, 1475, -1481, 0,
+ 0, 0, 0, 644, 0, 0, 0, 0,
+ 0, 0, 173, 0, 0, 0, 0, 0,
+ 0, 0, 0, -1226, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 204, 205, 0, 207, 0, 209, 210,
+ 0, 0, 0, 0, 383, 0, 0,
+ };
+
+ const unsigned char *k = (const unsigned char *) key;
+ size_t keylen = 4;
+ uint32 a = 0;
+ uint32 b = 0;
+
+ while (keylen--)
+ {
+ unsigned char c = *k++;
+
+ a = a * 257 + c;
+ b = b * 17 + c;
+ }
+ return h[a % 2463] + h[b % 2463];
+}
+
+static const unicode_norm_info UnicodeNormInfo_NFC_QC = {
+ UnicodeNormProps_NFC_QC,
+ NFC_QC_hash_func,
+ 1231
+};
+
static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
{0x00A0, UNICODE_NORM_QC_NO},
{0x00A8, UNICODE_NORM_QC_NO},
diff --git a/src/tools/PerfectHash.pm b/src/tools/PerfectHash.pm
index d6841589a3..26efa7ad70 100644
--- a/src/tools/PerfectHash.pm
+++ b/src/tools/PerfectHash.pm
@@ -124,7 +124,7 @@ sub generate_hash_function
$f .= sprintf "\tstatic const %s h[%d] = {\n", $elemtype, $nhash;
for (my $i = 0; $i < $nhash; $i++)
{
- $f .= sprintf "%s%6d,%s",
+ $f .= sprintf "%s%d,%s",
($i % 8 == 0 ? "\t\t" : " "),
$hashtab[$i],
($i % 8 == 7 ? "\n" : "");
--
2.22.0
v1-0003-Use-perfect-hashing-for-NFKC-Unicode-normalizatio.patchapplication/octet-stream; name=v1-0003-Use-perfect-hashing-for-NFKC-Unicode-normalizatio.patchDownload
From 6a49f7c7db8405ad64d382ecbe7f6a570e8da684 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Fri, 15 May 2020 11:17:08 +0800
Subject: [PATCH v1 3/3] Use perfect hashing for NFKC Unicode normalization
quick check
This is about 45% faster than binary search, at the cost of 19kB of binary
space. Also remove the ability to use binary search for quick check.
---
.../generate-unicode_normprops_table.pl | 3 -
src/common/unicode_norm.c | 20 +-
src/include/common/unicode_normprops_table.h | 1257 +++++++++++++++++
3 files changed, 1258 insertions(+), 22 deletions(-)
diff --git a/src/common/unicode/generate-unicode_normprops_table.pl b/src/common/unicode/generate-unicode_normprops_table.pl
index 7f00cb0ae4..e0a201b6d1 100644
--- a/src/common/unicode/generate-unicode_normprops_table.pl
+++ b/src/common/unicode/generate-unicode_normprops_table.pl
@@ -105,9 +105,6 @@ foreach my $prop (sort keys %data)
# Emit the definition of the hash function.
- # To save space, skip building the function for the larger "C" form.
- next if $prop eq "NFKC_QC";
-
my $funcname = $prop . '_hash_func';
my $f = PerfectHash::generate_hash_function(\@cp_packed, $funcname,
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 1714837e64..5d951fc2e0 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -465,17 +465,6 @@ get_canonical_class(pg_wchar ch)
return entry->comb_class;
}
-static int
-qc_compare(const void *p1, const void *p2)
-{
- uint32 v1,
- v2;
-
- v1 = ((const pg_unicode_normprops *) p1)->codepoint;
- v2 = ((const pg_unicode_normprops *) p2)->codepoint;
- return (v1 - v2);
-}
-
static const pg_unicode_normprops *
qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
{
@@ -510,22 +499,15 @@ qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
static UnicodeNormalizationQC
qc_is_allowed(UnicodeNormalizationForm form, pg_wchar ch)
{
- pg_unicode_normprops key;
const pg_unicode_normprops *found = NULL;
- key.codepoint = ch;
-
switch (form)
{
case UNICODE_NFC:
found = qc_hash_lookup(ch, &UnicodeNormInfo_NFC_QC);
break;
case UNICODE_NFKC:
- found = bsearch(&key,
- UnicodeNormProps_NFKC_QC,
- lengthof(UnicodeNormProps_NFKC_QC),
- sizeof(pg_unicode_normprops),
- qc_compare);
+ found = qc_hash_lookup(ch, &UnicodeNormInfo_NFKC_QC);
break;
default:
Assert(false);
diff --git a/src/include/common/unicode_normprops_table.h b/src/include/common/unicode_normprops_table.h
index 4e8d2c46d6..bd2894855a 100644
--- a/src/include/common/unicode_normprops_table.h
+++ b/src/include/common/unicode_normprops_table.h
@@ -6509,3 +6509,1260 @@ static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
{0x2FA1C, UNICODE_NORM_QC_NO},
{0x2FA1D, UNICODE_NORM_QC_NO},
};
+
+static int
+NFKC_QC_hash_func(const void *key)
+{
+ static const int16 h[9837] = {
+ -2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472,
+ -2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472,
+ -2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472,
+ -2472, -2472, -2472, -2472, -2472, 32767, 32767, 32767,
+ -2475, -2475, -2475, -2475, -2475, -2475, -2475, -2475,
+ -2475, -2475, -2475, -2475, -2475, -2475, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 865, 865, 865, 865, 865, 865, 865,
+ 865, 865, 865, 865, -2255, 32767, -5207, 32767,
+ -5207, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 4250, 861, 861, 861, 3339, 3339,
+ 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339,
+ 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339,
+ 32767, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 9, 10, 32767, 11, 12, 0, 32767,
+ 0, 2913, 2914, 2915, 2916, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 2917, 32767, 2918, -100,
+ 2919, 2920, 2921, 840, 840, 840, 2922, 0,
+ 0, 0, 0, 0, 2206, 0, 2923, 0,
+ 2924, 2925, 2926, 0, 0, 0, -2590, 0,
+ 0, 0, 0, 0, 0, 0, 2934, 0,
+ 2474, 2931, 2932, 0, 0, 0, 0, 0,
+ 14, 805, 0, 0, 2933, 0, 2934, 0,
+ 2935, 2936, 0, 0, 0, 16, 17, 0,
+ 0, 0, 0, 0, 0, 0, 0, 18,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -790, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -1675, 0, 0, 19, 0, -1679,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, -1694,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 20, 21, 22, 23, 24, 25,
+ 26, 27, 28, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 29, 30, 31, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 724, 2668, 724, 4350, -2633, -2633,
+ 2533, 2534, 2535, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 2518, 2519, 2520, 1431, 45, 46,
+ 32767, 32767, 47, 48, 49, 50, 51, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -3011, 53, -1125, -3010, -3010,
+ 32767, -3334, -1123, -3011, 60, 61, 62, 63,
+ 32767, 32767, 64, 32767, 65, 32767, 66, 67,
+ 32767, 32767, 32767, 32767, 32767, 32767, 2268, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 69, 70,
+ 71, 72, 73, 74, 32767, 32767, 32767, 32767,
+ 75, 76, 32767, 77, 281, 32767, 32767, 32767,
+ 32767, 32767, 32767, 811, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 1341, 1342, 1343, 1344, 1345,
+ 1346, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 86,
+ 32767, 32767, 32767, 32767, 32767, 4550, 32767, 32767,
+ 32767, 1135, 32767, 32767, 32767, 32767, 32767, 1130,
+ 3016, 32767, 3017, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 677, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 2858, 2859, 651, 2861, -438,
+ 2863, 2864, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -5305, -5305, -5305, 32767, -5306,
+ -5306, 32767, 32767, 32767, 2871, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 3022, 3023, 680, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, -272, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 4308, 4309, 4310,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 4311, 4312, 4313,
+ 4314, 4315, 4316, 4317, 4318, 4319, 4320, 4321,
+ 4322, 4323, 4324, 4325, 4326, 4307, 4307, 4307,
+ 4307, 4307, 4307, 4307, 4307, 4307, 4336, 4337,
+ 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345,
+ 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353,
+ 4354, 32767, 32767, 32767, 32767, 4355, 4356, 4357,
+ 4358, 4359, 4360, 4361, 4362, 4363, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 4364, 4365, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2202, 0, 0, 0, 59, 0,
+ 0, 35, 0, 0, 0, 3549, 0, 0,
+ 0, 0, 0, 3394, 0, 0, 3399, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2012,
+ 0, 0, 0, 0, 87, 2022, 0, 7490,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 2255, 0, 2256, 2256, 2256, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 0, 0,
+ 0, 0, 0, 0, -1759, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4767, 0, 0, 4772,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 5977, 0,
+ 892, 32767, 0, 32767, 32767, 0, 0, 32767,
+ 32767, 2344, 4834, 4835, 4836, 32767, 0, 4840,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 32767, 0, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 32767, 32767, 0, 32767, 0, 0, 0, 32767,
+ 32767, 32767, 32767, 3261, 3262, 32767, 3007, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 106, 107, 108, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 109, 110, 111, 112, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, -2344,
+ -2344, 0, 32767, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, -1642, 1469, -1641, 1469, -1640, 1469,
+ 1469, 1457, 1469, 1469, 1469, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -3359, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4103,
+ -1478, 0, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -2433, -4254, -4254, -4254, -3658,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, 0, -4253, -4253, -4253, -4253, -4253,
+ -4253, -4253, -4253, -4253, -678, -677, -676, -675,
+ -674, -673, -672, -4253, 314, -4253, -4253, -4253,
+ -4253, -4253, -4253, -4253, -4253, -4253, -4253, -4253,
+ -4253, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 1464, 1465, 1466, 1467,
+ 1468, 1469, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 0, 32767, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 827, 828, 829, -2469, -2469, -260, 0,
+ 0, 32767, 0, 32767, 0, 0, 32767, 0,
+ 0, 32767, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 3575, 3576, 3577, 3578, 3579, 3580, 3581, 0,
+ 4567, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2201, 4411, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -3338, 0, 0, 0,
+ 0, 0, 0, 0, -3337, 0, -3336, 0,
+ 0, 0, 0, -3335, 0, 0, -3334, -3333,
+ -3332, -3331, 0, 0, -3330, 0, 0, 32767,
+ 0, 0, 13, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 3073,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ -2556, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 3074, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 2355, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, -488, -488, -488, -302, -3067, -3067,
+ -3067, -3067, -488, -488, -488, -488, 2999, -488,
+ 2999, -488, -488, -488, -3067, -3067, -3067, -488,
+ -488, -3067, -3067, -3067, -488, -488, -488, 2463,
+ -488, -488, -488, -301, 2465, -488, 2466, 2467,
+ -3600, -493, -3599, -488, -3598, -488, -3597, -488,
+ -488, -500, -488, -488, -488, -488, -488, 2470,
+ 2471, 2472, -488, -488, -254, -488, -488, -488,
+ -488, -488, -104, -488, -488, -488, -102, -101,
+ -100, -99, -98, -97, -96, -95, -94, -93,
+ -92, -488, -488, -488, -488, -488, -488, -488,
+ -488, -488, -2194, -2194, -2194, -2194, -2194, -2194,
+ -2194, -2194, -2194, -2194, 5211, 3269, 5213, 3269,
+ 6895, -88, -88, 5078, 5079, 5080, 1773, -92,
+ -92, 1773, 1773, 1773, 1773, 1773, 1773, 5072,
+ 5073, 2865, 5075, 1776, 5077, 5078, 1778, 1778,
+ 6942, 6943, 1778, 1778, 1778, 5086, 6952, 6953,
+ 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096,
+ 4007, 5098, 2333, 2334, 2335, 2336, 2337, -3066,
+ -3066, -3066, 2341, -3066, -3066, 2344, 2345, 2346,
+ 5114, 317, 2349, 848, 849, 850, 2353, 852,
+ 853, 854, 855, 856, 857, 858, 859, 860,
+ 861, 692, 692, 692, 692, 692, 692, 692,
+ 692, 692, 692, 692, 692, 692, 692, 692,
+ 692, 692, 692, 692, 692, 692, 692, 692,
+ 692, 692, 692, 692, 692, 692, 692, 692,
+ 692, 692, 692, 692, 692, 692, 692, 692,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 3093, 3094, 3095, 3096, 3097, 3098, 3099,
+ 3100, 3101, 3102, 901, 3104, 3105, 3106, 3048,
+ 3108, 3109, 3075, 3111, 3112, 3113, -435, 3115,
+ 3116, 3117, 3118, 3119, -274, 3121, 3122, -276,
+ 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131,
+ 1120, 3133, 3134, 3135, 3136, 3050, 1116, 3139,
+ -4350, 3141, 3142, 3143, 3144, 3145, 3146, 3147,
+ 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155,
+ 3156, 902, 3158, 903, 904, 905, 3162, 3163,
+ 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171,
+ 3172, 3173, 3174, 3175, 3176, 3177, 32767, 3178,
+ 3179, 3180, 3181, 3182, 3183, 4943, 3185, 3186,
+ 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194,
+ 3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202,
+ 3203, 3204, 3205, 3206, 3207, 3208, 3209, 3210,
+ 3211, 3212, 3213, 3214, 3215, 3216, 3217, 3218,
+ 3219, 3220, 3221, 3222, 3223, -1543, 3225, 3226,
+ -1545, 3228, 3229, 3230, 3231, 3232, 3233, 3234,
+ 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242,
+ 3243, 3244, 3245, 3246, 3247, 3248, -1251, -2728,
+ 3250, 32767, 32767, 3251, 906, 907, 3252, 3253,
+ 32767, 32767, 910, -1579, -1579, -1579, 32767, 3258,
+ -1581, 3260, 3261, 3262, 3263, 3264, 3265, 3266,
+ 3267, 3268, 3269, 32767, 3270, 32767, 3271, 3272,
+ 3273, 3274, 3275, 3276, 3277, 32767, 3278, 3279,
+ 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287,
+ 3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295,
+ 3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303,
+ 3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311,
+ 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319,
+ 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327,
+ 3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335,
+ 3336, 32767, 3337, 3338, 3339, 3340, 3341, 3342,
+ 0, 3343, 3344, 3345, 3346, 32767, 32767, 3347,
+ 3348, 3349, 3350, 3351, 3352, 3353, 3354, 32767,
+ 3355, 3356, 3357, 3358, 3359, 3360, 3361, 32767,
+ 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369,
+ 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377,
+ 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385,
+ 3386, 3387, 3388, 3389, 0, 3390, 3391, 3392,
+ 915, 916, 917, 918, 919, 920, 921, 922,
+ 923, 924, 925, 926, 927, 928, 929, 930,
+ 931, 932, 933, 934, 935, 936, 937, 938,
+ 939, 940, 941, 942, 943, 944, 945, 946,
+ 947, 948, 949, 950, 951, 952, 953, 954,
+ 955, 956, 957, 958, 959, 960, 961, 962,
+ 963, 964, 965, 966, 967, 968, 969, 970,
+ 971, 972, 973, 974, 975, 976, 3449, 3450,
+ 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458,
+ 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466,
+ 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474,
+ 3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482,
+ 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490,
+ 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498,
+ 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506,
+ 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514,
+ 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522,
+ 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530,
+ 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538,
+ 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546,
+ 3547, 3548, 3549, 3550, 3551, 3552, 3553, 3554,
+ 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562,
+ 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570,
+ 3571, 3572, 3573, 3574, 3575, 3576, 3577, 6056,
+ 6057, 6058, 32767, 3581, 3582, 3583, 3584, 3585,
+ 4157, 4158, 4159, 3589, 4162, -4510, -1558, -1557,
+ -1556, -1742, -4507, -1553, -4506, -4506, 1562, -1544,
+ 1563, -1547, 1564, -1545, 1565, -1543, -1542, -1529,
+ -1540, -1539, -1538, -1537, -1536, -4493, -4493, -4493,
+ -1532, -1531, -1764, -1529, 3622, -1528, -1527, -1526,
+ -1909, -1524, -1523, -1522, -1907, -1907, -1907, -1907,
+ -1907, -1907, -1907, -1907, -1907, -1907, -1907, -1510,
+ -1509, 1071, 1072, 1073, 1074, 1075, 1076, 1077,
+ 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085,
+ 1086, 1087, 1088, 1089, 1090, 3663, 3664, 3665,
+ 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673,
+ 3674, 1095, 1096, 1097, 1098, 1099, 1100, 1101,
+ 3682, 1103, 3684, 1105, 3686, 3687, 3688, 1109,
+ 1110, 1111, 3692, 1113, 1114, 1115, 1116, 1117,
+ 1118, 1119, 3700, 1121, 3702, 3703, 3704, 1125,
+ 1126, 1127, -1809, -1809, -1809, -1809, -1809, -1809,
+ 3720, 3721, 3722, 3717, 3718, 3719, 3720, 1140,
+ 1141, 1142, 1143, -1802, 1145, 1146, 1147, 1148,
+ 3730, -1797, 3732, 1152, 3734, 3735, 1155, 1156,
+ 3738, 3739, 3740, 3741, 3742, 3743, -1785, -1785,
+ -1785, -1779, -1324, 1168, 1169, 1170, 1171, 1172,
+ 3752, 3753, 1175, 1176, 1177, 992, 3758, 3759,
+ 3760, 3761, 1183, 1184, 1185, 1186, -2300, 1188,
+ -2298, 1190, 1191, 1192, 3772, 3773, 3774, 1196,
+ 1197, 3777, 3778, 3779, 1201, 1202, 1203, -1747,
+ 1205, 1206, 1207, 1021, -1744, 1210, -1743, -1743,
+ 4325, 1219, 4326, 1216, 4327, 1218, 4328, 1220,
+ 1221, 1234, 1223, 1224, 1225, 1226, 1227, -1730,
+ -1730, -1730, 1231, 1232, 999, 1234, 1235, 1236,
+ 1237, 1238, 855, 1240, 1241, 1242, 857, 857,
+ 857, 857, 857, 857, 857, 857, 857, 857,
+ 857, 1254, 1255, 1256, 1257, 1258, 1259, 1260,
+ 1261, 1262, 2969, 2970, 2971, 2972, 2973, 2974,
+ 2975, 2976, 2977, 2978, -4426, -2483, -4426, -2481,
+ -6106, 878, 879, -4286, -4286, -4286, -978, 888,
+ 889, -975, -974, -973, -972, -971, -970, -4268,
+ -4268, -2059, -4268, -968, -4268, -4268, -967, -966,
+ -6129, -6129, -963, -962, -961, -4268, -6133, -6133,
+ -4268, -4268, -4268, -4268, -4268, -4268, -4268, -4268,
+ -3178, -4268, -1502, -1502, -1502, -1502, -1502, 3902,
+ 3903, 3904, -1502, 3906, 3907, -1502, -1502, -1502,
+ -4269, 529, -1502, 0, 0, 0, -1502, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 170, 171, 172, 173, 174, 175, 176,
+ 177, 178, 179, 180, 181, 182, 183, 184,
+ 185, 186, 187, 188, 189, 190, 191, 192,
+ 193, 194, 195, 196, 197, 198, 199, 200,
+ 201, 202, 203, 204, 205, 206, 207, 208,
+ 209, 210, 211, 212, 213, 214, 215, 216,
+ 217, 218, 219, -3194, 221, 222, 223, 224,
+ -1657, 226, 227, -1657, 229, 230, -1655, 555,
+ -1655, 234, 235, 236, 732, 238, 239, 240,
+ 241, 242, 243, -1655, 245, 246, 247, 248,
+ -1655, 250, -1655, 252, -1655, -1655, -1655, -1655,
+ -1655, -1655, 259, -1655, -1655, -1655, -1655, 264,
+ -1655, 266, -1655, 268, -1655, -3620, 271, 272,
+ -1655, 274, 275, -1655, 277, -1655, -1655, 280,
+ -1655, 282, 5746, 5747, 5748, 5749, -1655, 288,
+ -1655, 290, -3335, 3649, 3650, -1515, -1515, -1515,
+ 1793, 3659, 3660, 1796, 1797, 1798, 1799, 1800,
+ 1801, -1497, -1497, 712, -1497, 1803, -1497, -1497,
+ 1804, 1805, -3358, -3358, 1808, 1809, 1810, -1497,
+ -3362, -3362, -1497, -1497, -1497, -1497, -1497, -1497,
+ -1497, -1497, -407, -1497, -1497, -1497, -1497, -1497,
+ -1497, 3667, 3668, -1497, -1497, -1497, 1811, 3677,
+ 3678, 32767, 1814, 32767, 1815, 32767, 32767, 1816,
+ 1817, 32767, 32767, 32767, 1818, 1819, 1820, 1821,
+ -3342, -3342, 1824, 1825, 1826, 1827, 1828, 1829,
+ 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837,
+ 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845,
+ 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853,
+ 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861,
+ 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869,
+ 1870, 1871, 1872, 1873, 1874, 1875, 1876, -1537,
+ 1878, 1879, 1880, 1881, 0, 1883, 1884, 0,
+ 529, 0, 0, 2210, 0, 1889, 1890, 1891,
+ 2387, 1893, 1894, 1895, 1896, 1897, 1898, 0,
+ 1900, 1901, 1902, 1903, 0, 1905, 0, 1907,
+ 0, 0, 0, 0, 0, 0, 1914, 0,
+ 0, 0, 0, 1919, 0, 1921, 0, 1923,
+ 0, -1965, 1926, 1927, 0, 1929, 1930, 0,
+ 1932, 0, 0, 1935, 0, 1937, 7401, 7402,
+ 7403, 7404, 0, 1943, 0, 1945, 1946, 0,
+ 1948, 0, 0, 1951, 1952, 1953, 1954, 0,
+ 1956, 1957, 1958, 1959, 1960, 1961, 1962, 0,
+ 1964, 1965, 1966, 1967, 0, 1969, 1970, 1971,
+ 1972, 0, 1974, 0, 1976, 1977, 1978, 1979,
+ 1980, 1981, 1982, 1983, 1984, 1985, 0, 1987,
+ 1988, 1989, 1990, 1991, 566, 566, 566, 5141,
+ 5142, 566, 566, 566, 566, 566, 566, 566,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 8673, 5722, 5722, 5722, 0, 8676,
+ 5723, 8677, 8678, 2611, 5718, 2612, 5723, 2613,
+ 5723, 2614, 5723, 5723, 5711, 5723, 5723, 5723,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 895, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 151, 2776, 4254, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1821, 0,
+ 0, 0, 596, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -2856, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, -2901, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, -1025, 32767, 32767, 32767,
+ 32767, -2910, 32767, 32767, 32767, 32767, 157, 32767,
+ 32767, 32767, 32767, 158, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 2359, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 160, 32767, 161, 162, 163, 164,
+ 165, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 898, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 1428, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 1254, 32767, 32767, 32767,
+ 32767, 1250, 32767, 32767, 32767, 32767, 1246, 32767,
+ 32767, 32767, 32767, 1243, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1231, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 1842, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 3177, 1235, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, -4323,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 174, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 1830, -112, 1832, -112, 3514, -3469,
+ -3469, 1697, 1698, 1699, -1608, -3473, -3473, -1608,
+ -1608, -1608, -1608, -1608, -1608, 1691, 1692, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, -1623, -1623, -1623, 3541, 3542, -1623, -1623,
+ -1623, -1623, -1623, -1623, -1623, -1623, -1623, -1623,
+ -1623, -1623, -1623, -1623, -1623, -1623, -1623, -1623,
+ -1623, -1623, -1623, -1623, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -766, 2253, 2254, 2255, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1531, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 0, 32767, 0, 0, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -173, -173, -173, -173, -173,
+ -173, -173, -173, -173, -173, -173, -173, 3241,
+ -173, -173, -173, -173, 1709, -173, -173, 1712,
+ -173, -173, 1713, -496, 1715, -173, -173, -173,
+ -668, -173, -173, -173, -173, -173, -173, 1726,
+ -173, -173, -173, -173, 1731, -173, 1733, -173,
+ 1735, 1736, 1737, 1738, 1739, 1740, -173, 1742,
+ 1743, 1744, 1745, -173, 1747, -173, 1749, -173,
+ 1751, 3717, -173, -173, 1755, -173, -173, 1758,
+ -173, 1760, 1761, -173, 1763, -173, -5636, -5636,
+ -5636, -5636, 1769, -173, 1771, -173, 3453, -3530,
+ -3530, 1636, 1637, 1638, -1669, -3534, -3534, -1669,
+ -1669, -1669, -1669, -1669, -1669, 1630, 1631, -577,
+ 1633, -1666, 1635, 1636, -1664, -1664, 3500, 3501,
+ -1664, -1664, -1664, 1644, 3510, 3511, 1647, 1648,
+ 1649, 1650, 1651, 1652, 1653, 1654, 565, 1656,
+ 1657, 1658, 1659, 1660, 1661, -3502, -3502, 1664,
+ 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672,
+ 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680,
+ 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688,
+ 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696,
+ 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704,
+ 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712,
+ 1713, 1714, 1715, 1716, -1697, 1718, 1719, 1720,
+ 1721, -160, 1723, 1724, -160, 1726, 1727, -158,
+ 2052, -158, 1731, 1732, 1733, 2229, 1735, 1736,
+ 1737, 1738, 1739, 1740, -158, 1742, 1743, 1744,
+ 1745, -158, 1747, -158, 1749, -158, -158, -158,
+ -158, -158, -158, 1756, -158, -158, -158, -158,
+ 1761, -158, 1763, -158, 1765, -158, -2123, 1768,
+ 1769, -158, 1771, 1772, -158, 1774, -158, -158,
+ 1777, -158, 1779, 7243, 7244, 7245, 7246, -158,
+ 1785, -158, 1787, -1838, 5146, 5147, -18, -18,
+ -18, 3290, 5156, 5157, 3293, 3294, 3295, 3296,
+ 3297, 3298, 0, 0, 2209, 0, 3300, 0,
+ 0, 3301, 3302, -1861, -1861, 3305, 3306, 3307,
+ 0, -1865, -1865, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1090, 0, 0, 0, 0,
+ 0, 0, 5164, 5165, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3414, 0, 0, 0, 0, 1882, 0,
+ 0, 1885, 0, 0, 1886, -323, 1888, 0,
+ 0, 0, -495, 0, 0, 0, 0, 0,
+ 0, 1899, 0, 0, 0, 0, 1904, 0,
+ 1906, 0, 1908, 1909, 1910, 1911, 1912, 1913,
+ 0, 1915, 1916, 1917, 1918, 0, 1920, 0,
+ 1922, 0, 1924, 3890, 0, 0, 1928, 0,
+ 0, 1931, 0, 1933, 1934, 0, 1936, 0,
+ -5463, -5463, -5463, -5463, 1942, 0, 1944, 0,
+ 0, 1947, 0, 1949, 1950, 0, 0, 0,
+ 0, 1955, 0, 0, 0, 0, 0, 0,
+ 0, 1963, 0, 0, 0, 0, 1968, 0,
+ 0, 0, 0, 1973, 0, 1975, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1986, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 527, 527, 527, 527, 0,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 1998, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1999, 2000, 2001, 2002, 2003, 32767, 32767, 32767,
+ 32767, 32767, 2004, 32767, 2005, 2006, 2007, 2008,
+ 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016,
+ 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024,
+ 2025, 2026, 1200, 1200, 32767, 4498, 4499, 2291,
+ 2032, 2033, 32767, 2034, 32767, 2035, 2036, 32767,
+ 2037, 2038, 32767, 2039, 2040, 2041, 2042, 2043,
+ 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051,
+ 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059,
+ 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067,
+ 2068, -1506, -1506, -1506, -1506, -1506, -1506, -1506,
+ 2076, -2490, 2078, 2079, 2080, 2081, 2082, 2083,
+ 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091,
+ 2092, 2093, 2094, 2095, -105, -2314, 2098, 2099,
+ 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107,
+ 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115,
+ 2116, 2117, 2118, 2119, 2120, 5459, 2122, 2123,
+ 2124, 2125, 2126, 2127, 2128, 5466, 2130, 5467,
+ 2132, 2133, 2134, 2135, 5471, 2137, 2138, 5473,
+ 5473, 5473, 5473, 2143, 2144, 5475, 2146, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154,
+ 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162,
+ 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170,
+ 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178,
+ 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186,
+ 2187, 2188, 2189, 2190, 2191, 32767, -726, 2293,
+ -725, -725, -725, 1357, 1358, 1359, -722, 2201,
+ 2202, 2203, 2204, 2205, 0, 2207, -715, 2209,
+ -714, -714, -714, 2213, 2214, 2215, 4806, 2217,
+ 2218, 2219, 2220, 2221, 2222, 2223, -710, 2225,
+ -248, -704, -704, 2229, 2230, 2231, 2232, 2233,
+ 2220, 1430, 2236, 2237, -695, 2239, -694, 2241,
+ -693, -693, 2244, 2245, 2246, 2231, 2231, 2249,
+ 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2239,
+ 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265,
+ 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273,
+ 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281,
+ 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289,
+ 2290, 2291, 2292, 2293, 3084, 2295, 2296, 2297,
+ 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305,
+ 2306, 2307, 3983, 2309, 2310, 2292, 2312, 3992,
+ 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321,
+ 2322, 2323, 2324, 2325, 2326, 2327, 2328, 4023,
+ 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337,
+ 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345,
+ 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353,
+ 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361,
+ 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369,
+ 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377,
+ 2378, 2379, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2389, 2390, 2391, 2392, 2393,
+ 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401,
+ 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409,
+ 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417,
+ 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425,
+ 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433,
+ 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441,
+ 2442, 2443, 2444, 2445, 2446, 2447, 32767, 2448,
+ 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456,
+ 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464,
+ 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472,
+ 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480,
+ 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488,
+ 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496,
+ 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504,
+ 2505, 2506, 2507, 2508, 2509, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 2510,
+ 2511, 2512, 2513, 3266, 3266, 3266, 3266, 2518,
+ 3267, 3267, 3267, 2522, 3268, 3268, 3268, 3268,
+ 3268, 3268, 3268, 6682, 3268, 3268, 3268, 2534,
+ 5151, 3269, 2537, 2538, 3271, 3271, 5157, 2948,
+ 5159, 2544, 2545, 3273, 2778, 3273, 2549, 3274,
+ 2551, 3275, 2553, 5175, 2555, 3277, 3277, 3277,
+ 5181, 2560, 5184, 3278, 5186, 2564, 5189, 5190,
+ 5191, 5192, 3279, 5194, 5195, 2572, 5198, 32767,
+ 32767, 3278, 5200, 3278, 2577, 2578, 2579, 2580,
+ 5210, 3282, 3282, 5213, 3282, 2586, 2587, 2588,
+ 2589, 2590, 2591, -2175, -2175, -2175, 5230, 3288,
+ 5232, 3288, 6914, -69, -69, 5097, 5098, 5099,
+ 1792, -73, -73, 1792, 1792, 1792, 1792, 1792,
+ 1792, 5091, 5092, 2884, 5094, 1795, 5096, 5097,
+ 1797, 1797, 6961, 6962, 1797, 1797, 1797, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 2578, 2578, 2578, 2578, 2578,
+ 2578, 872, 872, 872, 872, 872, 872, 872,
+ 872, 872, 872, 8277, 6335, 8279, 6335, 9961,
+ 2978, 2978, 8144, 8145, 8146, 4839, 2974, 2974,
+ 4839, 4839, 4839, 4839, 4839, 4839, 8138, 8139,
+ 5931, 8141, 4842, 8143, 8144, 4844, 4844, 10008,
+ 10009, 4844, 4844, 4844, 8152, 10018, 10019, 8155,
+ 8156, 8157, 8158, 8159, 8160, 8161, 8162, 7073,
+ 8164, 5399, 5400, 5401, 5402, 5403, 0, 0,
+ 0, 5407, 0, 0, 5410, 5411, 5412, 8180,
+ 3383, 5415, 3914, 3915, 3916, 5419, 3918, 3919,
+ 3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 7172, 3758, 3758, 3758, 3758, 5640,
+ 3758, 3758, 5643, 3758, 3758, 5644, 3435, 5646,
+ 3758, 3758, 3758, 3263, 3758, 3758, 3758, 3758,
+ 3758, 3758, 5657, 3758, 3758, 3758, 3758, 5662,
+ 3758, 5664, 3758, 5666, 5667, 5668, 5669, 5670,
+ 5671, 3758, 5673, 5674, 5675, 5676, 3758, 5678,
+ 3758, 5680, 3758, 5682, 7648, 3758, 3758, 5686,
+ 3758, 3758, 5689, 3758, 5691, 5692, 3758, -1707,
+ -1707, -1707, -1707, -1707, -1707, 5698, 3756, 5700,
+ 3756, 7382, 399, 399, 5565, 5566, 5567, 2260,
+ 395, 395, 2260, 2260, 2260, 2260, 2260, 2260,
+ 5559, 5560, 3352, 5562, 2263, 5564, 5565, 2265,
+ 2265, 7429, 7430, 2265, 2265, 2265, 5573, 7439,
+ 7440, 5576, 5577, 5578, 5579, 5580, 5581, 5582,
+ 5583, 4494, 5585, 2820, 2821, 2822, 2823, 2824,
+ -2579, -2579, -2579, 2828, -2579, -2579, 2831, 2832,
+ 2833, 5601, 804, 2836, 1335, 1336, 1337, 2840,
+ 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346,
+ 1347, 1348, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 4593, 1179, 1179, 1179,
+ 1179, 3061, 1179, 1179, 3064, 1179, 1179, 3065,
+ 856, 3067, 1179, 1179, 1179, 684, 1179, 1179,
+ 1179, 1179, 1179, 1179, 3078, 1179, 1179, 1179,
+ 1179, 3083, 1179, 3085, 1179, 3087, 3088, 3089,
+ 3090, 3091, 3092, 1179, 3094, 3095, 3096, 3097,
+ 1179, 3099, 1179, 3101, 1179, 3103, 5069, 1179,
+ 1179, 3107, 1179, 1179, 3110, 1179, 3112, 3113,
+ 1179, 3115, 1179, -4284, -4284, -4284, -4284, 3121,
+ 1179, 3123, 1179, 4805, -2178, -2178, 2988, 2989,
+ 2990, -317, -2182, -2182, -317, -317, -317, -317,
+ -317, -317, 2982, 2983, 775, 2985, -314, 2987,
+ 2988, -312, -312, 4852, 4853, -312, -312, -312,
+ 2996, 4862, 4863, 2999, 3000, 3001, 3002, 3003,
+ 3004, 3005, 3006, 1917, 3008, 3009, 3010, 3011,
+ 3012, 3013, -2150, -2150, 3016, 3017, 3018, 3019,
+ 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027,
+ 3028, 3029, 3030, 3031, 3032, 3033, 3034, 3035,
+ 32767, 32767, 32767, 3036, 3037, 3038, 3039, 3040,
+ 3041, 32767, 32767, 3042, 3043, 3044, 3045, 3046,
+ 3047, 32767, 32767, 3048, 3049, 3050, 3051, 3052,
+ 3053, 32767, 32767, 3054, 3055, 3056, 32767, 32767,
+ 32767, -357, 3058, 3059, 3060, 3061, 1180, 3063,
+ 0, 1179, 3065, 3066, 1181, 3391, 1181, 3070,
+ 0, 0, 0, 0, 32767, 0, 0, 32767,
+ 0, 32767, 0, 0, -4973, 32767, 32767, -7368,
+ -2202, -2201, -2200, -5507, -7372, -7372, -5507, -5507,
+ -5507, 32767, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 32767, 0, 0, 32767, 0,
+ -203, -2234, -732, -732, -732, -2234, -732, -732,
+ -2763, -1261, -1261, -1261, -2763, -1261, -1261, -1261,
+ -1261, -1261, -1261, -1261, -1261, -1261, -1261, -1091,
+ -1090, -1089, -1088, -1087, 32767, 32767, -1086, -1085,
+ -1084, -1083, -1082, -1081, -1080, -1079, -1078, -1077,
+ -1076, -1075, 32767, -1074, -1073, -1072, -1071, -1070,
+ -1069, -1068, -1067, -1066, -1065, -1064, -1063, -1062,
+ -1061, -1060, -1059, -1058, -1057, -1056, 32767, -1055,
+ -1054, -1053, -1052, 0, 32767, 32767, 32767, -1051,
+ -1050, -4463, 32767, -1048, 32767, -1047, -2928, -1045,
+ -1044, -2928, -1042, -1041, -2926, -716, -2926, -1037,
+ -1036, -1035, -539, -1033, -1032, -1031, -1030, -1029,
+ -1028, -2926, -1026, -1025, -1024, -1023, -2926, -1021,
+ -2926, -1019, -2926, -2926, -2926, -2926, -2926, -2926,
+ -1012, -2926, -2926, -2926, -2926, -1007, -2926, -1005,
+ -2926, -1003, -2926, -4891, -1000, -999, -2926, -997,
+ -996, -2926, -994, -2926, -2926, -991, 4475, 4476,
+ 4477, 4478, 4479, 4480, -2924, -981, -2924, -979,
+ -4604, 2380, 2381, -2784, -2784, -2784, 524, 2390,
+ 2391, 527, 528, 529, 530, 531, 532, -2766,
+ -2766, -557, -2766, 534, -2766, -2766, 535, 536,
+ -4627, -4627, 539, 540, 541, -2766, -4631, -4631,
+ -2766, -2766, -2766, -2766, -2766, -2766, -2766, -2766,
+ -1676, -2766, 0, 0, 0, 0, 0, 5404,
+ 5405, 5406, 0, 5408, 5409, 0, 0, 0,
+ -2767, 2031, 0, 1502, 1502, 1502, 0, 1502,
+ 1502, 1502, 1502, 1502, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 224, 225, 226, 32767, 227, 228, 229,
+ 230, 231, 232, 233, 234, 235, 236, 67,
+ 32767, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 32767, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, -271, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1940, 18, 1942, 3908, 18, 18, 1946, 18,
+ 18, 1949, 18, 1951, 1952, 18, 1954, 18,
+ -5445, -5445, -5445, -5445, 1960, 18, 1962, 18,
+ 3644, -3339, -3339, 1827, 1828, 1829, -1478, -3343,
+ -3343, -1478, -1478, -1478, -1478, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, 0,
+ 0, 32767, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1340, 1341,
+ 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349,
+ -2064, 1351, 1352, 1353, 1354, 32767, 1355, 1356,
+ 32767, 0, 32767, 32767, 1679, 32767, 1357, 1358,
+ 1359, 1855, 1361, 1362, 1363, 1364, 1365, 1366,
+ 32767, 1367, 1368, 1369, 1370, 32767, 1371, 32767,
+ 1372, 32767, 32767, 32767, 32767, 32767, 32767, 1373,
+ 32767, 32767, 32767, 32767, 1374, 32767, 1375, 32767,
+ 1376, 32767, -2513, 1378, 1379, 32767, 1380, 1381,
+ 32767, 1382, 32767, 32767, 1383, 32767, 1384, 32767,
+ 6848, 32767, 6849, 32767, 1387, 32767, 1388, 1389,
+ 32767, 1390, 32767, 32767, 1391, 1392, 1393, 1394,
+ 32767, 1395, 1396, 1397, 1398, 1399, 1400, 1401,
+ 32767, 1402, 1403, 1404, 1405, 32767, 1406, 1407,
+ 1408, 1409, 32767, 1410, 32767, 1411, 1412, 1413,
+ 1414, 1415, 1416, 1417, 1418, 1419, 1420, 32767,
+ 1421, 1422, 1423, 1424, 1425, 0, 0, 0,
+ 4575, 4576, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -571, -571,
+ -571, 0, -572, 8101, 5150, 5150, 5150, 5337,
+ 8103, 5150, 8104, 8105, 2038, 5145, 2039, 5150,
+ 2040, 5150, 2041, 5150, 5150, 5138, 5150, 5150,
+ 5150, 5150, 5150, 8108, 8109, 8110, 5150, 5150,
+ 5384, 5150, 0, 5151, 5151, 5151, 5535, 5151,
+ 5151, 5151, 5537, 5538, 5539, 5540, 5541, 5542,
+ 5543, 5544, 5545, 5546, 5547, 5151, 5151, 2572,
+ 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572,
+ 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572,
+ 2572, 2572, 2572, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 0, 2580,
+ 0, 2580, 0, 0, 0, 2580, 2580, 2580,
+ 0, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 0, 2580, 0, 0, 0, 2580, 2580, 2580,
+ 5517, 5518, 5519, 5520, 5521, 5522, -6, -6,
+ -6, 0, 0, 0, 0, 2581, 2581, 2581,
+ 2581, 5527, 2581, 2581, 2581, 2581, 0, 5528,
+ 0, 2581, 0, 0, 2581, 2581, 0, 0,
+ 0, 0, 0, 0, 5529, 5530, 5531, 32767,
+ 32767, 2579, 2579, 2579, 2579, 2579, 0, 0,
+ 2579, 2579, 2579, 2765, 0, 0, 0, 0,
+ 2579, 2579, 2579, 2579, 6066, 2579, 6066, 2579,
+ 2579, 2579, 0, 0, 0, 2579, 2579, 0,
+ 0, 0, 2579, 2579, 2579, 5530, 2579, 2579,
+ 2579, 2766, 5532, 2579, 5533, 5534, -533, 2574,
+ -532, 2579, -531, 2579, -530, 2579, 2579, 2567,
+ 2579, 2579, 2579, 2579, 2579, 5537, 5538, 5539,
+ 2579, 2579, 2813, 2579, 2579, 2579, 2579, 2579,
+ 2963, 2579, 2579, 2579, 2965, 2966, 2967, 2968,
+ 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2579,
+ 2579, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 331, 32767, 332, -2580, -2580, -2580,
+ -2580, 0, 0, 0, 0, 0, 0, 0,
+ -2580, 0, -2580, 0, -2580, -2580, -2580, 0,
+ 0, 0, -2580, 0, 0, 0, 0, 0,
+ 0, 0, -2580, 0, -2580, -2580, -2580, 0,
+ 0, 0, 2937, 2938, 2939, 2940, 2941, 2942,
+ -2586, -2586, -2586, -2580, -2125, -2581, -2581, 0,
+ 0, 0, 0, 2946, 0, 0, 0, 0,
+ -2581, 2947, -2581, 0, -2581, -2581, 0, 0,
+ -2581, -2581, -2581, -2581, -2581, -2581, 2948, 2949,
+ 2950, 2945, 2491, 0, 0, 0, 0, 0,
+ -2579, -2579, 0, 0, 0, 186, -2579, -2579,
+ -2579, -2579, 0, 0, 0, 0, 3487, 0,
+ 3487, 0, 0, 0, -2579, -2579, -2579, 0,
+ 0, -2579, -2579, -2579, 0, 0, 0, 2951,
+ 0, 0, 0, 187, 2953, 0, 2954, 2955,
+ -3112, -5, -3111, 0, -3110, 0, -3109, 0,
+ 0, -12, 0, 0, 0, 0, 0, 2958,
+ 2959, 2960, 0, 0, 234, 0, 0, 0,
+ 0, 0, 384, 0, 0, 0, 386, 387,
+ 388, 389, 390, 391, 392, 393, 394, 395,
+ 396, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -1706, -1706, -1706, 0, 0, 0,
+ 0, 385, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 397,
+ 398, 399, 400, 401, 402, 403, 404, 405,
+ 2112, 2113, 2114, 409, 410, 411, 412, 32767,
+ 413, 414, 415, 416, 417, 418, 419, 420,
+ 421, 422, 423, 424, 425, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ -1688, 32767, 32767, 32767, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, 0,
+ 0, -752, -751, -750, -749, 0, -748, -747,
+ -746, 0, -745, -744, -743, -742, -741, -740,
+ -739, -4152, -737, -736, -735, 0, -2616, -733,
+ 0, 0, -732, -731, -2616, -406, -2616, 0,
+ 0, -727, -231, -725, 0, -724, 0, -723,
+ 0, -2621, 0, -721, -720, -719, -2622, 0,
+ -2623, -716, -2623, 0, -2624, -2624, -2624, -2624,
+ -710, -2624, -2624, 0, -2625, -706, -2625, -704,
+ -2625, -702, 0, 0, 0, 0, -2629, -700,
+ -699, -2629, -697, 0, 0, 0, 0, 0,
+ 0, 4767, 4768, 4769, -2635, -692, -2635, -690,
+ -4315, 2669, 2670, -2495, -2495, -2495, 813, 2679,
+ 2680, 816, 817, 818, 819, 820, 821, -2477,
+ -2477, -268, -2477, 823, -2477, -2477, 824, 825,
+ -4338, -4338, 828, 829, 830, -2477, -4342, -4342,
+ -2477, -2477, -2477, -2477, -2477, -2477, -2477, -2477,
+ -1387, 0, 0, 32767, 32767, 0, 0, 0,
+ 0, 0, -2486, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 1756, 1757, 1758,
+ 1759, -5645, -3702, -5645, -3700, -7325, -341, -340,
+ -5505, -5505, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 532, 533,
+ 32767, 534, 535, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -781, 1084, 1084, 1084, 1084,
+ 1084, 1084, 4383, 4384, 2176, 4386, 1087, 4388,
+ 4389, 1089, 1089, 6253, 6254, 1089, 1089, 1089,
+ 4397, 6263, 6264, 4400, 4401, 4402, 4403, 4404,
+ 4405, 4406, 4407, 3318, 4409, 4410, 4411, 4412,
+ 4413, 4414, -749, -749, 4417, 4418, 4419, 4420,
+ 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428,
+ 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436,
+ 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444,
+ 4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452,
+ 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460,
+ 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468,
+ 4469, 1056, 4471, 4472, 4473, 4474, 2593, 4476,
+ 4477, 2593, 4479, 4480, 2595, 4805, 2595, 4484,
+ 4485, 4486, 4982, 4488, 4489, 4490, 4491, 4492,
+ 4493, 2595, 4495, 4496, 4497, 4498, 2595, 4500,
+ 2595, 4502, 2595, 2595, 2595, 2595, 2595, 2595,
+ 4509, 2595, 2595, 2595, 2595, 4514, 2595, 4516,
+ 2595, 4518, 2595, 630, 4521, 4522, 2595, 4524,
+ 4525, 2595, 4527, 2595, 2595, 4530, 2595, 4532,
+ 9996, 9997, 9998, 9999, 2595, 4538, 2595, 4540,
+ 4541, 2595, 4543, 2595, 2595, 4546, 4547, 4548,
+ 4549, 2595, 4551, 4552, 4553, 4554, 4555, 4556,
+ 4557, 2595, 4559, 4560, 4561, 4562, 2595, 4564,
+ 4565, 4566, 4567, 2595, 4569, 2595, 4571, 4572,
+ 4573, 4574, 4575, 4576, 4577, 4578, 4579, 4580,
+ 2595, 4582, 4583, 4584, 4585, 4586, 4587, 4588,
+ 4589, 4590, 4591, 4592, 4593, 4594, 4595, 4596,
+ 4597, 4598, 4599, 4600, 4601, 4602, 4603, 4604,
+ 4605, 4606, 4607, 4608, 4609, 4610, 4611, 4612,
+ 4613, 4614, 4615, 4089, 4090, 4091, 4092, 4620,
+ 4093, 4094, 4095, 4096, 4097, 4098, 4099, 4100,
+ 4101, 4102, 4103, 4104, 2765, 2765, 2765, 2765,
+ 2765, 2765, 2765, 2765, 2765, 2765, 6179, 2765,
+ 2765, 2765, 2765, 4647, 2765, 2765, 4650, 4122,
+ 4652, 4653, 2444, 4655, 2767, 2767, 2767, 2272,
+ 2767, 2767, 2767, 2767, 2767, 2767, 4666, 2767,
+ 2767, 2767, 2767, 4671, 2767, 4673, 2767, 4675,
+ 4676, 4677, 4678, 4679, 4680, 2767, 4682, 4683,
+ 4684, 4685, 2767, 4687, 2767, 4689, 2767, 4691,
+ 6657, 2767, 2767, 4695, 2767, 2767, 4698, 2767,
+ 4700, 4701, 2767, 4703, 2767, -2696, -2696, -2696,
+ -2696, 4709, 2767, 4711, 2767, 2767, 4714, 2767,
+ 4716, 4717, 2767, 2767, 2767, 2767, 4722, 2767,
+ 2767, 2767, 2767, 2767, 2767, 2767, 4730, 2767,
+ 2767, 2767, 2767, 4735, 2767, 2767, 2767, 2767,
+ 4740, 2767, 4742, 2767, 2767, 2767, 2767, 2767,
+ 2767, 2767, 2767, 2767, 2767, 4753, 2767, 2767,
+ 2767, 2767, 2767, 4193, 4194, 4195, -379, -379,
+ 4198, 4199, 4200, 4201, 4202, 4203, 4204, 4771,
+ 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779,
+ 4780, -3892, -940, -939, -938, 4785, -3890, -936,
+ -3889, -3889, 2179, -927, 2180, -930, 2181, -928,
+ 2182, -926, -925, -912, -923, -922, -921, 4803,
+ 4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811,
+ 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819,
+ 3925, 4821, 4822, 4823, 4824, 4825, 4826, 4827,
+ 4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835,
+ 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843,
+ 4844, 4845, 4846, 4847, 4848, 4849, 4850, 4851,
+ 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859,
+ 4860, 4710, 2086, 609, 4864, 4865, 4866, 4867,
+ 4868, 4869, 4870, 4871, 4872, 3052, 4874, 4875,
+ 4876, 4281, 4878, 4879, 4880, 4881, 4882, 4883,
+ 4884, 4885, 4886, 4887, 634, 4888, 4889, 4890,
+ 4891, 4892, 4893, 4894, 4895, 4896, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 4904, 338, 4906,
+ 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914,
+ 4915, 4916, 4917, 665, 666, 667, 668, 669,
+ 670, 671, 672, 673, 674, 675, 676, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 0, 0, 0, 0, 0, 32767, 0, 0,
+ 0, 0, 32767, 32767, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32767, 0, 0, 0, 2478, 32767, 2477,
+ 2477, 2477, 2477, 2477, 32767, 2476, 32767, 32767,
+ 32767, 2473, 2473, 2473, 2473, 2473, 2473, 2473,
+ 32767, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -2478, -2478, -2478, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ };
+
+ const unsigned char *k = (const unsigned char *) key;
+ size_t keylen = 4;
+ uint32 a = 0;
+ uint32 b = 1;
+
+ while (keylen--)
+ {
+ unsigned char c = *k++;
+
+ a = a * 257 + c;
+ b = b * 8191 + c;
+ }
+ return h[a % 9837] + h[b % 9837];
+}
+
+static const unicode_norm_info UnicodeNormInfo_NFKC_QC = {
+ UnicodeNormProps_NFKC_QC,
+ NFKC_QC_hash_func,
+ 4918
+};
--
2.22.0
On May 21, 2020, at 12:12 AM, John Naylor <john.naylor@2ndquadrant.com> wrote:
Hi,
Attached is a patch to use perfect hashing to speed up Unicode
normalization quick check.0001 changes the set of multipliers attempted when generating the hash
function. The set in HEAD works for the current set of NFC codepoints,
but not for the other types. Also, the updated multipliers now all
compile to shift-and-add on most platform/compiler combinations
available on godbolt.org (earlier experiments found in [1]). The
existing keyword lists are fine with the new set, and don't seem to be
very picky in general. As a test, it also successfully finds a
function for the OS "words" file, the "D" sets of codepoints, and for
sets of the first n built-in OIDs, where n > 5.
Prior to this patch, src/tools/gen_keywordlist.pl is the only script that uses PerfectHash. Your patch adds a second. I'm not convinced that modifying the PerfectHash code directly each time a new caller needs different multipliers is the right way to go. Could you instead make them arguments such that gen_keywordlist.pl, generate-unicode_combining_table.pl, and future callers can pass in the numbers they want? Or is there some advantage to having it this way?
—
Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
On Fri, May 29, 2020 at 5:59 AM Mark Dilger
<mark.dilger@enterprisedb.com> wrote:
On May 21, 2020, at 12:12 AM, John Naylor <john.naylor@2ndquadrant.com> wrote:
very picky in general. As a test, it also successfully finds a
function for the OS "words" file, the "D" sets of codepoints, and for
sets of the first n built-in OIDs, where n > 5.Prior to this patch, src/tools/gen_keywordlist.pl is the only script that uses PerfectHash. Your patch adds a second. I'm not convinced that modifying the PerfectHash code directly each time a new caller needs different multipliers is the right way to go.
Calling it "each time" with a sample size of two is a bit of a
stretch. The first implementation made a reasonable attempt to suit
future uses and I simply made it a bit more robust. In the text quoted
above you can see I tested some scenarios beyond the current use
cases, with key set sizes as low as 6 and as high as 250k.
Could you instead make them arguments such that gen_keywordlist.pl, generate-unicode_combining_table.pl, and future callers can pass in the numbers they want? Or is there some advantage to having it this way?
That is an implementation detail that callers have no business knowing about.
--
John Naylor https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
On May 28, 2020, at 8:54 PM, John Naylor <john.naylor@2ndquadrant.com> wrote:
On Fri, May 29, 2020 at 5:59 AM Mark Dilger
<mark.dilger@enterprisedb.com> wrote:On May 21, 2020, at 12:12 AM, John Naylor <john.naylor@2ndquadrant.com> wrote:
very picky in general. As a test, it also successfully finds a
function for the OS "words" file, the "D" sets of codepoints, and for
sets of the first n built-in OIDs, where n > 5.Prior to this patch, src/tools/gen_keywordlist.pl is the only script that uses PerfectHash. Your patch adds a second. I'm not convinced that modifying the PerfectHash code directly each time a new caller needs different multipliers is the right way to go.
I forgot in my first round of code review to mention, "thanks for the patch". I generally like what you are doing here, and am trying to review it so it gets committed.
Calling it "each time" with a sample size of two is a bit of a
stretch. The first implementation made a reasonable attempt to suit
future uses and I simply made it a bit more robust. In the text quoted
above you can see I tested some scenarios beyond the current use
cases, with key set sizes as low as 6 and as high as 250k.
I don't really have an objection to what you did in the patch. I'm not going to lose any sleep if it gets committed this way.
The reason I gave this feedback is that I saved the *kwlist_d.h files generated before applying the patch, and compared them with the same files generated after applying the patch, and noticed a very slight degradation. Most of the files changed without any expansion, but the largest of them, src/common/kwlist_d.h, changed from
static const int16 h[901]
to
static const int16 h[902]
suggesting that even with your reworking of the parameters for PerfectHash, you weren't able to find a single set of numbers that worked for the two datasets quite as well as different sets of numbers each tailored for a particular data set. I started to imagine that if we wanted to use PerfectHash for yet more stuff, the problem of finding numbers that worked across all N data sets (even if N is only 3 or 4) might be harder still. That's all I was referring to. 901 -> 902 is such a small expansion that it might not be worth worrying about.
—
Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
On Sat, May 30, 2020 at 12:13 AM Mark Dilger
<mark.dilger@enterprisedb.com> wrote:
I forgot in my first round of code review to mention, "thanks for the patch". I generally like what you are doing here, and am trying to review it so it gets committed.
And I forgot to say thanks for taking a look!
The reason I gave this feedback is that I saved the *kwlist_d.h files generated before applying the patch, and compared them with the same files generated after applying the patch, and noticed a very slight degradation. Most of the files changed without any expansion, but the largest of them, src/common/kwlist_d.h, changed from
static const int16 h[901]
to
static const int16 h[902]
Interesting, I hadn't noticed. With 450 keywords, we need at least 901
elements in the table. Since 901 is divisible by the new hash
multiplier 17, this gets triggered:
# However, it would be very bad if $nverts were exactly equal to either
# $hash_mult1 or $hash_mult2: effectively, that hash function would be
# sensitive to only the last byte of each key. Cases where $nverts is a
# multiple of either multiplier likewise lose information. (But $nverts
# can't actually divide them, if they've been intelligently chosen as
# primes.) We can avoid such problems by adjusting the table size.
while ($nverts % $hash_mult1 == 0
|| $nverts % $hash_mult2 == 0)
{
$nverts++;
}
This is harmless, and will go away next time we add a keyword.
--
John Naylor https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Attached is version 4, which excludes the output file from pgindent,
to match recent commit 74d4608f5. Since it won't be indented again, I
also tweaked the generator script to match pgindent for the typedef,
since we don't want to lose what pgindent has fixed already. This last
part isn't new to v4, but I thought I'd highlight it anyway.
--
John Naylor https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Attachments:
v4-0001-Tweak-the-set-of-candidate-multipliers-for-genera.patchapplication/x-patch; name=v4-0001-Tweak-the-set-of-candidate-multipliers-for-genera.patchDownload
From de9d213855ea4fdc56cd0602d63f5f704283940d Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Tue, 12 May 2020 17:45:49 +0800
Subject: [PATCH v4 1/3] Tweak the set of candidate multipliers for generating
perfect hash functions
The previous set of multipliers were inadequate for large sets of short
keys. A future commit will have that as a use case, so increase the
maximum size of multipliers attempted. Experimentation shows that the
existing callers are still happy with the smallest pair of multipliers.
Also make sure all multipliers compile to shift-and-add instructions
on most platforms. On x86-64 this was confirmed as far back as gcc 4.1
and clang 3.8.
---
src/tools/PerfectHash.pm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/tools/PerfectHash.pm b/src/tools/PerfectHash.pm
index 74fb1f2ef6..d6841589a3 100644
--- a/src/tools/PerfectHash.pm
+++ b/src/tools/PerfectHash.pm
@@ -81,13 +81,13 @@ sub generate_hash_function
# to calculate via shift-and-add, so don't change them without care.
# (Commonly, random seeds are tried, but we want reproducible results
# from this program so we don't do that.)
- my $hash_mult1 = 31;
+ my $hash_mult1 = 257;
my $hash_mult2;
my $hash_seed1;
my $hash_seed2;
my @subresult;
FIND_PARAMS:
- foreach (127, 257, 521, 1033, 2053)
+ foreach (17, 31, 127, 8191)
{
$hash_mult2 = $_; # "foreach $hash_mult2" doesn't work
for ($hash_seed1 = 0; $hash_seed1 < 10; $hash_seed1++)
--
2.22.0
v4-0002-Use-perfect-hashing-for-NFC-Unicode-normalization.patchapplication/x-patch; name=v4-0002-Use-perfect-hashing-for-NFC-Unicode-normalization.patchDownload
From 7e98ecd444b35416050cc3952804ddd995ff7fd6 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Thu, 17 Sep 2020 22:59:34 -0400
Subject: [PATCH v4 2/3] Use perfect hashing for NFC Unicode normalization
quick check
This makes the normalization check about 30% faster, while only adding 5kB
to the binary size. The hash lookup reuses the existing array of bitfields
used for binary search to get the quick check property and is generated as
part of make update-unicode.
NFKC quick check still uses binary search, simply to make the patch smaller.
---
.../generate-unicode_normprops_table.pl | 38 +-
src/common/unicode_norm.c | 36 +-
src/include/common/unicode_normprops_table.h | 344 ++++++++++++++++++
src/tools/pgindent/exclude_file_patterns | 6 +-
4 files changed, 415 insertions(+), 9 deletions(-)
diff --git a/src/common/unicode/generate-unicode_normprops_table.pl b/src/common/unicode/generate-unicode_normprops_table.pl
index e8e5097c09..7f00cb0ae4 100644
--- a/src/common/unicode/generate-unicode_normprops_table.pl
+++ b/src/common/unicode/generate-unicode_normprops_table.pl
@@ -9,6 +9,10 @@
use strict;
use warnings;
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
my %data;
print
@@ -17,6 +21,8 @@ print
print <<EOS;
#include "common/unicode_norm.h"
+typedef int (*qc_hash_func) (const void *key);
+
/*
* We use a bit field here to save space.
*/
@@ -24,7 +30,14 @@ typedef struct
{
unsigned int codepoint:21;
signed int quickcheck:4; /* really UnicodeNormalizationQC */
-} pg_unicode_normprops;
+} pg_unicode_normprops;
+
+typedef struct
+{
+ const pg_unicode_normprops *normprops;
+ qc_hash_func hash;
+ int num_normprops;
+} unicode_norm_info;
EOS
foreach my $line (<ARGV>)
@@ -66,6 +79,7 @@ foreach my $prop (sort keys %data)
"static const pg_unicode_normprops UnicodeNormProps_${prop}[] = {\n";
my %subdata = %{ $data{$prop} };
+ my @cp_packed;
foreach my $cp (sort { $a <=> $b } keys %subdata)
{
my $qc;
@@ -82,7 +96,29 @@ foreach my $prop (sort keys %data)
die;
}
printf "\t{0x%04X, %s},\n", $cp, $qc;
+
+ # Save the bytes as a string in network order.
+ push @cp_packed, pack('N', $cp);
}
print "};\n";
+
+ # Emit the definition of the hash function.
+
+ # To save space, skip building the function for the larger "C" form.
+ next if $prop eq "NFKC_QC";
+
+ my $funcname = $prop . '_hash_func';
+
+ my $f = PerfectHash::generate_hash_function(\@cp_packed, $funcname,
+ fixed_key_length => 4);
+ print "\nstatic $f\n";
+
+ # Emit the struct that wraps the hash lookup info into one variable.
+ printf "static const unicode_norm_info ";
+ printf "UnicodeNormInfo_%s = {\n", $prop;
+ printf "\tUnicodeNormProps_%s,\n", $prop;
+ printf "\t%s,\n", $funcname;
+ printf "\t%d\n", scalar @cp_packed;
+ printf "};\n";
}
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index ab5ce59345..1714837e64 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -476,6 +476,34 @@ qc_compare(const void *p1, const void *p2)
return (v1 - v2);
}
+static const pg_unicode_normprops *
+qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
+{
+ int h;
+ uint32 hashkey;
+
+ /*
+ * Compute the hash function. The hash key is the codepoint with the bytes
+ * in network order.
+ */
+ hashkey = htonl(ch);
+ h = norminfo->hash(&hashkey);
+
+ /* An out-of-range result implies no match */
+ if (h < 0 || h >= norminfo->num_normprops)
+ return NULL;
+
+ /*
+ * Since it's a perfect hash, we need only match to the specific codepoint
+ * it identifies.
+ */
+ if (ch != norminfo->normprops[h].codepoint)
+ return NULL;
+
+ /* Success! */
+ return &norminfo->normprops[h];
+}
+
/*
* Look up the normalization quick check character property
*/
@@ -483,18 +511,14 @@ static UnicodeNormalizationQC
qc_is_allowed(UnicodeNormalizationForm form, pg_wchar ch)
{
pg_unicode_normprops key;
- pg_unicode_normprops *found = NULL;
+ const pg_unicode_normprops *found = NULL;
key.codepoint = ch;
switch (form)
{
case UNICODE_NFC:
- found = bsearch(&key,
- UnicodeNormProps_NFC_QC,
- lengthof(UnicodeNormProps_NFC_QC),
- sizeof(pg_unicode_normprops),
- qc_compare);
+ found = qc_hash_lookup(ch, &UnicodeNormInfo_NFC_QC);
break;
case UNICODE_NFKC:
found = bsearch(&key,
diff --git a/src/include/common/unicode_normprops_table.h b/src/include/common/unicode_normprops_table.h
index 93a2e55b75..5e1e382af5 100644
--- a/src/include/common/unicode_normprops_table.h
+++ b/src/include/common/unicode_normprops_table.h
@@ -2,6 +2,8 @@
#include "common/unicode_norm.h"
+typedef int (*qc_hash_func) (const void *key);
+
/*
* We use a bit field here to save space.
*/
@@ -11,6 +13,13 @@ typedef struct
signed int quickcheck:4; /* really UnicodeNormalizationQC */
} pg_unicode_normprops;
+typedef struct
+{
+ const pg_unicode_normprops *normprops;
+ qc_hash_func hash;
+ int num_normprops;
+} unicode_norm_info;
+
static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
{0x0300, UNICODE_NORM_QC_MAYBE},
{0x0301, UNICODE_NORM_QC_MAYBE},
@@ -1245,6 +1254,341 @@ static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
{0x2FA1D, UNICODE_NORM_QC_NO},
};
+static int
+NFC_QC_hash_func(const void *key)
+{
+ static const int16 h[2463] = {
+ 0, -2717, 0, 221, 1293, 223, 1295, 225,
+ 226, 241, 0, 229, 230, 231, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -386, 0, 0, 0, 0, 0, 0, 0,
+ -163, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -246, -175, 1260, 0, 0, 0, -174, -173,
+ 0, -172, 0, 0, 0, 0, 0, 0,
+ 1049, 0, 300, 301, 1071, 0, 1071, 0,
+ 1071, 1071, 1057, 0, 0, 0, 0, 1061,
+ 0, -1053, 1664, 0, 2956, 0, 0, -13,
+ 0, 0, 0, 0, 2156, 0, 0, 0,
+ 0, 0, 0, 0, 71, 0, 1082, 0,
+ 1083, 1083, 0, 1084, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 359, 360, 361,
+ -1091, 363, -762, -130, -129, -128, -127, -126,
+ 137, -124, -708, -707, -706, -120, -185, -705,
+ -117, -184, -1307, -114, -113, -112, -111, 0,
+ 386, 387, 388, 389, -90, 391, 171, 172,
+ 394, -94, -183, 397, 398, 399, -98, -225,
+ 402, -1019, -636, -1019, -225, 407, 408, 409,
+ 410, 411, 674, 413, -171, -170, -169, 417,
+ 352, -168, 420, 353, -770, 423, 424, 425,
+ 426, 427, 428, 32767, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 32767, 32767, 237, 32767, 236, 32767,
+ 32767, 234, 234, 234, 234, 617, 234, 234,
+ 234, -2483, 234, -1430, 1526, -1430, 1527, 47,
+ 48, 471, 230, 32767, 32767, 32767, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227,
+ -159, 227, 227, 227, 227, 227, 227, 227,
+ 64, 227, 227, 227, 227, 227, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227,
+ -19, 52, 1487, 227, 227, 227, 53, 54,
+ 227, 55, 227, 227, 227, 227, 227, 227,
+ 1276, 227, -989, 32767, 1296, 225, 1296, 225,
+ 1296, 1296, 1282, 225, 225, 225, 225, 1286,
+ 225, -828, 1889, 225, 3181, 225, 225, 212,
+ 225, 225, 225, 225, 2381, 225, 225, 225,
+ 225, 225, 225, 225, 296, 225, 1307, 225,
+ 1308, 1308, 225, 1309, 225, 225, 225, 225,
+ 225, 225, 225, 225, 225, 225, 225, 225,
+ 225, 225, 225, 225, 225, 584, 585, 586,
+ -866, 588, -537, 95, 96, 97, 98, 99,
+ 362, 101, -483, -482, -481, 105, 40, -480,
+ 108, 41, -1082, 111, 112, 113, 114, 225,
+ 611, 612, 613, 614, 135, 616, 396, 397,
+ 619, 131, 42, 622, 623, 624, 127, 0,
+ 627, -794, -411, -794, 0, 632, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ -272, 32767, 32767, 32767, 0, 32767, 32767, 32767,
+ 32767, 32767, -166, -165, 32767, 32767, 32767, 32767,
+ -164, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 397, 32767, 396, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 386,
+ 0, 386, 386, 386, 386, 386, 386, 386,
+ 223, 386, 386, 386, 32767, 385, 385, 385,
+ 385, 385, 32767, 384, 32767, 383, 383, 32767,
+ 382, 382, 32767, 381, 381, 381, 381, 381,
+ 135, 206, 1641, 381, 32767, 32767, 32767, 32767,
+ 32767, 32767, -160, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 1148, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 32767, 32767, 32767, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, -257, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, -910, -910, 32767, 32767,
+ 0, 32767, 0, 32767, 0, 32767, 0, 32767,
+ 147, 32767, 0, 32767, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 143, 32767, 144, 32767, 145,
+ 32767, 146, 32767, 0, 32767, 148, 32767, 149,
+ 32767, 32767, 32767, -160, 32767, 32767, 32767, 32767,
+ 32767, 32767, 15, 32767, 32767, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 145, 32767, 144, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, -148, 32767, 32767, 32767, 32767,
+ 32767, 32767, 2009, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 32767, 32767, 135, -918, 32767,
+ 151, 32767, 32767, 0, 1, 2, 3, 4,
+ 133, 5, 6, 7, 8, 9, 10, 11,
+ 32767, 32767, -1248, 32767, 13, 154, 188, 188,
+ 32767, 32767, 32767, 32767, 32767, 155, 16, 32767,
+ 32767, 32767, 32767, 32767, 32767, -1853, -1054, 18,
+ -1052, -1051, -1036, 22, 32767, 157, 32767, 28,
+ 23, 1077, 673, 25, -2930, 0, 32767, 32767,
+ 32767, 32767, 32767, 27, 32767, 155, 32767, 154,
+ 32767, 32767, -62, 28, -42, 30, -1051, 32,
+ -1050, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 34,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 129, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 672, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 0, 32767,
+ 32767, 32767, 32767, 32767, -156, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, -155, 32767, 32767,
+ 32767, 0, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 73, 32767, 32767, 32767, 32767, 74, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 675,
+ 32767, 32767, 32767, 32767, 32767, 75, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 165, 32767, 32767, 32767, 166, 167,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 170, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 689, 690, 691, 692, 693, 694, 695,
+ 696, 697, 698, 699, 700, 701, 702, 703,
+ 704, 705, 706, 707, 708, 709, 710, 711,
+ 712, 713, 714, 715, 716, 717, 718, 719,
+ 720, 721, 722, -304, -303, -302, -301, -300,
+ -299, -298, -297, 930, -295, -294, -293, -292,
+ -291, -290, -289, -288, -287, -286, -285, -284,
+ -283, -282, -281, -280, -279, -278, -277, -276,
+ -275, 753, 754, 755, 646, 757, -712, -1765,
+ 952, -712, 2244, -712, 2245, 765, 766, 767,
+ 768, 125, 770, 771, 772, 773, 774, 775,
+ 603, 777, 778, 779, 780, 781, 782, 783,
+ 784, 2011, 786, 787, 788, 789, 790, 791,
+ 792, 793, 794, 795, 796, 797, 798, 799,
+ 800, 801, 802, 803, 804, 805, 806, 603,
+ 603, 809, 603, 811, 603, 603, 814, 815,
+ 816, 817, 435, 819, 820, 821, 3539, 823,
+ 603, -468, 603, -468, 603, 603, 589, 831,
+ 603, 603, 603, 835, 836, 837, 838, 839,
+ 840, 841, 842, 843, 844, 845, 846, 847,
+ 848, 849, 850, 851, 852, 1239, 854, 855,
+ 856, 857, 858, 859, 860, 1024, 862, 863,
+ 864, 865, 866, 867, 868, 869, 870, 871,
+ 872, 873, 874, 875, 876, 877, 878, 879,
+ 880, 881, 882, 883, 884, 1131, 1061, -373,
+ 888, 889, 890, 1065, 1065, 893, 1066, 895,
+ 896, 897, 898, 899, 900, -148, 902, 603,
+ 603, -166, 906, -164, 908, -162, -161, -146,
+ 912, 913, 914, 915, -145, 917, 1971, -745,
+ 920, -2035, 922, 923, 937, 925, 926, 927,
+ 928, -1227, 930, 931, 932, 933, 934, 935,
+ 936, 866, 938, -143, 940, -142, -141, 943,
+ -140, 32767, 945, 946, 947, 948, 949, 950,
+ 951, 952, 953, 954, 955, 956, 957, 958,
+ 959, 960, 961, -65, -64, -63, -62, -61,
+ -60, -59, -58, 1169, -56, -55, -54, -53,
+ -52, -51, -50, -49, -48, -47, -46, -45,
+ -44, -43, -42, -41, -40, -39, -38, -37,
+ -36, 992, 993, 994, 885, 996, -473, -1526,
+ 1191, -473, 2483, -473, 2484, 1004, 1005, 1006,
+ 1007, 364, 1009, 1010, 1011, 1012, 1013, 1014,
+ 842, 1016, 1017, 1018, 1019, 1020, 1021, 1022,
+ 1023, 2250, 1025, 1026, 1027, 1028, 1029, 1030,
+ 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038,
+ 1039, 1040, 1041, 1042, 1043, 1044, 1045, 842,
+ 842, 1048, 842, 1050, 842, 842, 1053, 1054,
+ 1055, 1056, 674, 1058, 1059, 1060, 3778, 1062,
+ 842, -229, 842, -229, 842, 842, 828, 1070,
+ 842, 842, 842, 1074, 1075, 1076, 1077, 1078,
+ 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086,
+ 1087, 1088, 1089, 1090, 1091, 1478, 1093, 1094,
+ 1095, 1096, 1097, 1098, 1099, 1263, 1101, 1102,
+ 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110,
+ 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118,
+ 1119, 1120, 1121, 1122, 1123, 1370, 1300, -134,
+ 1127, 1128, 1129, 1304, 1304, 1132, 1305, 1134,
+ 1135, 1136, 1137, 1138, 1139, 91, 1141, 842,
+ 842, 73, 1145, 75, 1147, 77, 78, 93,
+ 1151, 1152, 1153, 1154, 94, 1156, 2210, -506,
+ 1159, -1796, 1161, 1162, 1176, 1164, 1165, 1166,
+ 1167, -988, 1169, 1170, 1171, 1172, 1173, 1174,
+ 1175, 1105, 1177, 96, 1179, 97, 98, 1182,
+ 99, 1184, 1185, 1186, 1187, 1188, 1189, 1190,
+ 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198,
+ 1199, 1200, 0, 174, 175, 176, 177, 178,
+ 179, 180, 181, 1408, 183, 184, 185, 186,
+ 187, 188, 189, 190, 191, 192, 193, 194,
+ 195, 196, 197, 198, 199, 200, 201, 202,
+ 203, 0, 0, 206, 0, 208, 0, 0,
+ 211, 212, 213, 214, -168, 216, 217, 218,
+ 2936, 220, 0, -1071, 0, -1071, 0, 0,
+ -14, 228, 0, 0, 0, 232, 233, 234,
+ 235, 236, 237, 238, 239, 240, 241, 242,
+ 243, 244, 245, 246, 247, 248, 249, 636,
+ 251, 252, 253, 254, 255, 256, 257, 421,
+ 259, 260, 261, 262, 263, 264, 265, 266,
+ 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 528,
+ 458, -976, 285, 286, 287, 462, 462, 290,
+ 463, 292, 293, 294, 295, 296, 297, -751,
+ 299, 0, 0, -769, 303, -767, 305, -765,
+ -764, -749, 309, 310, 311, 312, -748, 314,
+ 1368, -1348, 317, -2638, 319, 320, 334, 322,
+ 323, 324, 325, -1830, 327, 328, 329, 330,
+ 331, 332, 333, 263, 335, -746, 337, -745,
+ -744, 340, -743, 342, 343, 344, 345, 346,
+ 347, 348, 349, 350, 351, 352, 353, 354,
+ 355, 356, 357, 358, 0, 0, 0, 1453,
+ 0, 1126, 495, 495, 495, 495, 495, 233,
+ 495, 1080, 1080, 1080, 495, 561, 1082, 495,
+ 563, 1687, 495, 495, 495, 495, 385, 0,
+ 0, 0, 0, 480, 0, 221, 221, 0,
+ 489, 579, 0, 0, 0, 498, 626, 0,
+ 1422, 1040, 1424, 631, 0, 0, 0, 0,
+ 0, -262, 0, 585, 585, 585, 0, 66,
+ 587, 0, 68, 1192, 0, 0, 0, 0,
+ 0, 0, 32767, 32767, 32767, 32767, 669, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 670,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 142, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 115, 116, 117, 118, 119, 120,
+ 121, 122, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, 132, 133, 134, 135, 136,
+ 137, 138, 139, 140, 141, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, -199, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1027, 0, 0, 0, 110, 0,
+ 1470, 2524, -192, 1473, -1482, 1475, -1481, 0,
+ 0, 0, 0, 644, 0, 0, 0, 0,
+ 0, 0, 173, 0, 0, 0, 0, 0,
+ 0, 0, 0, -1226, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 204, 205, 0, 207, 0, 209, 210,
+ 0, 0, 0, 0, 383, 0, 0,
+ };
+
+ const unsigned char *k = (const unsigned char *) key;
+ size_t keylen = 4;
+ uint32 a = 0;
+ uint32 b = 0;
+
+ while (keylen--)
+ {
+ unsigned char c = *k++;
+
+ a = a * 257 + c;
+ b = b * 17 + c;
+ }
+ return h[a % 2463] + h[b % 2463];
+}
+
+static const unicode_norm_info UnicodeNormInfo_NFC_QC = {
+ UnicodeNormProps_NFC_QC,
+ NFC_QC_hash_func,
+ 1231
+};
+
static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
{0x00A0, UNICODE_NORM_QC_NO},
{0x00A8, UNICODE_NORM_QC_NO},
diff --git a/src/tools/pgindent/exclude_file_patterns b/src/tools/pgindent/exclude_file_patterns
index b2e9d8f654..7022aa7c80 100644
--- a/src/tools/pgindent/exclude_file_patterns
+++ b/src/tools/pgindent/exclude_file_patterns
@@ -10,9 +10,11 @@ src/include/jit/llvmjit\.h$
# This confuses pgindent, and it's a derived file anyway.
src/backend/utils/fmgrtab\.c$
#
-# kwlist_d files are made by gen_keywordlist.pl. While we could insist that
-# they match pgindent style, they'd look worse not better, so exclude them.
+# Exclude files with hash functions generated via PerfectHash.pm.
+# While we could insist that they match pgindent style, they'd look
+# worse not better, so exclude them.
kwlist_d\.h$
+src/include/common/unicode_normprops_table\.h$
#
# Exclude ecpg test files to avoid breaking the ecpg regression tests
# (but include files at the top level of the ecpg/test/ directory).
--
2.22.0
v4-0003-Use-perfect-hashing-for-NKFC-Unicode-normalizatio.patchapplication/x-patch; name=v4-0003-Use-perfect-hashing-for-NKFC-Unicode-normalizatio.patchDownload
From 36eda71568c5bc032d9eb5eb6ba6489b6225990d Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Thu, 17 Sep 2020 22:14:58 -0400
Subject: [PATCH v4 3/3] Use perfect hashing for NKFC Unicode normalization
quick check
This is about 50% faster than binary search. Also remove the ability to
use binary search for quick check.
---
.../generate-unicode_normprops_table.pl | 3 -
src/common/unicode_norm.c | 20 +-
src/include/common/unicode_normprops_table.h | 1257 +++++++++++++++++
3 files changed, 1258 insertions(+), 22 deletions(-)
diff --git a/src/common/unicode/generate-unicode_normprops_table.pl b/src/common/unicode/generate-unicode_normprops_table.pl
index 7f00cb0ae4..e0a201b6d1 100644
--- a/src/common/unicode/generate-unicode_normprops_table.pl
+++ b/src/common/unicode/generate-unicode_normprops_table.pl
@@ -105,9 +105,6 @@ foreach my $prop (sort keys %data)
# Emit the definition of the hash function.
- # To save space, skip building the function for the larger "C" form.
- next if $prop eq "NFKC_QC";
-
my $funcname = $prop . '_hash_func';
my $f = PerfectHash::generate_hash_function(\@cp_packed, $funcname,
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 1714837e64..5d951fc2e0 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -465,17 +465,6 @@ get_canonical_class(pg_wchar ch)
return entry->comb_class;
}
-static int
-qc_compare(const void *p1, const void *p2)
-{
- uint32 v1,
- v2;
-
- v1 = ((const pg_unicode_normprops *) p1)->codepoint;
- v2 = ((const pg_unicode_normprops *) p2)->codepoint;
- return (v1 - v2);
-}
-
static const pg_unicode_normprops *
qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
{
@@ -510,22 +499,15 @@ qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
static UnicodeNormalizationQC
qc_is_allowed(UnicodeNormalizationForm form, pg_wchar ch)
{
- pg_unicode_normprops key;
const pg_unicode_normprops *found = NULL;
- key.codepoint = ch;
-
switch (form)
{
case UNICODE_NFC:
found = qc_hash_lookup(ch, &UnicodeNormInfo_NFC_QC);
break;
case UNICODE_NFKC:
- found = bsearch(&key,
- UnicodeNormProps_NFKC_QC,
- lengthof(UnicodeNormProps_NFKC_QC),
- sizeof(pg_unicode_normprops),
- qc_compare);
+ found = qc_hash_lookup(ch, &UnicodeNormInfo_NFKC_QC);
break;
default:
Assert(false);
diff --git a/src/include/common/unicode_normprops_table.h b/src/include/common/unicode_normprops_table.h
index 5e1e382af5..bac3cc5cdb 100644
--- a/src/include/common/unicode_normprops_table.h
+++ b/src/include/common/unicode_normprops_table.h
@@ -6509,3 +6509,1260 @@ static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
{0x2FA1C, UNICODE_NORM_QC_NO},
{0x2FA1D, UNICODE_NORM_QC_NO},
};
+
+static int
+NFKC_QC_hash_func(const void *key)
+{
+ static const int16 h[9837] = {
+ -2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472,
+ -2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472,
+ -2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472,
+ -2472, -2472, -2472, -2472, -2472, 32767, 32767, 32767,
+ -2475, -2475, -2475, -2475, -2475, -2475, -2475, -2475,
+ -2475, -2475, -2475, -2475, -2475, -2475, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 865, 865, 865, 865, 865, 865, 865,
+ 865, 865, 865, 865, -2255, 32767, -5207, 32767,
+ -5207, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 4250, 861, 861, 861, 3339, 3339,
+ 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339,
+ 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339,
+ 32767, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 9, 10, 32767, 11, 12, 0, 32767,
+ 0, 2913, 2914, 2915, 2916, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 2917, 32767, 2918, -100,
+ 2919, 2920, 2921, 840, 840, 840, 2922, 0,
+ 0, 0, 0, 0, 2206, 0, 2923, 0,
+ 2924, 2925, 2926, 0, 0, 0, -2590, 0,
+ 0, 0, 0, 0, 0, 0, 2934, 0,
+ 2474, 2931, 2932, 0, 0, 0, 0, 0,
+ 14, 805, 0, 0, 2933, 0, 2934, 0,
+ 2935, 2936, 0, 0, 0, 16, 17, 0,
+ 0, 0, 0, 0, 0, 0, 0, 18,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -790, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -1675, 0, 0, 19, 0, -1679,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, -1694,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 20, 21, 22, 23, 24, 25,
+ 26, 27, 28, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 29, 30, 31, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 724, 2668, 724, 4350, -2633, -2633,
+ 2533, 2534, 2535, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 2518, 2519, 2520, 1431, 45, 46,
+ 32767, 32767, 47, 48, 49, 50, 51, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -3011, 53, -1125, -3010, -3010,
+ 32767, -3334, -1123, -3011, 60, 61, 62, 63,
+ 32767, 32767, 64, 32767, 65, 32767, 66, 67,
+ 32767, 32767, 32767, 32767, 32767, 32767, 2268, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 69, 70,
+ 71, 72, 73, 74, 32767, 32767, 32767, 32767,
+ 75, 76, 32767, 77, 281, 32767, 32767, 32767,
+ 32767, 32767, 32767, 811, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 1341, 1342, 1343, 1344, 1345,
+ 1346, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 86,
+ 32767, 32767, 32767, 32767, 32767, 4550, 32767, 32767,
+ 32767, 1135, 32767, 32767, 32767, 32767, 32767, 1130,
+ 3016, 32767, 3017, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 677, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 2858, 2859, 651, 2861, -438,
+ 2863, 2864, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -5305, -5305, -5305, 32767, -5306,
+ -5306, 32767, 32767, 32767, 2871, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 3022, 3023, 680, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, -272, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 4308, 4309, 4310,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 4311, 4312, 4313,
+ 4314, 4315, 4316, 4317, 4318, 4319, 4320, 4321,
+ 4322, 4323, 4324, 4325, 4326, 4307, 4307, 4307,
+ 4307, 4307, 4307, 4307, 4307, 4307, 4336, 4337,
+ 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345,
+ 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353,
+ 4354, 32767, 32767, 32767, 32767, 4355, 4356, 4357,
+ 4358, 4359, 4360, 4361, 4362, 4363, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 4364, 4365, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2202, 0, 0, 0, 59, 0,
+ 0, 35, 0, 0, 0, 3549, 0, 0,
+ 0, 0, 0, 3394, 0, 0, 3399, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2012,
+ 0, 0, 0, 0, 87, 2022, 0, 7490,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 2255, 0, 2256, 2256, 2256, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 0, 0,
+ 0, 0, 0, 0, -1759, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4767, 0, 0, 4772,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 5977, 0,
+ 892, 32767, 0, 32767, 32767, 0, 0, 32767,
+ 32767, 2344, 4834, 4835, 4836, 32767, 0, 4840,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 32767, 0, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 32767, 32767, 0, 32767, 0, 0, 0, 32767,
+ 32767, 32767, 32767, 3261, 3262, 32767, 3007, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 106, 107, 108, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 109, 110, 111, 112, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, -2344,
+ -2344, 0, 32767, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, -1642, 1469, -1641, 1469, -1640, 1469,
+ 1469, 1457, 1469, 1469, 1469, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -3359, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4103,
+ -1478, 0, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -2433, -4254, -4254, -4254, -3658,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, 0, -4253, -4253, -4253, -4253, -4253,
+ -4253, -4253, -4253, -4253, -678, -677, -676, -675,
+ -674, -673, -672, -4253, 314, -4253, -4253, -4253,
+ -4253, -4253, -4253, -4253, -4253, -4253, -4253, -4253,
+ -4253, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 1464, 1465, 1466, 1467,
+ 1468, 1469, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 0, 32767, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 827, 828, 829, -2469, -2469, -260, 0,
+ 0, 32767, 0, 32767, 0, 0, 32767, 0,
+ 0, 32767, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 3575, 3576, 3577, 3578, 3579, 3580, 3581, 0,
+ 4567, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2201, 4411, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -3338, 0, 0, 0,
+ 0, 0, 0, 0, -3337, 0, -3336, 0,
+ 0, 0, 0, -3335, 0, 0, -3334, -3333,
+ -3332, -3331, 0, 0, -3330, 0, 0, 32767,
+ 0, 0, 13, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 3073,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ -2556, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 3074, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 2355, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, -488, -488, -488, -302, -3067, -3067,
+ -3067, -3067, -488, -488, -488, -488, 2999, -488,
+ 2999, -488, -488, -488, -3067, -3067, -3067, -488,
+ -488, -3067, -3067, -3067, -488, -488, -488, 2463,
+ -488, -488, -488, -301, 2465, -488, 2466, 2467,
+ -3600, -493, -3599, -488, -3598, -488, -3597, -488,
+ -488, -500, -488, -488, -488, -488, -488, 2470,
+ 2471, 2472, -488, -488, -254, -488, -488, -488,
+ -488, -488, -104, -488, -488, -488, -102, -101,
+ -100, -99, -98, -97, -96, -95, -94, -93,
+ -92, -488, -488, -488, -488, -488, -488, -488,
+ -488, -488, -2194, -2194, -2194, -2194, -2194, -2194,
+ -2194, -2194, -2194, -2194, 5211, 3269, 5213, 3269,
+ 6895, -88, -88, 5078, 5079, 5080, 1773, -92,
+ -92, 1773, 1773, 1773, 1773, 1773, 1773, 5072,
+ 5073, 2865, 5075, 1776, 5077, 5078, 1778, 1778,
+ 6942, 6943, 1778, 1778, 1778, 5086, 6952, 6953,
+ 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096,
+ 4007, 5098, 2333, 2334, 2335, 2336, 2337, -3066,
+ -3066, -3066, 2341, -3066, -3066, 2344, 2345, 2346,
+ 5114, 317, 2349, 848, 849, 850, 2353, 852,
+ 853, 854, 855, 856, 857, 858, 859, 860,
+ 861, 692, 692, 692, 692, 692, 692, 692,
+ 692, 692, 692, 692, 692, 692, 692, 692,
+ 692, 692, 692, 692, 692, 692, 692, 692,
+ 692, 692, 692, 692, 692, 692, 692, 692,
+ 692, 692, 692, 692, 692, 692, 692, 692,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 3093, 3094, 3095, 3096, 3097, 3098, 3099,
+ 3100, 3101, 3102, 901, 3104, 3105, 3106, 3048,
+ 3108, 3109, 3075, 3111, 3112, 3113, -435, 3115,
+ 3116, 3117, 3118, 3119, -274, 3121, 3122, -276,
+ 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131,
+ 1120, 3133, 3134, 3135, 3136, 3050, 1116, 3139,
+ -4350, 3141, 3142, 3143, 3144, 3145, 3146, 3147,
+ 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155,
+ 3156, 902, 3158, 903, 904, 905, 3162, 3163,
+ 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171,
+ 3172, 3173, 3174, 3175, 3176, 3177, 32767, 3178,
+ 3179, 3180, 3181, 3182, 3183, 4943, 3185, 3186,
+ 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194,
+ 3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202,
+ 3203, 3204, 3205, 3206, 3207, 3208, 3209, 3210,
+ 3211, 3212, 3213, 3214, 3215, 3216, 3217, 3218,
+ 3219, 3220, 3221, 3222, 3223, -1543, 3225, 3226,
+ -1545, 3228, 3229, 3230, 3231, 3232, 3233, 3234,
+ 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242,
+ 3243, 3244, 3245, 3246, 3247, 3248, -1251, -2728,
+ 3250, 32767, 32767, 3251, 906, 907, 3252, 3253,
+ 32767, 32767, 910, -1579, -1579, -1579, 32767, 3258,
+ -1581, 3260, 3261, 3262, 3263, 3264, 3265, 3266,
+ 3267, 3268, 3269, 32767, 3270, 32767, 3271, 3272,
+ 3273, 3274, 3275, 3276, 3277, 32767, 3278, 3279,
+ 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287,
+ 3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295,
+ 3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303,
+ 3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311,
+ 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319,
+ 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327,
+ 3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335,
+ 3336, 32767, 3337, 3338, 3339, 3340, 3341, 3342,
+ 0, 3343, 3344, 3345, 3346, 32767, 32767, 3347,
+ 3348, 3349, 3350, 3351, 3352, 3353, 3354, 32767,
+ 3355, 3356, 3357, 3358, 3359, 3360, 3361, 32767,
+ 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369,
+ 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377,
+ 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385,
+ 3386, 3387, 3388, 3389, 0, 3390, 3391, 3392,
+ 915, 916, 917, 918, 919, 920, 921, 922,
+ 923, 924, 925, 926, 927, 928, 929, 930,
+ 931, 932, 933, 934, 935, 936, 937, 938,
+ 939, 940, 941, 942, 943, 944, 945, 946,
+ 947, 948, 949, 950, 951, 952, 953, 954,
+ 955, 956, 957, 958, 959, 960, 961, 962,
+ 963, 964, 965, 966, 967, 968, 969, 970,
+ 971, 972, 973, 974, 975, 976, 3449, 3450,
+ 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458,
+ 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466,
+ 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474,
+ 3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482,
+ 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490,
+ 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498,
+ 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506,
+ 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514,
+ 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522,
+ 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530,
+ 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538,
+ 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546,
+ 3547, 3548, 3549, 3550, 3551, 3552, 3553, 3554,
+ 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562,
+ 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570,
+ 3571, 3572, 3573, 3574, 3575, 3576, 3577, 6056,
+ 6057, 6058, 32767, 3581, 3582, 3583, 3584, 3585,
+ 4157, 4158, 4159, 3589, 4162, -4510, -1558, -1557,
+ -1556, -1742, -4507, -1553, -4506, -4506, 1562, -1544,
+ 1563, -1547, 1564, -1545, 1565, -1543, -1542, -1529,
+ -1540, -1539, -1538, -1537, -1536, -4493, -4493, -4493,
+ -1532, -1531, -1764, -1529, 3622, -1528, -1527, -1526,
+ -1909, -1524, -1523, -1522, -1907, -1907, -1907, -1907,
+ -1907, -1907, -1907, -1907, -1907, -1907, -1907, -1510,
+ -1509, 1071, 1072, 1073, 1074, 1075, 1076, 1077,
+ 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085,
+ 1086, 1087, 1088, 1089, 1090, 3663, 3664, 3665,
+ 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673,
+ 3674, 1095, 1096, 1097, 1098, 1099, 1100, 1101,
+ 3682, 1103, 3684, 1105, 3686, 3687, 3688, 1109,
+ 1110, 1111, 3692, 1113, 1114, 1115, 1116, 1117,
+ 1118, 1119, 3700, 1121, 3702, 3703, 3704, 1125,
+ 1126, 1127, -1809, -1809, -1809, -1809, -1809, -1809,
+ 3720, 3721, 3722, 3717, 3718, 3719, 3720, 1140,
+ 1141, 1142, 1143, -1802, 1145, 1146, 1147, 1148,
+ 3730, -1797, 3732, 1152, 3734, 3735, 1155, 1156,
+ 3738, 3739, 3740, 3741, 3742, 3743, -1785, -1785,
+ -1785, -1779, -1324, 1168, 1169, 1170, 1171, 1172,
+ 3752, 3753, 1175, 1176, 1177, 992, 3758, 3759,
+ 3760, 3761, 1183, 1184, 1185, 1186, -2300, 1188,
+ -2298, 1190, 1191, 1192, 3772, 3773, 3774, 1196,
+ 1197, 3777, 3778, 3779, 1201, 1202, 1203, -1747,
+ 1205, 1206, 1207, 1021, -1744, 1210, -1743, -1743,
+ 4325, 1219, 4326, 1216, 4327, 1218, 4328, 1220,
+ 1221, 1234, 1223, 1224, 1225, 1226, 1227, -1730,
+ -1730, -1730, 1231, 1232, 999, 1234, 1235, 1236,
+ 1237, 1238, 855, 1240, 1241, 1242, 857, 857,
+ 857, 857, 857, 857, 857, 857, 857, 857,
+ 857, 1254, 1255, 1256, 1257, 1258, 1259, 1260,
+ 1261, 1262, 2969, 2970, 2971, 2972, 2973, 2974,
+ 2975, 2976, 2977, 2978, -4426, -2483, -4426, -2481,
+ -6106, 878, 879, -4286, -4286, -4286, -978, 888,
+ 889, -975, -974, -973, -972, -971, -970, -4268,
+ -4268, -2059, -4268, -968, -4268, -4268, -967, -966,
+ -6129, -6129, -963, -962, -961, -4268, -6133, -6133,
+ -4268, -4268, -4268, -4268, -4268, -4268, -4268, -4268,
+ -3178, -4268, -1502, -1502, -1502, -1502, -1502, 3902,
+ 3903, 3904, -1502, 3906, 3907, -1502, -1502, -1502,
+ -4269, 529, -1502, 0, 0, 0, -1502, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 170, 171, 172, 173, 174, 175, 176,
+ 177, 178, 179, 180, 181, 182, 183, 184,
+ 185, 186, 187, 188, 189, 190, 191, 192,
+ 193, 194, 195, 196, 197, 198, 199, 200,
+ 201, 202, 203, 204, 205, 206, 207, 208,
+ 209, 210, 211, 212, 213, 214, 215, 216,
+ 217, 218, 219, -3194, 221, 222, 223, 224,
+ -1657, 226, 227, -1657, 229, 230, -1655, 555,
+ -1655, 234, 235, 236, 732, 238, 239, 240,
+ 241, 242, 243, -1655, 245, 246, 247, 248,
+ -1655, 250, -1655, 252, -1655, -1655, -1655, -1655,
+ -1655, -1655, 259, -1655, -1655, -1655, -1655, 264,
+ -1655, 266, -1655, 268, -1655, -3620, 271, 272,
+ -1655, 274, 275, -1655, 277, -1655, -1655, 280,
+ -1655, 282, 5746, 5747, 5748, 5749, -1655, 288,
+ -1655, 290, -3335, 3649, 3650, -1515, -1515, -1515,
+ 1793, 3659, 3660, 1796, 1797, 1798, 1799, 1800,
+ 1801, -1497, -1497, 712, -1497, 1803, -1497, -1497,
+ 1804, 1805, -3358, -3358, 1808, 1809, 1810, -1497,
+ -3362, -3362, -1497, -1497, -1497, -1497, -1497, -1497,
+ -1497, -1497, -407, -1497, -1497, -1497, -1497, -1497,
+ -1497, 3667, 3668, -1497, -1497, -1497, 1811, 3677,
+ 3678, 32767, 1814, 32767, 1815, 32767, 32767, 1816,
+ 1817, 32767, 32767, 32767, 1818, 1819, 1820, 1821,
+ -3342, -3342, 1824, 1825, 1826, 1827, 1828, 1829,
+ 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837,
+ 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845,
+ 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853,
+ 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861,
+ 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869,
+ 1870, 1871, 1872, 1873, 1874, 1875, 1876, -1537,
+ 1878, 1879, 1880, 1881, 0, 1883, 1884, 0,
+ 529, 0, 0, 2210, 0, 1889, 1890, 1891,
+ 2387, 1893, 1894, 1895, 1896, 1897, 1898, 0,
+ 1900, 1901, 1902, 1903, 0, 1905, 0, 1907,
+ 0, 0, 0, 0, 0, 0, 1914, 0,
+ 0, 0, 0, 1919, 0, 1921, 0, 1923,
+ 0, -1965, 1926, 1927, 0, 1929, 1930, 0,
+ 1932, 0, 0, 1935, 0, 1937, 7401, 7402,
+ 7403, 7404, 0, 1943, 0, 1945, 1946, 0,
+ 1948, 0, 0, 1951, 1952, 1953, 1954, 0,
+ 1956, 1957, 1958, 1959, 1960, 1961, 1962, 0,
+ 1964, 1965, 1966, 1967, 0, 1969, 1970, 1971,
+ 1972, 0, 1974, 0, 1976, 1977, 1978, 1979,
+ 1980, 1981, 1982, 1983, 1984, 1985, 0, 1987,
+ 1988, 1989, 1990, 1991, 566, 566, 566, 5141,
+ 5142, 566, 566, 566, 566, 566, 566, 566,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 8673, 5722, 5722, 5722, 0, 8676,
+ 5723, 8677, 8678, 2611, 5718, 2612, 5723, 2613,
+ 5723, 2614, 5723, 5723, 5711, 5723, 5723, 5723,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 895, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 151, 2776, 4254, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1821, 0,
+ 0, 0, 596, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -2856, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, -2901, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, -1025, 32767, 32767, 32767,
+ 32767, -2910, 32767, 32767, 32767, 32767, 157, 32767,
+ 32767, 32767, 32767, 158, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 2359, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 160, 32767, 161, 162, 163, 164,
+ 165, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 898, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 1428, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 1254, 32767, 32767, 32767,
+ 32767, 1250, 32767, 32767, 32767, 32767, 1246, 32767,
+ 32767, 32767, 32767, 1243, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1231, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 1842, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 3177, 1235, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, -4323,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 174, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 1830, -112, 1832, -112, 3514, -3469,
+ -3469, 1697, 1698, 1699, -1608, -3473, -3473, -1608,
+ -1608, -1608, -1608, -1608, -1608, 1691, 1692, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, -1623, -1623, -1623, 3541, 3542, -1623, -1623,
+ -1623, -1623, -1623, -1623, -1623, -1623, -1623, -1623,
+ -1623, -1623, -1623, -1623, -1623, -1623, -1623, -1623,
+ -1623, -1623, -1623, -1623, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -766, 2253, 2254, 2255, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1531, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 0, 32767, 0, 0, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -173, -173, -173, -173, -173,
+ -173, -173, -173, -173, -173, -173, -173, 3241,
+ -173, -173, -173, -173, 1709, -173, -173, 1712,
+ -173, -173, 1713, -496, 1715, -173, -173, -173,
+ -668, -173, -173, -173, -173, -173, -173, 1726,
+ -173, -173, -173, -173, 1731, -173, 1733, -173,
+ 1735, 1736, 1737, 1738, 1739, 1740, -173, 1742,
+ 1743, 1744, 1745, -173, 1747, -173, 1749, -173,
+ 1751, 3717, -173, -173, 1755, -173, -173, 1758,
+ -173, 1760, 1761, -173, 1763, -173, -5636, -5636,
+ -5636, -5636, 1769, -173, 1771, -173, 3453, -3530,
+ -3530, 1636, 1637, 1638, -1669, -3534, -3534, -1669,
+ -1669, -1669, -1669, -1669, -1669, 1630, 1631, -577,
+ 1633, -1666, 1635, 1636, -1664, -1664, 3500, 3501,
+ -1664, -1664, -1664, 1644, 3510, 3511, 1647, 1648,
+ 1649, 1650, 1651, 1652, 1653, 1654, 565, 1656,
+ 1657, 1658, 1659, 1660, 1661, -3502, -3502, 1664,
+ 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672,
+ 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680,
+ 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688,
+ 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696,
+ 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704,
+ 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712,
+ 1713, 1714, 1715, 1716, -1697, 1718, 1719, 1720,
+ 1721, -160, 1723, 1724, -160, 1726, 1727, -158,
+ 2052, -158, 1731, 1732, 1733, 2229, 1735, 1736,
+ 1737, 1738, 1739, 1740, -158, 1742, 1743, 1744,
+ 1745, -158, 1747, -158, 1749, -158, -158, -158,
+ -158, -158, -158, 1756, -158, -158, -158, -158,
+ 1761, -158, 1763, -158, 1765, -158, -2123, 1768,
+ 1769, -158, 1771, 1772, -158, 1774, -158, -158,
+ 1777, -158, 1779, 7243, 7244, 7245, 7246, -158,
+ 1785, -158, 1787, -1838, 5146, 5147, -18, -18,
+ -18, 3290, 5156, 5157, 3293, 3294, 3295, 3296,
+ 3297, 3298, 0, 0, 2209, 0, 3300, 0,
+ 0, 3301, 3302, -1861, -1861, 3305, 3306, 3307,
+ 0, -1865, -1865, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1090, 0, 0, 0, 0,
+ 0, 0, 5164, 5165, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3414, 0, 0, 0, 0, 1882, 0,
+ 0, 1885, 0, 0, 1886, -323, 1888, 0,
+ 0, 0, -495, 0, 0, 0, 0, 0,
+ 0, 1899, 0, 0, 0, 0, 1904, 0,
+ 1906, 0, 1908, 1909, 1910, 1911, 1912, 1913,
+ 0, 1915, 1916, 1917, 1918, 0, 1920, 0,
+ 1922, 0, 1924, 3890, 0, 0, 1928, 0,
+ 0, 1931, 0, 1933, 1934, 0, 1936, 0,
+ -5463, -5463, -5463, -5463, 1942, 0, 1944, 0,
+ 0, 1947, 0, 1949, 1950, 0, 0, 0,
+ 0, 1955, 0, 0, 0, 0, 0, 0,
+ 0, 1963, 0, 0, 0, 0, 1968, 0,
+ 0, 0, 0, 1973, 0, 1975, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1986, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 527, 527, 527, 527, 0,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 1998, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1999, 2000, 2001, 2002, 2003, 32767, 32767, 32767,
+ 32767, 32767, 2004, 32767, 2005, 2006, 2007, 2008,
+ 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016,
+ 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024,
+ 2025, 2026, 1200, 1200, 32767, 4498, 4499, 2291,
+ 2032, 2033, 32767, 2034, 32767, 2035, 2036, 32767,
+ 2037, 2038, 32767, 2039, 2040, 2041, 2042, 2043,
+ 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051,
+ 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059,
+ 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067,
+ 2068, -1506, -1506, -1506, -1506, -1506, -1506, -1506,
+ 2076, -2490, 2078, 2079, 2080, 2081, 2082, 2083,
+ 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091,
+ 2092, 2093, 2094, 2095, -105, -2314, 2098, 2099,
+ 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107,
+ 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115,
+ 2116, 2117, 2118, 2119, 2120, 5459, 2122, 2123,
+ 2124, 2125, 2126, 2127, 2128, 5466, 2130, 5467,
+ 2132, 2133, 2134, 2135, 5471, 2137, 2138, 5473,
+ 5473, 5473, 5473, 2143, 2144, 5475, 2146, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154,
+ 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162,
+ 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170,
+ 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178,
+ 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186,
+ 2187, 2188, 2189, 2190, 2191, 32767, -726, 2293,
+ -725, -725, -725, 1357, 1358, 1359, -722, 2201,
+ 2202, 2203, 2204, 2205, 0, 2207, -715, 2209,
+ -714, -714, -714, 2213, 2214, 2215, 4806, 2217,
+ 2218, 2219, 2220, 2221, 2222, 2223, -710, 2225,
+ -248, -704, -704, 2229, 2230, 2231, 2232, 2233,
+ 2220, 1430, 2236, 2237, -695, 2239, -694, 2241,
+ -693, -693, 2244, 2245, 2246, 2231, 2231, 2249,
+ 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2239,
+ 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265,
+ 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273,
+ 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281,
+ 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289,
+ 2290, 2291, 2292, 2293, 3084, 2295, 2296, 2297,
+ 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305,
+ 2306, 2307, 3983, 2309, 2310, 2292, 2312, 3992,
+ 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321,
+ 2322, 2323, 2324, 2325, 2326, 2327, 2328, 4023,
+ 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337,
+ 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345,
+ 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353,
+ 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361,
+ 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369,
+ 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377,
+ 2378, 2379, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2389, 2390, 2391, 2392, 2393,
+ 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401,
+ 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409,
+ 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417,
+ 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425,
+ 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433,
+ 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441,
+ 2442, 2443, 2444, 2445, 2446, 2447, 32767, 2448,
+ 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456,
+ 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464,
+ 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472,
+ 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480,
+ 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488,
+ 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496,
+ 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504,
+ 2505, 2506, 2507, 2508, 2509, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 2510,
+ 2511, 2512, 2513, 3266, 3266, 3266, 3266, 2518,
+ 3267, 3267, 3267, 2522, 3268, 3268, 3268, 3268,
+ 3268, 3268, 3268, 6682, 3268, 3268, 3268, 2534,
+ 5151, 3269, 2537, 2538, 3271, 3271, 5157, 2948,
+ 5159, 2544, 2545, 3273, 2778, 3273, 2549, 3274,
+ 2551, 3275, 2553, 5175, 2555, 3277, 3277, 3277,
+ 5181, 2560, 5184, 3278, 5186, 2564, 5189, 5190,
+ 5191, 5192, 3279, 5194, 5195, 2572, 5198, 32767,
+ 32767, 3278, 5200, 3278, 2577, 2578, 2579, 2580,
+ 5210, 3282, 3282, 5213, 3282, 2586, 2587, 2588,
+ 2589, 2590, 2591, -2175, -2175, -2175, 5230, 3288,
+ 5232, 3288, 6914, -69, -69, 5097, 5098, 5099,
+ 1792, -73, -73, 1792, 1792, 1792, 1792, 1792,
+ 1792, 5091, 5092, 2884, 5094, 1795, 5096, 5097,
+ 1797, 1797, 6961, 6962, 1797, 1797, 1797, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 2578, 2578, 2578, 2578, 2578,
+ 2578, 872, 872, 872, 872, 872, 872, 872,
+ 872, 872, 872, 8277, 6335, 8279, 6335, 9961,
+ 2978, 2978, 8144, 8145, 8146, 4839, 2974, 2974,
+ 4839, 4839, 4839, 4839, 4839, 4839, 8138, 8139,
+ 5931, 8141, 4842, 8143, 8144, 4844, 4844, 10008,
+ 10009, 4844, 4844, 4844, 8152, 10018, 10019, 8155,
+ 8156, 8157, 8158, 8159, 8160, 8161, 8162, 7073,
+ 8164, 5399, 5400, 5401, 5402, 5403, 0, 0,
+ 0, 5407, 0, 0, 5410, 5411, 5412, 8180,
+ 3383, 5415, 3914, 3915, 3916, 5419, 3918, 3919,
+ 3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 7172, 3758, 3758, 3758, 3758, 5640,
+ 3758, 3758, 5643, 3758, 3758, 5644, 3435, 5646,
+ 3758, 3758, 3758, 3263, 3758, 3758, 3758, 3758,
+ 3758, 3758, 5657, 3758, 3758, 3758, 3758, 5662,
+ 3758, 5664, 3758, 5666, 5667, 5668, 5669, 5670,
+ 5671, 3758, 5673, 5674, 5675, 5676, 3758, 5678,
+ 3758, 5680, 3758, 5682, 7648, 3758, 3758, 5686,
+ 3758, 3758, 5689, 3758, 5691, 5692, 3758, -1707,
+ -1707, -1707, -1707, -1707, -1707, 5698, 3756, 5700,
+ 3756, 7382, 399, 399, 5565, 5566, 5567, 2260,
+ 395, 395, 2260, 2260, 2260, 2260, 2260, 2260,
+ 5559, 5560, 3352, 5562, 2263, 5564, 5565, 2265,
+ 2265, 7429, 7430, 2265, 2265, 2265, 5573, 7439,
+ 7440, 5576, 5577, 5578, 5579, 5580, 5581, 5582,
+ 5583, 4494, 5585, 2820, 2821, 2822, 2823, 2824,
+ -2579, -2579, -2579, 2828, -2579, -2579, 2831, 2832,
+ 2833, 5601, 804, 2836, 1335, 1336, 1337, 2840,
+ 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346,
+ 1347, 1348, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 4593, 1179, 1179, 1179,
+ 1179, 3061, 1179, 1179, 3064, 1179, 1179, 3065,
+ 856, 3067, 1179, 1179, 1179, 684, 1179, 1179,
+ 1179, 1179, 1179, 1179, 3078, 1179, 1179, 1179,
+ 1179, 3083, 1179, 3085, 1179, 3087, 3088, 3089,
+ 3090, 3091, 3092, 1179, 3094, 3095, 3096, 3097,
+ 1179, 3099, 1179, 3101, 1179, 3103, 5069, 1179,
+ 1179, 3107, 1179, 1179, 3110, 1179, 3112, 3113,
+ 1179, 3115, 1179, -4284, -4284, -4284, -4284, 3121,
+ 1179, 3123, 1179, 4805, -2178, -2178, 2988, 2989,
+ 2990, -317, -2182, -2182, -317, -317, -317, -317,
+ -317, -317, 2982, 2983, 775, 2985, -314, 2987,
+ 2988, -312, -312, 4852, 4853, -312, -312, -312,
+ 2996, 4862, 4863, 2999, 3000, 3001, 3002, 3003,
+ 3004, 3005, 3006, 1917, 3008, 3009, 3010, 3011,
+ 3012, 3013, -2150, -2150, 3016, 3017, 3018, 3019,
+ 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027,
+ 3028, 3029, 3030, 3031, 3032, 3033, 3034, 3035,
+ 32767, 32767, 32767, 3036, 3037, 3038, 3039, 3040,
+ 3041, 32767, 32767, 3042, 3043, 3044, 3045, 3046,
+ 3047, 32767, 32767, 3048, 3049, 3050, 3051, 3052,
+ 3053, 32767, 32767, 3054, 3055, 3056, 32767, 32767,
+ 32767, -357, 3058, 3059, 3060, 3061, 1180, 3063,
+ 0, 1179, 3065, 3066, 1181, 3391, 1181, 3070,
+ 0, 0, 0, 0, 32767, 0, 0, 32767,
+ 0, 32767, 0, 0, -4973, 32767, 32767, -7368,
+ -2202, -2201, -2200, -5507, -7372, -7372, -5507, -5507,
+ -5507, 32767, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 32767, 0, 0, 32767, 0,
+ -203, -2234, -732, -732, -732, -2234, -732, -732,
+ -2763, -1261, -1261, -1261, -2763, -1261, -1261, -1261,
+ -1261, -1261, -1261, -1261, -1261, -1261, -1261, -1091,
+ -1090, -1089, -1088, -1087, 32767, 32767, -1086, -1085,
+ -1084, -1083, -1082, -1081, -1080, -1079, -1078, -1077,
+ -1076, -1075, 32767, -1074, -1073, -1072, -1071, -1070,
+ -1069, -1068, -1067, -1066, -1065, -1064, -1063, -1062,
+ -1061, -1060, -1059, -1058, -1057, -1056, 32767, -1055,
+ -1054, -1053, -1052, 0, 32767, 32767, 32767, -1051,
+ -1050, -4463, 32767, -1048, 32767, -1047, -2928, -1045,
+ -1044, -2928, -1042, -1041, -2926, -716, -2926, -1037,
+ -1036, -1035, -539, -1033, -1032, -1031, -1030, -1029,
+ -1028, -2926, -1026, -1025, -1024, -1023, -2926, -1021,
+ -2926, -1019, -2926, -2926, -2926, -2926, -2926, -2926,
+ -1012, -2926, -2926, -2926, -2926, -1007, -2926, -1005,
+ -2926, -1003, -2926, -4891, -1000, -999, -2926, -997,
+ -996, -2926, -994, -2926, -2926, -991, 4475, 4476,
+ 4477, 4478, 4479, 4480, -2924, -981, -2924, -979,
+ -4604, 2380, 2381, -2784, -2784, -2784, 524, 2390,
+ 2391, 527, 528, 529, 530, 531, 532, -2766,
+ -2766, -557, -2766, 534, -2766, -2766, 535, 536,
+ -4627, -4627, 539, 540, 541, -2766, -4631, -4631,
+ -2766, -2766, -2766, -2766, -2766, -2766, -2766, -2766,
+ -1676, -2766, 0, 0, 0, 0, 0, 5404,
+ 5405, 5406, 0, 5408, 5409, 0, 0, 0,
+ -2767, 2031, 0, 1502, 1502, 1502, 0, 1502,
+ 1502, 1502, 1502, 1502, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 224, 225, 226, 32767, 227, 228, 229,
+ 230, 231, 232, 233, 234, 235, 236, 67,
+ 32767, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 32767, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, -271, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1940, 18, 1942, 3908, 18, 18, 1946, 18,
+ 18, 1949, 18, 1951, 1952, 18, 1954, 18,
+ -5445, -5445, -5445, -5445, 1960, 18, 1962, 18,
+ 3644, -3339, -3339, 1827, 1828, 1829, -1478, -3343,
+ -3343, -1478, -1478, -1478, -1478, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, 0,
+ 0, 32767, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1340, 1341,
+ 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349,
+ -2064, 1351, 1352, 1353, 1354, 32767, 1355, 1356,
+ 32767, 0, 32767, 32767, 1679, 32767, 1357, 1358,
+ 1359, 1855, 1361, 1362, 1363, 1364, 1365, 1366,
+ 32767, 1367, 1368, 1369, 1370, 32767, 1371, 32767,
+ 1372, 32767, 32767, 32767, 32767, 32767, 32767, 1373,
+ 32767, 32767, 32767, 32767, 1374, 32767, 1375, 32767,
+ 1376, 32767, -2513, 1378, 1379, 32767, 1380, 1381,
+ 32767, 1382, 32767, 32767, 1383, 32767, 1384, 32767,
+ 6848, 32767, 6849, 32767, 1387, 32767, 1388, 1389,
+ 32767, 1390, 32767, 32767, 1391, 1392, 1393, 1394,
+ 32767, 1395, 1396, 1397, 1398, 1399, 1400, 1401,
+ 32767, 1402, 1403, 1404, 1405, 32767, 1406, 1407,
+ 1408, 1409, 32767, 1410, 32767, 1411, 1412, 1413,
+ 1414, 1415, 1416, 1417, 1418, 1419, 1420, 32767,
+ 1421, 1422, 1423, 1424, 1425, 0, 0, 0,
+ 4575, 4576, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -571, -571,
+ -571, 0, -572, 8101, 5150, 5150, 5150, 5337,
+ 8103, 5150, 8104, 8105, 2038, 5145, 2039, 5150,
+ 2040, 5150, 2041, 5150, 5150, 5138, 5150, 5150,
+ 5150, 5150, 5150, 8108, 8109, 8110, 5150, 5150,
+ 5384, 5150, 0, 5151, 5151, 5151, 5535, 5151,
+ 5151, 5151, 5537, 5538, 5539, 5540, 5541, 5542,
+ 5543, 5544, 5545, 5546, 5547, 5151, 5151, 2572,
+ 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572,
+ 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572,
+ 2572, 2572, 2572, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 0, 2580,
+ 0, 2580, 0, 0, 0, 2580, 2580, 2580,
+ 0, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 0, 2580, 0, 0, 0, 2580, 2580, 2580,
+ 5517, 5518, 5519, 5520, 5521, 5522, -6, -6,
+ -6, 0, 0, 0, 0, 2581, 2581, 2581,
+ 2581, 5527, 2581, 2581, 2581, 2581, 0, 5528,
+ 0, 2581, 0, 0, 2581, 2581, 0, 0,
+ 0, 0, 0, 0, 5529, 5530, 5531, 32767,
+ 32767, 2579, 2579, 2579, 2579, 2579, 0, 0,
+ 2579, 2579, 2579, 2765, 0, 0, 0, 0,
+ 2579, 2579, 2579, 2579, 6066, 2579, 6066, 2579,
+ 2579, 2579, 0, 0, 0, 2579, 2579, 0,
+ 0, 0, 2579, 2579, 2579, 5530, 2579, 2579,
+ 2579, 2766, 5532, 2579, 5533, 5534, -533, 2574,
+ -532, 2579, -531, 2579, -530, 2579, 2579, 2567,
+ 2579, 2579, 2579, 2579, 2579, 5537, 5538, 5539,
+ 2579, 2579, 2813, 2579, 2579, 2579, 2579, 2579,
+ 2963, 2579, 2579, 2579, 2965, 2966, 2967, 2968,
+ 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2579,
+ 2579, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 331, 32767, 332, -2580, -2580, -2580,
+ -2580, 0, 0, 0, 0, 0, 0, 0,
+ -2580, 0, -2580, 0, -2580, -2580, -2580, 0,
+ 0, 0, -2580, 0, 0, 0, 0, 0,
+ 0, 0, -2580, 0, -2580, -2580, -2580, 0,
+ 0, 0, 2937, 2938, 2939, 2940, 2941, 2942,
+ -2586, -2586, -2586, -2580, -2125, -2581, -2581, 0,
+ 0, 0, 0, 2946, 0, 0, 0, 0,
+ -2581, 2947, -2581, 0, -2581, -2581, 0, 0,
+ -2581, -2581, -2581, -2581, -2581, -2581, 2948, 2949,
+ 2950, 2945, 2491, 0, 0, 0, 0, 0,
+ -2579, -2579, 0, 0, 0, 186, -2579, -2579,
+ -2579, -2579, 0, 0, 0, 0, 3487, 0,
+ 3487, 0, 0, 0, -2579, -2579, -2579, 0,
+ 0, -2579, -2579, -2579, 0, 0, 0, 2951,
+ 0, 0, 0, 187, 2953, 0, 2954, 2955,
+ -3112, -5, -3111, 0, -3110, 0, -3109, 0,
+ 0, -12, 0, 0, 0, 0, 0, 2958,
+ 2959, 2960, 0, 0, 234, 0, 0, 0,
+ 0, 0, 384, 0, 0, 0, 386, 387,
+ 388, 389, 390, 391, 392, 393, 394, 395,
+ 396, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -1706, -1706, -1706, 0, 0, 0,
+ 0, 385, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 397,
+ 398, 399, 400, 401, 402, 403, 404, 405,
+ 2112, 2113, 2114, 409, 410, 411, 412, 32767,
+ 413, 414, 415, 416, 417, 418, 419, 420,
+ 421, 422, 423, 424, 425, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ -1688, 32767, 32767, 32767, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, 0,
+ 0, -752, -751, -750, -749, 0, -748, -747,
+ -746, 0, -745, -744, -743, -742, -741, -740,
+ -739, -4152, -737, -736, -735, 0, -2616, -733,
+ 0, 0, -732, -731, -2616, -406, -2616, 0,
+ 0, -727, -231, -725, 0, -724, 0, -723,
+ 0, -2621, 0, -721, -720, -719, -2622, 0,
+ -2623, -716, -2623, 0, -2624, -2624, -2624, -2624,
+ -710, -2624, -2624, 0, -2625, -706, -2625, -704,
+ -2625, -702, 0, 0, 0, 0, -2629, -700,
+ -699, -2629, -697, 0, 0, 0, 0, 0,
+ 0, 4767, 4768, 4769, -2635, -692, -2635, -690,
+ -4315, 2669, 2670, -2495, -2495, -2495, 813, 2679,
+ 2680, 816, 817, 818, 819, 820, 821, -2477,
+ -2477, -268, -2477, 823, -2477, -2477, 824, 825,
+ -4338, -4338, 828, 829, 830, -2477, -4342, -4342,
+ -2477, -2477, -2477, -2477, -2477, -2477, -2477, -2477,
+ -1387, 0, 0, 32767, 32767, 0, 0, 0,
+ 0, 0, -2486, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 1756, 1757, 1758,
+ 1759, -5645, -3702, -5645, -3700, -7325, -341, -340,
+ -5505, -5505, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 532, 533,
+ 32767, 534, 535, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -781, 1084, 1084, 1084, 1084,
+ 1084, 1084, 4383, 4384, 2176, 4386, 1087, 4388,
+ 4389, 1089, 1089, 6253, 6254, 1089, 1089, 1089,
+ 4397, 6263, 6264, 4400, 4401, 4402, 4403, 4404,
+ 4405, 4406, 4407, 3318, 4409, 4410, 4411, 4412,
+ 4413, 4414, -749, -749, 4417, 4418, 4419, 4420,
+ 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428,
+ 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436,
+ 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444,
+ 4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452,
+ 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460,
+ 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468,
+ 4469, 1056, 4471, 4472, 4473, 4474, 2593, 4476,
+ 4477, 2593, 4479, 4480, 2595, 4805, 2595, 4484,
+ 4485, 4486, 4982, 4488, 4489, 4490, 4491, 4492,
+ 4493, 2595, 4495, 4496, 4497, 4498, 2595, 4500,
+ 2595, 4502, 2595, 2595, 2595, 2595, 2595, 2595,
+ 4509, 2595, 2595, 2595, 2595, 4514, 2595, 4516,
+ 2595, 4518, 2595, 630, 4521, 4522, 2595, 4524,
+ 4525, 2595, 4527, 2595, 2595, 4530, 2595, 4532,
+ 9996, 9997, 9998, 9999, 2595, 4538, 2595, 4540,
+ 4541, 2595, 4543, 2595, 2595, 4546, 4547, 4548,
+ 4549, 2595, 4551, 4552, 4553, 4554, 4555, 4556,
+ 4557, 2595, 4559, 4560, 4561, 4562, 2595, 4564,
+ 4565, 4566, 4567, 2595, 4569, 2595, 4571, 4572,
+ 4573, 4574, 4575, 4576, 4577, 4578, 4579, 4580,
+ 2595, 4582, 4583, 4584, 4585, 4586, 4587, 4588,
+ 4589, 4590, 4591, 4592, 4593, 4594, 4595, 4596,
+ 4597, 4598, 4599, 4600, 4601, 4602, 4603, 4604,
+ 4605, 4606, 4607, 4608, 4609, 4610, 4611, 4612,
+ 4613, 4614, 4615, 4089, 4090, 4091, 4092, 4620,
+ 4093, 4094, 4095, 4096, 4097, 4098, 4099, 4100,
+ 4101, 4102, 4103, 4104, 2765, 2765, 2765, 2765,
+ 2765, 2765, 2765, 2765, 2765, 2765, 6179, 2765,
+ 2765, 2765, 2765, 4647, 2765, 2765, 4650, 4122,
+ 4652, 4653, 2444, 4655, 2767, 2767, 2767, 2272,
+ 2767, 2767, 2767, 2767, 2767, 2767, 4666, 2767,
+ 2767, 2767, 2767, 4671, 2767, 4673, 2767, 4675,
+ 4676, 4677, 4678, 4679, 4680, 2767, 4682, 4683,
+ 4684, 4685, 2767, 4687, 2767, 4689, 2767, 4691,
+ 6657, 2767, 2767, 4695, 2767, 2767, 4698, 2767,
+ 4700, 4701, 2767, 4703, 2767, -2696, -2696, -2696,
+ -2696, 4709, 2767, 4711, 2767, 2767, 4714, 2767,
+ 4716, 4717, 2767, 2767, 2767, 2767, 4722, 2767,
+ 2767, 2767, 2767, 2767, 2767, 2767, 4730, 2767,
+ 2767, 2767, 2767, 4735, 2767, 2767, 2767, 2767,
+ 4740, 2767, 4742, 2767, 2767, 2767, 2767, 2767,
+ 2767, 2767, 2767, 2767, 2767, 4753, 2767, 2767,
+ 2767, 2767, 2767, 4193, 4194, 4195, -379, -379,
+ 4198, 4199, 4200, 4201, 4202, 4203, 4204, 4771,
+ 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779,
+ 4780, -3892, -940, -939, -938, 4785, -3890, -936,
+ -3889, -3889, 2179, -927, 2180, -930, 2181, -928,
+ 2182, -926, -925, -912, -923, -922, -921, 4803,
+ 4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811,
+ 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819,
+ 3925, 4821, 4822, 4823, 4824, 4825, 4826, 4827,
+ 4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835,
+ 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843,
+ 4844, 4845, 4846, 4847, 4848, 4849, 4850, 4851,
+ 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859,
+ 4860, 4710, 2086, 609, 4864, 4865, 4866, 4867,
+ 4868, 4869, 4870, 4871, 4872, 3052, 4874, 4875,
+ 4876, 4281, 4878, 4879, 4880, 4881, 4882, 4883,
+ 4884, 4885, 4886, 4887, 634, 4888, 4889, 4890,
+ 4891, 4892, 4893, 4894, 4895, 4896, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 4904, 338, 4906,
+ 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914,
+ 4915, 4916, 4917, 665, 666, 667, 668, 669,
+ 670, 671, 672, 673, 674, 675, 676, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 0, 0, 0, 0, 0, 32767, 0, 0,
+ 0, 0, 32767, 32767, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32767, 0, 0, 0, 2478, 32767, 2477,
+ 2477, 2477, 2477, 2477, 32767, 2476, 32767, 32767,
+ 32767, 2473, 2473, 2473, 2473, 2473, 2473, 2473,
+ 32767, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -2478, -2478, -2478, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ };
+
+ const unsigned char *k = (const unsigned char *) key;
+ size_t keylen = 4;
+ uint32 a = 0;
+ uint32 b = 1;
+
+ while (keylen--)
+ {
+ unsigned char c = *k++;
+
+ a = a * 257 + c;
+ b = b * 8191 + c;
+ }
+ return h[a % 9837] + h[b % 9837];
+}
+
+static const unicode_norm_info UnicodeNormInfo_NFKC_QC = {
+ UnicodeNormProps_NFKC_QC,
+ NFKC_QC_hash_func,
+ 4918
+};
--
2.22.0
On Sep 18, 2020, at 9:41 AM, John Naylor <john.naylor@2ndquadrant.com> wrote:
Attached is version 4, which excludes the output file from pgindent,
to match recent commit 74d4608f5. Since it won't be indented again, I
also tweaked the generator script to match pgindent for the typedef,
since we don't want to lose what pgindent has fixed already. This last
part isn't new to v4, but I thought I'd highlight it anyway.
0001 looks ok to me. The change is quite minor. I reviewed it by comparing the assembly generated for perfect hash functions before and after applying the patch.
For 0001, the assembly code generated from the perfect hash functions in src/common/keywords.s and src/pl/plpgsql/src/pl_scanner.s do not appear to differ in any performance significant way. The assembly code generated in src/interfaces/ecpg/preproc/ecpg_keywords.s and src/interfaces/ecpg/preproc/c_keywords.s change enough that I wouldn't try to compare them just by visual inspection.
Compiled using -g -O2
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
I'm attaching the diffs of the old and new assembly files, if anyone cares to look.
Attachments:
assember.diffsapplication/octet-stream; name=assember.diffs; x-unix-mode=0644Download
diff --git a/src/common/keywords.s b/src/common/keywords.s
index 1cb88f7220..ee628f3ea0 100644
--- a/src/common/keywords.s
+++ b/src/common/keywords.s
@@ -47,7 +47,7 @@ Ltmp3:
##DEBUG_VALUE: ScanKeywords_hash_func:keylen <- $rsi
##DEBUG_VALUE: ScanKeywords_hash_func:key <- $rdi
.loc 5 0 15 ## ./kwlist_d.h:0:15
- movl $381, %esi ## imm = 0x17D
+ movl $51, %esi
Ltmp4:
## implicit-def: $eax
## implicit-def: $ecx
@@ -94,17 +94,17 @@ Ltmp8:
##DEBUG_VALUE: c <- $r10d
.loc 5 1058 9 is_stmt 1 ## ./kwlist_d.h:1058:9
movl %eax, %edx
- shll $5, %edx
- subl %eax, %edx
- .loc 5 1058 14 is_stmt 0 ## ./kwlist_d.h:1058:14
+ shll $8, %edx
+ addl %eax, %edx
+ .loc 5 1058 15 is_stmt 0 ## ./kwlist_d.h:1058:15
addl %r10d, %edx
Ltmp9:
##DEBUG_VALUE: ScanKeywords_hash_func:a <- $edx
.loc 5 1059 9 is_stmt 1 ## ./kwlist_d.h:1059:9
movl %ecx, %esi
- shll $7, %esi
- subl %ecx, %esi
- .loc 5 1059 15 is_stmt 0 ## ./kwlist_d.h:1059:15
+ shll $4, %esi
+ addl %ecx, %esi
+ .loc 5 1059 14 is_stmt 0 ## ./kwlist_d.h:1059:14
addl %r10d, %esi
.loc 5 1056 21 is_stmt 1 ## ./kwlist_d.h:1056:21
movzbl 1(%rdi), %r10d
@@ -121,17 +121,17 @@ Ltmp12:
##DEBUG_VALUE: c <- $r10d
.loc 5 1058 9 is_stmt 1 ## ./kwlist_d.h:1058:9
movl %edx, %eax
- shll $5, %eax
- subl %edx, %eax
- .loc 5 1058 14 is_stmt 0 ## ./kwlist_d.h:1058:14
+ shll $8, %eax
+ addl %edx, %eax
+ .loc 5 1058 15 is_stmt 0 ## ./kwlist_d.h:1058:15
addl %r10d, %eax
Ltmp13:
##DEBUG_VALUE: ScanKeywords_hash_func:a <- $eax
.loc 5 1059 9 is_stmt 1 ## ./kwlist_d.h:1059:9
movl %esi, %ecx
- shll $7, %ecx
- subl %esi, %ecx
- .loc 5 1059 15 is_stmt 0 ## ./kwlist_d.h:1059:15
+ shll $4, %ecx
+ addl %esi, %ecx
+ .loc 5 1059 14 is_stmt 0 ## ./kwlist_d.h:1059:14
addl %r10d, %ecx
Ltmp14:
##DEBUG_VALUE: ScanKeywords_hash_func:keylen <- [DW_OP_constu 2, DW_OP_minus, DW_OP_stack_value] undef
@@ -145,11 +145,11 @@ Ltmp15:
##DEBUG_VALUE: ScanKeywords_hash_func:a <- $eax
##DEBUG_VALUE: ScanKeywords_hash_func:k <- $rdi
movl %eax, %edx
- shll $5, %edx
- subl %eax, %edx
+ shll $8, %edx
+ addl %eax, %edx
movl %ecx, %esi
- shll $7, %esi
- subl %ecx, %esi
+ shll $4, %esi
+ addl %ecx, %esi
##DEBUG_VALUE: ScanKeywords_hash_func:k <- $rdi
Ltmp16:
##DEBUG_VALUE: ScanKeywords_hash_func:k <- [DW_OP_plus_uconst 1, DW_OP_stack_value] $rdi
@@ -164,17 +164,17 @@ LBB0_8:
orl $32, %eax
Ltmp18:
##DEBUG_VALUE: c <- $eax
- .loc 5 1059 15 is_stmt 1 ## ./kwlist_d.h:1059:15
+ .loc 5 1059 14 is_stmt 1 ## ./kwlist_d.h:1059:14
addl %eax, %esi
Ltmp19:
##DEBUG_VALUE: ScanKeywords_hash_func:b <- $esi
- .loc 5 1058 14 ## ./kwlist_d.h:1058:14
+ .loc 5 1058 15 ## ./kwlist_d.h:1058:15
addl %eax, %edx
Ltmp20:
##DEBUG_VALUE: ScanKeywords_hash_func:a <- $edx
movl %edx, %eax
Ltmp21:
- .loc 5 1059 15 ## ./kwlist_d.h:1059:15
+ .loc 5 1059 14 ## ./kwlist_d.h:1059:14
movl %esi, %ecx
Ltmp22:
##DEBUG_VALUE: ScanKeywords_hash_func:b <- $ecx
@@ -182,15 +182,16 @@ LBB0_9:
##DEBUG_VALUE: ScanKeywords_hash_func:k <- $rdi
.loc 5 1061 13 ## ./kwlist_d.h:1061:13
movl %eax, %edx
- movl $2440647343, %esi ## imm = 0x917952AF
- imulq %rsi, %rdx
- shrq $41, %rdx
- imull $901, %edx, %edx ## imm = 0x385
+ shrl %edx
+ imulq $1218970763, %rdx, %rdx ## imm = 0x48A8048B
+ shrq $39, %rdx
+ imull $902, %edx, %edx ## imm = 0x386
subl %edx, %eax
movl %ecx, %edx
- imulq %rsi, %rdx
- shrq $41, %rdx
- imull $901, %edx, %edx ## imm = 0x385
+ shrl %edx
+ imulq $1218970763, %rdx, %rdx ## imm = 0x48A8048B
+ shrq $39, %rdx
+ imull $902, %edx, %edx ## imm = 0x386
subl %edx, %ecx
Ltmp23:
LBB0_10:
@@ -685,907 +686,908 @@ _ScanKeywordCategories:
.p2align 4 ## @ScanKeywords_hash_func.h
_ScanKeywords_hash_func.h:
- .short 65364 ## 0xff54
+ .short 181 ## 0xb5
.short 32767 ## 0x7fff
+ .short 65447 ## 0xffa7
+ .short 220 ## 0xdc
+ .short 357 ## 0x165
+ .short 0 ## 0x0
+ .short 146 ## 0x92
+ .short 0 ## 0x0
+ .short 28 ## 0x1c
+ .short 65351 ## 0xff47
.short 32767 ## 0x7fff
+ .short 284 ## 0x11c
.short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 56 ## 0x38
- .short 362 ## 0x16a
.short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 90 ## 0x5a
- .short 65285 ## 0xff05
- .short 332 ## 0x14c
.short 32767 ## 0x7fff
- .short 66 ## 0x42
- .short 298 ## 0x12a
- .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 88 ## 0x58
- .short 27 ## 0x1b
- .short 22 ## 0x16
- .short 65411 ## 0xff83
- .short 317 ## 0x13d
+ .short 65067 ## 0xfe2b
+ .short 65441 ## 0xffa1
.short 0 ## 0x0
+ .short 328 ## 0x148
+ .short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 65501 ## 0xffdd
.short 0 ## 0x0
+ .short 168 ## 0xa8
+ .short 32767 ## 0x7fff
+ .short 65390 ## 0xff6e
+ .short 65346 ## 0xff42
+ .short 26 ## 0x1a
+ .short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 0 ## 0x0
+ .short 335 ## 0x14f
+ .short 65424 ## 0xff90
+ .short 237 ## 0xed
+ .short 54 ## 0x36
+ .short 170 ## 0xaa
.short 32767 ## 0x7fff
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 52 ## 0x34
+ .short 0 ## 0x0
+ .short 192 ## 0xc0
.short 32767 ## 0x7fff
- .short 275 ## 0x113
+ .short 180 ## 0xb4
+ .short 401 ## 0x191
+ .short 152 ## 0x98
+ .short 169 ## 0xa9
+ .short 269 ## 0x10d
.short 32767 ## 0x7fff
- .short 65259 ## 0xfeeb
+ .short 138 ## 0x8a
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 316 ## 0x13c
- .short 177 ## 0xb1
+ .short 35 ## 0x23
+ .short 217 ## 0xd9
+ .short 288 ## 0x120
.short 32767 ## 0x7fff
+ .short 31 ## 0x1f
.short 0 ## 0x0
- .short 398 ## 0x18e
- .short 58 ## 0x3a
- .short 272 ## 0x110
- .short 65448 ## 0xffa8
+ .short 45 ## 0x2d
.short 0 ## 0x0
- .short 65389 ## 0xff6d
- .short 242 ## 0xf2
- .short 143 ## 0x8f
- .short 401 ## 0x191
+ .short 65415 ## 0xff87
+ .short 33 ## 0x21
.short 0 ## 0x0
- .short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 293 ## 0x125
- .short 355 ## 0x163
+ .short 65111 ## 0xfe57
.short 0 ## 0x0
+ .short 247 ## 0xf7
+ .short 406 ## 0x196
+ .short 145 ## 0x91
+ .short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 303 ## 0x12f
+ .short 65463 ## 0xffb7
+ .short 32767 ## 0x7fff
+ .short 32767 ## 0x7fff
+ .short 65 ## 0x41
+ .short 867 ## 0x363
+ .short 32767 ## 0x7fff
+ .short 32767 ## 0x7fff
+ .short 95 ## 0x5f
+ .short 32767 ## 0x7fff
+ .short 32767 ## 0x7fff
+ .short 32767 ## 0x7fff
+ .short 324 ## 0x144
+ .short 223 ## 0xdf
+ .short 198 ## 0xc6
+ .short 33 ## 0x21
+ .short 65278 ## 0xfefe
.short 32767 ## 0x7fff
- .short 225 ## 0xe1
- .short 580 ## 0x244
.short 0 ## 0x0
- .short 378 ## 0x17a
+ .short 158 ## 0x9e
+ .short 360 ## 0x168
.short 0 ## 0x0
+ .short 32 ## 0x20
.short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 65511 ## 0xffe7
- .short 65224 ## 0xfec8
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 65326 ## 0xff2e
.short 0 ## 0x0
+ .short 20 ## 0x14
.short 32767 ## 0x7fff
- .short 65517 ## 0xffed
.short 32767 ## 0x7fff
- .short 91 ## 0x5b
- .short 307 ## 0x133
- .short 354 ## 0x162
+ .short 374 ## 0x176
+ .short 65430 ## 0xff96
.short 32767 ## 0x7fff
+ .short 196 ## 0xc4
.short 32767 ## 0x7fff
- .short 65518 ## 0xffee
- .short 36 ## 0x24
+ .short 359 ## 0x167
+ .short 64782 ## 0xfd0e
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 402 ## 0x192
- .short 292 ## 0x124
- .short 165 ## 0xa5
- .short 274 ## 0x112
- .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 10 ## 0xa
- .short 65516 ## 0xffec
+ .short 279 ## 0x117
+ .short 32767 ## 0x7fff
+ .short 65450 ## 0xffaa
+ .short 65449 ## 0xffa9
+ .short 240 ## 0xf0
.short 32767 ## 0x7fff
- .short 294 ## 0x126
+ .short 270 ## 0x10e
+ .short 38 ## 0x26
+ .short 498 ## 0x1f2
+ .short 187 ## 0xbb
+ .short 436 ## 0x1b4
.short 32767 ## 0x7fff
- .short 64914 ## 0xfd92
- .short 326 ## 0x146
.short 32767 ## 0x7fff
- .short 65408 ## 0xff80
- .short 0 ## 0x0
- .short 33 ## 0x21
+ .short 26 ## 0x1a
+ .short 324 ## 0x144
.short 32767 ## 0x7fff
+ .short 422 ## 0x1a6
.short 32767 ## 0x7fff
- .short 325 ## 0x145
.short 32767 ## 0x7fff
- .short 276 ## 0x114
- .short 343 ## 0x157
+ .short 513 ## 0x201
+ .short 135 ## 0x87
+ .short 64998 ## 0xfde6
+ .short 368 ## 0x170
+ .short 121 ## 0x79
+ .short 10 ## 0xa
+ .short 32767 ## 0x7fff
+ .short 47 ## 0x2f
+ .short 378 ## 0x17a
+ .short 395 ## 0x18b
+ .short 0 ## 0x0
+ .short 65506 ## 0xffe2
+ .short 139 ## 0x8b
+ .short 162 ## 0xa2
+ .short 32767 ## 0x7fff
+ .short 6 ## 0x6
+ .short 55 ## 0x37
+ .short 447 ## 0x1bf
.short 32767 ## 0x7fff
- .short 96 ## 0x60
- .short 173 ## 0xad
.short 32767 ## 0x7fff
+ .short 616 ## 0x268
+ .short 41 ## 0x29
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
.short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 320 ## 0x140
- .short 65408 ## 0xff80
.short 32767 ## 0x7fff
- .short 357 ## 0x165
- .short 24 ## 0x18
- .short 65527 ## 0xfff7
- .short 427 ## 0x1ab
.short 32767 ## 0x7fff
+ .short 386 ## 0x182
+ .short 154 ## 0x9a
.short 32767 ## 0x7fff
- .short 0 ## 0x0
+ .short 65389 ## 0xff6d
.short 32767 ## 0x7fff
+ .short 175 ## 0xaf
+ .short 360 ## 0x168
.short 0 ## 0x0
- .short 0 ## 0x0
+ .short 65272 ## 0xfef8
+ .short 154 ## 0x9a
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 405 ## 0x195
.short 32767 ## 0x7fff
- .short 125 ## 0x7d
+ .short 421 ## 0x1a5
+ .short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 65467 ## 0xffbb
.short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 65496 ## 0xffd8
+ .short 65341 ## 0xff3d
+ .short 394 ## 0x18a
+ .short 356 ## 0x164
+ .short 32767 ## 0x7fff
+ .short 64746 ## 0xfcea
+ .short 306 ## 0x132
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 80 ## 0x50
- .short 0 ## 0x0
.short 32767 ## 0x7fff
+ .short 358 ## 0x166
+ .short 65428 ## 0xff94
.short 0 ## 0x0
- .short 95 ## 0x5f
- .short 65390 ## 0xff6e
+ .short 566 ## 0x236
+ .short 309 ## 0x135
+ .short 340 ## 0x154
+ .short 32767 ## 0x7fff
+ .short 32767 ## 0x7fff
+ .short 32767 ## 0x7fff
.short 0 ## 0x0
+ .short 874 ## 0x36a
+ .short 64815 ## 0xfd2f
+ .short 541 ## 0x21d
.short 32767 ## 0x7fff
- .short 26 ## 0x1a
- .short 165 ## 0xa5
.short 32767 ## 0x7fff
- .short 41 ## 0x29
.short 32767 ## 0x7fff
- .short 418 ## 0x1a2
+ .short 127 ## 0x7f
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 40 ## 0x28
+ .short 342 ## 0x156
+ .short 65348 ## 0xff44
+ .short 58 ## 0x3a
+ .short 0 ## 0x0
+ .short 271 ## 0x10f
+ .short 93 ## 0x5d
+ .short 0 ## 0x0
+ .short 148 ## 0x94
+ .short 249 ## 0xf9
.short 32767 ## 0x7fff
- .short 147 ## 0x93
+ .short 212 ## 0xd4
+ .short 0 ## 0x0
+ .short 268 ## 0x10c
+ .short 291 ## 0x123
.short 32767 ## 0x7fff
+ .short 65504 ## 0xffe0
.short 32767 ## 0x7fff
+ .short 407 ## 0x197
.short 32767 ## 0x7fff
- .short 91 ## 0x5b
- .short 110 ## 0x6e
- .short 9 ## 0x9
- .short 305 ## 0x131
- .short 65196 ## 0xfeac
.short 32767 ## 0x7fff
- .short 103 ## 0x67
+ .short 65206 ## 0xfeb6
+ .short 65134 ## 0xfe6e
+ .short 65457 ## 0xffb1
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 329 ## 0x149
+ .short 308 ## 0x134
+ .short 0 ## 0x0
+ .short 0 ## 0x0
+ .short 65430 ## 0xff96
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 310 ## 0x136
.short 32767 ## 0x7fff
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 147 ## 0x93
- .short 65274 ## 0xfefa
- .short 422 ## 0x1a6
- .short 393 ## 0x189
- .short 382 ## 0x17e
- .short 136 ## 0x88
.short 32767 ## 0x7fff
- .short 177 ## 0xb1
- .short 0 ## 0x0
.short 32767 ## 0x7fff
+ .short 57 ## 0x39
.short 32767 ## 0x7fff
- .short 102 ## 0x66
.short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 83 ## 0x53
- .short 141 ## 0x8d
- .short 28 ## 0x1c
- .short 167 ## 0xa7
- .short 65115 ## 0xfe5b
.short 32767 ## 0x7fff
- .short 38 ## 0x26
- .short 111 ## 0x6f
+ .short 123 ## 0x7b
+ .short 64874 ## 0xfd6a
+ .short 32767 ## 0x7fff
+ .short 377 ## 0x179
+ .short 81 ## 0x51
.short 0 ## 0x0
- .short 479 ## 0x1df
+ .short 144 ## 0x90
.short 32767 ## 0x7fff
+ .short 77 ## 0x4d
+ .short 65324 ## 0xff2c
+ .short 79 ## 0x4f
+ .short 383 ## 0x17f
+ .short 0 ## 0x0
+ .short 65367 ## 0xff57
+ .short 508 ## 0x1fc
+ .short 250 ## 0xfa
.short 32767 ## 0x7fff
- .short 29 ## 0x1d
- .short 439 ## 0x1b7
.short 32767 ## 0x7fff
- .short 427 ## 0x1ab
- .short 65530 ## 0xfffa
- .short 182 ## 0xb6
+ .short 45 ## 0x2d
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 74 ## 0x4a
+ .short 65338 ## 0xff3a
.short 32767 ## 0x7fff
- .short 360 ## 0x168
- .short 236 ## 0xec
.short 32767 ## 0x7fff
+ .short 271 ## 0x10f
.short 32767 ## 0x7fff
- .short 327 ## 0x147
- .short 65473 ## 0xffc1
- .short 162 ## 0xa2
- .short 154 ## 0x9a
- .short 184 ## 0xb8
- .short 90 ## 0x5a
- .short 263 ## 0x107
- .short 115 ## 0x73
- .short 127 ## 0x7f
- .short 539 ## 0x21b
- .short 347 ## 0x15b
- .short 65464 ## 0xffb8
+ .short 134 ## 0x86
+ .short 291 ## 0x123
+ .short 276 ## 0x114
+ .short 64881 ## 0xfd71
+ .short 0 ## 0x0
+ .short 146 ## 0x92
.short 32767 ## 0x7fff
- .short 65377 ## 0xff61
.short 32767 ## 0x7fff
- .short 65287 ## 0xff07
- .short 152 ## 0x98
+ .short 116 ## 0x74
.short 32767 ## 0x7fff
- .short 357 ## 0x165
- .short 404 ## 0x194
- .short 65426 ## 0xff92
.short 32767 ## 0x7fff
- .short 404 ## 0x194
- .short 345 ## 0x159
.short 32767 ## 0x7fff
- .short 80 ## 0x50
- .short 352 ## 0x160
- .short 422 ## 0x1a6
- .short 61 ## 0x3d
+ .short 375 ## 0x177
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 65256 ## 0xfee8
.short 32767 ## 0x7fff
- .short 243 ## 0xf3
- .short 126 ## 0x7e
- .short 117 ## 0x75
.short 32767 ## 0x7fff
- .short 0 ## 0x0
.short 32767 ## 0x7fff
+ .short 288 ## 0x120
+ .short 348 ## 0x15c
.short 32767 ## 0x7fff
- .short 208 ## 0xd0
+ .short 163 ## 0xa3
+ .short 65523 ## 0xfff3
+ .short 794 ## 0x31a
+ .short 440 ## 0x1b8
+ .short 221 ## 0xdd
.short 32767 ## 0x7fff
+ .short 281 ## 0x119
+ .short 51 ## 0x33
.short 32767 ## 0x7fff
- .short 65516 ## 0xffec
- .short 430 ## 0x1ae
- .short 65341 ## 0xff3d
+ .short 223 ## 0xdf
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 118 ## 0x76
- .short 65474 ## 0xffc2
+ .short 65248 ## 0xfee0
+ .short 65378 ## 0xff62
+ .short 65130 ## 0xfe6a
+ .short 32767 ## 0x7fff
+ .short 0 ## 0x0
+ .short 310 ## 0x136
+ .short 32767 ## 0x7fff
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 98 ## 0x62
- .short 136 ## 0x88
.short 0 ## 0x0
.short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 261 ## 0x105
.short 32767 ## 0x7fff
.short 0 ## 0x0
+ .short 222 ## 0xde
+ .short 321 ## 0x141
+ .short 221 ## 0xdd
.short 32767 ## 0x7fff
- .short 230 ## 0xe6
- .short 37 ## 0x25
- .short 750 ## 0x2ee
- .short 154 ## 0x9a
+ .short 284 ## 0x11c
+ .short 200 ## 0xc8
.short 32767 ## 0x7fff
- .short 65450 ## 0xffaa
- .short 87 ## 0x57
+ .short 65212 ## 0xfebc
+ .short 234 ## 0xea
+ .short 202 ## 0xca
.short 32767 ## 0x7fff
- .short 6 ## 0x6
- .short 61 ## 0x3d
+ .short 343 ## 0x157
.short 32767 ## 0x7fff
- .short 205 ## 0xcd
+ .short 0 ## 0x0
+ .short 65447 ## 0xffa7
+ .short 32767 ## 0x7fff
+ .short 10 ## 0xa
.short 32767 ## 0x7fff
- .short 517 ## 0x205
- .short 107 ## 0x6b
- .short 66 ## 0x42
- .short 304 ## 0x130
.short 32767 ## 0x7fff
.short 0 ## 0x0
.short 32767 ## 0x7fff
+ .short 65510 ## 0xffe6
+ .short 261 ## 0x105
+ .short 65291 ## 0xff0b
.short 32767 ## 0x7fff
+ .short 296 ## 0x128
.short 32767 ## 0x7fff
- .short 333 ## 0x14d
.short 32767 ## 0x7fff
- .short 357 ## 0x165
- .short 239 ## 0xef
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 437 ## 0x1b5
- .short 65510 ## 0xffe6
.short 32767 ## 0x7fff
- .short 210 ## 0xd2
+ .short 42 ## 0x2a
+ .short 49 ## 0x31
+ .short 65023 ## 0xfdff
+ .short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 20 ## 0x14
- .short 369 ## 0x171
- .short 10 ## 0xa
+ .short 0 ## 0x0
+ .short 129 ## 0x81
+ .short 406 ## 0x196
+ .short 13 ## 0xd
+ .short 181 ## 0xb5
+ .short 65497 ## 0xffd9
+ .short 167 ## 0xa7
+ .short 646 ## 0x286
+ .short 256 ## 0x100
.short 32767 ## 0x7fff
- .short 65458 ## 0xffb2
- .short 616 ## 0x268
- .short 70 ## 0x46
.short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 86 ## 0x56
.short 32767 ## 0x7fff
+ .short 544 ## 0x220
.short 0 ## 0x0
+ .short 4 ## 0x4
.short 32767 ## 0x7fff
- .short 14 ## 0xe
- .short 60 ## 0x3c
- .short 32 ## 0x20
.short 32767 ## 0x7fff
- .short 373 ## 0x175
- .short 32767 ## 0x7fff
- .short 65318 ## 0xff26
- .short 320 ## 0x140
+ .short 280 ## 0x118
+ .short 65494 ## 0xffd6
+ .short 65034 ## 0xfe0a
+ .short 6 ## 0x6
+ .short 347 ## 0x15b
.short 32767 ## 0x7fff
.short 268 ## 0x10c
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 425 ## 0x1a9
- .short 65469 ## 0xffbd
+ .short 336 ## 0x150
+ .short 64 ## 0x40
+ .short 32767 ## 0x7fff
+ .short 65515 ## 0xffeb
+ .short 60 ## 0x3c
.short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 252 ## 0xfc
- .short 32767 ## 0x7fff
- .short 65443 ## 0xffa3
- .short 193 ## 0xc1
- .short 65174 ## 0xfe96
- .short 65396 ## 0xff74
- .short 32767 ## 0x7fff
- .short 65208 ## 0xfeb8
- .short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 319 ## 0x13f
- .short 336 ## 0x150
+ .short 65521 ## 0xfff1
.short 32767 ## 0x7fff
- .short 121 ## 0x79
+ .short 398 ## 0x18e
+ .short 113 ## 0x71
.short 0 ## 0x0
- .short 32767 ## 0x7fff
- .short 207 ## 0xcf
- .short 32767 ## 0x7fff
- .short 481 ## 0x1e1
- .short 65360 ## 0xff50
- .short 276 ## 0x114
- .short 47 ## 0x2f
- .short 235 ## 0xeb
- .short 32767 ## 0x7fff
+ .short 145 ## 0x91
.short 0 ## 0x0
- .short 221 ## 0xdd
- .short 32767 ## 0x7fff
- .short 228 ## 0xe4
- .short 32767 ## 0x7fff
- .short 84 ## 0x54
- .short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 55 ## 0x37
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 65521 ## 0xfff1
+ .short 0 ## 0x0
+ .short 432 ## 0x1b0
.short 32767 ## 0x7fff
+ .short 370 ## 0x172
.short 32767 ## 0x7fff
- .short 290 ## 0x122
+ .short 0 ## 0x0
+ .short 393 ## 0x189
+ .short 74 ## 0x4a
.short 32767 ## 0x7fff
+ .short 312 ## 0x138
.short 32767 ## 0x7fff
- .short 84 ## 0x54
- .short 65366 ## 0xff56
- .short 82 ## 0x52
- .short 246 ## 0xf6
- .short 65493 ## 0xffd5
- .short 201 ## 0xc9
- .short 155 ## 0x9b
- .short 65529 ## 0xfff9
- .short 299 ## 0x12b
+ .short 184 ## 0xb8
+ .short 65180 ## 0xfe9c
+ .short 77 ## 0x4d
+ .short 260 ## 0x104
+ .short 154 ## 0x9a
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
+ .short 328 ## 0x148
.short 32767 ## 0x7fff
- .short 241 ## 0xf1
.short 32767 ## 0x7fff
- .short 65118 ## 0xfe5e
+ .short 66 ## 0x42
.short 32767 ## 0x7fff
+ .short 302 ## 0x12e
+ .short 65140 ## 0xfe74
+ .short 65214 ## 0xfebe
+ .short 65521 ## 0xfff1
+ .short 79 ## 0x4f
+ .short 101 ## 0x65
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 65233 ## 0xfed1
+ .short 65473 ## 0xffc1
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 65496 ## 0xffd8
- .short 308 ## 0x134
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 178 ## 0xb2
- .short 65469 ## 0xffbd
- .short 32767 ## 0x7fff
- .short 273 ## 0x111
- .short 32767 ## 0x7fff
+ .short 281 ## 0x119
.short 0 ## 0x0
+ .short 394 ## 0x18a
+ .short 369 ## 0x171
.short 32767 ## 0x7fff
- .short 69 ## 0x45
- .short 387 ## 0x183
- .short 32767 ## 0x7fff
- .short 341 ## 0x155
+ .short 65401 ## 0xff79
.short 0 ## 0x0
.short 0 ## 0x0
- .short 65517 ## 0xffed
- .short 324 ## 0x144
- .short 65448 ## 0xffa8
- .short 166 ## 0xa6
- .short 32767 ## 0x7fff
- .short 6 ## 0x6
- .short 20 ## 0x14
- .short 32767 ## 0x7fff
- .short 17 ## 0x11
- .short 22 ## 0x16
- .short 359 ## 0x167
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 172 ## 0xac
- .short 0 ## 0x0
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 206 ## 0xce
- .short 88 ## 0x58
+ .short 65312 ## 0xff20
+ .short 719 ## 0x2cf
+ .short 246 ## 0xf6
+ .short 3 ## 0x3
.short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 35 ## 0x23
- .short 0 ## 0x0
- .short 275 ## 0x113
- .short 114 ## 0x72
- .short 339 ## 0x153
+ .short 68 ## 0x44
+ .short 243 ## 0xf3
+ .short 64731 ## 0xfcdb
+ .short 99 ## 0x63
+ .short 65499 ## 0xffdb
.short 32767 ## 0x7fff
+ .short 30 ## 0x1e
+ .short 681 ## 0x2a9
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 395 ## 0x18b
.short 32767 ## 0x7fff
- .short 524 ## 0x20c
- .short 0 ## 0x0
- .short 65484 ## 0xffcc
- .short 191 ## 0xbf
- .short 65421 ## 0xff8d
- .short 9 ## 0x9
- .short 200 ## 0xc8
- .short 102 ## 0x66
- .short 0 ## 0x0
+ .short 210 ## 0xd2
.short 32767 ## 0x7fff
- .short 3 ## 0x3
- .short 0 ## 0x0
- .short 0 ## 0x0
- .short 0 ## 0x0
- .short 65248 ## 0xfee0
- .short 0 ## 0x0
- .short 65404 ## 0xff7c
.short 32767 ## 0x7fff
- .short 0 ## 0x0
+ .short 809 ## 0x329
.short 32767 ## 0x7fff
- .short 300 ## 0x12c
- .short 0 ## 0x0
- .short 0 ## 0x0
- .short 0 ## 0x0
- .short 212 ## 0xd4
.short 32767 ## 0x7fff
- .short 260 ## 0x104
+ .short 103 ## 0x67
+ .short 65243 ## 0xfedb
.short 32767 ## 0x7fff
- .short 65257 ## 0xfee9
- .short 104 ## 0x68
- .short 506 ## 0x1fa
- .short 0 ## 0x0
- .short 640 ## 0x280
- .short 38 ## 0x26
- .short 268 ## 0x10c
+ .short 389 ## 0x185
+ .short 47 ## 0x2f
+ .short 322 ## 0x142
+ .short 403 ## 0x193
+ .short 344 ## 0x158
+ .short 248 ## 0xf8
+ .short 65317 ## 0xff25
+ .short 8 ## 0x8
.short 32767 ## 0x7fff
- .short 131 ## 0x83
+ .short 104 ## 0x68
.short 32767 ## 0x7fff
+ .short 305 ## 0x131
+ .short 275 ## 0x113
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 176 ## 0xb0
+ .short 202 ## 0xca
+ .short 732 ## 0x2dc
.short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 0 ## 0x0
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 18 ## 0x12
- .short 100 ## 0x64
- .short 44 ## 0x2c
- .short 67 ## 0x43
- .short 270 ## 0x10e
- .short 245 ## 0xf5
- .short 283 ## 0x11b
- .short 224 ## 0xe0
- .short 65470 ## 0xffbe
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 205 ## 0xcd
.short 32767 ## 0x7fff
- .short 65469 ## 0xffbd
.short 32767 ## 0x7fff
- .short 389 ## 0x185
+ .short 79 ## 0x4f
.short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 125 ## 0x7d
- .short 354 ## 0x162
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 65515 ## 0xffeb
- .short 124 ## 0x7c
- .short 0 ## 0x0
- .short 204 ## 0xcc
+ .short 65478 ## 0xffc6
+ .short 274 ## 0x112
+ .short 65388 ## 0xff6c
+ .short 268 ## 0x10c
.short 32767 ## 0x7fff
+ .short 3 ## 0x3
.short 0 ## 0x0
- .short 99 ## 0x63
.short 32767 ## 0x7fff
- .short 267 ## 0x10b
- .short 32767 ## 0x7fff
- .short 0 ## 0x0
+ .short 286 ## 0x11e
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 231 ## 0xe7
.short 32767 ## 0x7fff
- .short 65407 ## 0xff7f
- .short 65423 ## 0xff8f
- .short 108 ## 0x6c
- .short 23 ## 0x17
- .short 0 ## 0x0
- .short 0 ## 0x0
+ .short 290 ## 0x122
+ .short 319 ## 0x13f
.short 32767 ## 0x7fff
+ .short 219 ## 0xdb
+ .short 230 ## 0xe6
+ .short 65444 ## 0xffa4
+ .short 150 ## 0x96
+ .short 371 ## 0x173
.short 32767 ## 0x7fff
- .short 0 ## 0x0
+ .short 112 ## 0x70
.short 32767 ## 0x7fff
- .short 269 ## 0x10d
+ .short 1181 ## 0x49d
.short 32767 ## 0x7fff
+ .short 118 ## 0x76
.short 32767 ## 0x7fff
- .short 65403 ## 0xff7b
+ .short 57 ## 0x39
+ .short 128 ## 0x80
.short 32767 ## 0x7fff
- .short 65152 ## 0xfe80
+ .short 15 ## 0xf
+ .short 478 ## 0x1de
+ .short 65473 ## 0xffc1
+ .short 65382 ## 0xff66
+ .short 325 ## 0x145
+ .short 402 ## 0x192
+ .short 550 ## 0x226
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 0 ## 0x0
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 65204 ## 0xfeb4
+ .short 0 ## 0x0
+ .short 64931 ## 0xfda3
.short 0 ## 0x0
.short 32767 ## 0x7fff
+ .short 208 ## 0xd0
.short 32767 ## 0x7fff
+ .short 84 ## 0x54
+ .short 46 ## 0x2e
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 322 ## 0x142
- .short 424 ## 0x1a8
- .short 117 ## 0x75
- .short 65507 ## 0xffe3
+ .short 670 ## 0x29e
+ .short 96 ## 0x60
.short 32767 ## 0x7fff
+ .short 118 ## 0x76
+ .short 445 ## 0x1bd
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 145 ## 0x91
.short 0 ## 0x0
+ .short 150 ## 0x96
.short 0 ## 0x0
- .short 323 ## 0x143
- .short 119 ## 0x77
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 392 ## 0x188
- .short 65372 ## 0xff5c
- .short 65393 ## 0xff71
- .short 65511 ## 0xffe7
- .short 65430 ## 0xff96
.short 0 ## 0x0
- .short 97 ## 0x61
+ .short 65482 ## 0xffca
.short 32767 ## 0x7fff
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 235 ## 0xeb
+ .short 535 ## 0x217
.short 32767 ## 0x7fff
- .short 0 ## 0x0
+ .short 309 ## 0x135
.short 32767 ## 0x7fff
- .short 411 ## 0x19b
- .short 363 ## 0x16b
.short 32767 ## 0x7fff
- .short 31 ## 0x1f
+ .short 65254 ## 0xfee6
.short 32767 ## 0x7fff
- .short 443 ## 0x1bb
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 76 ## 0x4c
- .short 29 ## 0x1d
+ .short 24 ## 0x18
+ .short 40 ## 0x28
.short 32767 ## 0x7fff
- .short 323 ## 0x143
.short 32767 ## 0x7fff
- .short 142 ## 0x8e
+ .short 109 ## 0x6d
+ .short 588 ## 0x24c
+ .short 78 ## 0x4e
.short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 244 ## 0xf4
- .short 0 ## 0x0
+ .short 25 ## 0x19
.short 32767 ## 0x7fff
- .short 28 ## 0x1c
+ .short 152 ## 0x98
+ .short 65103 ## 0xfe4f
+ .short 290 ## 0x122
+ .short 65355 ## 0xff4b
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 377 ## 0x179
- .short 65528 ## 0xfff8
- .short 65491 ## 0xffd3
.short 32767 ## 0x7fff
- .short 37 ## 0x25
- .short 0 ## 0x0
- .short 350 ## 0x15e
- .short 0 ## 0x0
+ .short 2 ## 0x2
+ .short 187 ## 0xbb
+ .short 349 ## 0x15d
+ .short 21 ## 0x15
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 38 ## 0x26
+ .short 353 ## 0x161
+ .short 0 ## 0x0
+ .short 411 ## 0x19b
.short 416 ## 0x1a0
+ .short 65415 ## 0xff87
.short 32767 ## 0x7fff
- .short 265 ## 0x109
- .short 65458 ## 0xffb2
- .short 65228 ## 0xfecc
- .short 65485 ## 0xffcd
- .short 705 ## 0x2c1
+ .short 329 ## 0x149
+ .short 422 ## 0x1a6
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 66 ## 0x42
- .short 0 ## 0x0
+ .short 350 ## 0x15e
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 289 ## 0x121
.short 32767 ## 0x7fff
- .short 81 ## 0x51
- .short 65286 ## 0xff06
+ .short 354 ## 0x162
+ .short 23 ## 0x17
.short 32767 ## 0x7fff
- .short 1 ## 0x1
- .short 421 ## 0x1a5
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 0 ## 0x0
+ .short 178 ## 0xb2
.short 32767 ## 0x7fff
- .short 401 ## 0x191
- .short 198 ## 0xc6
+ .short 65265 ## 0xfef1
+ .short 65374 ## 0xff5e
+ .short 141 ## 0x8d
.short 32767 ## 0x7fff
- .short 256 ## 0x100
- .short 290 ## 0x122
- .short 210 ## 0xd2
+ .short 0 ## 0x0
+ .short 0 ## 0x0
+ .short 32767 ## 0x7fff
+ .short 351 ## 0x15f
+ .short 313 ## 0x139
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 8 ## 0x8
+ .short 304 ## 0x130
.short 0 ## 0x0
- .short 444 ## 0x1bc
- .short 211 ## 0xd3
- .short 65437 ## 0xff9d
- .short 220 ## 0xdc
- .short 64 ## 0x40
+ .short 41 ## 0x29
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 65480 ## 0xffc8
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 190 ## 0xbe
- .short 19 ## 0x13
- .short 0 ## 0x0
- .short 216 ## 0xd8
.short 32767 ## 0x7fff
- .short 262 ## 0x106
.short 32767 ## 0x7fff
- .short 404 ## 0x194
- .short 562 ## 0x232
- .short 65314 ## 0xff22
.short 0 ## 0x0
+ .short 923 ## 0x39b
+ .short 65252 ## 0xfee4
+ .short 245 ## 0xf5
+ .short 387 ## 0x183
+ .short 212 ## 0xd4
.short 0 ## 0x0
- .short 65374 ## 0xff5e
.short 32767 ## 0x7fff
- .short 192 ## 0xc0
- .short 65 ## 0x41
- .short 32767 ## 0x7fff
- .short 150 ## 0x96
- .short 191 ## 0xbf
.short 0 ## 0x0
- .short 218 ## 0xda
- .short 267 ## 0x10b
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 399 ## 0x18f
- .short 189 ## 0xbd
- .short 356 ## 0x164
- .short 532 ## 0x214
+ .short 65489 ## 0xffd1
.short 0 ## 0x0
+ .short 520 ## 0x208
+ .short 65532 ## 0xfffc
+ .short 104 ## 0x68
+ .short 522 ## 0x20a
+ .short 32767 ## 0x7fff
+ .short 65423 ## 0xff8f
+ .short 88 ## 0x58
+ .short 73 ## 0x49
.short 32767 ## 0x7fff
- .short 429 ## 0x1ad
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 54 ## 0x36
- .short 279 ## 0x117
- .short 151 ## 0x97
- .short 0 ## 0x0
- .short 353 ## 0x161
- .short 394 ## 0x18a
- .short 176 ## 0xb0
- .short 215 ## 0xd7
.short 32767 ## 0x7fff
- .short 15 ## 0xf
- .short 153 ## 0x99
- .short 137 ## 0x89
- .short 92 ## 0x5c
- .short 420 ## 0x1a4
- .short 47 ## 0x2f
- .short 253 ## 0xfd
.short 0 ## 0x0
- .short 298 ## 0x12a
- .short 32767 ## 0x7fff
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 234 ## 0xea
- .short 164 ## 0xa4
- .short 241 ## 0xf1
+ .short 189 ## 0xbd
.short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 409 ## 0x199
- .short 0 ## 0x0
+ .short 65241 ## 0xfed9
+ .short 65516 ## 0xffec
.short 32767 ## 0x7fff
- .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 70 ## 0x46
.short 32767 ## 0x7fff
+ .short 131 ## 0x83
.short 32767 ## 0x7fff
+ .short 273 ## 0x111
+ .short 63 ## 0x3f
+ .short 65399 ## 0xff77
.short 32767 ## 0x7fff
.short 0 ## 0x0
.short 32767 ## 0x7fff
+ .short 65512 ## 0xffe8
+ .short 90 ## 0x5a
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 65398 ## 0xff76
- .short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 65490 ## 0xffd2
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 97 ## 0x61
+ .short 65340 ## 0xff3c
+ .short 365 ## 0x16d
+ .short 313 ## 0x139
+ .short 368 ## 0x170
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 65410 ## 0xff82
+ .short 31 ## 0x1f
+ .short 332 ## 0x14c
+ .short 412 ## 0x19c
+ .short 670 ## 0x29e
+ .short 391 ## 0x187
.short 32767 ## 0x7fff
- .short 169 ## 0xa9
- .short 322 ## 0x142
- .short 392 ## 0x188
.short 32767 ## 0x7fff
- .short 0 ## 0x0
+ .short 368 ## 0x170
.short 32767 ## 0x7fff
+ .short 136 ## 0x88
+ .short 0 ## 0x0
+ .short 426 ## 0x1aa
+ .short 116 ## 0x74
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 282 ## 0x11a
- .short 296 ## 0x128
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 403 ## 0x193
+ .short 5 ## 0x5
+ .short 313 ## 0x139
+ .short 109 ## 0x6d
.short 32767 ## 0x7fff
- .short 65512 ## 0xffe8
+ .short 259 ## 0x103
.short 32767 ## 0x7fff
+ .short 206 ## 0xce
+ .short 177 ## 0xb1
+ .short 449 ## 0x1c1
+ .short 445 ## 0x1bd
+ .short 65081 ## 0xfe39
.short 65502 ## 0xffde
+ .short 177 ## 0xb1
.short 32767 ## 0x7fff
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
+ .short 0 ## 0x0
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 418 ## 0x1a2
+ .short 0 ## 0x0
+ .short 0 ## 0x0
+ .short 0 ## 0x0
+ .short 64948 ## 0xfdb4
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 97 ## 0x61
- .short 238 ## 0xee
+ .short 30 ## 0x1e
.short 32767 ## 0x7fff
- .short 144 ## 0x90
- .short 428 ## 0x1ac
+ .short 65481 ## 0xffc9
+ .short 332 ## 0x14c
+ .short 32767 ## 0x7fff
+ .short 0 ## 0x0
+ .short 65462 ## 0xffb6
.short 32767 ## 0x7fff
- .short 2 ## 0x2
.short 32767 ## 0x7fff
+ .short 65411 ## 0xff83
.short 32767 ## 0x7fff
+ .short 146 ## 0x92
.short 32767 ## 0x7fff
- .short 194 ## 0xc2
- .short 65354 ## 0xff4a
- .short 12 ## 0xc
.short 32767 ## 0x7fff
- .short 391 ## 0x187
+ .short 252 ## 0xfc
.short 32767 ## 0x7fff
- .short 880 ## 0x370
.short 32767 ## 0x7fff
+ .short 431 ## 0x1af
+ .short 893 ## 0x37d
+ .short 178 ## 0xb2
+ .short 65524 ## 0xfff4
.short 32767 ## 0x7fff
- .short 50 ## 0x32
- .short 331 ## 0x14b
- .short 0 ## 0x0
- .short 0 ## 0x0
- .short 358 ## 0x166
- .short 20 ## 0x14
+ .short 142 ## 0x8e
+ .short 299 ## 0x12b
+ .short 207 ## 0xcf
+ .short 25 ## 0x19
+ .short 238 ## 0xee
+ .short 65077 ## 0xfe35
+ .short 148 ## 0x94
.short 32767 ## 0x7fff
+ .short 193 ## 0xc1
.short 32767 ## 0x7fff
- .short 222 ## 0xde
- .short 317 ## 0x13d
+ .short 11 ## 0xb
+ .short 0 ## 0x0
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 125 ## 0x7d
+ .short 0 ## 0x0
+ .short 407 ## 0x197
+ .short 383 ## 0x17f
.short 32767 ## 0x7fff
.short 0 ## 0x0
+ .short 0 ## 0x0
+ .short 330 ## 0x14a
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 284 ## 0x11c
+ .short 65492 ## 0xffd4
.short 32767 ## 0x7fff
+ .short 320 ## 0x140
+ .short 32767 ## 0x7fff
+ .short 277 ## 0x115
.short 32767 ## 0x7fff
- .short 197 ## 0xc5
- .short 0 ## 0x0
- .short 63 ## 0x3f
.short 32767 ## 0x7fff
+ .short 174 ## 0xae
+ .short 65325 ## 0xff2d
.short 0 ## 0x0
- .short 188 ## 0xbc
.short 32767 ## 0x7fff
+ .short 0 ## 0x0
+ .short 0 ## 0x0
+ .short 65197 ## 0xfead
+ .short 417 ## 0x1a1
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 147 ## 0x93
- .short 190 ## 0xbe
- .short 344 ## 0x158
.short 32767 ## 0x7fff
- .short 65494 ## 0xffd6
+ .short 65407 ## 0xff7f
+ .short 87 ## 0x57
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 187 ## 0xbb
+ .short 312 ## 0x138
+ .short 42 ## 0x2a
.short 32767 ## 0x7fff
+ .short 65077 ## 0xfe35
.short 32767 ## 0x7fff
- .short 350 ## 0x15e
.short 32767 ## 0x7fff
+ .short 297 ## 0x129
+ .short 65451 ## 0xffab
+ .short 82 ## 0x52
+ .short 124 ## 0x7c
+ .short 840 ## 0x348
+ .short 236 ## 0xec
+ .short 139 ## 0x8b
.short 0 ## 0x0
- .short 0 ## 0x0
- .short 127 ## 0x7f
.short 32767 ## 0x7fff
+ .short 26 ## 0x1a
.short 32767 ## 0x7fff
- .short 161 ## 0xa1
+ .short 390 ## 0x186
.short 32767 ## 0x7fff
+ .short 143 ## 0x8f
+ .short 93 ## 0x5d
+ .short 115 ## 0x73
+ .short 0 ## 0x0
.short 0 ## 0x0
.short 0 ## 0x0
- .short 382 ## 0x17e
.short 32767 ## 0x7fff
+ .short 65 ## 0x41
+ .short 0 ## 0x0
+ .short 84 ## 0x54
+ .short 65402 ## 0xff7a
.short 32767 ## 0x7fff
- .short 316 ## 0x13c
- .short 130 ## 0x82
.short 32767 ## 0x7fff
- .short 379 ## 0x17b
.short 32767 ## 0x7fff
- .short 383 ## 0x17f
- .short 368 ## 0x170
- .short 93 ## 0x5d
- .short 65341 ## 0xff3d
- .short 0 ## 0x0
- .short 233 ## 0xe9
- .short 73 ## 0x49
.short 32767 ## 0x7fff
- .short 100 ## 0x64
.short 32767 ## 0x7fff
- .short 338 ## 0x152
- .short 90 ## 0x5a
.short 32767 ## 0x7fff
- .short 258 ## 0x102
+ .short 103 ## 0x67
+ .short 32767 ## 0x7fff
+ .short 188 ## 0xbc
+ .short 342 ## 0x156
+ .short 72 ## 0x48
+ .short 699 ## 0x2bb
+ .short 102 ## 0x66
+ .short 399 ## 0x18f
+ .short 151 ## 0x97
.short 32767 ## 0x7fff
+ .short 626 ## 0x272
+ .short 109 ## 0x6d
+ .short 0 ## 0x0
+ .short 65338 ## 0xff3a
.short 32767 ## 0x7fff
- .short 235 ## 0xeb
- .short 175 ## 0xaf
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 65527 ## 0xfff7
- .short 0 ## 0x0
- .short 0 ## 0x0
+ .short 2 ## 0x2
+ .short 19 ## 0x13
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 111 ## 0x6f
- .short 417 ## 0x1a1
- .short 330 ## 0x14a
+ .short 195 ## 0xc3
.short 0 ## 0x0
+ .short 73 ## 0x49
.short 0 ## 0x0
- .short 225 ## 0xe1
.short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 0 ## 0x0
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 64 ## 0x40
+ .short 44 ## 0x2c
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 16 ## 0x10
- .short 113 ## 0x71
- .short 29 ## 0x1d
- .short 0 ## 0x0
+ .short 64 ## 0x40
+ .short 87 ## 0x57
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 43 ## 0x2b
- .short 0 ## 0x0
- .short 365 ## 0x16d
- .short 65495 ## 0xffd7
- .short 65252 ## 0xfee4
- .short 0 ## 0x0
- .short 0 ## 0x0
.short 0 ## 0x0
- .short 61 ## 0x3d
- .short 314 ## 0x13a
- .short 255 ## 0xff
.short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 145 ## 0x91
- .short 32767 ## 0x7fff
- .short 65091 ## 0xfe43
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 154 ## 0x9a
.section __DWARF,__debug_str,regular,debug
Linfo_string:
@@ -2317,7 +2319,7 @@ Ldebug_info_start0:
.long 567 ## DW_AT_type
.byte 15 ## Abbrev [15] 0x22f:0x7 DW_TAG_subrange_type
.long 327 ## DW_AT_type
- .short 901 ## DW_AT_count
+ .short 902 ## DW_AT_count
.byte 0 ## End Of Children Mark
.byte 3 ## Abbrev [3] 0x237:0x5 DW_TAG_const_type
.long 572 ## DW_AT_type
diff --git a/src/interfaces/ecpg/preproc/c_keywords.s b/src/interfaces/ecpg/preproc/c_keywords.s
index 2bf3f117c6..3ade6bbf8d 100644
--- a/src/interfaces/ecpg/preproc/c_keywords.s
+++ b/src/interfaces/ecpg/preproc/c_keywords.s
@@ -44,19 +44,22 @@ Ltmp3:
cmpq $8, %rax
Ltmp4:
.loc 6 47 6 is_stmt 0 ## c_keywords.c:47:6
- ja LBB0_14
+ ja LBB0_13
Ltmp5:
## %bb.1:
##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
- ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- 1
- ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- 2
+ .loc 6 0 6 ## c_keywords.c:0:6
+ xorl %esi, %esi
+Ltmp6:
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- 0
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- 0
.loc 5 100 2 is_stmt 1 ## ./c_kwlist_d.h:100:2
testq %rax, %rax
je LBB0_2
-Ltmp6:
+Ltmp7:
## %bb.3:
##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
@@ -66,237 +69,229 @@ Ltmp6:
leaq -1(%rax), %rcx
movl %eax, %r8d
andl $3, %r8d
- cmpq $3, %rcx
- jae LBB0_5
-Ltmp7:
-## %bb.4:
- ##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
- ##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
- ##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
- ##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
- .loc 5 0 15 ## ./c_kwlist_d.h:0:15
- movl $1, %esi
- movl $2, %edx
+ movl $0, %ebx
movq %r15, %r10
- jmp LBB0_7
+ cmpq $3, %rcx
+ jb LBB0_6
Ltmp8:
-LBB0_2:
- ##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
- ##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
- ##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
- ##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
- movl $2, %ebx
- movl $1, %edi
- jmp LBB0_11
-Ltmp9:
-LBB0_5:
+## %bb.4:
##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
- .loc 5 100 15 ## ./c_kwlist_d.h:100:15
movq %r8, %r9
subq %rax, %r9
- movl $1, %esi
- movl $2, %edx
+ xorl %esi, %esi
+ xorl %ebx, %ebx
movq %r15, %r10
-Ltmp10:
+Ltmp9:
.p2align 4, 0x90
-LBB0_6: ## =>This Inner Loop Header: Depth=1
+LBB0_5: ## =>This Inner Loop Header: Depth=1
##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- undef
- ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $esi
- ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $edx
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $ebx
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $esi
##DEBUG_VALUE: ScanCKeywords_hash_func:k <- $r10
##DEBUG_VALUE: c <- undef
.loc 5 102 21 is_stmt 1 ## ./c_kwlist_d.h:102:21
- movzbl (%r10), %ecx
+ movzbl (%r10), %eax
+Ltmp10:
.loc 5 104 9 ## ./c_kwlist_d.h:104:9
- movl %esi, %ebx
- shll $5, %ebx
- subl %esi, %ebx
- .loc 5 104 14 is_stmt 0 ## ./c_kwlist_d.h:104:14
- addl %ecx, %ebx
+ movl %ebx, %ecx
+ shll $8, %ecx
+ addl %ebx, %ecx
+ .loc 5 104 15 is_stmt 0 ## ./c_kwlist_d.h:104:15
+ addl %eax, %ecx
Ltmp11:
- ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $ebx
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $ecx
.loc 5 105 9 is_stmt 1 ## ./c_kwlist_d.h:105:9
- movl %edx, %esi
- shll $7, %esi
- subl %edx, %esi
- .loc 5 105 15 is_stmt 0 ## ./c_kwlist_d.h:105:15
- addl %ecx, %esi
+ movl %esi, %ebx
+ shll $4, %ebx
+ addl %esi, %ebx
+ .loc 5 105 14 is_stmt 0 ## ./c_kwlist_d.h:105:14
+ addl %eax, %ebx
Ltmp12:
##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- [DW_OP_constu 1, DW_OP_minus, DW_OP_stack_value] undef
- ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $esi
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $ebx
.loc 5 102 21 is_stmt 1 ## ./c_kwlist_d.h:102:21
- movzbl 1(%r10), %ecx
+ movzbl 1(%r10), %eax
##DEBUG_VALUE: c <- undef
.loc 5 104 9 ## ./c_kwlist_d.h:104:9
- movl %ebx, %edx
- shll $5, %edx
- subl %ebx, %edx
- .loc 5 104 14 is_stmt 0 ## ./c_kwlist_d.h:104:14
- addl %ecx, %edx
+ movl %ecx, %esi
+ shll $8, %esi
+ addl %ecx, %esi
+ .loc 5 104 15 is_stmt 0 ## ./c_kwlist_d.h:104:15
+ addl %eax, %esi
Ltmp13:
- ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $edx
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $esi
.loc 5 105 9 is_stmt 1 ## ./c_kwlist_d.h:105:9
- movl %esi, %ebx
- shll $7, %ebx
- subl %esi, %ebx
- .loc 5 105 15 is_stmt 0 ## ./c_kwlist_d.h:105:15
- addl %ecx, %ebx
+ movl %ebx, %ecx
+ shll $4, %ecx
+ addl %ebx, %ecx
+ .loc 5 105 14 is_stmt 0 ## ./c_kwlist_d.h:105:14
+ addl %eax, %ecx
Ltmp14:
##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- [DW_OP_constu 2, DW_OP_minus, DW_OP_stack_value] undef
- ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $ebx
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $ecx
.loc 5 102 21 is_stmt 1 ## ./c_kwlist_d.h:102:21
- movzbl 2(%r10), %ecx
+ movzbl 2(%r10), %eax
##DEBUG_VALUE: c <- undef
.loc 5 104 9 ## ./c_kwlist_d.h:104:9
- movl %edx, %edi
- shll $5, %edi
- subl %edx, %edi
- .loc 5 104 14 is_stmt 0 ## ./c_kwlist_d.h:104:14
- addl %ecx, %edi
+ movl %esi, %edi
+ shll $8, %edi
+ addl %esi, %edi
+ .loc 5 104 15 is_stmt 0 ## ./c_kwlist_d.h:104:15
+ addl %eax, %edi
Ltmp15:
##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $edi
.loc 5 105 9 is_stmt 1 ## ./c_kwlist_d.h:105:9
- movl %ebx, %eax
-Ltmp16:
- shll $7, %eax
- subl %ebx, %eax
- .loc 5 105 15 is_stmt 0 ## ./c_kwlist_d.h:105:15
- addl %ecx, %eax
+ movl %ecx, %edx
+ shll $4, %edx
+ addl %ecx, %edx
+ .loc 5 105 14 is_stmt 0 ## ./c_kwlist_d.h:105:14
+ addl %eax, %edx
.loc 5 102 21 is_stmt 1 ## ./c_kwlist_d.h:102:21
- movzbl 3(%r10), %ecx
-Ltmp17:
+ movzbl 3(%r10), %eax
+Ltmp16:
##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- [DW_OP_constu 3, DW_OP_minus, DW_OP_stack_value] undef
- ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $eax
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $edx
.loc 5 102 23 is_stmt 0 ## ./c_kwlist_d.h:102:23
addq $4, %r10
-Ltmp18:
+Ltmp17:
##DEBUG_VALUE: c <- undef
##DEBUG_VALUE: ScanCKeywords_hash_func:k <- $r10
.loc 5 104 9 is_stmt 1 ## ./c_kwlist_d.h:104:9
- movl %edi, %esi
- shll $5, %esi
- subl %edi, %esi
- .loc 5 104 14 is_stmt 0 ## ./c_kwlist_d.h:104:14
- addl %ecx, %esi
-Ltmp19:
- ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $esi
+ movl %edi, %ebx
+ shll $8, %ebx
+ addl %edi, %ebx
+ .loc 5 104 15 is_stmt 0 ## ./c_kwlist_d.h:104:15
+ addl %eax, %ebx
+Ltmp18:
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $ebx
.loc 5 105 9 is_stmt 1 ## ./c_kwlist_d.h:105:9
- movl %eax, %edx
- shll $7, %edx
- subl %eax, %edx
- .loc 5 105 15 is_stmt 0 ## ./c_kwlist_d.h:105:15
- addl %ecx, %edx
-Ltmp20:
+ movl %edx, %esi
+ shll $4, %esi
+ addl %edx, %esi
+ .loc 5 105 14 is_stmt 0 ## ./c_kwlist_d.h:105:14
+ addl %eax, %esi
+Ltmp19:
##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- [DW_OP_constu 4, DW_OP_minus, DW_OP_stack_value] undef
- ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $edx
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $esi
.loc 5 100 2 is_stmt 1 ## ./c_kwlist_d.h:100:2
addq $4, %r9
- jne LBB0_6
-Ltmp21:
-LBB0_7:
+ jne LBB0_5
+Ltmp20:
+LBB0_6:
##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
- .loc 5 104 14 ## ./c_kwlist_d.h:104:14
+ .loc 5 104 15 ## ./c_kwlist_d.h:104:15
+ movl %ebx, %eax
+ .loc 5 105 14 ## ./c_kwlist_d.h:105:14
movl %esi, %edi
- .loc 5 105 15 ## ./c_kwlist_d.h:105:15
- movl %edx, %ebx
-Ltmp22:
+Ltmp21:
.loc 5 100 2 ## ./c_kwlist_d.h:100:2
testq %r8, %r8
- je LBB0_10
-Ltmp23:
-## %bb.8:
+ je LBB0_9
+Ltmp22:
+## %bb.7:
##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
.loc 5 0 2 is_stmt 0 ## ./c_kwlist_d.h:0:2
xorl %ecx, %ecx
-Ltmp24:
+Ltmp23:
.p2align 4, 0x90
-LBB0_9: ## =>This Inner Loop Header: Depth=1
+LBB0_8: ## =>This Inner Loop Header: Depth=1
##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- undef
- ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $esi
- ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $edx
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $ebx
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $esi
##DEBUG_VALUE: ScanCKeywords_hash_func:k <- undef
##DEBUG_VALUE: c <- undef
.loc 5 102 21 is_stmt 1 ## ./c_kwlist_d.h:102:21
- movzbl (%r10,%rcx), %eax
+ movzbl (%r10,%rcx), %edx
.loc 5 104 9 ## ./c_kwlist_d.h:104:9
+ movl %ebx, %eax
+ shll $8, %eax
+ addl %ebx, %eax
+ .loc 5 104 15 is_stmt 0 ## ./c_kwlist_d.h:104:15
+ addl %edx, %eax
+Ltmp24:
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $eax
+ .loc 5 105 9 is_stmt 1 ## ./c_kwlist_d.h:105:9
movl %esi, %edi
- shll $5, %edi
- subl %esi, %edi
- .loc 5 104 14 is_stmt 0 ## ./c_kwlist_d.h:104:14
- addl %eax, %edi
+ shll $4, %edi
+ addl %esi, %edi
+ .loc 5 105 14 is_stmt 0 ## ./c_kwlist_d.h:105:14
+ addl %edx, %edi
Ltmp25:
- ##DEBUG_VALUE: ScanCKeywords_hash_func:a <- $edi
- .loc 5 105 9 is_stmt 1 ## ./c_kwlist_d.h:105:9
- movl %edx, %ebx
- shll $7, %ebx
- subl %edx, %ebx
- .loc 5 105 15 is_stmt 0 ## ./c_kwlist_d.h:105:15
- addl %eax, %ebx
-Ltmp26:
##DEBUG_VALUE: ScanCKeywords_hash_func:k <- [DW_OP_plus_uconst 1, DW_OP_stack_value] undef
##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- [DW_OP_constu 1, DW_OP_minus, DW_OP_stack_value] undef
- ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $ebx
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:b <- $edi
.loc 5 100 2 is_stmt 1 ## ./c_kwlist_d.h:100:2
incq %rcx
- movl %ebx, %edx
movl %edi, %esi
+ movl %eax, %ebx
cmpq %rcx, %r8
- jne LBB0_9
-Ltmp27:
-LBB0_10:
+ jne LBB0_8
+Ltmp26:
+LBB0_9:
##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
.loc 5 107 13 ## ./c_kwlist_d.h:107:13
- movl %edi, %eax
- imulq $891408307, %rax, %rax ## imm = 0x3521CFB3
- shrq $32, %rax
+ movl %eax, %ecx
+ imulq $891408307, %rcx, %rcx ## imm = 0x3521CFB3
+ shrq $32, %rcx
+ movl %eax, %edx
+ subl %ecx, %edx
+ shrl %edx
+ addl %ecx, %edx
+ shrl $5, %edx
+ imull $53, %edx, %ecx
+ subl %ecx, %eax
movl %edi, %ecx
- subl %eax, %ecx
- shrl %ecx
- addl %eax, %ecx
- shrl $5, %ecx
- imull $53, %ecx, %eax
- subl %eax, %edi
- movl %ebx, %eax
- imulq $891408307, %rax, %rax ## imm = 0x3521CFB3
- shrq $32, %rax
- movl %ebx, %ecx
- subl %eax, %ecx
- shrl %ecx
- addl %eax, %ecx
- shrl $5, %ecx
- imull $53, %ecx, %eax
- subl %eax, %ebx
+ imulq $891408307, %rcx, %rcx ## imm = 0x3521CFB3
+ shrq $32, %rcx
+ movl %edi, %edx
+ subl %ecx, %edx
+ shrl %edx
+ addl %ecx, %edx
+ shrl $5, %edx
+ imull $53, %edx, %ecx
+ subl %ecx, %edi
+ jmp LBB0_10
+Ltmp27:
+LBB0_2:
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:keylen <- $rax
+ ##DEBUG_VALUE: ScanCKeywordLookup:len <- $rax
+ ##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
+ ##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
+ .loc 5 0 13 is_stmt 0 ## ./c_kwlist_d.h:0:13
+ xorl %eax, %eax
Ltmp28:
-LBB0_11:
+ xorl %edi, %edi
+Ltmp29:
+LBB0_10:
##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
##DEBUG_VALUE: ScanCKeywords_hash_func:key <- $r15
- .loc 5 107 9 is_stmt 0 ## ./c_kwlist_d.h:107:9
- leaq _ScanCKeywords_hash_func.h(%rip), %rax
- movsbq (%rdi,%rax), %rcx
+ .loc 5 107 9 ## ./c_kwlist_d.h:107:9
+ leaq _ScanCKeywords_hash_func.h(%rip), %rcx
+ movsbq (%rax,%rcx), %rax
.loc 5 107 21 ## ./c_kwlist_d.h:107:21
- movsbq (%rbx,%rax), %rbx
+ movsbq (%rdi,%rcx), %rbx
.loc 5 107 19 ## ./c_kwlist_d.h:107:19
- addq %rcx, %rbx
-Ltmp29:
+ addq %rax, %rbx
+Ltmp30:
##DEBUG_VALUE: ScanCKeywordLookup:h <- $ebx
##DEBUG_VALUE: GetScanKeyword:n <- $ebx
.loc 6 57 12 is_stmt 1 ## c_keywords.c:57:12
cmpl $25, %ebx
- ja LBB0_14
-Ltmp30:
-## %bb.12:
+ ja LBB0_13
+Ltmp31:
+## %bb.11:
##DEBUG_VALUE: GetScanKeyword:n <- $ebx
##DEBUG_VALUE: ScanCKeywordLookup:h <- $ebx
##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
@@ -306,26 +301,26 @@ Ltmp30:
.loc 1 41 29 is_stmt 0 ## ../../../../src/include/common/kwlookup.h:41:29
leaq _ScanCKeywords_kw_string(%rip), %rdi
addq %rax, %rdi
-Ltmp31:
+Ltmp32:
##DEBUG_VALUE: ScanCKeywordLookup:kw <- $rdi
.loc 6 62 6 is_stmt 1 ## c_keywords.c:62:6
movq %r15, %rsi
callq _strcmp
-Ltmp32:
+Ltmp33:
.loc 6 62 22 is_stmt 0 ## c_keywords.c:62:22
testl %eax, %eax
-Ltmp33:
- .loc 6 62 6 ## c_keywords.c:62:6
- jne LBB0_14
Ltmp34:
-## %bb.13:
+ .loc 6 62 6 ## c_keywords.c:62:6
+ jne LBB0_13
+Ltmp35:
+## %bb.12:
##DEBUG_VALUE: ScanCKeywordLookup:h <- $ebx
##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
.loc 6 63 10 is_stmt 1 ## c_keywords.c:63:10
leaq _ScanCKeywordTokens(%rip), %rax
movzwl (%rax,%rbx,2), %r14d
-Ltmp35:
-LBB0_14:
+Ltmp36:
+LBB0_13:
##DEBUG_VALUE: ScanCKeywordLookup:str <- $r15
.loc 6 66 1 ## c_keywords.c:66:1
movl %r14d, %eax
@@ -333,10 +328,10 @@ LBB0_14:
popq %rbx
popq %r14
popq %r15
-Ltmp36:
+Ltmp37:
popq %rbp
retq
-Ltmp37:
+Ltmp38:
Lfunc_end0:
.cfi_endproc
## -- End function
@@ -405,7 +400,7 @@ _ScanCKeywords_kw_offsets:
.p2align 4 ## @ScanCKeywords_hash_func.h
_ScanCKeywords_hash_func.h:
- .ascii "\030\016\000\n\023\002\013\003\006\177\177\177\177\002\000\177\000\t\177\177\177\177\021\177\000\001\005\000\000\364\025\r\177\177\000\177\177\000\177\007\177\020\002\000\n\000\000\003\000\004\000\022\024"
+ .asciz "\373\000\177\367\000\177\177\003\177\017\177\177\177\177\013\020\001\000\006\020\t\005\177\000\177\024\030\373\005\022\005\022\002\177\177\177\024\177\357\000\177\002\177\006\177\366\f\023\000\000\000\177"
.section __DWARF,__debug_str,regular,debug
Linfo_string:
@@ -438,10 +433,10 @@ Linfo_string:
.asciz "ScanCKeywords_hash_func" ## string offset=418
.asciz "key" ## string offset=442
.asciz "keylen" ## string offset=446
- .asciz "a" ## string offset=453
+ .asciz "b" ## string offset=453
.asciz "uint32" ## string offset=455
.asciz "unsigned int" ## string offset=462
- .asciz "b" ## string offset=475
+ .asciz "a" ## string offset=475
.asciz "k" ## string offset=477
.asciz "c" ## string offset=479
.asciz "GetScanKeyword" ## string offset=481
@@ -462,7 +457,7 @@ Ldebug_loc0:
.byte 85 ## DW_OP_reg5
.set Lset2, Ltmp1-Lfunc_begin0
.quad Lset2
-.set Lset3, Ltmp36-Lfunc_begin0
+.set Lset3, Ltmp37-Lfunc_begin0
.quad Lset3
.short 1 ## Loc expr size
.byte 95 ## DW_OP_reg15
@@ -477,7 +472,7 @@ Ldebug_loc1:
.byte 85 ## DW_OP_reg5
.set Lset6, Ltmp1-Lfunc_begin0
.quad Lset6
-.set Lset7, Ltmp30-Lfunc_begin0
+.set Lset7, Ltmp31-Lfunc_begin0
.quad Lset7
.short 1 ## Loc expr size
.byte 95 ## DW_OP_reg15
@@ -486,157 +481,169 @@ Ldebug_loc1:
Ldebug_loc2:
.set Lset8, Ltmp2-Lfunc_begin0
.quad Lset8
-.set Lset9, Ltmp16-Lfunc_begin0
+.set Lset9, Ltmp10-Lfunc_begin0
.quad Lset9
.short 1 ## Loc expr size
.byte 80 ## DW_OP_reg0
- .quad 0
- .quad 0
-Ldebug_loc3:
-.set Lset10, Ltmp2-Lfunc_begin0
+.set Lset10, Ltmp27-Lfunc_begin0
.quad Lset10
-.set Lset11, Ltmp10-Lfunc_begin0
+.set Lset11, Ltmp28-Lfunc_begin0
.quad Lset11
.short 1 ## Loc expr size
.byte 80 ## DW_OP_reg0
.quad 0
.quad 0
-Ldebug_loc4:
-.set Lset12, Ltmp5-Lfunc_begin0
+Ldebug_loc3:
+.set Lset12, Ltmp2-Lfunc_begin0
.quad Lset12
-.set Lset13, Ltmp10-Lfunc_begin0
+.set Lset13, Ltmp9-Lfunc_begin0
.quad Lset13
- .short 2 ## Loc expr size
- .byte 49 ## DW_OP_lit1
- .byte 159 ## DW_OP_stack_value
-.set Lset14, Ltmp10-Lfunc_begin0
+ .short 1 ## Loc expr size
+ .byte 80 ## DW_OP_reg0
+.set Lset14, Ltmp27-Lfunc_begin0
.quad Lset14
-.set Lset15, Ltmp11-Lfunc_begin0
+.set Lset15, Ltmp28-Lfunc_begin0
.quad Lset15
.short 1 ## Loc expr size
- .byte 84 ## super-register DW_OP_reg4
-.set Lset16, Ltmp11-Lfunc_begin0
+ .byte 80 ## DW_OP_reg0
+ .quad 0
+ .quad 0
+Ldebug_loc4:
+.set Lset16, Ltmp6-Lfunc_begin0
.quad Lset16
-.set Lset17, Ltmp13-Lfunc_begin0
+.set Lset17, Ltmp9-Lfunc_begin0
.quad Lset17
- .short 1 ## Loc expr size
- .byte 83 ## super-register DW_OP_reg3
-.set Lset18, Ltmp13-Lfunc_begin0
+ .short 2 ## Loc expr size
+ .byte 48 ## DW_OP_lit0
+ .byte 159 ## DW_OP_stack_value
+.set Lset18, Ltmp9-Lfunc_begin0
.quad Lset18
-.set Lset19, Ltmp15-Lfunc_begin0
+.set Lset19, Ltmp12-Lfunc_begin0
.quad Lset19
.short 1 ## Loc expr size
- .byte 81 ## super-register DW_OP_reg1
-.set Lset20, Ltmp15-Lfunc_begin0
+ .byte 84 ## super-register DW_OP_reg4
+.set Lset20, Ltmp12-Lfunc_begin0
.quad Lset20
-.set Lset21, Ltmp19-Lfunc_begin0
+.set Lset21, Ltmp14-Lfunc_begin0
.quad Lset21
.short 1 ## Loc expr size
- .byte 85 ## super-register DW_OP_reg5
-.set Lset22, Ltmp19-Lfunc_begin0
+ .byte 83 ## super-register DW_OP_reg3
+.set Lset22, Ltmp14-Lfunc_begin0
.quad Lset22
-.set Lset23, Ltmp21-Lfunc_begin0
+.set Lset23, Ltmp16-Lfunc_begin0
.quad Lset23
.short 1 ## Loc expr size
- .byte 84 ## super-register DW_OP_reg4
-.set Lset24, Ltmp24-Lfunc_begin0
+ .byte 82 ## super-register DW_OP_reg2
+.set Lset24, Ltmp16-Lfunc_begin0
.quad Lset24
-.set Lset25, Ltmp25-Lfunc_begin0
+.set Lset25, Ltmp19-Lfunc_begin0
.quad Lset25
.short 1 ## Loc expr size
- .byte 84 ## super-register DW_OP_reg4
-.set Lset26, Ltmp25-Lfunc_begin0
+ .byte 81 ## super-register DW_OP_reg1
+.set Lset26, Ltmp19-Lfunc_begin0
.quad Lset26
-.set Lset27, Ltmp27-Lfunc_begin0
+.set Lset27, Ltmp20-Lfunc_begin0
.quad Lset27
.short 1 ## Loc expr size
- .byte 85 ## super-register DW_OP_reg5
- .quad 0
- .quad 0
-Ldebug_loc5:
-.set Lset28, Ltmp5-Lfunc_begin0
+ .byte 84 ## super-register DW_OP_reg4
+.set Lset28, Ltmp23-Lfunc_begin0
.quad Lset28
-.set Lset29, Ltmp10-Lfunc_begin0
+.set Lset29, Ltmp25-Lfunc_begin0
.quad Lset29
- .short 2 ## Loc expr size
- .byte 50 ## DW_OP_lit2
- .byte 159 ## DW_OP_stack_value
-.set Lset30, Ltmp10-Lfunc_begin0
+ .short 1 ## Loc expr size
+ .byte 84 ## super-register DW_OP_reg4
+.set Lset30, Ltmp25-Lfunc_begin0
.quad Lset30
-.set Lset31, Ltmp12-Lfunc_begin0
+.set Lset31, Ltmp26-Lfunc_begin0
.quad Lset31
.short 1 ## Loc expr size
- .byte 81 ## super-register DW_OP_reg1
-.set Lset32, Ltmp12-Lfunc_begin0
+ .byte 85 ## super-register DW_OP_reg5
+ .quad 0
+ .quad 0
+Ldebug_loc5:
+.set Lset32, Ltmp6-Lfunc_begin0
.quad Lset32
-.set Lset33, Ltmp14-Lfunc_begin0
+.set Lset33, Ltmp9-Lfunc_begin0
.quad Lset33
- .short 1 ## Loc expr size
- .byte 84 ## super-register DW_OP_reg4
-.set Lset34, Ltmp14-Lfunc_begin0
+ .short 2 ## Loc expr size
+ .byte 48 ## DW_OP_lit0
+ .byte 159 ## DW_OP_stack_value
+.set Lset34, Ltmp9-Lfunc_begin0
.quad Lset34
-.set Lset35, Ltmp17-Lfunc_begin0
+.set Lset35, Ltmp11-Lfunc_begin0
.quad Lset35
.short 1 ## Loc expr size
.byte 83 ## super-register DW_OP_reg3
-.set Lset36, Ltmp17-Lfunc_begin0
+.set Lset36, Ltmp11-Lfunc_begin0
.quad Lset36
-.set Lset37, Ltmp20-Lfunc_begin0
+.set Lset37, Ltmp13-Lfunc_begin0
.quad Lset37
.short 1 ## Loc expr size
- .byte 80 ## super-register DW_OP_reg0
-.set Lset38, Ltmp20-Lfunc_begin0
+ .byte 82 ## super-register DW_OP_reg2
+.set Lset38, Ltmp13-Lfunc_begin0
.quad Lset38
-.set Lset39, Ltmp21-Lfunc_begin0
+.set Lset39, Ltmp15-Lfunc_begin0
.quad Lset39
.short 1 ## Loc expr size
- .byte 81 ## super-register DW_OP_reg1
-.set Lset40, Ltmp24-Lfunc_begin0
+ .byte 84 ## super-register DW_OP_reg4
+.set Lset40, Ltmp15-Lfunc_begin0
.quad Lset40
-.set Lset41, Ltmp26-Lfunc_begin0
+.set Lset41, Ltmp18-Lfunc_begin0
.quad Lset41
.short 1 ## Loc expr size
- .byte 81 ## super-register DW_OP_reg1
-.set Lset42, Ltmp26-Lfunc_begin0
+ .byte 85 ## super-register DW_OP_reg5
+.set Lset42, Ltmp18-Lfunc_begin0
.quad Lset42
-.set Lset43, Ltmp27-Lfunc_begin0
+.set Lset43, Ltmp20-Lfunc_begin0
.quad Lset43
.short 1 ## Loc expr size
.byte 83 ## super-register DW_OP_reg3
+.set Lset44, Ltmp23-Lfunc_begin0
+ .quad Lset44
+.set Lset45, Ltmp24-Lfunc_begin0
+ .quad Lset45
+ .short 1 ## Loc expr size
+ .byte 83 ## super-register DW_OP_reg3
+.set Lset46, Ltmp24-Lfunc_begin0
+ .quad Lset46
+.set Lset47, Ltmp26-Lfunc_begin0
+ .quad Lset47
+ .short 1 ## Loc expr size
+ .byte 80 ## super-register DW_OP_reg0
.quad 0
.quad 0
Ldebug_loc6:
-.set Lset44, Ltmp10-Lfunc_begin0
- .quad Lset44
-.set Lset45, Ltmp21-Lfunc_begin0
- .quad Lset45
+.set Lset48, Ltmp9-Lfunc_begin0
+ .quad Lset48
+.set Lset49, Ltmp20-Lfunc_begin0
+ .quad Lset49
.short 1 ## Loc expr size
.byte 90 ## DW_OP_reg10
.quad 0
.quad 0
Ldebug_loc7:
-.set Lset46, Ltmp29-Lfunc_begin0
- .quad Lset46
-.set Lset47, Ltmp35-Lfunc_begin0
- .quad Lset47
+.set Lset50, Ltmp30-Lfunc_begin0
+ .quad Lset50
+.set Lset51, Ltmp36-Lfunc_begin0
+ .quad Lset51
.short 1 ## Loc expr size
.byte 83 ## super-register DW_OP_reg3
.quad 0
.quad 0
Ldebug_loc8:
-.set Lset48, Ltmp29-Lfunc_begin0
- .quad Lset48
-.set Lset49, Ltmp34-Lfunc_begin0
- .quad Lset49
+.set Lset52, Ltmp30-Lfunc_begin0
+ .quad Lset52
+.set Lset53, Ltmp35-Lfunc_begin0
+ .quad Lset53
.short 1 ## Loc expr size
.byte 83 ## super-register DW_OP_reg3
.quad 0
.quad 0
Ldebug_loc9:
-.set Lset50, Ltmp31-Lfunc_begin0
- .quad Lset50
-.set Lset51, Ltmp32-Lfunc_begin0
- .quad Lset51
+.set Lset54, Ltmp32-Lfunc_begin0
+ .quad Lset54
+.set Lset55, Ltmp33-Lfunc_begin0
+ .quad Lset55
.short 1 ## Loc expr size
.byte 85 ## DW_OP_reg5
.quad 0
@@ -984,25 +991,25 @@ Lsection_abbrev:
.section __DWARF,__debug_info,regular,debug
Lsection_info:
Lcu_begin0:
-.set Lset52, Ldebug_info_end0-Ldebug_info_start0 ## Length of Unit
- .long Lset52
+.set Lset56, Ldebug_info_end0-Ldebug_info_start0 ## Length of Unit
+ .long Lset56
Ldebug_info_start0:
.short 4 ## DWARF version number
-.set Lset53, Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section
- .long Lset53
+.set Lset57, Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section
+ .long Lset57
.byte 8 ## Address Size (in bytes)
.byte 1 ## Abbrev [1] 0xb:0x2ed DW_TAG_compile_unit
.long 0 ## DW_AT_producer
.short 12 ## DW_AT_language
.long 48 ## DW_AT_name
-.set Lset54, Lline_table_start0-Lsection_line ## DW_AT_stmt_list
- .long Lset54
+.set Lset58, Lline_table_start0-Lsection_line ## DW_AT_stmt_list
+ .long Lset58
.long 61 ## DW_AT_comp_dir
## DW_AT_GNU_pubnames
## DW_AT_APPLE_optimized
.quad Lfunc_begin0 ## DW_AT_low_pc
-.set Lset55, Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc
- .long Lset55
+.set Lset59, Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc
+ .long Lset59
.byte 2 ## Abbrev [2] 0x2a:0xb DW_TAG_variable
.long 125 ## DW_AT_name
.long 53 ## DW_AT_type
@@ -1204,12 +1211,12 @@ Ldebug_info_start0:
.byte 20 ## Abbrev [20] 0x1ce:0xb DW_TAG_variable
.long 453 ## DW_AT_name
.byte 5 ## DW_AT_decl_file
- .byte 97 ## DW_AT_decl_line
+ .byte 98 ## DW_AT_decl_line
.long 509 ## DW_AT_type
.byte 20 ## Abbrev [20] 0x1d9:0xb DW_TAG_variable
.long 475 ## DW_AT_name
.byte 5 ## DW_AT_decl_file
- .byte 98 ## DW_AT_decl_line
+ .byte 97 ## DW_AT_decl_line
.long 509 ## DW_AT_type
.byte 20 ## Abbrev [20] 0x1e4:0xb DW_TAG_variable
.long 477 ## DW_AT_name
@@ -1256,8 +1263,8 @@ Ldebug_info_start0:
.long 53 ## DW_AT_type
.byte 22 ## Abbrev [22] 0x238:0xbf DW_TAG_subprogram
.quad Lfunc_begin0 ## DW_AT_low_pc
-.set Lset56, Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc
- .long Lset56
+.set Lset60, Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc
+ .long Lset60
.byte 1 ## DW_AT_frame_base
.byte 86
## DW_AT_call_all_calls
@@ -1269,77 +1276,77 @@ Ldebug_info_start0:
## DW_AT_external
## DW_AT_APPLE_optimized
.byte 23 ## Abbrev [23] 0x251:0xf DW_TAG_formal_parameter
-.set Lset57, Ldebug_loc0-Lsection_debug_loc ## DW_AT_location
- .long Lset57
+.set Lset61, Ldebug_loc0-Lsection_debug_loc ## DW_AT_location
+ .long Lset61
.long 526 ## DW_AT_name
.byte 6 ## DW_AT_decl_file
.byte 36 ## DW_AT_decl_line
.long 138 ## DW_AT_type
.byte 24 ## Abbrev [24] 0x260:0xf DW_TAG_variable
-.set Lset58, Ldebug_loc2-Lsection_debug_loc ## DW_AT_location
- .long Lset58
+.set Lset62, Ldebug_loc2-Lsection_debug_loc ## DW_AT_location
+ .long Lset62
.long 530 ## DW_AT_name
.byte 6 ## DW_AT_decl_file
.byte 38 ## DW_AT_decl_line
.long 229 ## DW_AT_type
.byte 24 ## Abbrev [24] 0x26f:0xf DW_TAG_variable
-.set Lset59, Ldebug_loc7-Lsection_debug_loc ## DW_AT_location
- .long Lset59
+.set Lset63, Ldebug_loc7-Lsection_debug_loc ## DW_AT_location
+ .long Lset63
.long 366 ## DW_AT_name
.byte 6 ## DW_AT_decl_file
.byte 39 ## DW_AT_decl_line
.long 216 ## DW_AT_type
.byte 24 ## Abbrev [24] 0x27e:0xf DW_TAG_variable
-.set Lset60, Ldebug_loc9-Lsection_debug_loc ## DW_AT_location
- .long Lset60
+.set Lset64, Ldebug_loc9-Lsection_debug_loc ## DW_AT_location
+ .long Lset64
.long 534 ## DW_AT_name
.byte 6 ## DW_AT_decl_file
.byte 40 ## DW_AT_decl_line
.long 138 ## DW_AT_type
.byte 25 ## Abbrev [25] 0x28d:0x4c DW_TAG_inlined_subroutine
.long 428 ## DW_AT_abstract_origin
- .quad Ltmp5 ## DW_AT_low_pc
-.set Lset61, Ltmp29-Ltmp5 ## DW_AT_high_pc
- .long Lset61
+ .quad Ltmp6 ## DW_AT_low_pc
+.set Lset65, Ltmp30-Ltmp6 ## DW_AT_high_pc
+ .long Lset65
.byte 6 ## DW_AT_call_file
.byte 54 ## DW_AT_call_line
.byte 26 ## Abbrev [26] 0x2a0:0x9 DW_TAG_formal_parameter
-.set Lset62, Ldebug_loc1-Lsection_debug_loc ## DW_AT_location
- .long Lset62
+.set Lset66, Ldebug_loc1-Lsection_debug_loc ## DW_AT_location
+ .long Lset66
.long 440 ## DW_AT_abstract_origin
.byte 26 ## Abbrev [26] 0x2a9:0x9 DW_TAG_formal_parameter
-.set Lset63, Ldebug_loc3-Lsection_debug_loc ## DW_AT_location
- .long Lset63
+.set Lset67, Ldebug_loc3-Lsection_debug_loc ## DW_AT_location
+ .long Lset67
.long 451 ## DW_AT_abstract_origin
.byte 27 ## Abbrev [27] 0x2b2:0x9 DW_TAG_variable
-.set Lset64, Ldebug_loc4-Lsection_debug_loc ## DW_AT_location
- .long Lset64
+.set Lset68, Ldebug_loc4-Lsection_debug_loc ## DW_AT_location
+ .long Lset68
.long 462 ## DW_AT_abstract_origin
.byte 27 ## Abbrev [27] 0x2bb:0x9 DW_TAG_variable
-.set Lset65, Ldebug_loc5-Lsection_debug_loc ## DW_AT_location
- .long Lset65
+.set Lset69, Ldebug_loc5-Lsection_debug_loc ## DW_AT_location
+ .long Lset69
.long 473 ## DW_AT_abstract_origin
.byte 27 ## Abbrev [27] 0x2c4:0x9 DW_TAG_variable
-.set Lset66, Ldebug_loc6-Lsection_debug_loc ## DW_AT_location
- .long Lset66
+.set Lset70, Ldebug_loc6-Lsection_debug_loc ## DW_AT_location
+ .long Lset70
.long 484 ## DW_AT_abstract_origin
.byte 28 ## Abbrev [28] 0x2cd:0xb DW_TAG_lexical_block
-.set Lset67, Ldebug_ranges0-Ldebug_range ## DW_AT_ranges
- .long Lset67
+.set Lset71, Ldebug_ranges0-Ldebug_range ## DW_AT_ranges
+ .long Lset71
.byte 29 ## Abbrev [29] 0x2d2:0x5 DW_TAG_variable
.long 496 ## DW_AT_abstract_origin
.byte 0 ## End Of Children Mark
.byte 0 ## End Of Children Mark
.byte 25 ## Abbrev [25] 0x2d9:0x1d DW_TAG_inlined_subroutine
.long 528 ## DW_AT_abstract_origin
- .quad Ltmp30 ## DW_AT_low_pc
-.set Lset68, Ltmp31-Ltmp30 ## DW_AT_high_pc
- .long Lset68
+ .quad Ltmp31 ## DW_AT_low_pc
+.set Lset72, Ltmp32-Ltmp31 ## DW_AT_high_pc
+ .long Lset72
.byte 6 ## DW_AT_call_file
.byte 60 ## DW_AT_call_line
.byte 26 ## Abbrev [26] 0x2ec:0x9 DW_TAG_formal_parameter
-.set Lset69, Ldebug_loc8-Lsection_debug_loc ## DW_AT_location
- .long Lset69
+.set Lset73, Ldebug_loc8-Lsection_debug_loc ## DW_AT_location
+ .long Lset73
.long 540 ## DW_AT_abstract_origin
.byte 0 ## End Of Children Mark
.byte 0 ## End Of Children Mark
@@ -1348,18 +1355,18 @@ Ldebug_info_end0:
.section __DWARF,__debug_ranges,regular,debug
Ldebug_range:
Ldebug_ranges0:
-.set Lset70, Ltmp10-Lfunc_begin0
- .quad Lset70
-.set Lset71, Ltmp20-Lfunc_begin0
- .quad Lset71
-.set Lset72, Ltmp21-Lfunc_begin0
- .quad Lset72
-.set Lset73, Ltmp22-Lfunc_begin0
- .quad Lset73
-.set Lset74, Ltmp24-Lfunc_begin0
+.set Lset74, Ltmp9-Lfunc_begin0
.quad Lset74
-.set Lset75, Ltmp26-Lfunc_begin0
+.set Lset75, Ltmp19-Lfunc_begin0
.quad Lset75
+.set Lset76, Ltmp20-Lfunc_begin0
+ .quad Lset76
+.set Lset77, Ltmp21-Lfunc_begin0
+ .quad Lset77
+.set Lset78, Ltmp23-Lfunc_begin0
+ .quad Lset78
+.set Lset79, Ltmp25-Lfunc_begin0
+ .quad Lset79
.quad 0
.quad 0
.section __DWARF,__debug_macinfo,regular,debug
@@ -1391,20 +1398,20 @@ Lnames_begin:
.long -1268970906 ## Hash in Bucket 4
.long -263601009 ## Hash in Bucket 4
.long 1073557084 ## Hash in Bucket 5
-.set Lset76, LNames6-Lnames_begin ## Offset in Bucket 2
- .long Lset76
-.set Lset77, LNames3-Lnames_begin ## Offset in Bucket 2
- .long Lset77
-.set Lset78, LNames2-Lnames_begin ## Offset in Bucket 3
- .long Lset78
-.set Lset79, LNames5-Lnames_begin ## Offset in Bucket 4
- .long Lset79
-.set Lset80, LNames0-Lnames_begin ## Offset in Bucket 4
+.set Lset80, LNames6-Lnames_begin ## Offset in Bucket 2
.long Lset80
-.set Lset81, LNames4-Lnames_begin ## Offset in Bucket 4
+.set Lset81, LNames3-Lnames_begin ## Offset in Bucket 2
.long Lset81
-.set Lset82, LNames1-Lnames_begin ## Offset in Bucket 5
+.set Lset82, LNames2-Lnames_begin ## Offset in Bucket 3
.long Lset82
+.set Lset83, LNames5-Lnames_begin ## Offset in Bucket 4
+ .long Lset83
+.set Lset84, LNames0-Lnames_begin ## Offset in Bucket 4
+ .long Lset84
+.set Lset85, LNames4-Lnames_begin ## Offset in Bucket 4
+ .long Lset85
+.set Lset86, LNames1-Lnames_begin ## Offset in Bucket 5
+ .long Lset86
LNames6:
.long 418 ## ScanCKeywords_hash_func
.long 1 ## Num DIEs
@@ -1512,36 +1519,36 @@ Ltypes_begin:
.long 2090147939 ## Hash in Bucket 14
.long -851394017 ## Hash in Bucket 14
.long -104093792 ## Hash in Bucket 14
-.set Lset83, Ltypes3-Ltypes_begin ## Offset in Bucket 1
- .long Lset83
-.set Lset84, Ltypes11-Ltypes_begin ## Offset in Bucket 2
- .long Lset84
-.set Lset85, Ltypes1-Ltypes_begin ## Offset in Bucket 3
- .long Lset85
-.set Lset86, Ltypes6-Ltypes_begin ## Offset in Bucket 3
- .long Lset86
-.set Lset87, Ltypes0-Ltypes_begin ## Offset in Bucket 4
+.set Lset87, Ltypes3-Ltypes_begin ## Offset in Bucket 1
.long Lset87
-.set Lset88, Ltypes4-Ltypes_begin ## Offset in Bucket 5
+.set Lset88, Ltypes11-Ltypes_begin ## Offset in Bucket 2
.long Lset88
-.set Lset89, Ltypes8-Ltypes_begin ## Offset in Bucket 7
+.set Lset89, Ltypes1-Ltypes_begin ## Offset in Bucket 3
.long Lset89
-.set Lset90, Ltypes5-Ltypes_begin ## Offset in Bucket 8
+.set Lset90, Ltypes6-Ltypes_begin ## Offset in Bucket 3
.long Lset90
-.set Lset91, Ltypes7-Ltypes_begin ## Offset in Bucket 9
+.set Lset91, Ltypes0-Ltypes_begin ## Offset in Bucket 4
.long Lset91
-.set Lset92, Ltypes9-Ltypes_begin ## Offset in Bucket 11
+.set Lset92, Ltypes4-Ltypes_begin ## Offset in Bucket 5
.long Lset92
-.set Lset93, Ltypes2-Ltypes_begin ## Offset in Bucket 12
+.set Lset93, Ltypes8-Ltypes_begin ## Offset in Bucket 7
.long Lset93
-.set Lset94, Ltypes10-Ltypes_begin ## Offset in Bucket 13
+.set Lset94, Ltypes5-Ltypes_begin ## Offset in Bucket 8
.long Lset94
-.set Lset95, Ltypes14-Ltypes_begin ## Offset in Bucket 14
+.set Lset95, Ltypes7-Ltypes_begin ## Offset in Bucket 9
.long Lset95
-.set Lset96, Ltypes12-Ltypes_begin ## Offset in Bucket 14
+.set Lset96, Ltypes9-Ltypes_begin ## Offset in Bucket 11
.long Lset96
-.set Lset97, Ltypes13-Ltypes_begin ## Offset in Bucket 14
+.set Lset97, Ltypes2-Ltypes_begin ## Offset in Bucket 12
.long Lset97
+.set Lset98, Ltypes10-Ltypes_begin ## Offset in Bucket 13
+ .long Lset98
+.set Lset99, Ltypes14-Ltypes_begin ## Offset in Bucket 14
+ .long Lset99
+.set Lset100, Ltypes12-Ltypes_begin ## Offset in Bucket 14
+ .long Lset100
+.set Lset101, Ltypes13-Ltypes_begin ## Offset in Bucket 14
+ .long Lset101
Ltypes3:
.long 181 ## uint16
.long 1 ## Num DIEs
@@ -1651,12 +1658,12 @@ Ltypes13:
.byte 0
.long 0
.section __DWARF,__debug_gnu_pubn,regular,debug
-.set Lset98, LpubNames_end0-LpubNames_begin0 ## Length of Public Names Info
- .long Lset98
+.set Lset102, LpubNames_end0-LpubNames_begin0 ## Length of Public Names Info
+ .long Lset102
LpubNames_begin0:
.short 2 ## DWARF Version
-.set Lset99, Lcu_begin0-Lsection_info ## Offset of Compilation Unit Info
- .long Lset99
+.set Lset103, Lcu_begin0-Lsection_info ## Offset of Compilation Unit Info
+ .long Lset103
.long 760 ## Compilation Unit Length
.long 42 ## DIE offset
.byte 160 ## Attributes: VARIABLE, STATIC
@@ -1685,12 +1692,12 @@ LpubNames_begin0:
.long 0 ## End Mark
LpubNames_end0:
.section __DWARF,__debug_gnu_pubt,regular,debug
-.set Lset100, LpubTypes_end0-LpubTypes_begin0 ## Length of Public Types Info
- .long Lset100
+.set Lset104, LpubTypes_end0-LpubTypes_begin0 ## Length of Public Types Info
+ .long Lset104
LpubTypes_begin0:
.short 2 ## DWARF Version
-.set Lset101, Lcu_begin0-Lsection_info ## Offset of Compilation Unit Info
- .long Lset101
+.set Lset105, Lcu_begin0-Lsection_info ## Offset of Compilation Unit Info
+ .long Lset105
.long 760 ## Compilation Unit Length
.long 371 ## DIE offset
.byte 144 ## Attributes: TYPE, STATIC
diff --git a/src/interfaces/ecpg/preproc/ecpg_keywords.s b/src/interfaces/ecpg/preproc/ecpg_keywords.s
index e99fd57052..94c098d190 100644
--- a/src/interfaces/ecpg/preproc/ecpg_keywords.s
+++ b/src/interfaces/ecpg/preproc/ecpg_keywords.s
@@ -111,7 +111,7 @@ Ltmp15:
##DEBUG_VALUE: ScanECPGKeywords_hash_func:k <- $rdi
xorl %edx, %edx
Ltmp16:
- ##DEBUG_VALUE: ScanECPGKeywords_hash_func:b <- 3
+ ##DEBUG_VALUE: ScanECPGKeywords_hash_func:b <- 1
##DEBUG_VALUE: ScanECPGKeywords_hash_func:a <- 0
##DEBUG_VALUE: ScanECPGKeywords_hash_func:k <- $rdi
##DEBUG_VALUE: ScanECPGKeywords_hash_func:keylen <- $rsi
@@ -135,7 +135,7 @@ Ltmp18:
##DEBUG_VALUE: ScanECPGKeywords_hash_func:keylen <- $rsi
##DEBUG_VALUE: ScanECPGKeywords_hash_func:key <- $rdi
.loc 5 0 15 ## ./ecpg_kwlist_d.h:0:15
- movl $381, %esi ## imm = 0x17D
+ movl $17, %esi
Ltmp19:
## implicit-def: $eax
## implicit-def: $ecx
@@ -151,7 +151,7 @@ LBB1_1:
##DEBUG_VALUE: ScanECPGKeywords_hash_func:keylen <- $rsi
##DEBUG_VALUE: ScanECPGKeywords_hash_func:key <- $rdi
.loc 5 0 2 ## ./ecpg_kwlist_d.h:0:2
- movl $3, %ecx
+ movl $1, %ecx
xorl %eax, %eax
jmp LBB1_10
Ltmp21:
@@ -163,7 +163,7 @@ LBB1_4:
movq %r8, %r9
subq %rsi, %r9
xorl %eax, %eax
- movl $3, %ecx
+ movl $1, %ecx
Ltmp22:
.p2align 4, 0x90
LBB1_5: ## =>This Inner Loop Header: Depth=1
@@ -182,17 +182,17 @@ Ltmp23:
##DEBUG_VALUE: c <- $r10d
.loc 5 138 9 is_stmt 1 ## ./ecpg_kwlist_d.h:138:9
movl %eax, %edx
- shll $5, %edx
- subl %eax, %edx
- .loc 5 138 14 is_stmt 0 ## ./ecpg_kwlist_d.h:138:14
+ shll $8, %edx
+ addl %eax, %edx
+ .loc 5 138 15 is_stmt 0 ## ./ecpg_kwlist_d.h:138:15
addl %r10d, %edx
Ltmp24:
##DEBUG_VALUE: ScanECPGKeywords_hash_func:a <- $edx
.loc 5 139 9 is_stmt 1 ## ./ecpg_kwlist_d.h:139:9
movl %ecx, %esi
- shll $7, %esi
- subl %ecx, %esi
- .loc 5 139 15 is_stmt 0 ## ./ecpg_kwlist_d.h:139:15
+ shll $4, %esi
+ addl %ecx, %esi
+ .loc 5 139 14 is_stmt 0 ## ./ecpg_kwlist_d.h:139:14
addl %r10d, %esi
.loc 5 136 21 is_stmt 1 ## ./ecpg_kwlist_d.h:136:21
movzbl 1(%rdi), %r10d
@@ -209,17 +209,17 @@ Ltmp27:
##DEBUG_VALUE: c <- $r10d
.loc 5 138 9 is_stmt 1 ## ./ecpg_kwlist_d.h:138:9
movl %edx, %eax
- shll $5, %eax
- subl %edx, %eax
- .loc 5 138 14 is_stmt 0 ## ./ecpg_kwlist_d.h:138:14
+ shll $8, %eax
+ addl %edx, %eax
+ .loc 5 138 15 is_stmt 0 ## ./ecpg_kwlist_d.h:138:15
addl %r10d, %eax
Ltmp28:
##DEBUG_VALUE: ScanECPGKeywords_hash_func:a <- $eax
.loc 5 139 9 is_stmt 1 ## ./ecpg_kwlist_d.h:139:9
movl %esi, %ecx
- shll $7, %ecx
- subl %esi, %ecx
- .loc 5 139 15 is_stmt 0 ## ./ecpg_kwlist_d.h:139:15
+ shll $4, %ecx
+ addl %esi, %ecx
+ .loc 5 139 14 is_stmt 0 ## ./ecpg_kwlist_d.h:139:14
addl %r10d, %ecx
Ltmp29:
##DEBUG_VALUE: ScanECPGKeywords_hash_func:keylen <- [DW_OP_constu 2, DW_OP_minus, DW_OP_stack_value] undef
@@ -233,11 +233,11 @@ Ltmp30:
##DEBUG_VALUE: ScanECPGKeywords_hash_func:a <- $eax
##DEBUG_VALUE: ScanECPGKeywords_hash_func:k <- $rdi
movl %eax, %edx
- shll $5, %edx
- subl %eax, %edx
+ shll $8, %edx
+ addl %eax, %edx
movl %ecx, %esi
- shll $7, %esi
- subl %ecx, %esi
+ shll $4, %esi
+ addl %ecx, %esi
##DEBUG_VALUE: ScanECPGKeywords_hash_func:k <- $rdi
Ltmp31:
##DEBUG_VALUE: ScanECPGKeywords_hash_func:k <- [DW_OP_plus_uconst 1, DW_OP_stack_value] $rdi
@@ -252,17 +252,17 @@ LBB1_8:
orl $32, %eax
Ltmp33:
##DEBUG_VALUE: c <- $eax
- .loc 5 139 15 is_stmt 1 ## ./ecpg_kwlist_d.h:139:15
+ .loc 5 139 14 is_stmt 1 ## ./ecpg_kwlist_d.h:139:14
addl %eax, %esi
Ltmp34:
##DEBUG_VALUE: ScanECPGKeywords_hash_func:b <- $esi
- .loc 5 138 14 ## ./ecpg_kwlist_d.h:138:14
+ .loc 5 138 15 ## ./ecpg_kwlist_d.h:138:15
addl %eax, %edx
Ltmp35:
##DEBUG_VALUE: ScanECPGKeywords_hash_func:a <- $edx
movl %edx, %eax
Ltmp36:
- .loc 5 139 15 ## ./ecpg_kwlist_d.h:139:15
+ .loc 5 139 14 ## ./ecpg_kwlist_d.h:139:14
movl %esi, %ecx
Ltmp37:
##DEBUG_VALUE: ScanECPGKeywords_hash_func:b <- $ecx
@@ -284,9 +284,9 @@ LBB1_10:
##DEBUG_VALUE: ScanECPGKeywords_hash_func:k <- $rdi
.loc 5 141 9 is_stmt 0 ## ./ecpg_kwlist_d.h:141:9
leaq _ScanECPGKeywords_hash_func.h(%rip), %rdx
- movswl (%rdx,%rax,2), %esi
+ movsbl (%rax,%rdx), %esi
.loc 5 141 21 ## ./ecpg_kwlist_d.h:141:21
- movswl (%rdx,%rcx,2), %eax
+ movsbl (%rcx,%rdx), %eax
.loc 5 141 19 ## ./ecpg_kwlist_d.h:141:19
addl %esi, %eax
.loc 5 141 2 ## ./ecpg_kwlist_d.h:141:2
@@ -400,89 +400,7 @@ _ScanECPGKeywords_kw_offsets:
.p2align 4 ## @ScanECPGKeywords_hash_func.h
_ScanECPGKeywords_hash_func.h:
- .short 0 ## 0x0
- .short 26 ## 0x1a
- .short 65521 ## 0xfff1
- .short 29 ## 0x1d
- .short 8 ## 0x8
- .short 35 ## 0x23
- .short 65530 ## 0xfffa
- .short 32767 ## 0x7fff
- .short 11 ## 0xb
- .short 20 ## 0x14
- .short 0 ## 0x0
- .short 25 ## 0x19
- .short 4 ## 0x4
- .short 32767 ## 0x7fff
- .short 27 ## 0x1b
- .short 0 ## 0x0
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 32767 ## 0x7fff
- .short 6 ## 0x6
- .short 32767 ## 0x7fff
- .short 65449 ## 0xffa9
- .short 43 ## 0x2b
- .short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 32767 ## 0x7fff
- .short 12 ## 0xc
- .short 32767 ## 0x7fff
- .short 7 ## 0x7
- .short 0 ## 0x0
- .short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 30 ## 0x1e
- .short 38 ## 0x26
- .short 23 ## 0x17
- .short 65468 ## 0xffbc
- .short 0 ## 0x0
- .short 32767 ## 0x7fff
- .short 9 ## 0x9
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 16 ## 0x10
- .short 65518 ## 0xffee
- .short 65529 ## 0xfff9
- .short 32767 ## 0x7fff
- .short 19 ## 0x13
- .short 0 ## 0x0
- .short 68 ## 0x44
- .short 0 ## 0x0
- .short 96 ## 0x60
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 14 ## 0xe
- .short 0 ## 0x0
- .short 65518 ## 0xffee
- .short 32767 ## 0x7fff
- .short 65523 ## 0xfff3
- .short 32767 ## 0x7fff
- .short 32 ## 0x20
- .short 0 ## 0x0
- .short 29 ## 0x1d
- .short 65530 ## 0xfffa
- .short 78 ## 0x4e
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 39 ## 0x27
- .short 18 ## 0x12
- .short 65495 ## 0xffd7
- .short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 40 ## 0x28
- .short 65473 ## 0xffc1
- .short 22 ## 0x16
- .short 31 ## 0x1f
- .short 0 ## 0x0
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
+ .ascii "\366\374\177\000 \033\177\366\177%\344\177\003\037\177\357\177\177\375\177\177\000\017\177\177\"\177\177\177\030)\003\"\350\177\177\000\177\177\177\020\000!\177\177\177\016\177\177\022\000\177\177\374\354\025\000\000\036\005\000\177\027\006\177\362\177\1776\000\372\000\000\376$\f\000\364)\b\023\177\013"
.section __DWARF,__debug_str,regular,debug
Linfo_string:
@@ -508,22 +426,22 @@ Linfo_string:
.asciz "__ARRAY_SIZE_TYPE__" ## string offset=330
.asciz "ScanECPGKeywords_kw_offsets" ## string offset=350
.asciz "h" ## string offset=378
- .asciz "int16" ## string offset=380
- .asciz "short" ## string offset=386
- .asciz "ECPGScanKeywordTokens" ## string offset=392
- .asciz "unsigned char" ## string offset=414
- .asciz "ScanECPGKeywordLookup" ## string offset=428
- .asciz "ScanECPGKeywords_hash_func" ## string offset=450
- .asciz "text" ## string offset=477
- .asciz "kwnum" ## string offset=482
- .asciz "key" ## string offset=488
- .asciz "keylen" ## string offset=492
- .asciz "k" ## string offset=499
- .asciz "b" ## string offset=501
- .asciz "uint32" ## string offset=503
- .asciz "unsigned int" ## string offset=510
- .asciz "a" ## string offset=523
- .asciz "c" ## string offset=525
+ .asciz "int8" ## string offset=380
+ .asciz "signed char" ## string offset=385
+ .asciz "ECPGScanKeywordTokens" ## string offset=397
+ .asciz "unsigned char" ## string offset=419
+ .asciz "ScanECPGKeywordLookup" ## string offset=433
+ .asciz "ScanECPGKeywords_hash_func" ## string offset=455
+ .asciz "text" ## string offset=482
+ .asciz "kwnum" ## string offset=487
+ .asciz "key" ## string offset=493
+ .asciz "keylen" ## string offset=497
+ .asciz "k" ## string offset=504
+ .asciz "b" ## string offset=506
+ .asciz "uint32" ## string offset=508
+ .asciz "unsigned int" ## string offset=515
+ .asciz "a" ## string offset=528
+ .asciz "c" ## string offset=530
.section __DWARF,__debug_loc,regular,debug
Lsection_debug_loc:
Ldebug_loc0:
@@ -635,7 +553,7 @@ Ldebug_loc5:
.set Lset29, Ltmp22-Lfunc_begin0
.quad Lset29
.short 2 ## Loc expr size
- .byte 51 ## DW_OP_lit3
+ .byte 49 ## DW_OP_lit1
.byte 159 ## DW_OP_stack_value
.set Lset30, Ltmp22-Lfunc_begin0
.quad Lset30
@@ -1153,7 +1071,7 @@ Ldebug_info_start0:
.byte 1 ## DW_AT_frame_base
.byte 86
## DW_AT_call_all_calls
- .long 450 ## DW_AT_name
+ .long 455 ## DW_AT_name
.byte 5 ## DW_AT_decl_file
.byte 114 ## DW_AT_decl_line
## DW_AT_prototyped
@@ -1170,35 +1088,35 @@ Ldebug_info_start0:
.byte 18 ## Abbrev [18] 0x184:0xf DW_TAG_formal_parameter
.set Lset59, Ldebug_loc2-Lsection_debug_loc ## DW_AT_location
.long Lset59
- .long 488 ## DW_AT_name
+ .long 493 ## DW_AT_name
.byte 5 ## DW_AT_decl_file
.byte 114 ## DW_AT_decl_line
.long 233 ## DW_AT_type
.byte 18 ## Abbrev [18] 0x193:0xf DW_TAG_formal_parameter
.set Lset60, Ldebug_loc3-Lsection_debug_loc ## DW_AT_location
.long Lset60
- .long 492 ## DW_AT_name
+ .long 497 ## DW_AT_name
.byte 5 ## DW_AT_decl_file
.byte 114 ## DW_AT_decl_line
.long 239 ## DW_AT_type
.byte 19 ## Abbrev [19] 0x1a2:0xf DW_TAG_variable
.set Lset61, Ldebug_loc4-Lsection_debug_loc ## DW_AT_location
.long Lset61
- .long 499 ## DW_AT_name
+ .long 504 ## DW_AT_name
.byte 5 ## DW_AT_decl_file
.byte 130 ## DW_AT_decl_line
.long 542 ## DW_AT_type
.byte 19 ## Abbrev [19] 0x1b1:0xf DW_TAG_variable
.set Lset62, Ldebug_loc5-Lsection_debug_loc ## DW_AT_location
.long Lset62
- .long 501 ## DW_AT_name
+ .long 506 ## DW_AT_name
.byte 5 ## DW_AT_decl_file
.byte 132 ## DW_AT_decl_line
.long 615 ## DW_AT_type
.byte 19 ## Abbrev [19] 0x1c0:0xf DW_TAG_variable
.set Lset63, Ldebug_loc6-Lsection_debug_loc ## DW_AT_location
.long Lset63
- .long 523 ## DW_AT_name
+ .long 528 ## DW_AT_name
.byte 5 ## DW_AT_decl_file
.byte 131 ## DW_AT_decl_line
.long 615 ## DW_AT_type
@@ -1208,7 +1126,7 @@ Ldebug_info_start0:
.byte 19 ## Abbrev [19] 0x1d4:0xf DW_TAG_variable
.set Lset65, Ldebug_loc7-Lsection_debug_loc ## DW_AT_location
.long Lset65
- .long 525 ## DW_AT_name
+ .long 530 ## DW_AT_name
.byte 5 ## DW_AT_decl_file
.byte 136 ## DW_AT_decl_line
.long 552 ## DW_AT_type
@@ -1226,13 +1144,13 @@ Ldebug_info_start0:
.long 514 ## DW_AT_type
.long 380 ## DW_AT_name
.byte 2 ## DW_AT_decl_file
- .short 361 ## DW_AT_decl_line
+ .short 360 ## DW_AT_decl_line
.byte 8 ## Abbrev [8] 0x202:0x7 DW_TAG_base_type
- .long 386 ## DW_AT_name
- .byte 5 ## DW_AT_encoding
- .byte 2 ## DW_AT_byte_size
+ .long 385 ## DW_AT_name
+ .byte 6 ## DW_AT_encoding
+ .byte 1 ## DW_AT_byte_size
.byte 2 ## Abbrev [2] 0x209:0x15 DW_TAG_variable
- .long 392 ## DW_AT_name
+ .long 397 ## DW_AT_name
.long 330 ## DW_AT_type
.byte 6 ## DW_AT_decl_file
.byte 24 ## DW_AT_decl_line
@@ -1244,7 +1162,7 @@ Ldebug_info_start0:
.byte 3 ## Abbrev [3] 0x223:0x5 DW_TAG_const_type
.long 552 ## DW_AT_type
.byte 8 ## Abbrev [8] 0x228:0x7 DW_TAG_base_type
- .long 414 ## DW_AT_name
+ .long 419 ## DW_AT_name
.byte 8 ## DW_AT_encoding
.byte 1 ## DW_AT_byte_size
.byte 21 ## Abbrev [21] 0x22f:0x38 DW_TAG_subprogram
@@ -1254,7 +1172,7 @@ Ldebug_info_start0:
.byte 1 ## DW_AT_frame_base
.byte 86
## DW_AT_call_all_calls
- .long 428 ## DW_AT_name
+ .long 433 ## DW_AT_name
.byte 6 ## DW_AT_decl_file
.byte 39 ## DW_AT_decl_line
## DW_AT_prototyped
@@ -1264,25 +1182,25 @@ Ldebug_info_start0:
.byte 18 ## Abbrev [18] 0x248:0xf DW_TAG_formal_parameter
.set Lset67, Ldebug_loc0-Lsection_debug_loc ## DW_AT_location
.long Lset67
- .long 477 ## DW_AT_name
+ .long 482 ## DW_AT_name
.byte 6 ## DW_AT_decl_file
.byte 39 ## DW_AT_decl_line
.long 148 ## DW_AT_type
.byte 19 ## Abbrev [19] 0x257:0xf DW_TAG_variable
.set Lset68, Ldebug_loc1-Lsection_debug_loc ## DW_AT_location
.long Lset68
- .long 482 ## DW_AT_name
+ .long 487 ## DW_AT_name
.byte 6 ## DW_AT_decl_file
.byte 41 ## DW_AT_decl_line
.long 226 ## DW_AT_type
.byte 0 ## End Of Children Mark
.byte 9 ## Abbrev [9] 0x267:0xc DW_TAG_typedef
.long 627 ## DW_AT_type
- .long 503 ## DW_AT_name
+ .long 508 ## DW_AT_name
.byte 2 ## DW_AT_decl_file
.short 374 ## DW_AT_decl_line
.byte 8 ## Abbrev [8] 0x273:0x7 DW_TAG_base_type
- .long 510 ## DW_AT_name
+ .long 515 ## DW_AT_name
.byte 7 ## DW_AT_encoding
.byte 4 ## DW_AT_byte_size
.byte 0 ## End Of Children Mark
@@ -1349,7 +1267,7 @@ LNames2:
.long 309
.long 0
LNames6:
- .long 392 ## ECPGScanKeywordTokens
+ .long 397 ## ECPGScanKeywordTokens
.long 1 ## Num DIEs
.long 521
.long 0
@@ -1369,12 +1287,12 @@ LNames3:
.long 367
.long 0
LNames1:
- .long 428 ## ScanECPGKeywordLookup
+ .long 433 ## ScanECPGKeywordLookup
.long 1 ## Num DIEs
.long 559
.long 0
LNames4:
- .long 450 ## ScanECPGKeywords_hash_func
+ .long 455 ## ScanECPGKeywords_hash_func
.long 1 ## Num DIEs
.long 342
.long 0
@@ -1433,46 +1351,46 @@ Ltypes_begin:
.long -1 ## Bucket 10
.long 9 ## Bucket 11
.long 10 ## Bucket 12
- .long -1 ## Bucket 13
- .long 11 ## Bucket 14
+ .long 11 ## Bucket 13
+ .long 12 ## Bucket 14
.long 544532716 ## Hash in Bucket 1
.long -80380739 ## Hash in Bucket 2
.long 544532778 ## Hash in Bucket 3
.long 878862258 ## Hash in Bucket 3
- .long 274395349 ## Hash in Bucket 4
+ .long 2090370664 ## Hash in Bucket 4
.long -1304652851 ## Hash in Bucket 5
.long -282664779 ## Hash in Bucket 7
.long 193495088 ## Hash in Bucket 8
.long 466678419 ## Hash in Bucket 9
.long -594775205 ## Hash in Bucket 11
.long -1943928469 ## Hash in Bucket 12
- .long 262754999 ## Hash in Bucket 14
+ .long 691577533 ## Hash in Bucket 13
.long 2090147939 ## Hash in Bucket 14
.long -851394017 ## Hash in Bucket 14
.long -104093792 ## Hash in Bucket 14
-.set Lset80, Ltypes2-Ltypes_begin ## Offset in Bucket 1
+.set Lset80, Ltypes3-Ltypes_begin ## Offset in Bucket 1
.long Lset80
.set Lset81, Ltypes11-Ltypes_begin ## Offset in Bucket 2
.long Lset81
-.set Lset82, Ltypes0-Ltypes_begin ## Offset in Bucket 3
+.set Lset82, Ltypes1-Ltypes_begin ## Offset in Bucket 3
.long Lset82
-.set Lset83, Ltypes5-Ltypes_begin ## Offset in Bucket 3
+.set Lset83, Ltypes6-Ltypes_begin ## Offset in Bucket 3
.long Lset83
-.set Lset84, Ltypes8-Ltypes_begin ## Offset in Bucket 4
+.set Lset84, Ltypes0-Ltypes_begin ## Offset in Bucket 4
.long Lset84
-.set Lset85, Ltypes3-Ltypes_begin ## Offset in Bucket 5
+.set Lset85, Ltypes4-Ltypes_begin ## Offset in Bucket 5
.long Lset85
-.set Lset86, Ltypes7-Ltypes_begin ## Offset in Bucket 7
+.set Lset86, Ltypes8-Ltypes_begin ## Offset in Bucket 7
.long Lset86
-.set Lset87, Ltypes4-Ltypes_begin ## Offset in Bucket 8
+.set Lset87, Ltypes5-Ltypes_begin ## Offset in Bucket 8
.long Lset87
-.set Lset88, Ltypes6-Ltypes_begin ## Offset in Bucket 9
+.set Lset88, Ltypes7-Ltypes_begin ## Offset in Bucket 9
.long Lset88
-.set Lset89, Ltypes10-Ltypes_begin ## Offset in Bucket 11
+.set Lset89, Ltypes9-Ltypes_begin ## Offset in Bucket 11
.long Lset89
-.set Lset90, Ltypes1-Ltypes_begin ## Offset in Bucket 12
+.set Lset90, Ltypes2-Ltypes_begin ## Offset in Bucket 12
.long Lset90
-.set Lset91, Ltypes9-Ltypes_begin ## Offset in Bucket 14
+.set Lset91, Ltypes10-Ltypes_begin ## Offset in Bucket 13
.long Lset91
.set Lset92, Ltypes14-Ltypes_begin ## Offset in Bucket 14
.long Lset92
@@ -1480,7 +1398,7 @@ Ltypes_begin:
.long Lset93
.set Lset94, Ltypes13-Ltypes_begin ## Offset in Bucket 14
.long Lset94
-Ltypes2:
+Ltypes3:
.long 187 ## uint16
.long 1 ## Num DIEs
.long 175
@@ -1494,63 +1412,63 @@ Ltypes11:
.short 36
.byte 0
.long 0
-Ltypes0:
- .long 503 ## uint32
+Ltypes1:
+ .long 508 ## uint32
.long 1 ## Num DIEs
.long 615
.short 22
.byte 0
.long 0
-Ltypes5:
+Ltypes6:
.long 194 ## unsigned short
.long 1 ## Num DIEs
.long 187
.short 36
.byte 0
.long 0
-Ltypes8:
- .long 386 ## short
+Ltypes0:
+ .long 380 ## int8
.long 1 ## Num DIEs
- .long 514
- .short 36
+ .long 502
+ .short 22
.byte 0
.long 0
-Ltypes3:
- .long 510 ## unsigned int
+Ltypes4:
+ .long 515 ## unsigned int
.long 1 ## Num DIEs
.long 627
.short 36
.byte 0
.long 0
-Ltypes7:
+Ltypes8:
.long 245 ## __darwin_size_t
.long 1 ## Num DIEs
.long 250
.short 22
.byte 0
.long 0
-Ltypes4:
+Ltypes5:
.long 234 ## int
.long 1 ## Num DIEs
.long 226
.short 36
.byte 0
.long 0
-Ltypes6:
+Ltypes7:
.long 238 ## size_t
.long 1 ## Num DIEs
.long 239
.short 22
.byte 0
.long 0
-Ltypes10:
+Ltypes9:
.long 330 ## __ARRAY_SIZE_TYPE__
.long 1 ## Num DIEs
.long 302
.short 36
.byte 0
.long 0
-Ltypes1:
+Ltypes2:
.long 145 ## ScanKeywordList
.long 2 ## Num DIEs
.long 68
@@ -1560,11 +1478,11 @@ Ltypes1:
.short 19
.byte 0
.long 0
-Ltypes9:
- .long 380 ## int16
+Ltypes10:
+ .long 385 ## signed char
.long 1 ## Num DIEs
- .long 502
- .short 22
+ .long 514
+ .short 36
.byte 0
.long 0
Ltypes14:
@@ -1582,7 +1500,7 @@ Ltypes12:
.byte 0
.long 0
Ltypes13:
- .long 414 ## unsigned char
+ .long 419 ## unsigned char
.long 1 ## Num DIEs
.long 552
.short 36
@@ -1627,6 +1545,9 @@ LpubTypes_begin0:
.set Lset98, Lcu_begin0-Lsection_info ## Offset of Compilation Unit Info
.long Lset98
.long 635 ## Compilation Unit Length
+ .long 502 ## DIE offset
+ .byte 144 ## Attributes: TYPE, STATIC
+ .asciz "int8" ## External Name
.long 615 ## DIE offset
.byte 144 ## Attributes: TYPE, STATIC
.asciz "uint32" ## External Name
@@ -1651,15 +1572,12 @@ LpubTypes_begin0:
.long 250 ## DIE offset
.byte 144 ## Attributes: TYPE, STATIC
.asciz "__darwin_size_t" ## External Name
- .long 514 ## DIE offset
- .byte 144 ## Attributes: TYPE, STATIC
- .asciz "short" ## External Name
- .long 502 ## DIE offset
- .byte 144 ## Attributes: TYPE, STATIC
- .asciz "int16" ## External Name
.long 261 ## DIE offset
.byte 144 ## Attributes: TYPE, STATIC
.asciz "long unsigned int" ## External Name
+ .long 514 ## DIE offset
+ .byte 144 ## Attributes: TYPE, STATIC
+ .asciz "signed char" ## External Name
.long 194 ## DIE offset
.byte 144 ## Attributes: TYPE, STATIC
.asciz "ScanKeywordHashFunc" ## External Name
diff --git a/src/pl/plpgsql/src/pl_scanner.s b/src/pl/plpgsql/src/pl_scanner.s
index 8095fd18ec..323d282743 100644
--- a/src/pl/plpgsql/src/pl_scanner.s
+++ b/src/pl/plpgsql/src/pl_scanner.s
@@ -1736,7 +1736,7 @@ Ltmp211:
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:k <- $rdi
xorl %edx, %edx
Ltmp212:
- ##DEBUG_VALUE: UnreservedPLKeywords_hash_func:b <- 1
+ ##DEBUG_VALUE: UnreservedPLKeywords_hash_func:b <- 3
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:a <- 0
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:k <- $rdi
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:keylen <- $rsi
@@ -1760,7 +1760,7 @@ Ltmp214:
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:keylen <- $rsi
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:key <- $rdi
.loc 8 0 15 ## ./pl_unreserved_kwlist_d.h:0:15
- movl $127, %esi
+ movl $51, %esi
Ltmp215:
## implicit-def: $eax
## implicit-def: $ecx
@@ -1776,7 +1776,7 @@ LBB13_1:
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:keylen <- $rsi
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:key <- $rdi
.loc 8 0 2 ## ./pl_unreserved_kwlist_d.h:0:2
- movl $1, %ecx
+ movl $3, %ecx
xorl %eax, %eax
jmp LBB13_10
Ltmp217:
@@ -1788,7 +1788,7 @@ LBB13_4:
movq %r8, %r9
subq %rsi, %r9
xorl %eax, %eax
- movl $1, %ecx
+ movl $3, %ecx
Ltmp218:
.p2align 4, 0x90
LBB13_5: ## =>This Inner Loop Header: Depth=1
@@ -1807,17 +1807,17 @@ Ltmp219:
##DEBUG_VALUE: c <- $r10d
.loc 8 232 9 is_stmt 1 ## ./pl_unreserved_kwlist_d.h:232:9
movl %eax, %edx
- shll $5, %edx
- subl %eax, %edx
- .loc 8 232 14 is_stmt 0 ## ./pl_unreserved_kwlist_d.h:232:14
+ shll $8, %edx
+ addl %eax, %edx
+ .loc 8 232 15 is_stmt 0 ## ./pl_unreserved_kwlist_d.h:232:15
addl %r10d, %edx
Ltmp220:
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:a <- $edx
.loc 8 233 9 is_stmt 1 ## ./pl_unreserved_kwlist_d.h:233:9
movl %ecx, %esi
- shll $7, %esi
- subl %ecx, %esi
- .loc 8 233 15 is_stmt 0 ## ./pl_unreserved_kwlist_d.h:233:15
+ shll $4, %esi
+ addl %ecx, %esi
+ .loc 8 233 14 is_stmt 0 ## ./pl_unreserved_kwlist_d.h:233:14
addl %r10d, %esi
.loc 8 230 21 is_stmt 1 ## ./pl_unreserved_kwlist_d.h:230:21
movzbl 1(%rdi), %r10d
@@ -1834,17 +1834,17 @@ Ltmp223:
##DEBUG_VALUE: c <- $r10d
.loc 8 232 9 is_stmt 1 ## ./pl_unreserved_kwlist_d.h:232:9
movl %edx, %eax
- shll $5, %eax
- subl %edx, %eax
- .loc 8 232 14 is_stmt 0 ## ./pl_unreserved_kwlist_d.h:232:14
+ shll $8, %eax
+ addl %edx, %eax
+ .loc 8 232 15 is_stmt 0 ## ./pl_unreserved_kwlist_d.h:232:15
addl %r10d, %eax
Ltmp224:
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:a <- $eax
.loc 8 233 9 is_stmt 1 ## ./pl_unreserved_kwlist_d.h:233:9
movl %esi, %ecx
- shll $7, %ecx
- subl %esi, %ecx
- .loc 8 233 15 is_stmt 0 ## ./pl_unreserved_kwlist_d.h:233:15
+ shll $4, %ecx
+ addl %esi, %ecx
+ .loc 8 233 14 is_stmt 0 ## ./pl_unreserved_kwlist_d.h:233:14
addl %r10d, %ecx
Ltmp225:
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:keylen <- [DW_OP_constu 2, DW_OP_minus, DW_OP_stack_value] undef
@@ -1858,11 +1858,11 @@ Ltmp226:
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:a <- $eax
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:k <- $rdi
movl %eax, %edx
- shll $5, %edx
- subl %eax, %edx
+ shll $8, %edx
+ addl %eax, %edx
movl %ecx, %esi
- shll $7, %esi
- subl %ecx, %esi
+ shll $4, %esi
+ addl %ecx, %esi
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:k <- $rdi
Ltmp227:
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:k <- [DW_OP_plus_uconst 1, DW_OP_stack_value] $rdi
@@ -1877,17 +1877,17 @@ LBB13_8:
orl $32, %eax
Ltmp229:
##DEBUG_VALUE: c <- $eax
- .loc 8 233 15 is_stmt 1 ## ./pl_unreserved_kwlist_d.h:233:15
+ .loc 8 233 14 is_stmt 1 ## ./pl_unreserved_kwlist_d.h:233:14
addl %eax, %esi
Ltmp230:
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:b <- $esi
- .loc 8 232 14 ## ./pl_unreserved_kwlist_d.h:232:14
+ .loc 8 232 15 ## ./pl_unreserved_kwlist_d.h:232:15
addl %eax, %edx
Ltmp231:
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:a <- $edx
movl %edx, %eax
Ltmp232:
- .loc 8 233 15 ## ./pl_unreserved_kwlist_d.h:233:15
+ .loc 8 233 14 ## ./pl_unreserved_kwlist_d.h:233:14
movl %esi, %ecx
Ltmp233:
##DEBUG_VALUE: UnreservedPLKeywords_hash_func:b <- $ecx
@@ -1938,7 +1938,7 @@ Ltmp236:
##DEBUG_VALUE: ReservedPLKeywords_hash_func:k <- $rdi
xorl %edx, %edx
Ltmp237:
- ##DEBUG_VALUE: ReservedPLKeywords_hash_func:b <- 1
+ ##DEBUG_VALUE: ReservedPLKeywords_hash_func:b <- 9
##DEBUG_VALUE: ReservedPLKeywords_hash_func:a <- 0
##DEBUG_VALUE: ReservedPLKeywords_hash_func:k <- $rdi
##DEBUG_VALUE: ReservedPLKeywords_hash_func:keylen <- $rsi
@@ -1962,7 +1962,7 @@ Ltmp239:
##DEBUG_VALUE: ReservedPLKeywords_hash_func:keylen <- $rsi
##DEBUG_VALUE: ReservedPLKeywords_hash_func:key <- $rdi
.loc 58 0 15 ## ./pl_reserved_kwlist_d.h:0:15
- movl $127, %esi
+ movl $153, %esi
Ltmp240:
## implicit-def: $eax
## implicit-def: $ecx
@@ -1978,7 +1978,7 @@ LBB14_1:
##DEBUG_VALUE: ReservedPLKeywords_hash_func:keylen <- $rsi
##DEBUG_VALUE: ReservedPLKeywords_hash_func:key <- $rdi
.loc 58 0 2 ## ./pl_reserved_kwlist_d.h:0:2
- movl $1, %ecx
+ movl $9, %ecx
xorl %eax, %eax
jmp LBB14_10
Ltmp242:
@@ -1990,7 +1990,7 @@ LBB14_4:
movq %r8, %r9
subq %rsi, %r9
xorl %eax, %eax
- movl $1, %ecx
+ movl $9, %ecx
Ltmp243:
.p2align 4, 0x90
LBB14_5: ## =>This Inner Loop Header: Depth=1
@@ -2009,17 +2009,17 @@ Ltmp244:
##DEBUG_VALUE: c <- $r10d
.loc 58 100 9 is_stmt 1 ## ./pl_reserved_kwlist_d.h:100:9
movl %eax, %edx
- shll $5, %edx
- subl %eax, %edx
- .loc 58 100 14 is_stmt 0 ## ./pl_reserved_kwlist_d.h:100:14
+ shll $8, %edx
+ addl %eax, %edx
+ .loc 58 100 15 is_stmt 0 ## ./pl_reserved_kwlist_d.h:100:15
addl %r10d, %edx
Ltmp245:
##DEBUG_VALUE: ReservedPLKeywords_hash_func:a <- $edx
.loc 58 101 9 is_stmt 1 ## ./pl_reserved_kwlist_d.h:101:9
movl %ecx, %esi
- shll $7, %esi
- subl %ecx, %esi
- .loc 58 101 15 is_stmt 0 ## ./pl_reserved_kwlist_d.h:101:15
+ shll $4, %esi
+ addl %ecx, %esi
+ .loc 58 101 14 is_stmt 0 ## ./pl_reserved_kwlist_d.h:101:14
addl %r10d, %esi
.loc 58 98 21 is_stmt 1 ## ./pl_reserved_kwlist_d.h:98:21
movzbl 1(%rdi), %r10d
@@ -2036,17 +2036,17 @@ Ltmp248:
##DEBUG_VALUE: c <- $r10d
.loc 58 100 9 is_stmt 1 ## ./pl_reserved_kwlist_d.h:100:9
movl %edx, %eax
- shll $5, %eax
- subl %edx, %eax
- .loc 58 100 14 is_stmt 0 ## ./pl_reserved_kwlist_d.h:100:14
+ shll $8, %eax
+ addl %edx, %eax
+ .loc 58 100 15 is_stmt 0 ## ./pl_reserved_kwlist_d.h:100:15
addl %r10d, %eax
Ltmp249:
##DEBUG_VALUE: ReservedPLKeywords_hash_func:a <- $eax
.loc 58 101 9 is_stmt 1 ## ./pl_reserved_kwlist_d.h:101:9
movl %esi, %ecx
- shll $7, %ecx
- subl %esi, %ecx
- .loc 58 101 15 is_stmt 0 ## ./pl_reserved_kwlist_d.h:101:15
+ shll $4, %ecx
+ addl %esi, %ecx
+ .loc 58 101 14 is_stmt 0 ## ./pl_reserved_kwlist_d.h:101:14
addl %r10d, %ecx
Ltmp250:
##DEBUG_VALUE: ReservedPLKeywords_hash_func:keylen <- [DW_OP_constu 2, DW_OP_minus, DW_OP_stack_value] undef
@@ -2060,11 +2060,11 @@ Ltmp251:
##DEBUG_VALUE: ReservedPLKeywords_hash_func:a <- $eax
##DEBUG_VALUE: ReservedPLKeywords_hash_func:k <- $rdi
movl %eax, %edx
- shll $5, %edx
- subl %eax, %edx
+ shll $8, %edx
+ addl %eax, %edx
movl %ecx, %esi
- shll $7, %esi
- subl %ecx, %esi
+ shll $4, %esi
+ addl %ecx, %esi
##DEBUG_VALUE: ReservedPLKeywords_hash_func:k <- $rdi
Ltmp252:
##DEBUG_VALUE: ReservedPLKeywords_hash_func:k <- [DW_OP_plus_uconst 1, DW_OP_stack_value] $rdi
@@ -2079,17 +2079,17 @@ LBB14_8:
orl $32, %eax
Ltmp254:
##DEBUG_VALUE: c <- $eax
- .loc 58 101 15 is_stmt 1 ## ./pl_reserved_kwlist_d.h:101:15
+ .loc 58 101 14 is_stmt 1 ## ./pl_reserved_kwlist_d.h:101:14
addl %eax, %esi
Ltmp255:
##DEBUG_VALUE: ReservedPLKeywords_hash_func:b <- $esi
- .loc 58 100 14 ## ./pl_reserved_kwlist_d.h:100:14
+ .loc 58 100 15 ## ./pl_reserved_kwlist_d.h:100:15
addl %eax, %edx
Ltmp256:
##DEBUG_VALUE: ReservedPLKeywords_hash_func:a <- $edx
movl %edx, %eax
Ltmp257:
- .loc 58 101 15 ## ./pl_reserved_kwlist_d.h:101:15
+ .loc 58 101 14 ## ./pl_reserved_kwlist_d.h:101:14
movl %esi, %ecx
Ltmp258:
##DEBUG_VALUE: ReservedPLKeywords_hash_func:b <- $ecx
@@ -2780,173 +2780,173 @@ _UnreservedPLKeywords_kw_offsets:
.p2align 4 ## @UnreservedPLKeywords_hash_func.h
_UnreservedPLKeywords_hash_func.h:
- .short 10 ## 0xa
.short 32767 ## 0x7fff
+ .short 43 ## 0x2b
.short 32767 ## 0x7fff
- .short 57 ## 0x39
+ .short 0 ## 0x0
+ .short 74 ## 0x4a
+ .short 40 ## 0x28
+ .short 7 ## 0x7
.short 32767 ## 0x7fff
- .short 62 ## 0x3e
- .short 21 ## 0x15
.short 32767 ## 0x7fff
- .short 54 ## 0x36
.short 18 ## 0x12
.short 32767 ## 0x7fff
- .short 58 ## 0x3a
- .short 59 ## 0x3b
- .short 65482 ## 0xffca
- .short 47 ## 0x2f
+ .short 14 ## 0xe
+ .short 42 ## 0x2a
+ .short 3 ## 0x3
+ .short 33 ## 0x21
+ .short 65524 ## 0xfff4
.short 0 ## 0x0
- .short 65514 ## 0xffea
- .short 65472 ## 0xffc0
+ .short 35 ## 0x23
+ .short 0 ## 0x0
+ .short 65525 ## 0xfff5
+ .short 16 ## 0x10
.short 32767 ## 0x7fff
- .short 65514 ## 0xffea
- .short 33 ## 0x21
- .short 44 ## 0x2c
- .short 65531 ## 0xfffb
+ .short 21 ## 0x15
+ .short 0 ## 0x0
+ .short 39 ## 0x27
+ .short 65519 ## 0xffef
.short 32767 ## 0x7fff
+ .short 65515 ## 0xffeb
+ .short 18 ## 0x12
+ .short 28 ## 0x1c
+ .short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 43 ## 0x2b
- .short 57 ## 0x39
- .short 102 ## 0x66
.short 32767 ## 0x7fff
- .short 65471 ## 0xffbf
- .short 7 ## 0x7
.short 32767 ## 0x7fff
- .short 13 ## 0xd
.short 32767 ## 0x7fff
- .short 65508 ## 0xffe4
.short 14 ## 0xe
+ .short 53 ## 0x35
+ .short 65533 ## 0xfffd
+ .short 27 ## 0x1b
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 82 ## 0x52
+ .short 65527 ## 0xfff7
+ .short 32767 ## 0x7fff
+ .short 65503 ## 0xffdf
.short 32767 ## 0x7fff
+ .short 32767 ## 0x7fff
+ .short 81 ## 0x51
.short 0 ## 0x0
.short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 8 ## 0x8
- .short 65493 ## 0xffd5
- .short 0 ## 0x0
- .short 19 ## 0x13
- .short 8 ## 0x8
- .short 75 ## 0x4b
- .short 65478 ## 0xffc6
+ .short 7 ## 0x7
+ .short 63 ## 0x3f
.short 32767 ## 0x7fff
+ .short 45 ## 0x2d
.short 32767 ## 0x7fff
.short 0 ## 0x0
- .short 22 ## 0x16
- .short 29 ## 0x1d
+ .short 49 ## 0x31
+ .short 83 ## 0x53
+ .short 65458 ## 0xffb2
.short 32767 ## 0x7fff
- .short 65486 ## 0xffce
- .short 6 ## 0x6
.short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 30 ## 0x1e
+ .short 34 ## 0x22
.short 32767 ## 0x7fff
+ .short 65497 ## 0xffd9
.short 32767 ## 0x7fff
- .short 29 ## 0x1d
- .short 0 ## 0x0
- .short 104 ## 0x68
- .short 32767 ## 0x7fff
+ .short 43 ## 0x2b
+ .short 160 ## 0xa0
+ .short 45 ## 0x2d
.short 32767 ## 0x7fff
- .short 26 ## 0x1a
.short 0 ## 0x0
+ .short 49 ## 0x31
+ .short 65513 ## 0xffe9
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 65527 ## 0xfff7
- .short 2 ## 0x2
+ .short 20 ## 0x14
+ .short 9 ## 0x9
+ .short 21 ## 0x15
+ .short 11 ## 0xb
+ .short 76 ## 0x4c
.short 32767 ## 0x7fff
- .short 50 ## 0x32
- .short 39 ## 0x27
- .short 38 ## 0x26
- .short 39 ## 0x27
- .short 80 ## 0x50
+ .short 53 ## 0x35
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 8 ## 0x8
.short 32767 ## 0x7fff
- .short 65469 ## 0xffbd
- .short 89 ## 0x59
.short 32767 ## 0x7fff
- .short 65496 ## 0xffd8
- .short 64 ## 0x40
+ .short 0 ## 0x0
+ .short 35 ## 0x23
+ .short 11 ## 0xb
+ .short 65533 ## 0xfffd
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 26 ## 0x1a
- .short 10 ## 0xa
- .short 27 ## 0x1b
+ .short 17 ## 0x11
+ .short 41 ## 0x29
+ .short 65495 ## 0xffd7
+ .short 32767 ## 0x7fff
+ .short 36 ## 0x24
.short 32767 ## 0x7fff
.short 19 ## 0x13
.short 51 ## 0x33
- .short 65523 ## 0xfff3
- .short 26 ## 0x1a
+ .short 65519 ## 0xffef
+ .short 65495 ## 0xffd7
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 84 ## 0x54
- .short 23 ## 0x17
- .short 0 ## 0x0
- .short 66 ## 0x42
- .short 12 ## 0xc
- .short 65531 ## 0xfffb
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 0 ## 0x0
.short 50 ## 0x32
- .short 141 ## 0x8d
- .short 72 ## 0x48
- .short 45 ## 0x2d
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
+ .short 65499 ## 0xffdb
+ .short 56 ## 0x38
.short 0 ## 0x0
- .short 65514 ## 0xffea
+ .short 2 ## 0x2
+ .short 65470 ## 0xffbe
.short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 65502 ## 0xffde
.short 0 ## 0x0
- .short 19 ## 0x13
- .short 65531 ## 0xfffb
+ .short 65513 ## 0xffe9
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 37 ## 0x25
- .short 13 ## 0xd
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
+ .short 16 ## 0x10
.short 32767 ## 0x7fff
+ .short 65526 ## 0xfff6
.short 32767 ## 0x7fff
- .short 65468 ## 0xffbc
- .short 65532 ## 0xfffc
.short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 78 ## 0x4e
+ .short 0 ## 0x0
+ .short 0 ## 0x0
+ .short 7 ## 0x7
+ .short 0 ## 0x0
+ .short 71 ## 0x47
+ .short 0 ## 0x0
+ .short 65528 ## 0xfff8
+ .short 71 ## 0x47
+ .short 65527 ## 0xfff7
+ .short 46 ## 0x2e
+ .short 77 ## 0x4d
+ .short 114 ## 0x72
+ .short 0 ## 0x0
+ .short 32 ## 0x20
+ .short 0 ## 0x0
+ .short 70 ## 0x46
+ .short 0 ## 0x0
+ .short 31 ## 0x1f
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
- .short 0 ## 0x0
- .short 85 ## 0x55
+ .short 50 ## 0x32
.short 32767 ## 0x7fff
.short 32767 ## 0x7fff
+ .short 62 ## 0x3e
.short 32767 ## 0x7fff
- .short 65443 ## 0xffa3
.short 32767 ## 0x7fff
.short 0 ## 0x0
.short 0 ## 0x0
+ .short 48 ## 0x30
.short 32767 ## 0x7fff
- .short 74 ## 0x4a
- .short 5 ## 0x5
+ .short 65518 ## 0xffee
.short 32767 ## 0x7fff
+ .short 29 ## 0x1d
.short 32767 ## 0x7fff
- .short 71 ## 0x47
.short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
+ .short 81 ## 0x51
+ .short 0 ## 0x0
.short 0 ## 0x0
.short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 32767 ## 0x7fff
- .short 46 ## 0x2e
- .short 70 ## 0x46
+ .short 20 ## 0x14
.zerofill __DATA,__bss,_pushback_token,16,4 ## @pushback_token
.zerofill __DATA,__bss,_pushback_auxdata,160,4 ## @pushback_auxdata
@@ -3000,7 +3000,7 @@ _ReservedPLKeywords_kw_offsets:
.p2align 4 ## @ReservedPLKeywords_hash_func.h
_ReservedPLKeywords_hash_func.h:
- .ascii "\376\177\007\177\000\177\177\177\022\005\177\033\177\000\177\177\000' \026\n\177\023\346\177\365\000\f\177\177\377\034\024\000\027\177\000\016\370\177\177\177\r\005\177\351\001\000\177"
+ .asciz "\177\000\017\177\t\177\177\177\362\027\177\000\177\b\371\177\000\177\177\004\005\177\177\026\n\372\177\354\177\376\373\177\001\026\372\016\000\000\177\r\000\377\177\177\025\027\007\f"
.file 59 "/Users/mark.dilger/review/uninorm.4/src/pl/plpgsql/src" "../../../../src/include/lib/stringinfo.h"
.section __DWARF,__debug_str,regular,debug
@@ -5574,7 +5574,7 @@ Ldebug_loc47:
.set Lset205, Ltmp218-Lfunc_begin0
.quad Lset205
.short 2 ## Loc expr size
- .byte 49 ## DW_OP_lit1
+ .byte 51 ## DW_OP_lit3
.byte 159 ## DW_OP_stack_value
.set Lset206, Ltmp218-Lfunc_begin0
.quad Lset206
@@ -5724,7 +5724,7 @@ Ldebug_loc53:
.set Lset247, Ltmp243-Lfunc_begin0
.quad Lset247
.short 2 ## Loc expr size
- .byte 49 ## DW_OP_lit1
+ .byte 57 ## DW_OP_lit9
.byte 159 ## DW_OP_stack_value
.set Lset248, Ltmp243-Lfunc_begin0
.quad Lset248
On Sep 18, 2020, at 9:41 AM, John Naylor <john.naylor@2ndquadrant.com> wrote:
Attached is version 4, which excludes the output file from pgindent,
to match recent commit 74d4608f5. Since it won't be indented again, I
also tweaked the generator script to match pgindent for the typedef,
since we don't want to lose what pgindent has fixed already. This last
part isn't new to v4, but I thought I'd highlight it anyway.--
John Naylor https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
<v4-0001-Tweak-the-set-of-candidate-multipliers-for-genera.patch><v4-0002-Use-perfect-hashing-for-NFC-Unicode-normalization.patch><v4-0003-Use-perfect-hashing-for-NKFC-Unicode-normalizatio.patch>
0002 and 0003 look good to me. I like the way you cleaned up a bit with the unicode_norm_props struct, which makes the code a bit more tidy, and on my compiler under -O2 it does not generate any extra runtime dereferences, as the compiler can see through the struct just fine. My only concern would be if some other compilers might not see through the struct, resulting in a runtime performance cost? I wouldn't even ask, except that qc_hash_lookup is called in a fairly tight loop.
To clarify, the following changes to the generated code which remove the struct and corresponding dereferences (not intended as a patch submission) cause zero bytes of change in the compiled output for me on mac/clang, which is good, and generate inconsequential changes on linux/gcc, which is also good, but I wonder if that is true for all compilers. In your commit message for 0001 you mentioned testing on a multiplicity of compilers. Did you do that for 0002 and 0003 as well?
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 1714837e64..976b96e332 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -476,8 +476,11 @@ qc_compare(const void *p1, const void *p2)
return (v1 - v2);
}
-static const pg_unicode_normprops *
-qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
+static inline const pg_unicode_normprops *
+qc_hash_lookup(pg_wchar ch,
+ const pg_unicode_normprops *normprops,
+ qc_hash_func hash,
+ int num_normprops)
{
int h;
uint32 hashkey;
@@ -487,21 +490,21 @@ qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
* in network order.
*/
hashkey = htonl(ch);
- h = norminfo->hash(&hashkey);
+ h = hash(&hashkey);
/* An out-of-range result implies no match */
- if (h < 0 || h >= norminfo->num_normprops)
+ if (h < 0 || h >= num_normprops)
return NULL;
/*
* Since it's a perfect hash, we need only match to the specific codepoint
* it identifies.
*/
- if (ch != norminfo->normprops[h].codepoint)
+ if (ch != normprops[h].codepoint)
return NULL;
/* Success! */
- return &norminfo->normprops[h];
+ return &normprops[h];
}
/*
@@ -518,7 +521,10 @@ qc_is_allowed(UnicodeNormalizationForm form, pg_wchar ch)
switch (form)
{
case UNICODE_NFC:
- found = qc_hash_lookup(ch, &UnicodeNormInfo_NFC_QC);
+ found = qc_hash_lookup(ch,
+ UnicodeNormProps_NFC_QC,
+ NFC_QC_hash_func,
+ NFC_QC_num_normprops);
break;
case UNICODE_NFKC:
found = bsearch(&key,
diff --git a/src/include/common/unicode_normprops_table.h b/src/include/common/unicode_normprops_table.h
index 5e1e382af5..38300cfa12 100644
--- a/src/include/common/unicode_normprops_table.h
+++ b/src/include/common/unicode_normprops_table.h
@@ -13,13 +13,6 @@ typedef struct
signed int quickcheck:4; /* really UnicodeNormalizationQC */
} pg_unicode_normprops;
-typedef struct
-{
- const pg_unicode_normprops *normprops;
- qc_hash_func hash;
- int num_normprops;
-} unicode_norm_info;
-
static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
{0x0300, UNICODE_NORM_QC_MAYBE},
{0x0301, UNICODE_NORM_QC_MAYBE},
@@ -1583,12 +1576,6 @@ NFC_QC_hash_func(const void *key)
return h[a % 2463] + h[b % 2463];
}
-static const unicode_norm_info UnicodeNormInfo_NFC_QC = {
- UnicodeNormProps_NFC_QC,
- NFC_QC_hash_func,
- 1231
-};
-
static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
{0x00A0, UNICODE_NORM_QC_NO},
{0x00A8, UNICODE_NORM_QC_NO},
--
Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
On Sat, Sep 19, 2020 at 1:46 PM Mark Dilger
<mark.dilger@enterprisedb.com> wrote:
0002 and 0003 look good to me. I like the way you cleaned up a bit with the unicode_norm_props struct, which makes the code a bit more tidy, and on my compiler under -O2 it does not generate any extra runtime dereferences, as the compiler can see through the struct just fine. My only concern would be if some other compilers might not see through the struct, resulting in a runtime performance cost? I wouldn't even ask, except that qc_hash_lookup is called in a fairly tight loop.
(I assume you mean unicode_norm_info) Yeah, that usage was copied from
the keyword list code. I believe it was done for the convenience of
the callers. That is worth something, and so is consistency. That
said, I'd be curious if there is a measurable impact for some
platforms.
In your commit message for 0001 you mentioned testing on a multiplicity of compilers. Did you do that for 0002 and 0003 as well?
For that, I was simply using godbolt.org to test compiling the
multiplications down to shift-and-adds. Very widespread, I only
remember MSVC as not doing it. I'm not sure a few extra cycles would
have been noticeable here, but it can't hurt to have that guarantee.
--
John Naylor https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
On Sep 19, 2020, at 3:58 PM, John Naylor <john.naylor@2ndquadrant.com> wrote:
On Sat, Sep 19, 2020 at 1:46 PM Mark Dilger
<mark.dilger@enterprisedb.com> wrote:0002 and 0003 look good to me. I like the way you cleaned up a bit with the unicode_norm_props struct, which makes the code a bit more tidy, and on my compiler under -O2 it does not generate any extra runtime dereferences, as the compiler can see through the struct just fine. My only concern would be if some other compilers might not see through the struct, resulting in a runtime performance cost? I wouldn't even ask, except that qc_hash_lookup is called in a fairly tight loop.
(I assume you mean unicode_norm_info) Yeah, that usage was copied from
the keyword list code. I believe it was done for the convenience of
the callers. That is worth something, and so is consistency. That
said, I'd be curious if there is a measurable impact for some
platforms.
Right, unicode_norm_info. I'm not sure the convenience of the callers matters here, since the usage is restricted to just one file, but I also don't have a problem with the code as you have it.
In your commit message for 0001 you mentioned testing on a multiplicity of compilers. Did you do that for 0002 and 0003 as well?
For that, I was simply using godbolt.org to test compiling the
multiplications down to shift-and-adds. Very widespread, I only
remember MSVC as not doing it. I'm not sure a few extra cycles would
have been noticeable here, but it can't hurt to have that guarantee.
I am marking this ready for committer. I didn't object to the whitespace weirdness in your patch (about which `git apply` grumbles) since you seem to have done that intentionally. I have no further comments on the performance issue, since I don't have any other platforms at hand to test it on. Whichever committer picks this up can decide if the issue matters to them enough to punt it back for further performance testing.
—
Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
On Sat, Sep 19, 2020 at 04:09:27PM -0700, Mark Dilger wrote:
I am marking this ready for committer. I didn't object to the
whitespace weirdness in your patch (about which `git apply`
grumbles) since you seem to have done that intentionally. I have no
further comments on the performance issue, since I don't have any
other platforms at hand to test it on. Whichever committer picks
this up can decide if the issue matters to them enough to punt it
back for further performance testing.
About 0001, the new set of multipliers looks fine to me. Even if this
adds an extra item from 901 to 902 because this can be divided by 17
in kwlist_d.h, I also don't think that this is really much bothering
and. As mentioned, this impacts none of the other tables that are much
smaller in size, on top of coming back to normal once a new keyword
will be added. Being able to generate perfect hash functions for much
larger sets is a nice property to have. While on it, I also looked at
the assembly code with gcc -O2 for keywords.c & co and I have not
spotted any huge difference. So I'd like to apply this first if there
are no objections.
I have tested 0002 and 0003, that had better be merged together at the
end, and I can see performance improvements with MSVC and gcc similar
to what is being reported upthread, with 20~30% gains for simple
data sample using IS NFC/NFKC. That's cool.
Including unicode_normprops_table.h in what gets ignored with pgindent
is also fine at the end, even with the changes to make the output of
the structures generated more in-line with what pgindent generates.
One tiny comment I have is that I would have added an extra comment in
the unicode header generated to document the set of structures
generated for the perfect hash, but that's easy enough to add.
--
Michael
On Wed, Oct 07, 2020 at 03:18:44PM +0900, Michael Paquier wrote:
About 0001, the new set of multipliers looks fine to me. Even if this
adds an extra item from 901 to 902 because this can be divided by 17
in kwlist_d.h, I also don't think that this is really much bothering
and. As mentioned, this impacts none of the other tables that are much
smaller in size, on top of coming back to normal once a new keyword
will be added. Being able to generate perfect hash functions for much
larger sets is a nice property to have. While on it, I also looked at
the assembly code with gcc -O2 for keywords.c & co and I have not
spotted any huge difference. So I'd like to apply this first if there
are no objections.
I looked at this one again today, and applied it. I looked at what
MSVC compiler was able to do in terms of optimizations with
shift-and-add for multipliers, and it is by far not as good as gcc or
clang, applying imul for basically all the primes we could use for the
perfect hash generation.
I have tested 0002 and 0003, that had better be merged together at the
end, and I can see performance improvements with MSVC and gcc similar
to what is being reported upthread, with 20~30% gains for simple
data sample using IS NFC/NFKC. That's cool.
For these two, I have merged both together and did some adjustments as
per the attached. Not many tweaks, mainly some more comments for the
unicode header files as the number of structures generated gets
higher. FWIW, with the addition of the two hash tables,
libpgcommon_srv.a grows from 1032600B to 1089240B, which looks like a
small price to pay for the ~30% performance gains with the quick
checks.
--
Michael
Attachments:
uni-norm-hash-v5.patchtext/x-diff; charset=us-asciiDownload
diff --git a/src/include/common/unicode_normprops_table.h b/src/include/common/unicode_normprops_table.h
index 93a2e55b75..efee19a3dc 100644
--- a/src/include/common/unicode_normprops_table.h
+++ b/src/include/common/unicode_normprops_table.h
@@ -3,7 +3,8 @@
#include "common/unicode_norm.h"
/*
- * We use a bit field here to save space.
+ * Normalization quick check entry for codepoint. We use a bit field
+ * here to save space.
*/
typedef struct
{
@@ -11,6 +12,17 @@ typedef struct
signed int quickcheck:4; /* really UnicodeNormalizationQC */
} pg_unicode_normprops;
+/* Typedef for hash function on quick check table */
+typedef int (*qc_hash_func) (const void *key);
+
+/* Information for quick check lookup with perfect hash function */
+typedef struct
+{
+ const pg_unicode_normprops *normprops;
+ qc_hash_func hash;
+ int num_normprops;
+} unicode_norm_info;
+
static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
{0x0300, UNICODE_NORM_QC_MAYBE},
{0x0301, UNICODE_NORM_QC_MAYBE},
@@ -1245,6 +1257,343 @@ static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
{0x2FA1D, UNICODE_NORM_QC_NO},
};
+/* Perfect hash function for NFC_QC */
+static int
+NFC_QC_hash_func(const void *key)
+{
+ static const int16 h[2463] = {
+ 0, -2717, 0, 221, 1293, 223, 1295, 225,
+ 226, 241, 0, 229, 230, 231, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -386, 0, 0, 0, 0, 0, 0, 0,
+ -163, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -246, -175, 1260, 0, 0, 0, -174, -173,
+ 0, -172, 0, 0, 0, 0, 0, 0,
+ 1049, 0, 300, 301, 1071, 0, 1071, 0,
+ 1071, 1071, 1057, 0, 0, 0, 0, 1061,
+ 0, -1053, 1664, 0, 2956, 0, 0, -13,
+ 0, 0, 0, 0, 2156, 0, 0, 0,
+ 0, 0, 0, 0, 71, 0, 1082, 0,
+ 1083, 1083, 0, 1084, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 359, 360, 361,
+ -1091, 363, -762, -130, -129, -128, -127, -126,
+ 137, -124, -708, -707, -706, -120, -185, -705,
+ -117, -184, -1307, -114, -113, -112, -111, 0,
+ 386, 387, 388, 389, -90, 391, 171, 172,
+ 394, -94, -183, 397, 398, 399, -98, -225,
+ 402, -1019, -636, -1019, -225, 407, 408, 409,
+ 410, 411, 674, 413, -171, -170, -169, 417,
+ 352, -168, 420, 353, -770, 423, 424, 425,
+ 426, 427, 428, 32767, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 32767, 32767, 237, 32767, 236, 32767,
+ 32767, 234, 234, 234, 234, 617, 234, 234,
+ 234, -2483, 234, -1430, 1526, -1430, 1527, 47,
+ 48, 471, 230, 32767, 32767, 32767, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227,
+ -159, 227, 227, 227, 227, 227, 227, 227,
+ 64, 227, 227, 227, 227, 227, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227,
+ -19, 52, 1487, 227, 227, 227, 53, 54,
+ 227, 55, 227, 227, 227, 227, 227, 227,
+ 1276, 227, -989, 32767, 1296, 225, 1296, 225,
+ 1296, 1296, 1282, 225, 225, 225, 225, 1286,
+ 225, -828, 1889, 225, 3181, 225, 225, 212,
+ 225, 225, 225, 225, 2381, 225, 225, 225,
+ 225, 225, 225, 225, 296, 225, 1307, 225,
+ 1308, 1308, 225, 1309, 225, 225, 225, 225,
+ 225, 225, 225, 225, 225, 225, 225, 225,
+ 225, 225, 225, 225, 225, 584, 585, 586,
+ -866, 588, -537, 95, 96, 97, 98, 99,
+ 362, 101, -483, -482, -481, 105, 40, -480,
+ 108, 41, -1082, 111, 112, 113, 114, 225,
+ 611, 612, 613, 614, 135, 616, 396, 397,
+ 619, 131, 42, 622, 623, 624, 127, 0,
+ 627, -794, -411, -794, 0, 632, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ -272, 32767, 32767, 32767, 0, 32767, 32767, 32767,
+ 32767, 32767, -166, -165, 32767, 32767, 32767, 32767,
+ -164, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 397, 32767, 396, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 386,
+ 0, 386, 386, 386, 386, 386, 386, 386,
+ 223, 386, 386, 386, 32767, 385, 385, 385,
+ 385, 385, 32767, 384, 32767, 383, 383, 32767,
+ 382, 382, 32767, 381, 381, 381, 381, 381,
+ 135, 206, 1641, 381, 32767, 32767, 32767, 32767,
+ 32767, 32767, -160, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 1148, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 32767, 32767, 32767, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, -257, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, -910, -910, 32767, 32767,
+ 0, 32767, 0, 32767, 0, 32767, 0, 32767,
+ 147, 32767, 0, 32767, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 143, 32767, 144, 32767, 145,
+ 32767, 146, 32767, 0, 32767, 148, 32767, 149,
+ 32767, 32767, 32767, -160, 32767, 32767, 32767, 32767,
+ 32767, 32767, 15, 32767, 32767, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 145, 32767, 144, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, -148, 32767, 32767, 32767, 32767,
+ 32767, 32767, 2009, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 32767, 32767, 135, -918, 32767,
+ 151, 32767, 32767, 0, 1, 2, 3, 4,
+ 133, 5, 6, 7, 8, 9, 10, 11,
+ 32767, 32767, -1248, 32767, 13, 154, 188, 188,
+ 32767, 32767, 32767, 32767, 32767, 155, 16, 32767,
+ 32767, 32767, 32767, 32767, 32767, -1853, -1054, 18,
+ -1052, -1051, -1036, 22, 32767, 157, 32767, 28,
+ 23, 1077, 673, 25, -2930, 0, 32767, 32767,
+ 32767, 32767, 32767, 27, 32767, 155, 32767, 154,
+ 32767, 32767, -62, 28, -42, 30, -1051, 32,
+ -1050, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 34,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 129, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 672, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 0, 32767,
+ 32767, 32767, 32767, 32767, -156, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, -155, 32767, 32767,
+ 32767, 0, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 73, 32767, 32767, 32767, 32767, 74, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 675,
+ 32767, 32767, 32767, 32767, 32767, 75, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 165, 32767, 32767, 32767, 166, 167,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 170, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 689, 690, 691, 692, 693, 694, 695,
+ 696, 697, 698, 699, 700, 701, 702, 703,
+ 704, 705, 706, 707, 708, 709, 710, 711,
+ 712, 713, 714, 715, 716, 717, 718, 719,
+ 720, 721, 722, -304, -303, -302, -301, -300,
+ -299, -298, -297, 930, -295, -294, -293, -292,
+ -291, -290, -289, -288, -287, -286, -285, -284,
+ -283, -282, -281, -280, -279, -278, -277, -276,
+ -275, 753, 754, 755, 646, 757, -712, -1765,
+ 952, -712, 2244, -712, 2245, 765, 766, 767,
+ 768, 125, 770, 771, 772, 773, 774, 775,
+ 603, 777, 778, 779, 780, 781, 782, 783,
+ 784, 2011, 786, 787, 788, 789, 790, 791,
+ 792, 793, 794, 795, 796, 797, 798, 799,
+ 800, 801, 802, 803, 804, 805, 806, 603,
+ 603, 809, 603, 811, 603, 603, 814, 815,
+ 816, 817, 435, 819, 820, 821, 3539, 823,
+ 603, -468, 603, -468, 603, 603, 589, 831,
+ 603, 603, 603, 835, 836, 837, 838, 839,
+ 840, 841, 842, 843, 844, 845, 846, 847,
+ 848, 849, 850, 851, 852, 1239, 854, 855,
+ 856, 857, 858, 859, 860, 1024, 862, 863,
+ 864, 865, 866, 867, 868, 869, 870, 871,
+ 872, 873, 874, 875, 876, 877, 878, 879,
+ 880, 881, 882, 883, 884, 1131, 1061, -373,
+ 888, 889, 890, 1065, 1065, 893, 1066, 895,
+ 896, 897, 898, 899, 900, -148, 902, 603,
+ 603, -166, 906, -164, 908, -162, -161, -146,
+ 912, 913, 914, 915, -145, 917, 1971, -745,
+ 920, -2035, 922, 923, 937, 925, 926, 927,
+ 928, -1227, 930, 931, 932, 933, 934, 935,
+ 936, 866, 938, -143, 940, -142, -141, 943,
+ -140, 32767, 945, 946, 947, 948, 949, 950,
+ 951, 952, 953, 954, 955, 956, 957, 958,
+ 959, 960, 961, -65, -64, -63, -62, -61,
+ -60, -59, -58, 1169, -56, -55, -54, -53,
+ -52, -51, -50, -49, -48, -47, -46, -45,
+ -44, -43, -42, -41, -40, -39, -38, -37,
+ -36, 992, 993, 994, 885, 996, -473, -1526,
+ 1191, -473, 2483, -473, 2484, 1004, 1005, 1006,
+ 1007, 364, 1009, 1010, 1011, 1012, 1013, 1014,
+ 842, 1016, 1017, 1018, 1019, 1020, 1021, 1022,
+ 1023, 2250, 1025, 1026, 1027, 1028, 1029, 1030,
+ 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038,
+ 1039, 1040, 1041, 1042, 1043, 1044, 1045, 842,
+ 842, 1048, 842, 1050, 842, 842, 1053, 1054,
+ 1055, 1056, 674, 1058, 1059, 1060, 3778, 1062,
+ 842, -229, 842, -229, 842, 842, 828, 1070,
+ 842, 842, 842, 1074, 1075, 1076, 1077, 1078,
+ 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086,
+ 1087, 1088, 1089, 1090, 1091, 1478, 1093, 1094,
+ 1095, 1096, 1097, 1098, 1099, 1263, 1101, 1102,
+ 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110,
+ 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118,
+ 1119, 1120, 1121, 1122, 1123, 1370, 1300, -134,
+ 1127, 1128, 1129, 1304, 1304, 1132, 1305, 1134,
+ 1135, 1136, 1137, 1138, 1139, 91, 1141, 842,
+ 842, 73, 1145, 75, 1147, 77, 78, 93,
+ 1151, 1152, 1153, 1154, 94, 1156, 2210, -506,
+ 1159, -1796, 1161, 1162, 1176, 1164, 1165, 1166,
+ 1167, -988, 1169, 1170, 1171, 1172, 1173, 1174,
+ 1175, 1105, 1177, 96, 1179, 97, 98, 1182,
+ 99, 1184, 1185, 1186, 1187, 1188, 1189, 1190,
+ 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198,
+ 1199, 1200, 0, 174, 175, 176, 177, 178,
+ 179, 180, 181, 1408, 183, 184, 185, 186,
+ 187, 188, 189, 190, 191, 192, 193, 194,
+ 195, 196, 197, 198, 199, 200, 201, 202,
+ 203, 0, 0, 206, 0, 208, 0, 0,
+ 211, 212, 213, 214, -168, 216, 217, 218,
+ 2936, 220, 0, -1071, 0, -1071, 0, 0,
+ -14, 228, 0, 0, 0, 232, 233, 234,
+ 235, 236, 237, 238, 239, 240, 241, 242,
+ 243, 244, 245, 246, 247, 248, 249, 636,
+ 251, 252, 253, 254, 255, 256, 257, 421,
+ 259, 260, 261, 262, 263, 264, 265, 266,
+ 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 528,
+ 458, -976, 285, 286, 287, 462, 462, 290,
+ 463, 292, 293, 294, 295, 296, 297, -751,
+ 299, 0, 0, -769, 303, -767, 305, -765,
+ -764, -749, 309, 310, 311, 312, -748, 314,
+ 1368, -1348, 317, -2638, 319, 320, 334, 322,
+ 323, 324, 325, -1830, 327, 328, 329, 330,
+ 331, 332, 333, 263, 335, -746, 337, -745,
+ -744, 340, -743, 342, 343, 344, 345, 346,
+ 347, 348, 349, 350, 351, 352, 353, 354,
+ 355, 356, 357, 358, 0, 0, 0, 1453,
+ 0, 1126, 495, 495, 495, 495, 495, 233,
+ 495, 1080, 1080, 1080, 495, 561, 1082, 495,
+ 563, 1687, 495, 495, 495, 495, 385, 0,
+ 0, 0, 0, 480, 0, 221, 221, 0,
+ 489, 579, 0, 0, 0, 498, 626, 0,
+ 1422, 1040, 1424, 631, 0, 0, 0, 0,
+ 0, -262, 0, 585, 585, 585, 0, 66,
+ 587, 0, 68, 1192, 0, 0, 0, 0,
+ 0, 0, 32767, 32767, 32767, 32767, 669, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 670,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 142, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 115, 116, 117, 118, 119, 120,
+ 121, 122, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, 132, 133, 134, 135, 136,
+ 137, 138, 139, 140, 141, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, -199, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1027, 0, 0, 0, 110, 0,
+ 1470, 2524, -192, 1473, -1482, 1475, -1481, 0,
+ 0, 0, 0, 644, 0, 0, 0, 0,
+ 0, 0, 173, 0, 0, 0, 0, 0,
+ 0, 0, 0, -1226, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 204, 205, 0, 207, 0, 209, 210,
+ 0, 0, 0, 0, 383, 0, 0,
+ };
+
+ const unsigned char *k = (const unsigned char *) key;
+ size_t keylen = 4;
+ uint32 a = 0;
+ uint32 b = 0;
+
+ while (keylen--)
+ {
+ unsigned char c = *k++;
+
+ a = a * 257 + c;
+ b = b * 17 + c;
+ }
+ return h[a % 2463] + h[b % 2463];
+}
+
+/* Hash lookup information for NFC_QC */
+static const unicode_norm_info UnicodeNormInfo_NFC_QC = {
+ UnicodeNormProps_NFC_QC,
+ NFC_QC_hash_func,
+ 1231
+};
+
static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
{0x00A0, UNICODE_NORM_QC_NO},
{0x00A8, UNICODE_NORM_QC_NO},
@@ -6165,3 +6514,1262 @@ static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
{0x2FA1C, UNICODE_NORM_QC_NO},
{0x2FA1D, UNICODE_NORM_QC_NO},
};
+
+/* Perfect hash function for NFKC_QC */
+static int
+NFKC_QC_hash_func(const void *key)
+{
+ static const int16 h[9837] = {
+ -2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472,
+ -2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472,
+ -2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472,
+ -2472, -2472, -2472, -2472, -2472, 32767, 32767, 32767,
+ -2475, -2475, -2475, -2475, -2475, -2475, -2475, -2475,
+ -2475, -2475, -2475, -2475, -2475, -2475, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 865, 865, 865, 865, 865, 865, 865,
+ 865, 865, 865, 865, -2255, 32767, -5207, 32767,
+ -5207, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 4250, 861, 861, 861, 3339, 3339,
+ 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339,
+ 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339,
+ 32767, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 9, 10, 32767, 11, 12, 0, 32767,
+ 0, 2913, 2914, 2915, 2916, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 2917, 32767, 2918, -100,
+ 2919, 2920, 2921, 840, 840, 840, 2922, 0,
+ 0, 0, 0, 0, 2206, 0, 2923, 0,
+ 2924, 2925, 2926, 0, 0, 0, -2590, 0,
+ 0, 0, 0, 0, 0, 0, 2934, 0,
+ 2474, 2931, 2932, 0, 0, 0, 0, 0,
+ 14, 805, 0, 0, 2933, 0, 2934, 0,
+ 2935, 2936, 0, 0, 0, 16, 17, 0,
+ 0, 0, 0, 0, 0, 0, 0, 18,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -790, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -1675, 0, 0, 19, 0, -1679,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, -1694,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 20, 21, 22, 23, 24, 25,
+ 26, 27, 28, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 29, 30, 31, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 724, 2668, 724, 4350, -2633, -2633,
+ 2533, 2534, 2535, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 2518, 2519, 2520, 1431, 45, 46,
+ 32767, 32767, 47, 48, 49, 50, 51, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -3011, 53, -1125, -3010, -3010,
+ 32767, -3334, -1123, -3011, 60, 61, 62, 63,
+ 32767, 32767, 64, 32767, 65, 32767, 66, 67,
+ 32767, 32767, 32767, 32767, 32767, 32767, 2268, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 69, 70,
+ 71, 72, 73, 74, 32767, 32767, 32767, 32767,
+ 75, 76, 32767, 77, 281, 32767, 32767, 32767,
+ 32767, 32767, 32767, 811, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 1341, 1342, 1343, 1344, 1345,
+ 1346, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 86,
+ 32767, 32767, 32767, 32767, 32767, 4550, 32767, 32767,
+ 32767, 1135, 32767, 32767, 32767, 32767, 32767, 1130,
+ 3016, 32767, 3017, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 677, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 2858, 2859, 651, 2861, -438,
+ 2863, 2864, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -5305, -5305, -5305, 32767, -5306,
+ -5306, 32767, 32767, 32767, 2871, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 3022, 3023, 680, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, -272, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 4308, 4309, 4310,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 4311, 4312, 4313,
+ 4314, 4315, 4316, 4317, 4318, 4319, 4320, 4321,
+ 4322, 4323, 4324, 4325, 4326, 4307, 4307, 4307,
+ 4307, 4307, 4307, 4307, 4307, 4307, 4336, 4337,
+ 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345,
+ 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353,
+ 4354, 32767, 32767, 32767, 32767, 4355, 4356, 4357,
+ 4358, 4359, 4360, 4361, 4362, 4363, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 4364, 4365, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2202, 0, 0, 0, 59, 0,
+ 0, 35, 0, 0, 0, 3549, 0, 0,
+ 0, 0, 0, 3394, 0, 0, 3399, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2012,
+ 0, 0, 0, 0, 87, 2022, 0, 7490,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 2255, 0, 2256, 2256, 2256, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 0, 0,
+ 0, 0, 0, 0, -1759, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4767, 0, 0, 4772,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 5977, 0,
+ 892, 32767, 0, 32767, 32767, 0, 0, 32767,
+ 32767, 2344, 4834, 4835, 4836, 32767, 0, 4840,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 32767, 0, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 32767, 32767, 0, 32767, 0, 0, 0, 32767,
+ 32767, 32767, 32767, 3261, 3262, 32767, 3007, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 106, 107, 108, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 109, 110, 111, 112, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, -2344,
+ -2344, 0, 32767, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, -1642, 1469, -1641, 1469, -1640, 1469,
+ 1469, 1457, 1469, 1469, 1469, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -3359, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4103,
+ -1478, 0, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, -4254, -2433, -4254, -4254, -4254, -3658,
+ -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254,
+ -4254, -4254, 0, -4253, -4253, -4253, -4253, -4253,
+ -4253, -4253, -4253, -4253, -678, -677, -676, -675,
+ -674, -673, -672, -4253, 314, -4253, -4253, -4253,
+ -4253, -4253, -4253, -4253, -4253, -4253, -4253, -4253,
+ -4253, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 1464, 1465, 1466, 1467,
+ 1468, 1469, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 0, 32767, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 827, 828, 829, -2469, -2469, -260, 0,
+ 0, 32767, 0, 32767, 0, 0, 32767, 0,
+ 0, 32767, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 3575, 3576, 3577, 3578, 3579, 3580, 3581, 0,
+ 4567, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2201, 4411, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -3338, 0, 0, 0,
+ 0, 0, 0, 0, -3337, 0, -3336, 0,
+ 0, 0, 0, -3335, 0, 0, -3334, -3333,
+ -3332, -3331, 0, 0, -3330, 0, 0, 32767,
+ 0, 0, 13, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 3073,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ -2556, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 3074, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 2355, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, -488, -488, -488, -302, -3067, -3067,
+ -3067, -3067, -488, -488, -488, -488, 2999, -488,
+ 2999, -488, -488, -488, -3067, -3067, -3067, -488,
+ -488, -3067, -3067, -3067, -488, -488, -488, 2463,
+ -488, -488, -488, -301, 2465, -488, 2466, 2467,
+ -3600, -493, -3599, -488, -3598, -488, -3597, -488,
+ -488, -500, -488, -488, -488, -488, -488, 2470,
+ 2471, 2472, -488, -488, -254, -488, -488, -488,
+ -488, -488, -104, -488, -488, -488, -102, -101,
+ -100, -99, -98, -97, -96, -95, -94, -93,
+ -92, -488, -488, -488, -488, -488, -488, -488,
+ -488, -488, -2194, -2194, -2194, -2194, -2194, -2194,
+ -2194, -2194, -2194, -2194, 5211, 3269, 5213, 3269,
+ 6895, -88, -88, 5078, 5079, 5080, 1773, -92,
+ -92, 1773, 1773, 1773, 1773, 1773, 1773, 5072,
+ 5073, 2865, 5075, 1776, 5077, 5078, 1778, 1778,
+ 6942, 6943, 1778, 1778, 1778, 5086, 6952, 6953,
+ 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096,
+ 4007, 5098, 2333, 2334, 2335, 2336, 2337, -3066,
+ -3066, -3066, 2341, -3066, -3066, 2344, 2345, 2346,
+ 5114, 317, 2349, 848, 849, 850, 2353, 852,
+ 853, 854, 855, 856, 857, 858, 859, 860,
+ 861, 692, 692, 692, 692, 692, 692, 692,
+ 692, 692, 692, 692, 692, 692, 692, 692,
+ 692, 692, 692, 692, 692, 692, 692, 692,
+ 692, 692, 692, 692, 692, 692, 692, 692,
+ 692, 692, 692, 692, 692, 692, 692, 692,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 3093, 3094, 3095, 3096, 3097, 3098, 3099,
+ 3100, 3101, 3102, 901, 3104, 3105, 3106, 3048,
+ 3108, 3109, 3075, 3111, 3112, 3113, -435, 3115,
+ 3116, 3117, 3118, 3119, -274, 3121, 3122, -276,
+ 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131,
+ 1120, 3133, 3134, 3135, 3136, 3050, 1116, 3139,
+ -4350, 3141, 3142, 3143, 3144, 3145, 3146, 3147,
+ 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155,
+ 3156, 902, 3158, 903, 904, 905, 3162, 3163,
+ 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171,
+ 3172, 3173, 3174, 3175, 3176, 3177, 32767, 3178,
+ 3179, 3180, 3181, 3182, 3183, 4943, 3185, 3186,
+ 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194,
+ 3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202,
+ 3203, 3204, 3205, 3206, 3207, 3208, 3209, 3210,
+ 3211, 3212, 3213, 3214, 3215, 3216, 3217, 3218,
+ 3219, 3220, 3221, 3222, 3223, -1543, 3225, 3226,
+ -1545, 3228, 3229, 3230, 3231, 3232, 3233, 3234,
+ 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242,
+ 3243, 3244, 3245, 3246, 3247, 3248, -1251, -2728,
+ 3250, 32767, 32767, 3251, 906, 907, 3252, 3253,
+ 32767, 32767, 910, -1579, -1579, -1579, 32767, 3258,
+ -1581, 3260, 3261, 3262, 3263, 3264, 3265, 3266,
+ 3267, 3268, 3269, 32767, 3270, 32767, 3271, 3272,
+ 3273, 3274, 3275, 3276, 3277, 32767, 3278, 3279,
+ 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287,
+ 3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295,
+ 3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303,
+ 3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311,
+ 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319,
+ 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327,
+ 3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335,
+ 3336, 32767, 3337, 3338, 3339, 3340, 3341, 3342,
+ 0, 3343, 3344, 3345, 3346, 32767, 32767, 3347,
+ 3348, 3349, 3350, 3351, 3352, 3353, 3354, 32767,
+ 3355, 3356, 3357, 3358, 3359, 3360, 3361, 32767,
+ 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369,
+ 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377,
+ 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385,
+ 3386, 3387, 3388, 3389, 0, 3390, 3391, 3392,
+ 915, 916, 917, 918, 919, 920, 921, 922,
+ 923, 924, 925, 926, 927, 928, 929, 930,
+ 931, 932, 933, 934, 935, 936, 937, 938,
+ 939, 940, 941, 942, 943, 944, 945, 946,
+ 947, 948, 949, 950, 951, 952, 953, 954,
+ 955, 956, 957, 958, 959, 960, 961, 962,
+ 963, 964, 965, 966, 967, 968, 969, 970,
+ 971, 972, 973, 974, 975, 976, 3449, 3450,
+ 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458,
+ 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466,
+ 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474,
+ 3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482,
+ 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490,
+ 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498,
+ 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506,
+ 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514,
+ 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522,
+ 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530,
+ 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538,
+ 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546,
+ 3547, 3548, 3549, 3550, 3551, 3552, 3553, 3554,
+ 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562,
+ 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570,
+ 3571, 3572, 3573, 3574, 3575, 3576, 3577, 6056,
+ 6057, 6058, 32767, 3581, 3582, 3583, 3584, 3585,
+ 4157, 4158, 4159, 3589, 4162, -4510, -1558, -1557,
+ -1556, -1742, -4507, -1553, -4506, -4506, 1562, -1544,
+ 1563, -1547, 1564, -1545, 1565, -1543, -1542, -1529,
+ -1540, -1539, -1538, -1537, -1536, -4493, -4493, -4493,
+ -1532, -1531, -1764, -1529, 3622, -1528, -1527, -1526,
+ -1909, -1524, -1523, -1522, -1907, -1907, -1907, -1907,
+ -1907, -1907, -1907, -1907, -1907, -1907, -1907, -1510,
+ -1509, 1071, 1072, 1073, 1074, 1075, 1076, 1077,
+ 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085,
+ 1086, 1087, 1088, 1089, 1090, 3663, 3664, 3665,
+ 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673,
+ 3674, 1095, 1096, 1097, 1098, 1099, 1100, 1101,
+ 3682, 1103, 3684, 1105, 3686, 3687, 3688, 1109,
+ 1110, 1111, 3692, 1113, 1114, 1115, 1116, 1117,
+ 1118, 1119, 3700, 1121, 3702, 3703, 3704, 1125,
+ 1126, 1127, -1809, -1809, -1809, -1809, -1809, -1809,
+ 3720, 3721, 3722, 3717, 3718, 3719, 3720, 1140,
+ 1141, 1142, 1143, -1802, 1145, 1146, 1147, 1148,
+ 3730, -1797, 3732, 1152, 3734, 3735, 1155, 1156,
+ 3738, 3739, 3740, 3741, 3742, 3743, -1785, -1785,
+ -1785, -1779, -1324, 1168, 1169, 1170, 1171, 1172,
+ 3752, 3753, 1175, 1176, 1177, 992, 3758, 3759,
+ 3760, 3761, 1183, 1184, 1185, 1186, -2300, 1188,
+ -2298, 1190, 1191, 1192, 3772, 3773, 3774, 1196,
+ 1197, 3777, 3778, 3779, 1201, 1202, 1203, -1747,
+ 1205, 1206, 1207, 1021, -1744, 1210, -1743, -1743,
+ 4325, 1219, 4326, 1216, 4327, 1218, 4328, 1220,
+ 1221, 1234, 1223, 1224, 1225, 1226, 1227, -1730,
+ -1730, -1730, 1231, 1232, 999, 1234, 1235, 1236,
+ 1237, 1238, 855, 1240, 1241, 1242, 857, 857,
+ 857, 857, 857, 857, 857, 857, 857, 857,
+ 857, 1254, 1255, 1256, 1257, 1258, 1259, 1260,
+ 1261, 1262, 2969, 2970, 2971, 2972, 2973, 2974,
+ 2975, 2976, 2977, 2978, -4426, -2483, -4426, -2481,
+ -6106, 878, 879, -4286, -4286, -4286, -978, 888,
+ 889, -975, -974, -973, -972, -971, -970, -4268,
+ -4268, -2059, -4268, -968, -4268, -4268, -967, -966,
+ -6129, -6129, -963, -962, -961, -4268, -6133, -6133,
+ -4268, -4268, -4268, -4268, -4268, -4268, -4268, -4268,
+ -3178, -4268, -1502, -1502, -1502, -1502, -1502, 3902,
+ 3903, 3904, -1502, 3906, 3907, -1502, -1502, -1502,
+ -4269, 529, -1502, 0, 0, 0, -1502, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 170, 171, 172, 173, 174, 175, 176,
+ 177, 178, 179, 180, 181, 182, 183, 184,
+ 185, 186, 187, 188, 189, 190, 191, 192,
+ 193, 194, 195, 196, 197, 198, 199, 200,
+ 201, 202, 203, 204, 205, 206, 207, 208,
+ 209, 210, 211, 212, 213, 214, 215, 216,
+ 217, 218, 219, -3194, 221, 222, 223, 224,
+ -1657, 226, 227, -1657, 229, 230, -1655, 555,
+ -1655, 234, 235, 236, 732, 238, 239, 240,
+ 241, 242, 243, -1655, 245, 246, 247, 248,
+ -1655, 250, -1655, 252, -1655, -1655, -1655, -1655,
+ -1655, -1655, 259, -1655, -1655, -1655, -1655, 264,
+ -1655, 266, -1655, 268, -1655, -3620, 271, 272,
+ -1655, 274, 275, -1655, 277, -1655, -1655, 280,
+ -1655, 282, 5746, 5747, 5748, 5749, -1655, 288,
+ -1655, 290, -3335, 3649, 3650, -1515, -1515, -1515,
+ 1793, 3659, 3660, 1796, 1797, 1798, 1799, 1800,
+ 1801, -1497, -1497, 712, -1497, 1803, -1497, -1497,
+ 1804, 1805, -3358, -3358, 1808, 1809, 1810, -1497,
+ -3362, -3362, -1497, -1497, -1497, -1497, -1497, -1497,
+ -1497, -1497, -407, -1497, -1497, -1497, -1497, -1497,
+ -1497, 3667, 3668, -1497, -1497, -1497, 1811, 3677,
+ 3678, 32767, 1814, 32767, 1815, 32767, 32767, 1816,
+ 1817, 32767, 32767, 32767, 1818, 1819, 1820, 1821,
+ -3342, -3342, 1824, 1825, 1826, 1827, 1828, 1829,
+ 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837,
+ 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845,
+ 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853,
+ 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861,
+ 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869,
+ 1870, 1871, 1872, 1873, 1874, 1875, 1876, -1537,
+ 1878, 1879, 1880, 1881, 0, 1883, 1884, 0,
+ 529, 0, 0, 2210, 0, 1889, 1890, 1891,
+ 2387, 1893, 1894, 1895, 1896, 1897, 1898, 0,
+ 1900, 1901, 1902, 1903, 0, 1905, 0, 1907,
+ 0, 0, 0, 0, 0, 0, 1914, 0,
+ 0, 0, 0, 1919, 0, 1921, 0, 1923,
+ 0, -1965, 1926, 1927, 0, 1929, 1930, 0,
+ 1932, 0, 0, 1935, 0, 1937, 7401, 7402,
+ 7403, 7404, 0, 1943, 0, 1945, 1946, 0,
+ 1948, 0, 0, 1951, 1952, 1953, 1954, 0,
+ 1956, 1957, 1958, 1959, 1960, 1961, 1962, 0,
+ 1964, 1965, 1966, 1967, 0, 1969, 1970, 1971,
+ 1972, 0, 1974, 0, 1976, 1977, 1978, 1979,
+ 1980, 1981, 1982, 1983, 1984, 1985, 0, 1987,
+ 1988, 1989, 1990, 1991, 566, 566, 566, 5141,
+ 5142, 566, 566, 566, 566, 566, 566, 566,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 8673, 5722, 5722, 5722, 0, 8676,
+ 5723, 8677, 8678, 2611, 5718, 2612, 5723, 2613,
+ 5723, 2614, 5723, 5723, 5711, 5723, 5723, 5723,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 895, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 151, 2776, 4254, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1821, 0,
+ 0, 0, 596, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -2856, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, -2901, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, -1025, 32767, 32767, 32767,
+ 32767, -2910, 32767, 32767, 32767, 32767, 157, 32767,
+ 32767, 32767, 32767, 158, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 2359, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 160, 32767, 161, 162, 163, 164,
+ 165, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 898, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 1428, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 1254, 32767, 32767, 32767,
+ 32767, 1250, 32767, 32767, 32767, 32767, 1246, 32767,
+ 32767, 32767, 32767, 1243, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1231, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 1842, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 3177, 1235, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, -4323,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 174, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 1830, -112, 1832, -112, 3514, -3469,
+ -3469, 1697, 1698, 1699, -1608, -3473, -3473, -1608,
+ -1608, -1608, -1608, -1608, -1608, 1691, 1692, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, -1623, -1623, -1623, 3541, 3542, -1623, -1623,
+ -1623, -1623, -1623, -1623, -1623, -1623, -1623, -1623,
+ -1623, -1623, -1623, -1623, -1623, -1623, -1623, -1623,
+ -1623, -1623, -1623, -1623, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -766, 2253, 2254, 2255, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1531, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 0, 32767, 0, 0, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -173, -173, -173, -173, -173,
+ -173, -173, -173, -173, -173, -173, -173, 3241,
+ -173, -173, -173, -173, 1709, -173, -173, 1712,
+ -173, -173, 1713, -496, 1715, -173, -173, -173,
+ -668, -173, -173, -173, -173, -173, -173, 1726,
+ -173, -173, -173, -173, 1731, -173, 1733, -173,
+ 1735, 1736, 1737, 1738, 1739, 1740, -173, 1742,
+ 1743, 1744, 1745, -173, 1747, -173, 1749, -173,
+ 1751, 3717, -173, -173, 1755, -173, -173, 1758,
+ -173, 1760, 1761, -173, 1763, -173, -5636, -5636,
+ -5636, -5636, 1769, -173, 1771, -173, 3453, -3530,
+ -3530, 1636, 1637, 1638, -1669, -3534, -3534, -1669,
+ -1669, -1669, -1669, -1669, -1669, 1630, 1631, -577,
+ 1633, -1666, 1635, 1636, -1664, -1664, 3500, 3501,
+ -1664, -1664, -1664, 1644, 3510, 3511, 1647, 1648,
+ 1649, 1650, 1651, 1652, 1653, 1654, 565, 1656,
+ 1657, 1658, 1659, 1660, 1661, -3502, -3502, 1664,
+ 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672,
+ 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680,
+ 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688,
+ 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696,
+ 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704,
+ 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712,
+ 1713, 1714, 1715, 1716, -1697, 1718, 1719, 1720,
+ 1721, -160, 1723, 1724, -160, 1726, 1727, -158,
+ 2052, -158, 1731, 1732, 1733, 2229, 1735, 1736,
+ 1737, 1738, 1739, 1740, -158, 1742, 1743, 1744,
+ 1745, -158, 1747, -158, 1749, -158, -158, -158,
+ -158, -158, -158, 1756, -158, -158, -158, -158,
+ 1761, -158, 1763, -158, 1765, -158, -2123, 1768,
+ 1769, -158, 1771, 1772, -158, 1774, -158, -158,
+ 1777, -158, 1779, 7243, 7244, 7245, 7246, -158,
+ 1785, -158, 1787, -1838, 5146, 5147, -18, -18,
+ -18, 3290, 5156, 5157, 3293, 3294, 3295, 3296,
+ 3297, 3298, 0, 0, 2209, 0, 3300, 0,
+ 0, 3301, 3302, -1861, -1861, 3305, 3306, 3307,
+ 0, -1865, -1865, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1090, 0, 0, 0, 0,
+ 0, 0, 5164, 5165, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3414, 0, 0, 0, 0, 1882, 0,
+ 0, 1885, 0, 0, 1886, -323, 1888, 0,
+ 0, 0, -495, 0, 0, 0, 0, 0,
+ 0, 1899, 0, 0, 0, 0, 1904, 0,
+ 1906, 0, 1908, 1909, 1910, 1911, 1912, 1913,
+ 0, 1915, 1916, 1917, 1918, 0, 1920, 0,
+ 1922, 0, 1924, 3890, 0, 0, 1928, 0,
+ 0, 1931, 0, 1933, 1934, 0, 1936, 0,
+ -5463, -5463, -5463, -5463, 1942, 0, 1944, 0,
+ 0, 1947, 0, 1949, 1950, 0, 0, 0,
+ 0, 1955, 0, 0, 0, 0, 0, 0,
+ 0, 1963, 0, 0, 0, 0, 1968, 0,
+ 0, 0, 0, 1973, 0, 1975, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1986, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 527, 527, 527, 527, 0,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 1998, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1999, 2000, 2001, 2002, 2003, 32767, 32767, 32767,
+ 32767, 32767, 2004, 32767, 2005, 2006, 2007, 2008,
+ 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016,
+ 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024,
+ 2025, 2026, 1200, 1200, 32767, 4498, 4499, 2291,
+ 2032, 2033, 32767, 2034, 32767, 2035, 2036, 32767,
+ 2037, 2038, 32767, 2039, 2040, 2041, 2042, 2043,
+ 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051,
+ 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059,
+ 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067,
+ 2068, -1506, -1506, -1506, -1506, -1506, -1506, -1506,
+ 2076, -2490, 2078, 2079, 2080, 2081, 2082, 2083,
+ 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091,
+ 2092, 2093, 2094, 2095, -105, -2314, 2098, 2099,
+ 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107,
+ 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115,
+ 2116, 2117, 2118, 2119, 2120, 5459, 2122, 2123,
+ 2124, 2125, 2126, 2127, 2128, 5466, 2130, 5467,
+ 2132, 2133, 2134, 2135, 5471, 2137, 2138, 5473,
+ 5473, 5473, 5473, 2143, 2144, 5475, 2146, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154,
+ 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162,
+ 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170,
+ 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178,
+ 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186,
+ 2187, 2188, 2189, 2190, 2191, 32767, -726, 2293,
+ -725, -725, -725, 1357, 1358, 1359, -722, 2201,
+ 2202, 2203, 2204, 2205, 0, 2207, -715, 2209,
+ -714, -714, -714, 2213, 2214, 2215, 4806, 2217,
+ 2218, 2219, 2220, 2221, 2222, 2223, -710, 2225,
+ -248, -704, -704, 2229, 2230, 2231, 2232, 2233,
+ 2220, 1430, 2236, 2237, -695, 2239, -694, 2241,
+ -693, -693, 2244, 2245, 2246, 2231, 2231, 2249,
+ 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2239,
+ 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265,
+ 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273,
+ 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281,
+ 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289,
+ 2290, 2291, 2292, 2293, 3084, 2295, 2296, 2297,
+ 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305,
+ 2306, 2307, 3983, 2309, 2310, 2292, 2312, 3992,
+ 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321,
+ 2322, 2323, 2324, 2325, 2326, 2327, 2328, 4023,
+ 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337,
+ 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345,
+ 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353,
+ 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361,
+ 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369,
+ 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377,
+ 2378, 2379, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2389, 2390, 2391, 2392, 2393,
+ 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401,
+ 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409,
+ 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417,
+ 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425,
+ 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433,
+ 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441,
+ 2442, 2443, 2444, 2445, 2446, 2447, 32767, 2448,
+ 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456,
+ 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464,
+ 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472,
+ 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480,
+ 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488,
+ 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496,
+ 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504,
+ 2505, 2506, 2507, 2508, 2509, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 2510,
+ 2511, 2512, 2513, 3266, 3266, 3266, 3266, 2518,
+ 3267, 3267, 3267, 2522, 3268, 3268, 3268, 3268,
+ 3268, 3268, 3268, 6682, 3268, 3268, 3268, 2534,
+ 5151, 3269, 2537, 2538, 3271, 3271, 5157, 2948,
+ 5159, 2544, 2545, 3273, 2778, 3273, 2549, 3274,
+ 2551, 3275, 2553, 5175, 2555, 3277, 3277, 3277,
+ 5181, 2560, 5184, 3278, 5186, 2564, 5189, 5190,
+ 5191, 5192, 3279, 5194, 5195, 2572, 5198, 32767,
+ 32767, 3278, 5200, 3278, 2577, 2578, 2579, 2580,
+ 5210, 3282, 3282, 5213, 3282, 2586, 2587, 2588,
+ 2589, 2590, 2591, -2175, -2175, -2175, 5230, 3288,
+ 5232, 3288, 6914, -69, -69, 5097, 5098, 5099,
+ 1792, -73, -73, 1792, 1792, 1792, 1792, 1792,
+ 1792, 5091, 5092, 2884, 5094, 1795, 5096, 5097,
+ 1797, 1797, 6961, 6962, 1797, 1797, 1797, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 2578, 2578, 2578, 2578, 2578,
+ 2578, 872, 872, 872, 872, 872, 872, 872,
+ 872, 872, 872, 8277, 6335, 8279, 6335, 9961,
+ 2978, 2978, 8144, 8145, 8146, 4839, 2974, 2974,
+ 4839, 4839, 4839, 4839, 4839, 4839, 8138, 8139,
+ 5931, 8141, 4842, 8143, 8144, 4844, 4844, 10008,
+ 10009, 4844, 4844, 4844, 8152, 10018, 10019, 8155,
+ 8156, 8157, 8158, 8159, 8160, 8161, 8162, 7073,
+ 8164, 5399, 5400, 5401, 5402, 5403, 0, 0,
+ 0, 5407, 0, 0, 5410, 5411, 5412, 8180,
+ 3383, 5415, 3914, 3915, 3916, 5419, 3918, 3919,
+ 3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 7172, 3758, 3758, 3758, 3758, 5640,
+ 3758, 3758, 5643, 3758, 3758, 5644, 3435, 5646,
+ 3758, 3758, 3758, 3263, 3758, 3758, 3758, 3758,
+ 3758, 3758, 5657, 3758, 3758, 3758, 3758, 5662,
+ 3758, 5664, 3758, 5666, 5667, 5668, 5669, 5670,
+ 5671, 3758, 5673, 5674, 5675, 5676, 3758, 5678,
+ 3758, 5680, 3758, 5682, 7648, 3758, 3758, 5686,
+ 3758, 3758, 5689, 3758, 5691, 5692, 3758, -1707,
+ -1707, -1707, -1707, -1707, -1707, 5698, 3756, 5700,
+ 3756, 7382, 399, 399, 5565, 5566, 5567, 2260,
+ 395, 395, 2260, 2260, 2260, 2260, 2260, 2260,
+ 5559, 5560, 3352, 5562, 2263, 5564, 5565, 2265,
+ 2265, 7429, 7430, 2265, 2265, 2265, 5573, 7439,
+ 7440, 5576, 5577, 5578, 5579, 5580, 5581, 5582,
+ 5583, 4494, 5585, 2820, 2821, 2822, 2823, 2824,
+ -2579, -2579, -2579, 2828, -2579, -2579, 2831, 2832,
+ 2833, 5601, 804, 2836, 1335, 1336, 1337, 2840,
+ 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346,
+ 1347, 1348, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 4593, 1179, 1179, 1179,
+ 1179, 3061, 1179, 1179, 3064, 1179, 1179, 3065,
+ 856, 3067, 1179, 1179, 1179, 684, 1179, 1179,
+ 1179, 1179, 1179, 1179, 3078, 1179, 1179, 1179,
+ 1179, 3083, 1179, 3085, 1179, 3087, 3088, 3089,
+ 3090, 3091, 3092, 1179, 3094, 3095, 3096, 3097,
+ 1179, 3099, 1179, 3101, 1179, 3103, 5069, 1179,
+ 1179, 3107, 1179, 1179, 3110, 1179, 3112, 3113,
+ 1179, 3115, 1179, -4284, -4284, -4284, -4284, 3121,
+ 1179, 3123, 1179, 4805, -2178, -2178, 2988, 2989,
+ 2990, -317, -2182, -2182, -317, -317, -317, -317,
+ -317, -317, 2982, 2983, 775, 2985, -314, 2987,
+ 2988, -312, -312, 4852, 4853, -312, -312, -312,
+ 2996, 4862, 4863, 2999, 3000, 3001, 3002, 3003,
+ 3004, 3005, 3006, 1917, 3008, 3009, 3010, 3011,
+ 3012, 3013, -2150, -2150, 3016, 3017, 3018, 3019,
+ 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027,
+ 3028, 3029, 3030, 3031, 3032, 3033, 3034, 3035,
+ 32767, 32767, 32767, 3036, 3037, 3038, 3039, 3040,
+ 3041, 32767, 32767, 3042, 3043, 3044, 3045, 3046,
+ 3047, 32767, 32767, 3048, 3049, 3050, 3051, 3052,
+ 3053, 32767, 32767, 3054, 3055, 3056, 32767, 32767,
+ 32767, -357, 3058, 3059, 3060, 3061, 1180, 3063,
+ 0, 1179, 3065, 3066, 1181, 3391, 1181, 3070,
+ 0, 0, 0, 0, 32767, 0, 0, 32767,
+ 0, 32767, 0, 0, -4973, 32767, 32767, -7368,
+ -2202, -2201, -2200, -5507, -7372, -7372, -5507, -5507,
+ -5507, 32767, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 32767, 0, 0, 32767, 0,
+ -203, -2234, -732, -732, -732, -2234, -732, -732,
+ -2763, -1261, -1261, -1261, -2763, -1261, -1261, -1261,
+ -1261, -1261, -1261, -1261, -1261, -1261, -1261, -1091,
+ -1090, -1089, -1088, -1087, 32767, 32767, -1086, -1085,
+ -1084, -1083, -1082, -1081, -1080, -1079, -1078, -1077,
+ -1076, -1075, 32767, -1074, -1073, -1072, -1071, -1070,
+ -1069, -1068, -1067, -1066, -1065, -1064, -1063, -1062,
+ -1061, -1060, -1059, -1058, -1057, -1056, 32767, -1055,
+ -1054, -1053, -1052, 0, 32767, 32767, 32767, -1051,
+ -1050, -4463, 32767, -1048, 32767, -1047, -2928, -1045,
+ -1044, -2928, -1042, -1041, -2926, -716, -2926, -1037,
+ -1036, -1035, -539, -1033, -1032, -1031, -1030, -1029,
+ -1028, -2926, -1026, -1025, -1024, -1023, -2926, -1021,
+ -2926, -1019, -2926, -2926, -2926, -2926, -2926, -2926,
+ -1012, -2926, -2926, -2926, -2926, -1007, -2926, -1005,
+ -2926, -1003, -2926, -4891, -1000, -999, -2926, -997,
+ -996, -2926, -994, -2926, -2926, -991, 4475, 4476,
+ 4477, 4478, 4479, 4480, -2924, -981, -2924, -979,
+ -4604, 2380, 2381, -2784, -2784, -2784, 524, 2390,
+ 2391, 527, 528, 529, 530, 531, 532, -2766,
+ -2766, -557, -2766, 534, -2766, -2766, 535, 536,
+ -4627, -4627, 539, 540, 541, -2766, -4631, -4631,
+ -2766, -2766, -2766, -2766, -2766, -2766, -2766, -2766,
+ -1676, -2766, 0, 0, 0, 0, 0, 5404,
+ 5405, 5406, 0, 5408, 5409, 0, 0, 0,
+ -2767, 2031, 0, 1502, 1502, 1502, 0, 1502,
+ 1502, 1502, 1502, 1502, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 224, 225, 226, 32767, 227, 228, 229,
+ 230, 231, 232, 233, 234, 235, 236, 67,
+ 32767, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 32767, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, -271, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1940, 18, 1942, 3908, 18, 18, 1946, 18,
+ 18, 1949, 18, 1951, 1952, 18, 1954, 18,
+ -5445, -5445, -5445, -5445, 1960, 18, 1962, 18,
+ 3644, -3339, -3339, 1827, 1828, 1829, -1478, -3343,
+ -3343, -1478, -1478, -1478, -1478, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, 0,
+ 0, 32767, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1340, 1341,
+ 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349,
+ -2064, 1351, 1352, 1353, 1354, 32767, 1355, 1356,
+ 32767, 0, 32767, 32767, 1679, 32767, 1357, 1358,
+ 1359, 1855, 1361, 1362, 1363, 1364, 1365, 1366,
+ 32767, 1367, 1368, 1369, 1370, 32767, 1371, 32767,
+ 1372, 32767, 32767, 32767, 32767, 32767, 32767, 1373,
+ 32767, 32767, 32767, 32767, 1374, 32767, 1375, 32767,
+ 1376, 32767, -2513, 1378, 1379, 32767, 1380, 1381,
+ 32767, 1382, 32767, 32767, 1383, 32767, 1384, 32767,
+ 6848, 32767, 6849, 32767, 1387, 32767, 1388, 1389,
+ 32767, 1390, 32767, 32767, 1391, 1392, 1393, 1394,
+ 32767, 1395, 1396, 1397, 1398, 1399, 1400, 1401,
+ 32767, 1402, 1403, 1404, 1405, 32767, 1406, 1407,
+ 1408, 1409, 32767, 1410, 32767, 1411, 1412, 1413,
+ 1414, 1415, 1416, 1417, 1418, 1419, 1420, 32767,
+ 1421, 1422, 1423, 1424, 1425, 0, 0, 0,
+ 4575, 4576, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -571, -571,
+ -571, 0, -572, 8101, 5150, 5150, 5150, 5337,
+ 8103, 5150, 8104, 8105, 2038, 5145, 2039, 5150,
+ 2040, 5150, 2041, 5150, 5150, 5138, 5150, 5150,
+ 5150, 5150, 5150, 8108, 8109, 8110, 5150, 5150,
+ 5384, 5150, 0, 5151, 5151, 5151, 5535, 5151,
+ 5151, 5151, 5537, 5538, 5539, 5540, 5541, 5542,
+ 5543, 5544, 5545, 5546, 5547, 5151, 5151, 2572,
+ 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572,
+ 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572,
+ 2572, 2572, 2572, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 0, 2580,
+ 0, 2580, 0, 0, 0, 2580, 2580, 2580,
+ 0, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 0, 2580, 0, 0, 0, 2580, 2580, 2580,
+ 5517, 5518, 5519, 5520, 5521, 5522, -6, -6,
+ -6, 0, 0, 0, 0, 2581, 2581, 2581,
+ 2581, 5527, 2581, 2581, 2581, 2581, 0, 5528,
+ 0, 2581, 0, 0, 2581, 2581, 0, 0,
+ 0, 0, 0, 0, 5529, 5530, 5531, 32767,
+ 32767, 2579, 2579, 2579, 2579, 2579, 0, 0,
+ 2579, 2579, 2579, 2765, 0, 0, 0, 0,
+ 2579, 2579, 2579, 2579, 6066, 2579, 6066, 2579,
+ 2579, 2579, 0, 0, 0, 2579, 2579, 0,
+ 0, 0, 2579, 2579, 2579, 5530, 2579, 2579,
+ 2579, 2766, 5532, 2579, 5533, 5534, -533, 2574,
+ -532, 2579, -531, 2579, -530, 2579, 2579, 2567,
+ 2579, 2579, 2579, 2579, 2579, 5537, 5538, 5539,
+ 2579, 2579, 2813, 2579, 2579, 2579, 2579, 2579,
+ 2963, 2579, 2579, 2579, 2965, 2966, 2967, 2968,
+ 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2579,
+ 2579, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 331, 32767, 332, -2580, -2580, -2580,
+ -2580, 0, 0, 0, 0, 0, 0, 0,
+ -2580, 0, -2580, 0, -2580, -2580, -2580, 0,
+ 0, 0, -2580, 0, 0, 0, 0, 0,
+ 0, 0, -2580, 0, -2580, -2580, -2580, 0,
+ 0, 0, 2937, 2938, 2939, 2940, 2941, 2942,
+ -2586, -2586, -2586, -2580, -2125, -2581, -2581, 0,
+ 0, 0, 0, 2946, 0, 0, 0, 0,
+ -2581, 2947, -2581, 0, -2581, -2581, 0, 0,
+ -2581, -2581, -2581, -2581, -2581, -2581, 2948, 2949,
+ 2950, 2945, 2491, 0, 0, 0, 0, 0,
+ -2579, -2579, 0, 0, 0, 186, -2579, -2579,
+ -2579, -2579, 0, 0, 0, 0, 3487, 0,
+ 3487, 0, 0, 0, -2579, -2579, -2579, 0,
+ 0, -2579, -2579, -2579, 0, 0, 0, 2951,
+ 0, 0, 0, 187, 2953, 0, 2954, 2955,
+ -3112, -5, -3111, 0, -3110, 0, -3109, 0,
+ 0, -12, 0, 0, 0, 0, 0, 2958,
+ 2959, 2960, 0, 0, 234, 0, 0, 0,
+ 0, 0, 384, 0, 0, 0, 386, 387,
+ 388, 389, 390, 391, 392, 393, 394, 395,
+ 396, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -1706, -1706, -1706, 0, 0, 0,
+ 0, 385, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 397,
+ 398, 399, 400, 401, 402, 403, 404, 405,
+ 2112, 2113, 2114, 409, 410, 411, 412, 32767,
+ 413, 414, 415, 416, 417, 418, 419, 420,
+ 421, 422, 423, 424, 425, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ -1688, 32767, 32767, 32767, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, 0,
+ 0, -752, -751, -750, -749, 0, -748, -747,
+ -746, 0, -745, -744, -743, -742, -741, -740,
+ -739, -4152, -737, -736, -735, 0, -2616, -733,
+ 0, 0, -732, -731, -2616, -406, -2616, 0,
+ 0, -727, -231, -725, 0, -724, 0, -723,
+ 0, -2621, 0, -721, -720, -719, -2622, 0,
+ -2623, -716, -2623, 0, -2624, -2624, -2624, -2624,
+ -710, -2624, -2624, 0, -2625, -706, -2625, -704,
+ -2625, -702, 0, 0, 0, 0, -2629, -700,
+ -699, -2629, -697, 0, 0, 0, 0, 0,
+ 0, 4767, 4768, 4769, -2635, -692, -2635, -690,
+ -4315, 2669, 2670, -2495, -2495, -2495, 813, 2679,
+ 2680, 816, 817, 818, 819, 820, 821, -2477,
+ -2477, -268, -2477, 823, -2477, -2477, 824, 825,
+ -4338, -4338, 828, 829, 830, -2477, -4342, -4342,
+ -2477, -2477, -2477, -2477, -2477, -2477, -2477, -2477,
+ -1387, 0, 0, 32767, 32767, 0, 0, 0,
+ 0, 0, -2486, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 1756, 1757, 1758,
+ 1759, -5645, -3702, -5645, -3700, -7325, -341, -340,
+ -5505, -5505, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 532, 533,
+ 32767, 534, 535, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -781, 1084, 1084, 1084, 1084,
+ 1084, 1084, 4383, 4384, 2176, 4386, 1087, 4388,
+ 4389, 1089, 1089, 6253, 6254, 1089, 1089, 1089,
+ 4397, 6263, 6264, 4400, 4401, 4402, 4403, 4404,
+ 4405, 4406, 4407, 3318, 4409, 4410, 4411, 4412,
+ 4413, 4414, -749, -749, 4417, 4418, 4419, 4420,
+ 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428,
+ 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436,
+ 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444,
+ 4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452,
+ 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460,
+ 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468,
+ 4469, 1056, 4471, 4472, 4473, 4474, 2593, 4476,
+ 4477, 2593, 4479, 4480, 2595, 4805, 2595, 4484,
+ 4485, 4486, 4982, 4488, 4489, 4490, 4491, 4492,
+ 4493, 2595, 4495, 4496, 4497, 4498, 2595, 4500,
+ 2595, 4502, 2595, 2595, 2595, 2595, 2595, 2595,
+ 4509, 2595, 2595, 2595, 2595, 4514, 2595, 4516,
+ 2595, 4518, 2595, 630, 4521, 4522, 2595, 4524,
+ 4525, 2595, 4527, 2595, 2595, 4530, 2595, 4532,
+ 9996, 9997, 9998, 9999, 2595, 4538, 2595, 4540,
+ 4541, 2595, 4543, 2595, 2595, 4546, 4547, 4548,
+ 4549, 2595, 4551, 4552, 4553, 4554, 4555, 4556,
+ 4557, 2595, 4559, 4560, 4561, 4562, 2595, 4564,
+ 4565, 4566, 4567, 2595, 4569, 2595, 4571, 4572,
+ 4573, 4574, 4575, 4576, 4577, 4578, 4579, 4580,
+ 2595, 4582, 4583, 4584, 4585, 4586, 4587, 4588,
+ 4589, 4590, 4591, 4592, 4593, 4594, 4595, 4596,
+ 4597, 4598, 4599, 4600, 4601, 4602, 4603, 4604,
+ 4605, 4606, 4607, 4608, 4609, 4610, 4611, 4612,
+ 4613, 4614, 4615, 4089, 4090, 4091, 4092, 4620,
+ 4093, 4094, 4095, 4096, 4097, 4098, 4099, 4100,
+ 4101, 4102, 4103, 4104, 2765, 2765, 2765, 2765,
+ 2765, 2765, 2765, 2765, 2765, 2765, 6179, 2765,
+ 2765, 2765, 2765, 4647, 2765, 2765, 4650, 4122,
+ 4652, 4653, 2444, 4655, 2767, 2767, 2767, 2272,
+ 2767, 2767, 2767, 2767, 2767, 2767, 4666, 2767,
+ 2767, 2767, 2767, 4671, 2767, 4673, 2767, 4675,
+ 4676, 4677, 4678, 4679, 4680, 2767, 4682, 4683,
+ 4684, 4685, 2767, 4687, 2767, 4689, 2767, 4691,
+ 6657, 2767, 2767, 4695, 2767, 2767, 4698, 2767,
+ 4700, 4701, 2767, 4703, 2767, -2696, -2696, -2696,
+ -2696, 4709, 2767, 4711, 2767, 2767, 4714, 2767,
+ 4716, 4717, 2767, 2767, 2767, 2767, 4722, 2767,
+ 2767, 2767, 2767, 2767, 2767, 2767, 4730, 2767,
+ 2767, 2767, 2767, 4735, 2767, 2767, 2767, 2767,
+ 4740, 2767, 4742, 2767, 2767, 2767, 2767, 2767,
+ 2767, 2767, 2767, 2767, 2767, 4753, 2767, 2767,
+ 2767, 2767, 2767, 4193, 4194, 4195, -379, -379,
+ 4198, 4199, 4200, 4201, 4202, 4203, 4204, 4771,
+ 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779,
+ 4780, -3892, -940, -939, -938, 4785, -3890, -936,
+ -3889, -3889, 2179, -927, 2180, -930, 2181, -928,
+ 2182, -926, -925, -912, -923, -922, -921, 4803,
+ 4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811,
+ 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819,
+ 3925, 4821, 4822, 4823, 4824, 4825, 4826, 4827,
+ 4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835,
+ 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843,
+ 4844, 4845, 4846, 4847, 4848, 4849, 4850, 4851,
+ 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859,
+ 4860, 4710, 2086, 609, 4864, 4865, 4866, 4867,
+ 4868, 4869, 4870, 4871, 4872, 3052, 4874, 4875,
+ 4876, 4281, 4878, 4879, 4880, 4881, 4882, 4883,
+ 4884, 4885, 4886, 4887, 634, 4888, 4889, 4890,
+ 4891, 4892, 4893, 4894, 4895, 4896, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 4904, 338, 4906,
+ 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914,
+ 4915, 4916, 4917, 665, 666, 667, 668, 669,
+ 670, 671, 672, 673, 674, 675, 676, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 0, 0, 0, 0, 0, 32767, 0, 0,
+ 0, 0, 32767, 32767, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32767, 0, 0, 0, 2478, 32767, 2477,
+ 2477, 2477, 2477, 2477, 32767, 2476, 32767, 32767,
+ 32767, 2473, 2473, 2473, 2473, 2473, 2473, 2473,
+ 32767, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
+ 2472, 2472, 2472, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -2478, -2478, -2478, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ };
+
+ const unsigned char *k = (const unsigned char *) key;
+ size_t keylen = 4;
+ uint32 a = 0;
+ uint32 b = 1;
+
+ while (keylen--)
+ {
+ unsigned char c = *k++;
+
+ a = a * 257 + c;
+ b = b * 8191 + c;
+ }
+ return h[a % 9837] + h[b % 9837];
+}
+
+/* Hash lookup information for NFKC_QC */
+static const unicode_norm_info UnicodeNormInfo_NFKC_QC = {
+ UnicodeNormProps_NFKC_QC,
+ NFKC_QC_hash_func,
+ 4918
+};
diff --git a/src/common/unicode/generate-unicode_normprops_table.pl b/src/common/unicode/generate-unicode_normprops_table.pl
index e8e5097c09..2da2824830 100644
--- a/src/common/unicode/generate-unicode_normprops_table.pl
+++ b/src/common/unicode/generate-unicode_normprops_table.pl
@@ -9,6 +9,10 @@
use strict;
use warnings;
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
my %data;
print
@@ -18,13 +22,25 @@ print <<EOS;
#include "common/unicode_norm.h"
/*
- * We use a bit field here to save space.
+ * Normalization quick check entry for codepoint. We use a bit field
+ * here to save space.
*/
typedef struct
{
unsigned int codepoint:21;
signed int quickcheck:4; /* really UnicodeNormalizationQC */
-} pg_unicode_normprops;
+} pg_unicode_normprops;
+
+/* Typedef for hash function on quick check table */
+typedef int (*qc_hash_func) (const void *key);
+
+/* Information for quick check lookup with perfect hash function */
+typedef struct
+{
+ const pg_unicode_normprops *normprops;
+ qc_hash_func hash;
+ int num_normprops;
+} unicode_norm_info;
EOS
foreach my $line (<ARGV>)
@@ -66,6 +82,7 @@ foreach my $prop (sort keys %data)
"static const pg_unicode_normprops UnicodeNormProps_${prop}[] = {\n";
my %subdata = %{ $data{$prop} };
+ my @cp_packed;
foreach my $cp (sort { $a <=> $b } keys %subdata)
{
my $qc;
@@ -82,7 +99,27 @@ foreach my $prop (sort keys %data)
die;
}
printf "\t{0x%04X, %s},\n", $cp, $qc;
+
+ # Save the bytes as a string in network order.
+ push @cp_packed, pack('N', $cp);
}
print "};\n";
+
+ # Emit the definition of the perfect hash function.
+ my $funcname = $prop . '_hash_func';
+ my $f = PerfectHash::generate_hash_function(\@cp_packed, $funcname,
+ fixed_key_length => 4);
+ printf "\n/* Perfect hash function for %s */", $prop;
+ print "\nstatic $f\n";
+
+ # Emit the structure that wraps the hash lookup information into
+ # one variable.
+ printf "/* Hash lookup information for %s */", $prop;
+ printf "\nstatic const unicode_norm_info ";
+ printf "UnicodeNormInfo_%s = {\n", $prop;
+ printf "\tUnicodeNormProps_%s,\n", $prop;
+ printf "\t%s,\n", $funcname;
+ printf "\t%d\n", scalar @cp_packed;
+ printf "};\n";
}
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index ab5ce59345..5d951fc2e0 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -465,15 +465,32 @@ get_canonical_class(pg_wchar ch)
return entry->comb_class;
}
-static int
-qc_compare(const void *p1, const void *p2)
+static const pg_unicode_normprops *
+qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
{
- uint32 v1,
- v2;
+ int h;
+ uint32 hashkey;
- v1 = ((const pg_unicode_normprops *) p1)->codepoint;
- v2 = ((const pg_unicode_normprops *) p2)->codepoint;
- return (v1 - v2);
+ /*
+ * Compute the hash function. The hash key is the codepoint with the bytes
+ * in network order.
+ */
+ hashkey = htonl(ch);
+ h = norminfo->hash(&hashkey);
+
+ /* An out-of-range result implies no match */
+ if (h < 0 || h >= norminfo->num_normprops)
+ return NULL;
+
+ /*
+ * Since it's a perfect hash, we need only match to the specific codepoint
+ * it identifies.
+ */
+ if (ch != norminfo->normprops[h].codepoint)
+ return NULL;
+
+ /* Success! */
+ return &norminfo->normprops[h];
}
/*
@@ -482,26 +499,15 @@ qc_compare(const void *p1, const void *p2)
static UnicodeNormalizationQC
qc_is_allowed(UnicodeNormalizationForm form, pg_wchar ch)
{
- pg_unicode_normprops key;
- pg_unicode_normprops *found = NULL;
-
- key.codepoint = ch;
+ const pg_unicode_normprops *found = NULL;
switch (form)
{
case UNICODE_NFC:
- found = bsearch(&key,
- UnicodeNormProps_NFC_QC,
- lengthof(UnicodeNormProps_NFC_QC),
- sizeof(pg_unicode_normprops),
- qc_compare);
+ found = qc_hash_lookup(ch, &UnicodeNormInfo_NFC_QC);
break;
case UNICODE_NFKC:
- found = bsearch(&key,
- UnicodeNormProps_NFKC_QC,
- lengthof(UnicodeNormProps_NFKC_QC),
- sizeof(pg_unicode_normprops),
- qc_compare);
+ found = qc_hash_lookup(ch, &UnicodeNormInfo_NFKC_QC);
break;
default:
Assert(false);
diff --git a/src/tools/pgindent/exclude_file_patterns b/src/tools/pgindent/exclude_file_patterns
index bfe103f195..e629c18be2 100644
--- a/src/tools/pgindent/exclude_file_patterns
+++ b/src/tools/pgindent/exclude_file_patterns
@@ -18,6 +18,10 @@ src/backend/utils/fmgrprotos\.h$
# they match pgindent style, they'd look worse not better, so exclude them.
kwlist_d\.h$
#
+# This uses hash functions generated by PerfectHash.pm, whose format looks
+# worse with pgindent.
+src/include/common/unicode_normprops_table\.h$
+#
# Exclude ecpg test files to avoid breaking the ecpg regression tests
# (but include files at the top level of the ecpg/test/ directory).
src/interfaces/ecpg/test/.*/
On Thu, Oct 8, 2020 at 2:48 AM Michael Paquier <michael@paquier.xyz> wrote:
On Wed, Oct 07, 2020 at 03:18:44PM +0900, Michael Paquier wrote:
I looked at this one again today, and applied it. I looked at what
MSVC compiler was able to do in terms of optimizationswith
shift-and-add for multipliers, and it is by far not as good as gcc or
clang, applying imul for basically all the primes we could use for the
perfect hash generation.
Thanks for picking this up! As I recall, godbolt.org also showed MSVC
unable to do this optimization.
I have tested 0002 and 0003, that had better be merged together at the
end, and I can see performance improvements with MSVC and gcc similar
to what is being reported upthread, with 20~30% gains for simple
data sample using IS NFC/NFKC. That's cool.For these two, I have merged both together and did some adjustments as
per the attached. Not many tweaks, mainly some more comments for the
unicode header files as the number of structures generated gets
higher.
Looks fine overall, but one minor nit: I'm curious why you made a separate
section in the pgindent exclusions. The style in that file seems to be one
comment per category.
--
John Naylor
On Thu, Oct 08, 2020 at 04:52:18AM -0400, John Naylor wrote:
Looks fine overall, but one minor nit: I'm curious why you made a separate
section in the pgindent exclusions. The style in that file seems to be one
comment per category.
Both parts indeed use PerfectHash.pm, but are generated by different
scripts so that looked better as separate items.
--
Michael
On Thu, Oct 8, 2020 at 8:29 AM Michael Paquier <michael@paquier.xyz> wrote:
On Thu, Oct 08, 2020 at 04:52:18AM -0400, John Naylor wrote:
Looks fine overall, but one minor nit: I'm curious why you made a
separate
section in the pgindent exclusions. The style in that file seems to be
one
comment per category.
Both parts indeed use PerfectHash.pm, but are generated by different
scripts so that looked better as separate items.
Okay, thanks.
--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
On Thu, Oct 08, 2020 at 06:22:39PM -0400, John Naylor wrote:
Okay, thanks.
And applied. I did some more micro benchmarking with the quick
checks, and the numbers are cool, close to what you mentioned for the
quick checks of both NFC and NFKC.
Just wondering about something in the same area, did you look at the
decomposition table?
--
Michael
On Sun, 11 Oct 2020 at 19:27, Michael Paquier <michael@paquier.xyz> wrote:
On Thu, Oct 08, 2020 at 06:22:39PM -0400, John Naylor wrote:
Okay, thanks.
And applied.
The following warning recently started to be shown in my
environment(FreeBSD clang 8.0.1). Maybe it is relevant with this
commit:
unicode_norm.c:478:12: warning: implicit declaration of function
'htonl' is invalid in C99 [-Wimplicit-function-declaration]
hashkey = htonl(ch);
^
1 warning generated.
Regards,
--
Masahiko Sawada http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
On Mon, Oct 12, 2020 at 02:43:06PM +0900, Masahiko Sawada wrote:
The following warning recently started to be shown in my
environment(FreeBSD clang 8.0.1). Maybe it is relevant with this
commit:unicode_norm.c:478:12: warning: implicit declaration of function
'htonl' is invalid in C99 [-Wimplicit-function-declaration]
hashkey = htonl(ch);
^
Thanks, it is of course relevant to this commit. None of the
BSD animals complain here. So, while it would be tempting to have an
extra include with arpa/inet.h, I think that it would be better to
just use pg_hton32() in pg_bswap.h, as per the attached. Does that
take care of your problem?
--
Michael
Attachments:
htonl-warning.patchtext/x-diff; charset=us-asciiDownload
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 626645ac87..4bb6a0f587 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -23,6 +23,7 @@
#ifndef FRONTEND
#include "common/unicode_normprops_table.h"
#endif
+#include "port/pg_bswap.h"
#ifndef FRONTEND
#define ALLOC(size) palloc(size)
@@ -475,7 +476,7 @@ qc_hash_lookup(pg_wchar ch, const pg_unicode_norminfo *norminfo)
* Compute the hash function. The hash key is the codepoint with the bytes
* in network order.
*/
- hashkey = htonl(ch);
+ hashkey = pg_hton32(ch);
h = norminfo->hash(&hashkey);
/* An out-of-range result implies no match */
On Mon, 12 Oct 2020 at 15:27, Michael Paquier <michael@paquier.xyz> wrote:
On Mon, Oct 12, 2020 at 02:43:06PM +0900, Masahiko Sawada wrote:
The following warning recently started to be shown in my
environment(FreeBSD clang 8.0.1). Maybe it is relevant with this
commit:unicode_norm.c:478:12: warning: implicit declaration of function
'htonl' is invalid in C99 [-Wimplicit-function-declaration]
hashkey = htonl(ch);
^Thanks, it is of course relevant to this commit. None of the
BSD animals complain here. So, while it would be tempting to have an
extra include with arpa/inet.h, I think that it would be better to
just use pg_hton32() in pg_bswap.h, as per the attached. Does that
take care of your problem?
Thank you for the patch!
Yes, this patch resolves the problem.
Regards,
--
Masahiko Sawada http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
On Sun, Oct 11, 2020 at 6:27 AM Michael Paquier <michael@paquier.xyz> wrote:
And applied. I did some more micro benchmarking with the quick
checks, and the numbers are cool, close to what you mentioned for the
quick checks of both NFC and NFKC.
Thanks for confirming.
Just wondering about something in the same area, did you look at the
decomposition table?
Hmm, I hadn't actually, but now that you mention it, that looks worth
optimizing that as well, since there are multiple callers that search that
table -- thanks for the reminder. The attached patch was easy to whip up,
being similar to the quick check (doesn't include the pg_hton32 fix). I'll
do some performance testing soon. Note that a 25kB increase in size could
be present in frontend binaries as well in this case. While looking at
decomposition, I noticed that recomposition does a linear search through
all 6600+ entries, although it seems only about 800 are valid for that.
That could be optimized as well now, since with hashing we have more
flexibility in the ordering and can put the recomp-valid entries in front.
I'm not yet sure if it's worth the additional complexity. I'll take a look
and start a new thread.
--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
Attachments:
v1-decomp-hash.patchapplication/octet-stream; name=v1-decomp-hash.patchDownload
src/common/unicode/generate-unicode_norm_table.pl | 37 +
src/common/unicode_norm.c | 56 +-
src/include/common/unicode_norm_table.h | 1692 +++++++++++++++++++++
3 files changed, 1761 insertions(+), 24 deletions(-)
diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index 7ce15e1a03..b589fd9e4e 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -10,9 +10,14 @@
use strict;
use warnings;
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
my $output_file = "unicode_norm_table.h";
my $FH;
+my @code_packed;
# Read list of codes that should be excluded from re-composition.
my @composition_exclusion_codes = ();
@@ -59,6 +64,9 @@ while (my $line = <$FH>)
my %char_entry = (code => $code, class => $class, decomp => $decomp);
push(@characters, \%char_entry);
$character_hash{$code} = \%char_entry;
+
+ # Save the code point bytes as a string in network order.
+ push @code_packed, pack('N', hex($code));
}
close $FH;
@@ -96,6 +104,17 @@ typedef struct
* decomposition itself if DECOMP_INLINE */
} pg_unicode_decomposition;
+/* Typedef for hash function on quick check table */
+typedef int (*decomp_hash_func) (const void *key);
+
+/* Information for decomposition lookup with perfect hash function */
+typedef struct
+{
+ const pg_unicode_decomposition *decomps;
+ decomp_hash_func hash;
+ int num_decomps;
+} pg_unicode_decompinfo;
+
#define DECOMP_NO_COMPOSE 0x80 /* don't use for re-composition */
#define DECOMP_INLINE 0x40 /* decomposition is stored inline in
* dec_index */
@@ -222,6 +241,24 @@ foreach my $char (@characters)
}
print $OUTPUT "\n};\n\n";
+# Emit the definition of the perfect hash function.
+my $funcname = 'DecompMain_hash_func';
+my $f = PerfectHash::generate_hash_function(\@code_packed, $funcname,
+ fixed_key_length => 4);
+print $OUTPUT "/* Perfect hash function for decomposition */\n";
+print $OUTPUT "static $f\n";
+
+# Emit the structure that wraps the hash lookup information into
+# one variable.
+printf $OUTPUT "/* Hash lookup information for decomposition */\n";
+printf $OUTPUT "static const pg_unicode_decompinfo ";
+printf $OUTPUT "UnicodeDecompInfo = {\n";
+printf $OUTPUT "\tUnicodeDecompMain,\n";
+printf $OUTPUT "\t%s,\n", $funcname;
+printf $OUTPUT "\t%d\n", scalar @code_packed;
+printf $OUTPUT "};\n\n";
+
+
# Print the array of decomposed codes.
print $OUTPUT <<HEADER;
/* codepoints array */
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 626645ac87..25b0980cae 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -43,29 +43,37 @@
#define NCOUNT VCOUNT * TCOUNT
#define SCOUNT LCOUNT * NCOUNT
-/* comparison routine for bsearch() of decomposition lookup table. */
-static int
-conv_compare(const void *p1, const void *p2)
-{
- uint32 v1,
- v2;
-
- v1 = *(const uint32 *) p1;
- v2 = ((const pg_unicode_decomposition *) p2)->codepoint;
- return (v1 > v2) ? 1 : ((v1 == v2) ? 0 : -1);
-}
/*
* Get the entry corresponding to code in the decomposition lookup table.
*/
-static pg_unicode_decomposition *
+static const pg_unicode_decomposition *
get_code_entry(pg_wchar code)
{
- return bsearch(&(code),
- UnicodeDecompMain,
- lengthof(UnicodeDecompMain),
- sizeof(pg_unicode_decomposition),
- conv_compare);
+ int h;
+ uint32 hashkey;
+ pg_unicode_decompinfo decompinfo = UnicodeDecompInfo;
+
+ /*
+ * Compute the hash function. The hash key is the codepoint with the bytes
+ * in network order.
+ */
+ hashkey = htonl(code);
+ h = decompinfo.hash(&hashkey);
+
+ /* An out-of-range result implies no match */
+ if (h < 0 || h >= decompinfo.num_decomps)
+ return NULL;
+
+ /*
+ * Since it's a perfect hash, we need only match to the specific codepoint
+ * it identifies.
+ */
+ if (code != decompinfo.decomps[h].codepoint)
+ return NULL;
+
+ /* Success! */
+ return &decompinfo.decomps[h];
}
/*
@@ -76,7 +84,7 @@ get_code_entry(pg_wchar code)
* is only valid until next call to this function!
*/
static const pg_wchar *
-get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
+get_code_decomposition(const pg_unicode_decomposition *entry, int *dec_size)
{
static pg_wchar x;
@@ -103,7 +111,7 @@ get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
static int
get_decomposed_size(pg_wchar code, bool compat)
{
- pg_unicode_decomposition *entry;
+ const pg_unicode_decomposition *entry;
int size = 0;
int i;
const uint32 *decomp;
@@ -230,7 +238,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
static void
decompose_code(pg_wchar code, bool compat, pg_wchar **result, int *current)
{
- pg_unicode_decomposition *entry;
+ const pg_unicode_decomposition *entry;
int i;
const uint32 *decomp;
int dec_size;
@@ -357,8 +365,8 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
pg_wchar prev = decomp_chars[count - 1];
pg_wchar next = decomp_chars[count];
pg_wchar tmp;
- pg_unicode_decomposition *prevEntry = get_code_entry(prev);
- pg_unicode_decomposition *nextEntry = get_code_entry(next);
+ const pg_unicode_decomposition *prevEntry = get_code_entry(prev);
+ const pg_unicode_decomposition *nextEntry = get_code_entry(next);
/*
* If no entries are found, the character used is either an Hangul
@@ -416,7 +424,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
for (count = 1; count < decomp_size; count++)
{
pg_wchar ch = decomp_chars[count];
- pg_unicode_decomposition *ch_entry = get_code_entry(ch);
+ const pg_unicode_decomposition *ch_entry = get_code_entry(ch);
int ch_class = (ch_entry == NULL) ? 0 : ch_entry->comb_class;
pg_wchar composite;
@@ -457,7 +465,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
static uint8
get_canonical_class(pg_wchar ch)
{
- pg_unicode_decomposition *entry = get_code_entry(ch);
+ const pg_unicode_decomposition *entry = get_code_entry(ch);
if (!entry)
return 0;
diff --git a/src/include/common/unicode_norm_table.h b/src/include/common/unicode_norm_table.h
index 96d43b893c..0fc0db2016 100644
--- a/src/include/common/unicode_norm_table.h
+++ b/src/include/common/unicode_norm_table.h
@@ -25,6 +25,17 @@ typedef struct
* decomposition itself if DECOMP_INLINE */
} pg_unicode_decomposition;
+/* Typedef for hash function on quick check table */
+typedef int (*decomp_hash_func) (const void *key);
+
+/* Information for decomposition lookup with perfect hash function */
+typedef struct
+{
+ const pg_unicode_decomposition *decomps;
+ decomp_hash_func hash;
+ int num_decomps;
+} pg_unicode_decompinfo;
+
#define DECOMP_NO_COMPOSE 0x80 /* don't use for re-composition */
#define DECOMP_INLINE 0x40 /* decomposition is stored inline in
* dec_index */
@@ -6645,6 +6656,1687 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
};
+/* Perfect hash function for decomposition */
+static int
+DecompMain_hash_func(const void *key)
+{
+ static const int16 h[13209] = {
+ 0, 1515, 4744, 4745, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3890, 3890, 0, 0,
+ 3891, 3891, -2046, 2800, 3890, 3890, 3890, -4396,
+ 4361, 4362, -4441, -4441, -4396, 1773, 1773, 1773,
+ 4372, 4373, -4438, -4438, -4393, -4393, 2619, 17,
+ -4347, -4393, -4393, -4393, -4393, -4393, 2619, 2619,
+ 1560, 4346, 4347, 4348, 1917, 1873, 1874, 1875,
+ -7856, 4358, 17619, 2622, 2622, 2622, 6357, 6358,
+ 6359, 6360, 6361, 6362, 6363, 2622, -4390, -4390,
+ 4414, -5356, -5356, 4374, 4375, -5356, -5356, -6335,
+ -3020, 2511, -5356, -5356, -3583, -3583, -3583, -3583,
+ -995, 0, 0, -9799, -9754, 2874, 2875, 2876,
+ 2877, 2878, -9830, -3591, -9756, -9756, -2744, -5346,
+ -9710, -9756, 342, -5346, -9756, -5346, -2743, -449,
+ 348, 2894, 2895, -2853, 2897, 2898, 2899, 2900,
+ 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908,
+ 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916,
+ 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924,
+ 2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932,
+ 2933, 2934, 32767, 32767, 32767, 32767, 32767, 32767,
+ -8721, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1, 32767, 48, 32767, 32767, 32767, 32767, 49,
+ 32767, 32767, -8687, -8687, -6255, -6210, 32767, 32767,
+ -8689, -8689, -21949, 32767, -18635, -15320, -15320, 32767,
+ -12006, -8691, -8691, -8691, -8691, -8691, 32767, 66,
+ -8737, -8737, -8692, -8692, -8692, -8692, 73, 74,
+ 32767, -8738, -8693, -8693, -8693, -8693, -8693, 32767,
+ 32767, -8695, -8695, -8695, -8695, -8695, 32767, 32767,
+ 40, 41, -2390, -2434, 44, 45, 32767, 46,
+ 13307, 9993, 9994, 6680, 6681, 3367, 3368, 54,
+ 0, 55, 56, 57, -8699, -8699, 105, 32767,
+ 32767, 61, 62, 63, -8701, -8701, 32767, 111,
+ 32767, 67, 68, 69, 70, 1890, 3687, -1272,
+ 3690, 75, 76, 77, 78, 79, 80, 81,
+ 82, 32767, 32767, 83, 84, 85, 86, 87,
+ 88, 89, 90, 91, 92, 93, 94, 95,
+ 96, 97, 98, 99, 100, 101, 102, 32767,
+ 32767, 103, 104, 105, 106, 107, 108, 109,
+ -8660, -8660, 32767, -8661, -8661, -8661, -8661, -8661,
+ -8661, 32767, 73, 74, 75, 76, -2355, -2399,
+ 79, 80, 32767, 32767, 13341, 10027, 10028, 6714,
+ 6715, 3401, 3402, 32767, 32767, 88, 89, 90,
+ -8666, -8666, 138, 32767, 32767, 94, 95, 96,
+ -8668, -8668, 144, 145, 101, -2553, -2553, -2553,
+ -2553, -4983, -2553, -2553, 154, -2553, 156, 32767,
+ 32767, 6114, 158, -3153, -3152, -3151, -12891, -6888,
+ -931, -3149, 166, -3148, -4728, 169, -3147, -3146,
+ -3145, -3144, -3143, -3142, -3141, -2543, -3139, -3138,
+ 180, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 3314,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 0, 3660, 3661, 2131, 2132, 2133, 2134, 2135,
+ 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143,
+ 2144, 2145, -5472, -5472, -3612, -3612, -3612, -3612,
+ -3612, 2652, -3612, -3612, -3612, -3612, -3612, -3612,
+ -3612, -3612, 3693, -3613, -7015, -7015, 1742, 1743,
+ -7060, -7060, -7015, -846, -846, -846, 1753, 1754,
+ -7057, -7057, -7012, -7012, 0, -2602, -6966, -7012,
+ -7012, -7012, -7012, -7012, 0, 0, 1725, 1726,
+ 1727, 1728, -703, -747, -746, 0, 1735, 1736,
+ 14997, 0, 0, 0, 3735, 3736, 3737, 3738,
+ 3739, 3740, 3741, 0, -7012, -7012, 1792, 1793,
+ 1749, 1750, 1751, -7980, -7980, -8959, -5644, -113,
+ -7980, -113, -2382, -6116, -6116, -6116, -6116, -6116,
+ -6116, -6116, -2374, 4639, 4640, -4163, 5608, 5609,
+ -4120, -4120, 5612, 5613, 6593, 3279, -2251, 5617,
+ 5618, 3846, 3847, 3848, 3849, 1262, 1262, 10066,
+ 10067, 10023, 3855, 3856, 3857, 1259, 1259, 10071,
+ 3861, 10027, 10028, 3017, 5620, 9985, 10032, -65,
+ 5624, 10035, 5626, 3024, 731, -65, 1298, 12530,
+ 3727, 3727, 3772, 3772, 3772, 13504, 13505, 14485,
+ 11171, 5641, 13509, 5643, 7913, 11648, 11649, 11650,
+ 11651, 11652, 11653, 11654, 7913, 901, 901, 9705,
+ -65, -65, 9665, 9666, -65, -65, -1044, 2271,
+ 7802, -65, -65, 1708, 1708, 1708, 1708, 4296,
+ 4297, -4506, -4506, -4461, 1708, 1708, 1708, 4307,
+ 4308, -4503, 1708, -4457, -4457, 2555, -47, -4411,
+ -4457, 5641, -47, -4457, -47, 2556, 4850, 5647,
+ 4285, -6946, 1858, 1859, 1815, 1816, 1817, -7914,
+ -7914, -8893, -5578, -47, -7914, -47, -2316, -6050,
+ -6050, -6050, -6050, -6050, -6050, -6050, -2308, 4705,
+ 4706, -4097, 5674, 5675, -4054, -4054, 5678, 5679,
+ 6659, 3345, -2185, 5683, 5684, 3912, 3913, 3914,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, -3083, -3083, 232, 287, 233, 233,
+ 233, 8990, 8991, 32767, 32767, 3668, 32767, 3667,
+ 3667, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 208, 208, 208, 208, 208, 208,
+ 32767, 32767, 206, 206, 206, 206, 206, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 304, 305, -1274, 307, 308,
+ 309, 6753, -1374, 10488, 4486, -1470, 4488, 316,
+ 4489, -5607, 4490, 4491, 4492, 322, 760, 324,
+ 325, 326, 166, 763, 329, -2553, 765, 332,
+ 333, 334, 335, 772, 337, 6310, 339, 340,
+ 341, 342, 343, 344, 345, 346, -2542, -2542,
+ -2542, 350, 351, 352, 353, 354, 355, 356,
+ 357, 358, 359, 360, 361, 362, -6008, 364,
+ 365, 366, 367, 368, 369, 370, 254, 372,
+ 373, 374, 375, 376, 377, 378, 379, 380,
+ 381, 382, 32767, 383, 384, -3606, -3605, -3604,
+ -3603, 389, -3600, -3599, -3598, 2340, -1238, -3595,
+ -3594, -3593, 4694, -4062, -4062, 4742, 4743, 4699,
+ -1469, -1468, -1467, -4065, -4065, 4747, -1463, 4703,
+ 4704, -2307, 296, 32767, 0, 32767, 32767, 4708,
+ -1376, -1376, -1376, 32767, 32767, -1246, 506, 506,
+ 0, -1559, 32767, 32767, 32767, 32767, 32767, 305,
+ 419, 308, 2578, 6313, 6314, 424, 32767, -6030,
+ 32767, 426, 427, 428, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 32767, 0,
+ 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 0, 32767, 429, -5407, 431,
+ -5406, 433, -3601, 435, 32767, -3751, 32767, 32767,
+ 32767, 32767, -3755, 32767, 32767, 32767, 32767, 0,
+ 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 436, -11425, -5422,
+ 535, -5422, 535, -5422, 4675, -5421, -5421, -5421,
+ -5421, -5421, 4681, 0, 0, 0, 4682, 4683,
+ 4684, 4685, 4686, 4687, 0, 0, 32767, 32767,
+ 0, 0, -5684, 0, 4688, 4689, 4690, 4691,
+ 4692, 4693, 4694, 4695, -1257, -1257, 4696, -5441,
+ -5441, 4699, 4700, 4701, -5443, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 454, 0, 32767, 456,
+ 32767, 32767, 0, 457, 32767, 32767, 32767, 0,
+ 458, 459, 460, 32767, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 4703, 4704, 4705, 4706, 32767,
+ 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 4655, 4656, 4657, 4658,
+ 4659, 4712, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 462, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 463, 464, 32767, 465,
+ 32767, 32767, 32767, 466, 32767, 32767, 32767, 32767,
+ 467, 468, 469, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 3011, 3011, 3011,
+ 3011, 3011, 3011, 3011, 32767, 32767, 32767, 32767,
+ 32767, 32767, 470, 471, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 472,
+ 473, 474, 475, 476, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 4713, 4714, 4715, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 477, 478, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 479, 480, 481, 482,
+ 32767, 32767, 483, 484, 32767, 32767, 485, 486,
+ 487, 488, 489, 490, 32767, 32767, 491, 492,
+ 493, 494, 495, 496, 32767, 32767, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 665, -255, 667, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 693, 694, 695, 696,
+ 697, 698, 699, 700, 701, 702, 703, 704,
+ 705, 706, 707, 708, 709, 710, 711, 712,
+ 7183, 714, -1580, 716, 2547, 718, 7194, 720,
+ 2553, 722, 723, 7204, 725, 726, 727, 728,
+ 729, 730, 731, 732, 733, 734, 735, 736,
+ 0, 0, 8114, 8159, 745, -1535, 747, 748,
+ 8161, -5019, -5019, -5019, -5019, 1938, 0, 0,
+ 0, 0, 0, 0, 767, 768, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32767, 32767, 32767, 32767, 32767, 0, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, -2875, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, -2884, -2884,
+ -2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+ -2884, -2884, -4271, -2884, -2884, -2884, -2884, -2884,
+ -2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+ -2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+ -2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+ -2884, -2884, -2884, 32767, -2885, 32767, -2886, -2886,
+ 32767, -2887, -2887, 32767, -2888, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 563, 564,
+ 565, 566, 567, 568, 569, 570, 571, 572,
+ 573, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 574, 575, 576, 577, 578, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, -294, -294, -294, -3047, 583, 584, 585,
+ -4462, -4418, -4418, -4418, -4418, -4418, -4462, -4462,
+ -4462, 595, 596, 597, 598, 599, 32767, 32767,
+ 32767, 32767, -4471, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 4716, 4717, 4718, 4719,
+ 4720, 4721, 4722, 4723, 4724, 4725, 4726, 4727,
+ 4728, 4729, 4730, 4731, 4732, 4733, 4734, 4735,
+ 3826, 4737, 4738, 4739, 4740, 4741, 4742, 3832,
+ 4744, 3833, 3120, 3121, 3835, 3835, 3124, 3836,
+ 3836, 4753, 4754, 4755, 4756, 4757, 4758, 4759,
+ 4760, 4761, 4762, 4763, 4764, 4765, 4766, 4767,
+ 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775,
+ 4776, 4777, 4778, 4779, 4780, 4781, 6619, 6620,
+ 6621, 11272, 6623, 6624, 4788, 4789, 4790, 3874,
+ 4761, 3874, 4794, 3874, 4796, 4797, 4798, 3874,
+ 4800, 32767, 0, 4802, 4803, 4804, 4805, 4806,
+ 4807, 4808, 4809, 4810, 4811, 4812, 4813, 4814,
+ 4815, 4816, 4817, 4818, 4819, 4820, 4821, 4822,
+ 4823, 4824, 4825, 4826, 4827, 4828, 11299, 4830,
+ 2536, 4832, 6663, 4834, 11310, 4836, 6669, 4838,
+ 4839, 11320, 4841, 4842, 4843, 4844, 4845, 4846,
+ 4847, 4848, 4849, 4850, 4851, 4852, 1188, 4854,
+ 4855, 4856, 4857, 2577, 4859, 4860, 12273, -907,
+ -907, -907, -907, -907, -907, 4868, 4869, 4870,
+ 4871, 32767, 4872, 4873, 32767, 32767, 4874, 32767,
+ 627, 4875, 4876, 32767, 32767, 4877, 4878, 4879,
+ 6722, 32767, 4881, 4882, 4883, 6730, 6731, 7446,
+ 6733, 4888, 7449, 7449, 4891, 4892, 32767, 4893,
+ 32767, 4894, 4895, 4896, 4897, 4898, 4899, 3512,
+ 3513, 3514, 3515, 3516, 4904, 3518, 3519, 3520,
+ 3521, 3522, 3523, 3524, 3525, 3526, 3527, 3528,
+ 3529, 3530, 3531, 3532, 3533, 3534, 3535, 3536,
+ 3537, 3538, 4926, 6797, 4928, 6800, 4930, 4931,
+ 4932, 4933, 4934, 4935, 6813, 4937, 4938, 6816,
+ 6817, 4941, 4942, 4943, 0, 4945, 6821, 0,
+ 0, 4949, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, -127, -127, -127,
+ 7285, -127, -127, 0, -128, -128, -128, -128,
+ 0, 32767, -130, 4971, -129, 5613, 5614, 5615,
+ 4976, 5618, 32767, 5619, 5620, 5621, 4981, 5624,
+ 4983, 4984, 32767, 5630, 5631, -1986, -1986, -126,
+ -126, 5078, 4992, 5037, 5038, 5039, 5040, 5041,
+ 5086, 5087, 5088, 5089, -2322, 5091, 5092, 5093,
+ 5094, 5095, 5096, 5097, 5098, 5099, 5100, 0,
+ 5101, -640, -640, -640, 0, -641, -641, -641,
+ -641, -641, 0, -642, 0, 0, 32767, -645,
+ -645, 6973, 6974, 5115, 5116, -87, 0, -44,
+ -44, -44, -44, -44, -88, -88, -88, -88,
+ 7324, -88, -88, -88, -88, -88, -88, -88,
+ -88, -88, -88, -88, -88, 5654, 5655, 5656,
+ 5657, 5658, 5659, 5660, 5661, 5662, 5663, 5664,
+ 5665, 5666, 5667, 5668, 5669, -1948, -1948, -88,
+ -88, 5116, 5117, 5074, 5075, 5076, 5077, 5078,
+ 5123, 5124, 5125, 5126, -2285, 5128, 5129, 5130,
+ 5131, 5132, 5133, 5134, 5135, 5136, 5137, 5138,
+ 5139, -602, -602, -602, -602, -602, -602, -602,
+ -602, -602, -602, -602, -602, -602, -602, -602,
+ -602, 7016, 7017, 5158, 5159, -44, -44, 0,
+ 0, 0, 0, 0, -44, -44, -44, -44,
+ 7368, -44, -44, -44, -44, -44, -44, -44,
+ -44, -44, -44, -44, -44, 5698, 5699, 5700,
+ 5701, 5702, 5703, 5704, 5705, 5706, 5707, 5708,
+ 5709, 5710, 5711, 5712, 5713, -1904, -1904, -44,
+ -44, 5160, 5161, 5118, 5119, 5120, 5121, 5122,
+ 5167, 5168, 5169, 5170, -2241, 5172, 5173, 5174,
+ 5175, 5176, 5177, 5178, 5179, 5180, 5181, 5182,
+ 5183, -558, -558, -558, -558, -558, -558, -558,
+ -558, -558, -558, -558, -558, -558, -558, -558,
+ -558, 7060, 7061, 5202, 5203, 0, 0, 44,
+ 44, 44, 44, 44, 0, 0, 0, 0,
+ 7412, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 5742, 5743, 5744,
+ 5745, 5746, 5747, 5748, 5749, 5750, 5751, 5752,
+ 5753, 5754, 5755, 5756, 5757, -1860, -1860, 0,
+ 0, 0, 0, 0, 6264, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, -3402,
+ -3402, 5355, 5356, -3447, -3447, -3402, -3402, -3402,
+ -3402, 5363, 5364, -3447, -3447, -3402, -3402, -3402,
+ -3358, -3358, -3404, -3404, -3404, -3404, -3404, -3404,
+ -3404, 5331, 5332, 5333, 5334, 2903, 2859, 5337,
+ 5338, 5339, 5340, 18601, 15287, 15288, 11974, 11975,
+ 8661, 8662, 5348, 5349, 5350, 5351, 5352, -3404,
+ -3404, 5400, 5401, 5357, 5358, 5359, 5360, -3404,
+ -3404, 5408, 5409, 5365, 5366, 5367, 5324, 5325,
+ 5372, 5373, 5374, 5375, 5376, 5377, 5378, -3356,
+ -3356, -3356, -3356, -924, -879, -3356, -3356, -3356,
+ -3356, -16616, -13301, -13301, -9986, -9986, -6671, -6671,
+ -3356, -3356, -3356, -3356, -3356, 5401, 5402, -3401,
+ -3401, -3356, -3356, -3356, -3356, 5409, 5410, -3401,
+ -3401, -3356, -3356, -3356, -3312, -3312, -3358, -3358,
+ -3358, -3358, -3358, -3358, -3358, 5377, 5378, 5379,
+ 5380, 2949, 2905, 5383, 5384, 5385, 5386, 18647,
+ 15333, 15334, 12020, 12021, 8707, 8708, 5394, 5395,
+ 5396, 5397, 5398, -3358, -3358, 5446, 5447, 5403,
+ 5404, 5405, 5406, -3358, -3358, 5454, 5455, 5411,
+ 5412, 5413, 5414, 5415, 5416, 5417, 5418, 5419,
+ 5420, 5421, 5422, -3312, -3312, -3312, -3312, -880,
+ -835, -3312, -3312, -3312, -3312, -16572, -13257, -13257,
+ -9942, -9942, -6627, -6627, -3312, -3312, -3312, -3312,
+ -3312, 5445, 5446, -3357, -3357, -3312, -3312, -3312,
+ -3312, 5453, 5454, -3357, -3357, -3312, -3312, -3312,
+ -3312, -3312, -3312, -3312, -3312, -3312, -3312, -3312,
+ -3312, 5423, 5424, 5425, 5426, 2995, 2951, 5429,
+ 5430, 5431, 5432, 18693, 15379, 15380, 12066, 12067,
+ 8753, 8754, 5440, 5441, 5442, 5443, 5444, -3312,
+ -3312, 5492, 5493, 5449, 5450, 5451, 5452, -3312,
+ -3312, 5500, 5501, 5457, 2803, 2803, 2803, 2803,
+ 373, 2803, 2803, 5510, 2803, 5512, 11470, 5514,
+ 11472, 5516, 2205, 2206, 2207, -7533, -1530, 4427,
+ 2209, 5524, 2210, 630, 5527, 2211, 2212, 2213,
+ 2214, 2215, 2216, 2217, 2815, 2219, 2220, 5538,
+ 2221, 5540, 2222, 5542, 5543, 2223, -3312, -3312,
+ -3312, 5548, 5549, -3312, -3312, 2803, 2803, 2803,
+ 5555, 5556, 5557, 2803, 2803, 2803, 2803, 2803,
+ 2803, 2803, 2803, 2803, 2803, 2803, 2803, 2803,
+ 9050, 9051, 2803, 2803, 2803, 2803, 2803, 2803,
+ 2803, 2803, 2803, 2803, 2803, 2803, 4318, 7547,
+ 7548, 2803, 2803, 2803, 2803, 2803, 2803, 2803,
+ 2803, 6693, 6693, 2803, 2803, 6694, 6694, 757,
+ 5603, 6693, 6693, 6693, -1593, 7164, 7165, -1638,
+ -1638, -1593, 4576, 4576, 4576, 7175, 7176, -1635,
+ -1635, -1590, -1590, 5422, 2820, -1544, -1590, -1590,
+ -1590, -1590, -1590, 5422, 5422, 4363, 7149, 7150,
+ 7151, 4720, 4676, 4677, 4678, -5053, 7161, 20422,
+ 5425, 5425, 5425, 9160, 9161, 9162, 9163, 9164,
+ 9165, 9166, 5425, -1587, -1587, 7217, -2553, -2553,
+ 7177, 7178, -2553, 32767, 32767, -219, 5312, -2555,
+ -2555, -782, -782, -782, -782, 1806, 2801, 2801,
+ -6998, -6953, 5675, 5676, 5677, 5678, 5679, -7029,
+ -790, -6955, -6955, 57, -2545, -6909, -6955, 3143,
+ -2545, -6955, -2545, 58, 2352, 3149, 5695, 5696,
+ -52, 5698, 5699, 5700, 5701, 5702, 5703, 5704,
+ 5705, 5706, 5707, 5708, 5709, 5710, 5711, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, -1838, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 6927,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, -973, 32767, 32767,
+ 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 4567, 4568, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, -437,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -448, 32767, 32767, -450, -450,
+ -450, 0, 32767, 32767, 32767, -2166, 32767, 32767,
+ 32767, 32767, 32767, 32767, 0, 0, 32767, -464,
+ -464, 32767, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, -514,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 5757, 5758, 5759, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -4186, -4186, -12097, -4186, 32767,
+ -4187, -4187, -8787, 32767, 0, 0, 5952, 0,
+ 0, -4183, -4183, -4183, 0, -2386, -4182, 778,
+ -4183, -5935, 32767, 32767, -4690, -6249, -4184, -4184,
+ -4184, 32767, 32767, -4186, -4186, -77, 32767, -77,
+ 32767, -4188, 0, -4189, 32767, 0, 0, 0,
+ 0, 32767, 0, 0, 0, 32767, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 0, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 0, 0, 0, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -5937, -2358, 0, 0, 0,
+ -8286, 471, 472, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 1747, 32767, -2126, 32767, 32767, 1748,
+ 1749, 1750, 1751, 1752, 1753, 8224, 1755, -539,
+ 1757, 781, 32767, 32767, 32767, -1991, -2035, 32767,
+ 32767, 782, -3784, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 837, 32767, 32767, 32767, 32767, 32767, -4008,
+ -4008, -4008, 2949, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 0, -797, 1806, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 4605, 4606,
+ 32767, 32767, 0, 455, 32767, 0, 32767, 32767,
+ 32767, 0, 32767, 32767, 32767, 32767, 0, 0,
+ 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -4244, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 784, 32767, 32767, 2950, 2951, 32767, 32767, 32767,
+ 32767, 32767, 32767, 786, 787, 32767, 1252, 1253,
+ 32767, 790, 32767, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 0, 32767, 0, 32767, 32767,
+ 32767, 0, 32767, 32767, 32767, 32767, 0, 0,
+ 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 0, 0, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, 0,
+ 0, 0, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, -200, -200, -200,
+ -200, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ -5932, -5932, 32767, 32767, 2952, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, -5387,
+ -5387, -5387, -5387, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 0, 0, 0, 32767, 32767,
+ 0, 0, 32767, 32767, 0, 0, 0, 0,
+ 0, 0, 32767, 32767, 0, 0, 0, 0,
+ 0, 0, 32767, 32767, 497, 498, 499, 500,
+ 501, 502, 503, 504, 505, 506, 507, 508,
+ 32767, 32767, -156, 765, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, -861,
+ 32767, 6106, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 2953, 2954, 32767, 797,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 2955, 32767, 32767, 32767, -8929,
+ 32767, -8885, -8885, -8885, 32767, 32767, 32767, 32767,
+ 32767, 32767, -749, 7119, 7120, 32767, 32767, 32767,
+ 32767, 2760, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, -1181, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, -5587, 0, 7596,
+ 7597, 0, 0, 0, 0, 0, 0, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -714, 0,
+ 0, -713, -712, 0, -711, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1859,
+ 0, 3247, 32767, 32767, 0, 3247, 0, 3248,
+ 0, 3249, 0, 3250, 0, 3251, 0, 3252,
+ 808, 3252, 0, 3253, 0, 3254, 0, 0,
+ 3256, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 0, 0, 0,
+ 0, 32767, 32767, 32767, 32767, 0, 0, 6824,
+ 32767, 0, 32767, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 4207, 4208, 0, 0, 0, 0, 0, 1896,
+ 0, 0, 1898, 1898, 1898, 1898, 0, 0,
+ 0, 1901, 1901, 0, 0, 0, 0, 0,
+ 0, -1319, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 7618, 7619, 7620,
+ 3, 3, 1863, 1863, 7067, 7068, 7025, 7026,
+ 7027, 7028, 7029, 7074, 7075, 7076, 7077, -334,
+ 7079, 7080, 7081, 7082, 7083, 7084, 7085, 7086,
+ 7087, 7088, 7089, 7090, 1349, 1349, 1349, 1349,
+ 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349,
+ 1349, 1349, 1349, 1349, 8967, 8968, 7109, 7110,
+ 1907, 1907, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 2976, 2977, 2978, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 0, 0, 0, 820, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 821,
+ 2381, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 2005, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 823, 32767, 824, 32767,
+ 825, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 826, 32767, 32767, 32767, 32767, 32767,
+ 32767, 4575, 4576, 4577, 4578, 4579, 4580, 4581,
+ 4582, 4583, 4584, 4585, 32767, 32767, 829, 32767,
+ 32767, 32767, 32767, 830, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 6253, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 6253, -3848, 834, 835, 836, -3845, -3845, -3845,
+ -3845, -3845, -3845, 843, 844, -4280, 32767, 845,
+ 846, 6531, 848, -3839, 32767, -3840, -3840, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 1946, 32767,
+ 32767, 32767, -3849, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 853, 32767, 32767, 32767,
+ 32767, 854, 32767, 32767, 32767, 32767, 855, 32767,
+ 32767, 32767, 32767, 856, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 857, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, -3799, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 8266, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 859, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 860,
+ 32767, 861, -5065, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 10746, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 4526,
+ 32767, 4573, 4574, 4575, 32767, 32767, -2436, -1376,
+ 32767, 32767, 32767, 32767, 32767, -1689, -1689, 4349,
+ -4171, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 4588, 32767,
+ 4589, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 4590,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 4591, 4592, 32767,
+ 32767, 32767, 32767, 32767, 32767, 2933, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 864, 32767, 32767, 32767,
+ 0, 32767, 0, 32767, 32767, -2977, 335, 335,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 2992, 2993, 2994, 2995,
+ 32767, 32767, 32767, 4596, 2550, 32767, 32767, 32767,
+ -1188, 4769, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 4600, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 2997, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 4601, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 2013,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -11287, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -4664, 32767, 32767, -4711, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, -4718, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 4049,
+ 32767, 32767, 32767, 4050, 4051, 4052, 17313, 32767,
+ 32767, 32767, 10684, 7370, 7371, 4057, 4058, 4059,
+ 4060, 4061, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 4603, 8793, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1283, 4897, 4898, 4899, 12175, 4901, 4902, 32767,
+ 4903, 4904, 4905, 4906, 4907, 10276, -1469, 1282,
+ 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282,
+ 1282, 32767, 32767, 4920, 4921, 4063, -2051, -2050,
+ 4925, 4926, 32767, 7332, 7333, 32767, 7334, 7335,
+ 7336, 7337, 5045, 32767, 32767, 32767, -2049, -2048,
+ 32767, -8294, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1132, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 20166, 16852, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 6908, 6909, 6910, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -4510, -4510, -4510, -4510, -4510, -4510, -4510, 0,
+ 0, 0, 0, 0, 0, -1831, -1831, -1831,
+ -15091, -11776, -11776, -8461, 0, 0, 0, -1834,
+ -1834, -1834, -1834, -1834, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -1819, -3615, 1345, -3616, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 32767, 0,
+ 0, 0, 0, 0, 0, 0, 8770, 8771,
+ 8772, 8773, 8774, 8775, 8776, 8777, 8778, 8779,
+ 45, 45, 45, 45, 2477, 2522, 45, 45,
+ 45, 45, -13215, -9900, -9900, -6585, -6585, -3270,
+ -3270, 45, 45, 45, 45, 45, 8802, 8803,
+ 0, 0, 45, 45, 45, 45, 8810, 8811,
+ 0, 0, 45, 2700, 2701, 2702, 2703, 5134,
+ 2705, 2706, 0, 2708, 0, -5957, 0, -5957,
+ 0, 3312, 3312, 3312, 13053, 7051, 1095, 3314,
+ 0, 3315, 4896, 0, 3317, 3317, 3317, 3317,
+ 3317, 3317, 3317, 2720, 3317, 3317, 0, 3318,
+ 0, 3319, 0, 0, 3321, 8857, 8858, 8859,
+ 0, 0, 8862, 8863, 2749, 2750, 2751, 0,
+ 0, 0, 2755, 2756, 2757, 2758, 2759, 2760,
+ 2761, 2762, 2763, 2764, 2765, 2766, 2767, -3479,
+ -3479, 2770, 2771, 2772, 2773, 2774, 2775, 2776,
+ 2777, 2778, 2779, 2780, 2781, 1267, -1961, -1961,
+ 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792,
+ -1097, -1096, 2795, 2796, -1094, -1093, 4845, 0,
+ -1089, -1088, -1087, 7200, -1556, -1556, 7248, 7249,
+ 7205, 1037, 1038, 1039, -1559, -1559, 7253, 7254,
+ 7210, 7211, 200, 2803, 7168, 7215, 7216, 7217,
+ 7218, 7219, 208, 209, 1269, -1516, -1516, -1516,
+ 916, 961, 961, 961, 10693, -1520, -14780, 218,
+ 219, 220, -3514, -3514, -3514, -3514, -3514, -3514,
+ -3514, 228, 7241, 7242, -1561, 8210, 8211, -1518,
+ -1518, 8214, 8215, 9195, 5881, 351, 8219, 8220,
+ 6448, 6449, 6450, 6451, 3864, 2870, 2871, 12671,
+ 12627, 0, 0, 0, 0, 0, 12709, 6471,
+ 12637, 12638, 5627, 8230, 12595, 12642, 2545, 8234,
+ 12645, 8236, 5634, 3341, 2545, 0, 0, 5749,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 0, 0, 0, 0, 11602,
+ 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, 1466,
+ 0, 0, 32767, 32767, 32767, 32767, 32767, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 5760, 0, 0, 0, 0, 0, 32767,
+ 0, 32767, 0, 0, 32767, 0, 0, 32767,
+ 0, 3507, 3508, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1644, 1645, 1646, 1647, -5764, 1649, 1650, 1651,
+ 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659,
+ 1660, -4081, -4081, -4081, -4081, -4081, -4081, -4081,
+ -4081, -4081, -4081, -4081, -4081, -4081, -4081, -4081,
+ -4081, 3537, 3538, 1679, 3582, 3583, 3584, -3482,
+ -3482, -3482, -3482, -3482, -3526, -3526, -3526, -3526,
+ 3886, -3526, -3526, -3526, -3526, 3599, 3600, 3601,
+ 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609,
+ 3610, 3611, 3612, 3613, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, 0,
+ -7275, 0, 0, -7234, 0, 0, 0, 0,
+ 0, -5368, 6378, 3628, 3629, 3630, 3631, 3632,
+ 3633, 3634, 3635, 3636, 3637, 3638, 3639, 0,
+ 0, 859, 6974, 6974, 0, 0, 3647, -2405,
+ -2405, 3650, -2405, -2405, -2405, -2405, -112, -2405,
+ -3201, 3658, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767,
+ 32767, 5280, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 4637, 4638, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 4014, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 802, 32767, 32767,
+ 32767, 32767, 803, -1055, 805, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 4639, 32767,
+ 32767, 32767, 806, -2445, 0, -2443, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 810, 32767, 32767,
+ 32767, 32767, 811, 812, 813, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, -6211, -6211, -6211, -6211, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, -6271, -6271,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 935, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, -10300, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 0, 0, 32767, 32767, 4640, 4641, 32767,
+ 32767, 32767, 32767, 32767, 4624, 32767, 32767, 32767,
+ -4233, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 1859, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 872, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, -4568, -1253, 32767,
+ -3590, 32767, 32767, 32767, -1820, -1820, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 0, 0, 0, 0, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 873, 874, 875, 3629, 0, 0,
+ 0, 5048, 5005, 5006, 5007, 5008, 5009, 5054,
+ 5055, 5056, 0, 0, 0, 0, 0, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, -4118,
+ 32767, 32767, 32767, 32767, -4122, -4122, -4122, -4122,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, -4193,
+ 32767, -4194, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, -4209, 32767, 32767, -4211, -4211, -4211,
+ -4211, -4211, -4211, -4211, 32767, 32767, -4213, -10683,
+ -4213, -1918, -4213, -6043, 32767, 32767, -4215, -6047,
+ 32767, -4216, -10696, -4216, -4216, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 4646, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 876, 877, 0, 32767, 0, 32767, 0,
+ 32767, 0, 32767, 0, 32767, 32767, 32767, 0,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 1844, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -2899, 0, 32767,
+ 0, 32767, 0, 32767, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 836, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 32767, 0, 0, 0, 879,
+ 880, 881, 882, 883, 884, 885, 886, 0,
+ 0, 887, 0, 920, 0, 922, 923, 924,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 5431,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 0, 0,
+ 0, 32767, 3639, 889, 890, 891, 892, 893,
+ 894, 895, 896, 897, 898, 899, 900, -2739,
+ 927, -1881, 4234, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, -459, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, -458,
+ -457, 904, 32767, 905, 32767, 906, 32767, 907,
+ 32767, 908, 32767, 32767, 32767, 909, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 910,
+ 0, 0, 0, 0, 0, 0, 911, 0,
+ 912, 1626, 1626, 913, 914, 1626, 915, 916,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -1837, -1837, -1837,
+ -6487, -1837, -1837, 0, 0, 0, 917, 31,
+ 919, 0, 921, 0, 0, 0, 925, 0,
+ 32767, 4801, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -6470, 0, 2295,
+ 0, -1830, 0, -6475, 0, -1832, 0, 0,
+ -6480, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3665, 0, 0,
+ 0, 0, 2281, 0, 0, -7412, 5769, 5770,
+ 5771, 5772, 5773, 5774, 0, 0, 0, 0,
+ 32767, 0, 0, 32767, 32767, 0, 32767, 32767,
+ 0, 0, 32767, 32767, 0, 0, 0, -1842,
+ 32767, 0, 0, 0, -1846, -1846, -2560, -1846,
+ 0, -2560, -2559, 0, 0, 32767, 0, 32767,
+ 0, 0, 0, 0, 0, 0, 1388, 0,
+ 1387, 1387, 1387, 0, 1387, 1387, 1387, 1387,
+ 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387,
+ 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387,
+ 1387, 0, -1870, 0, -1871, 0, 0, 0,
+ 0, 0, 0, -1877, 0, 0, -1877, -1877,
+ 0, 0, 0, 4944, 0, -1875, 4947, 4948,
+ 0, 4950, 4951, 4952, 4953, 4954, 4955, 4956,
+ 4957, 4958, 4959, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 32767, 32767, 0, 0, 0, 0, 32767, 32767,
+ 32767, 0, 0, 931, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 4650,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 5375,
+ 5376, 5377, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 13180, 0, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, -4011, 933, -4011, 32767,
+ 935, 936, -4012, 938, 939, 940, 941, 942,
+ 943, 944, 945, 946, 947, 32767, 1075, 1076,
+ 1077, -6334, 1079, 1080, 954, 32767, 32767, 32767,
+ 32767, 955, 32767, 32767, 32767, 32767, 32767, 32767,
+ -4659, 32767, 32767, 32767, -4662, -4662, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 0, 0, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 959, 960, 961, 32767, 962, 963, 964,
+ 965, 966, 967, 968, 969, 970, 971, 972,
+ 32767, 973, 974, 975, 976, 977, 978, 979,
+ 980, 981, 982, 983, 984, 985, 986, 987,
+ 988, 989, 990, 32767, 991, 992, 993, 994,
+ 995, 996, 997, 998, 999, 1000, 1001, 1002,
+ 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010,
+ 1011, 1012, 1013, 1014, 1015, 1016, 1017, -362,
+ -362, 32767, 32767, 32767, 32767, -410, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 1019, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 164, 1021, -3551, -3551, 1024, 1025, 1026, 1027,
+ 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035,
+ 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043,
+ 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051,
+ 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059,
+ 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067,
+ 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075,
+ 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083,
+ 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091,
+ 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099,
+ 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107,
+ 1108, 1109, 1110, 1111, 1112, 1113, 1114, 32767,
+ 1115, 1116, 1117, 1118, 1119, 32767, 1120, 1121,
+ 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129,
+ 1130, 1131, 0, 1133, 1134, 1135, 1136, 1137,
+ 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145,
+ 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153,
+ 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161,
+ 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169,
+ 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177,
+ 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185,
+ 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193,
+ 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201,
+ 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209,
+ -18956, -15641, 1212, 1213, 1214, 1215, 1216, 1217,
+ 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225,
+ -5682, -5682, -5682, 1229, 1230, 1231, 1232, 1233,
+ 1234, 1235, 1236, 1237, 1238, 1239, 5750, 5751,
+ 5752, 5753, 5754, 5755, 5756, 1247, 1248, 1249,
+ 1250, 1251, 1252, 3084, 3085, 3086, 16347, 13033,
+ 13034, 9720, 1260, 1261, 1262, 3097, 3098, 3099,
+ 3100, 3101, 1268, 1269, 1270, 1271, 1272, 1273,
+ 1274, 1275, 32767, 32767, 32767, 32767, 1276, 1277,
+ 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285,
+ 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293,
+ 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301,
+ 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309,
+ 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317,
+ 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325,
+ 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333,
+ 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341,
+ 1342, 3162, 4959, 0, 4962, 1347, 1348, 1349,
+ 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357,
+ 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 7481,
+ 7482, 7483, 7484, 5053, 5009, 7487, 7488, 7489,
+ 7490, 20751, 17437, 17438, 14124, 14125, 10811, 10812,
+ 7498, 7499, 7500, 7501, 7502, 32767, 32767, 7548,
+ 7549, 7505, 7506, 7507, 7508, 32767, 32767, 7554,
+ 7555, 7511, 4857, 4857, 4857, 4857, 2427, 4857,
+ 4857, 7564, 4857, 7566, 13524, 7568, 13526, 7570,
+ 4259, 4260, 4261, -5479, 524, 6481, 4263, 7578,
+ 4264, 2684, 1421, -7842, -4527, -4527, -1212, -1212,
+ -1212, -1212, -1212, 7545, 7546, 0, 0, -1214,
+ -1214, -1214, -1214, 7551, 7552, 32767, 1610, -1216,
+ 1439, 1440, 1441, 1442, 3873, 1444, 1445, 32767,
+ 1446, 32767, -7220, 32767, -7221, 0, 2047, 2047,
+ 2047, 11788, 5786, -170, 2049, -1265, 2050, 3631,
+ -1265, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
+ 1455, 2052, 2052, -1265, 2053, -1265, 2054, -1265,
+ -1265, 2056, 7592, 7593, 7594, 32767, 32767, 7595,
+ 7596, 1482, 1483, 1484, -1267, -1267, -1267, 1488,
+ 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496,
+ 1497, 1498, 1499, 1500, -4746, -4746, 1503, 1504,
+ 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512,
+ 1513, 1514, 0, -3228, -3228, 1518, 1519, 1520,
+ 1521, 1522, 1523, 1524, 1525, -2364, -2363, 1528,
+ 1529, -2361, -2360, 3578, 0, -2357, -2356, -2355,
+ 5932, -2824, -2824, 5980, 5981, 5937, -231, -230,
+ -229, -2827, -2827, 5985, -225, 5941, 5942, -1069,
+ 1534, 5899, 5946, 5947, 5948, 5949, 5950, -1061,
+ -1060, 0, -2785, 0, -355, -355, -310, -310,
+ -310, 9422, -2791, 32767, -1054, -1053, -1052, -4786,
+ -4786, -4786, -4786, -4786, -4786, -4786, -1044, 5969,
+ 5970, -2833, 6938, 6939, -2790, -2790, 6942, 0,
+ 32767, 4607, -923, 6945, 32767, 5173, 5174, 5175,
+ 5176, 2589, 1595, 1596, 11396, 11352, 32767, 32767,
+ 6126, 2812, 2813, 2814, 2815, 2816, -5940, -5940,
+ 1607, 1608, 2823, 32767, 32767, 1516, 0, -8581,
+ 0, 0, 728, 1525, 163, -11068, 0, -2262,
+ -2306, -2305, 32767, 32767, 0, 0, 1580, 0,
+ 0, 0, -6443, 1685, -10176, -4173, 1784, -4173,
+ 0, -4172, 5925, -4171, -4171, -4171, 0, -437,
+ 0, 0, 0, 161, -435, 0, 2883, -434,
+ 0, 0, 0, 0, -436, 0, -5972, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2889,
+ 2890, 2891, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 6371,
+ 0, 0, 0, 0, 0, 0, 0, 117,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 32767, 0, 0, 3991, 3991,
+ 3991, 3991, 0, 3990, 3990, 3990, -1947, 1632,
+ 3990, 3990, 3990, -4296, 4461, 4462, -4341, -4341,
+ -4296, 1873, 1873, 1873, 4472, 4473, -4338, 1873,
+ -4292, -4292, 2720, 118, -4246, -4292, -4292, 117,
+ -4293, -4293, 2719, 2719, 1660, 4446, 1662, 2018,
+ 2019, 1975, 1976, 1977, -7754, -7754, -8733, -5418,
+ 113, 0, 112, -2157, -5891, -5891, 0, -5892,
+ 6455, -5893, 0, 0, 0, 32767, 32767, 32767,
+ 5826, 32767, 32767, 32767, 32767, 6806, 32767, -2039,
+ 32767, 5829, 32767, 5830, 5831, 5832, 32767, 5833,
+ 5834, 32767, 5835, 32767, 32767, -3520, 0, 5837,
+ 0, 5838, 0, 4035, 0, 5840, 32767, 10251,
+ 154, 1671, 10253, 1673, 1674, 947, 151, 1514,
+ 12746, 1679, 3942, 3987, 3987, 3987, 13719, 13720,
+ 14700, 103, 5855, 13723, 5857, 8127, 0, 11862,
+ 5860, -96, 5862, 1690, 5863, -4233, 5864, 5865,
+ 5866, 5867, 5868, 5869, 5870, 5871, 5872, 5873,
+ 32767, 5874, 5875, 5876, 5877, 5878, 5879, 5880,
+ 5881, 5882, 5883, 13795, 5885, 5886, 5887, 5888,
+ 10489, 5890, 1703, 1704, -4247, 1706, 1707, 5891,
+ 5892, 5893, 1711, 4098, 5895, 5896, 5897, 7650,
+ 32767, 5899, 6406, 7966, 5902, 5903, 5904, 5905,
+ 5906, 5907, 5908, 1800, 5910, 1801, 5912, 5913,
+ 5914, 5915, 32767, 1727, 1728, 1729, 1730, 32767,
+ 1731, 1732, 1733, 32767, 1734, 1735, 1736, 1737,
+ 1738, 1739, 1740, 32767, 1741, 1742, 1743, 1744,
+ 1745, 1746, 32767, 32767, 32767, 32767, 1747, 1748,
+ 1749, 1750, 1751, 32767, 32767, 32767, 32767, 32767,
+ 32767, 1752, 1753, 1754, 1755, 1756, 1757, 1758,
+ 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766,
+ 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774,
+ 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782,
+ 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790,
+ 1791, 7729, 4151, 1794, 1795, 1796, 10083, 1327,
+ 1327, 10131, 10132, 10088, 3920, 3921, 3922, 1324,
+ 1324, 10136, 3926, 10092, 10093, 3082, 5685, 10050,
+ 10097, 0, 5689, 10100, 5691, 3089, 796, 0,
+ 1363, 12595, 3792, 3792, 3837, 3837, 3837, 13569,
+ 13570, 14550, 11236, 5706, 13574, 5708, 7978, 11713,
+ 11714, 11715, 11716, 11717, 11718, 11719, 7978, 966,
+ 966, 9770, 0, 0, 9730, 9731, 0, 0,
+ -979, 2336, 7867, 0, 0, 32767, 0, 0,
+ 0, 32767, 0, 0, 32767, 0, 32767, 32767,
+ 9356, 32767, 0, 32767, 0, 32767, 1804, 2602,
+ 0, -4364, -4410, 5688, 0, -4410, 0, 2603,
+ 4897, 5694, 4332, -6899, 1905, 1906, 1862, 1863,
+ 1864, -7867, -7867, -8846, -5531, 0, -7867, 0,
+ -2269, -6003, -6003, 0, 5957, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -7911, 0,
+ 0, 0, 0, -4600, 0, 0, 4156, 32767,
+ 32767, 0, 0, 0, 0, 0, 1796, 0,
+ 0, 0, -1752, 0, 0, -506, -2065, 0,
+ 0, 0, 0, 0, 0, 0, 4109, 0,
+ 4110, 0, 0, 0, 0, 0, 4111, 17372,
+ 0, 14058, 10744, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -4650, 0, 0, 4161, 32767,
+ 32767, 4117, 32767, 4118, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, -7946, 32767, -4632, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, -4642,
+ -4642, 4123, 4124, -4687, 0, 0, -4644, -4644,
+ 0, 0, -4646, -4646, 32767, 32767, 32767, 32767,
+ 32767, 32767, 4084, 4085, 32767, 32767, 1609, 4087,
+ 32767, 32767, 4088, 17349, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 10092, 4136,
+ 10094, 4138, 10096, 0, 10097, 10098, 10099, 10100,
+ 10101, 0, 32767, 32767, 32767, 0, 0, 0,
+ 0, 0, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 0, 0, 0, 0, 0,
+ 0, 0, 0, 32767, 32767, 0, 10138, 10139,
+ 0, 0, 0, 10145, 32767, 32767, 32767, 32767,
+ 32767, 32767, -1425, 8316, 2314, -3642, 32767, 0,
+ 32767, 32767, 32767, 32767, -1426, -1426, -1426, -1426,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 0, 0, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 52, 52, 52, 52, 52,
+ 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 1849, 1850, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 100, 101, 102, 103, 104, 105, 106, 107,
+ 108, -5633, -5633, -5633, -5633, -5633, -5633, -5633,
+ -5633, -5633, -5633, -5633, -5633, -5633, -5633, -5633,
+ -5633, 1985, 1986, 127, 2030, 2031, 2032, -5034,
+ 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767,
+ 32767, 5916, 5917, 5918, 5919, 5920, 5921, 5922,
+ 5923, 5924, 8824, 5926, 32767, 32767, 0, 32767,
+ 0, 5927, 5928, 5929, 5930, 5931, 5932, 5933,
+ 5934, 5935, 5936, 5937, 5938, 5939, 5940, 5105,
+ 5942, 5943, 5944, 5945, 5946, 5947, 5948, 5949,
+ 5950, 5951, 5952, 5953, 5954, 5955, 5956, 5957,
+ 32767, 5958, 5959, 5960, 5082, 5082, 5082, 5082,
+ 5082, 5082, 5082, 5082, 5969, 5970, 5084, 5972,
+ 5053, 5974, 5053, 5053, 5053, 5978, 5979, 5980,
+ 5981, 5982, 5983, 5984, 5985, 5986, 5987, 5988,
+ 5989, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 2552, 32767, 32767, 32767,
+ 32767, 32767, 32767, 5990, 5991, 5992, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 5993, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 6936, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 1851, 1852, 1853, 1854,
+ 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862,
+ 1863, 1864, 1200, 2121, 1200, 1868, 1869, 1870,
+ 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878,
+ 1879, 1880, 1188, 1188, 1188, 1188, 1188, 1188,
+ 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
+ 1188, 1188, 1188, 1188, 1188, 1188, -5282, 1188,
+ 3483, 1188, -642, 1188, -5287, 1188, -644, 1188,
+ 1188, -5292, 1188, 1188, 1188, 1188, 1188, 1188,
+ 1188, 1188, 1188, 1188, 1188, 1188, 1925, 1926,
+ -6187, -6231, 1184, 3465, 1184, 1184, -6228, 6953,
+ 6954, 6955, 6956, 0, 1939, 1940, 1941, 1942,
+ 1943, 1944, 1178, 1178, 1947, 1948, 1949, 1950,
+ 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958,
+ 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966,
+ 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974,
+ 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982,
+ 1983, 1984, 1985, 1986, 1987, 1988, 1989, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 0, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 0, 0, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 709, 666, 667, 668, 32767, 669,
+ 714, 715, 716, 717, -6694, 719, 720, 721,
+ 32767, 722, 723, 724, 32767, 725, 726, 727,
+ 728, -5013, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 6052, 0, 0, 6055,
+ 0, 0, 0, 0, 2293, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 1244, 1245, 1246,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, -4660,
+ -4660, -4660, -4660, 4097, 4098, -4705, -4705, -4660,
+ -4660, -4660, -4660, 4105, 4106, -4705, 32767, -4661,
+ -4661, -4661, -4617, -4617, -4663, -4663, -4663, -4663,
+ -4663, -4663, -4663, 4072, 4073, 4074, 4075, 1644,
+ 1600, 4078, 4079, 4080, 4081, 17342, 14028, 14029,
+ 10715, 10716, 7402, 7403, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 0, 0,
+ 0, 32767, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32767, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 32767, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1380, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 856, 0, 4573,
+ 4574, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32767, 0, 0, 0,
+ 0, 0, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 5204, 5161, 5162, 5163, 5164, 5165, 5210, 5211,
+ 5212, 5213, -2198, 5215, 5216, 5217, 5218, 5219,
+ 5220, 5221, 5222, 5223, 5224, 5225, 5226, -515,
+ -515, -515, -515, -515, -515, -515, -515, -515,
+ -515, -515, -515, -515, -515, -515, -515, 7103,
+ 7104, 5245, 5246, 5247, 5248, 5249, -1014, 5251,
+ 5252, 5253, 5254, 5255, 5256, 5257, 5258, 5259,
+ 5260, 8663, 8664, -92, -92, 8712, 8713, 8669,
+ 8670, 8671, 8672, -92, -92, 8720, 8721, 8677,
+ 8678, 8679, 8636, 8637, 8684, 8685, 8686, 8687,
+ 8688, 8689, 8690, -44, -44, -44, -44, 2388,
+ 2433, -44, -44, -44, -44, -13304, -9989, -9989,
+ -6674, -6674, -3359, -3359, -44, -44, -44, -44,
+ -44, 8713, 8714, -89, -89, -44, -44, -44,
+ -44, 8721, 8722, -89, -89, -44, -44, -44,
+ 0, 0, -46, -46, -46, -46, -46, -46,
+ -46, 8689, 8690, 8691, 8692, 6261, 6217, 8695,
+ 8696, 8697, 8698, 21959, 18645, 18646, 15332, 15333,
+ 12019, 12020, 8706, 8707, 8708, 8709, 8710, -46,
+ -46, 8758, 8759, 8715, 8716, 8717, 8718, -46,
+ -46, 8766, 8767, 8723, 8724, 8725, 8726, 8727,
+ 8728, 8729, 8730, 8731, 8732, 8733, 8734, 0,
+ 0, 0, 0, 2432, 2477, 0, 0, 0,
+ 0, -13260, -9945, -9945, -6630, -6630, -3315, -3315,
+ 0, 0, 0, 0, 0, 8757, 8758, -45,
+ -45, 0, 0, 0, 0, 8765, 8766, -45,
+ -45, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 8735, 8736, 8737,
+ 8738, 6307, 6263, 8741, 8742, 8743, 8744, 22005,
+ 18691, 18692, 15378, 15379, 12065, 12066, 8752, 8753,
+ 8754, 8755, 8756, 0, 0, 8804, 8805, 8761,
+ 8762, 8763, 8764, 0, 0, 8812, 8813, 8769,
+ 6115, 6115, 6115, 6115, 3685, 6115, 6115, 8822,
+ 6115, 8824, 14782, 8826, 14784, 8828, 5517, 5518,
+ 5519, -4221, 1782, 7739, 5521, 8836, 5522, 3942,
+ 8839, 5523, 5524, 5525, 5526, 5527, 5528, 5529,
+ 6127, 5531, 5532, 8850, 5533, 8852, 5534, 8854,
+ 8855, 5535, 0, 0, 0, 8860, 8861, 0,
+ 0, 0, 13252, 9939, 9939, 6626, 6626, 3313,
+ 3313, 0, 0, 0, -9269, -3312, 0, 0,
+ 0, 9741, 32767, 32767, 0, 32767, 0, 32767,
+ 32767, 0, 0, 0, 0, 0, 0, 0,
+ -597, 0, 0, 32767, 0, 32767, 0, 32767,
+ 32767, 0, 0, 32767, 32767, 32767, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 32767, 32767, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -1387, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, -1773, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+ 0, 0, 0, 0, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, -4161, 1581, 1582, 32767, 32767, 1990, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 1539, 32767, 32767, 6150, 6151, 6152, 411,
+ 411, 411, 411, 411, 411, 411, 411, 411,
+ 411, 411, 411, 411, 411, 411, 411, 8029,
+ 8030, 6171, 6172, 969, 969, 1013, 1013, 1013,
+ 1013, 1013, 969, 969, 969, 969, 8381, 969,
+ 969, 969, 969, 969, 969, 969, 969, 969,
+ 969, 969, 969, 6711, 6712, 6713, 6714, 6715,
+ 6716, 6717, 6718, 6719, 6720, 6721, 6722, 6723,
+ 6724, 6725, 6726, -891, -891, 969, 969, 6173,
+ 6174, 6131, 6132, 6133, 6134, 6135, 6180, 6181,
+ 6182, 6183, -1228, 6185, 6186, 6187, 6188, 6189,
+ 6190, 6191, 6192, 6193, 6194, 6195, 6196, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 8073,
+ 8074, 6215, 6216, 1013, 1013, 1057, 1057, 1057,
+ 1057, 1057, 1013, 1013, 1013, 1013, 8425, 1013,
+ 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
+ 1013, 1013, 1013, 6755, 6756, 6757, 6758, 6759,
+ 6760, 6761, 6762, 6763, 6764, 6765, 6766, 6767,
+ 6768, 6769, 6770, -847, -847, 1013, 1013, 6217,
+ 6218, 6175, 6176, 6177, 6178, 6179, 6224, 6225,
+ 6226, 6227, -1184, 6229, 6230, 6231, 6232, 6233,
+ 6234, 6235, 6236, 6237, 6238, 6239, 6240, 499,
+ 499, 499, 499, 499, 499, 499, 499, 499,
+ 499, 499, 499, 499, 499, 499, 499, 8117,
+ 8118, 6259, 6260, 6261, 6262, 6263, 0, 6265,
+ 6266, 6267, 6268, 6269, 6270, 6271, 6272, 6273,
+ 6274, 9677, 9678, 922, 922, 9726, 9727, 9683,
+ 9684, 9685, 9686, 922, 922, 9734, 9735, 9691,
+ 9692, 9693, 9650, 9651, 9698, 9699, 9700, 9701,
+ 9702, 9703, 9704, 970, 970, 970, 970, 3402,
+ 3447, 970, 970, 970, 970, -12290, -8975, -8975,
+ -5660, -5660, -2345, -2345, -2345, -2345, -2345, 6412,
+ 6413, -2390, -2390, -2345, -2345, -2345, -2345, 6420,
+ 6421, -2390, -2390, -2345, -2345, -2345, -2301, -2301,
+ -2347, -2347, -2347, -2347, -2347, -2347, -2347, 6388,
+ 6389, 6390, 6391, 3960, 3916, 6394, 6395, 6396,
+ 6397, 19658, 16344, 16345, 13031, 13032, 9718, 9719,
+ 6405, 6406, 6407, 6408, 6409, -2347, -2347, 6457,
+ 6458, 6414, 6415, 6416, 6417, -2347, -2347, 6465,
+ 6466, 6422, 6423, 6424, 6381, 6382, 6429, 6430,
+ 6431, 6432, 6433, 6434, 6435, -2299, -2299, -2299,
+ -2299, 133, 178, -2299, -2299, -2299, -2299, -15559,
+ -12244, -12244, -8929, -8929, -5614, -5614, -2299, -2299,
+ -2299, -2299, -2299, 6458, 6459, -2344, -2344, -2299,
+ -2299, -2299, -2299, 6466, 6467, -2344, -2344, -2299,
+ -2299, -2299, -2299, -2299, -2299, -2299, -2299, -2299,
+ -2299, -2299, -2299, 6436, 6437, 6438, 6439, 4008,
+ 3964, 6442, 6443, 6444, 6445, 19706, 16392, 16393,
+ 13079, 13080, 9766, 9767, 6453, 6454, 6455, 6456,
+ 6457, -2299, -2299, 6505, 6506, 6462, 6463, 6464,
+ 6465, -2299, -2299, 6513, 6514, 6470, 6471, 6472,
+ 6473, 6474, 6475, 6476, 6477, 6478, 6479, 6480,
+ 6481, -2253, -2253, -2253, -2253, 179, 224, -2253,
+ -2253, -2253, -2253, -15513, -12198, -12198, -8883, -8883,
+ -5568, -5568, -2253, -2253, -2253, -2253, -2253, 6504,
+ 6505, -2298, -2298, -2253, -2253, -2253, -2253, 6512,
+ 6513, -2298, -2298, -2253, 402, 403, 404, 405,
+ 2836, 407, 408, -2298, 410, -2298, -8255, -2298,
+ -8255, -2298, 1014, 1014, 1014, 10755, 4753, -1203,
+ 1016, -2298, 1017, 2598, -2298, 1019, 1019, 1019,
+ 1019, 1019, 1019, 1019, 422, 1019, 1019, -2298,
+ 1020, -2298, 1021, -2298, -2298, 1023, 6559, 6560,
+ 6561, -2298, -2298, 6564, 6565, 6566, -6685, -3371,
+ -3370, -56, -55, 3259, 3260, 3261, 12531, 6575,
+ 3264, 3265, 3266, -6474, -471, 5486, 3268, 6583,
+ 3269, 1689, 6586, 3270, 3271, 3272, 3273, 3274,
+ 3275, 3276, 3874, 3278, 3279, 6597, 3280, 6599,
+ 3281, 6601, 6602, 3282, 3283, 32767, 32767, 32767,
+ 3284, 3285, 3286, 3287, 3288, 3289, 3290, 3291,
+ 3292, 3293, 3294, 3295, 3296, 3297, 3298, 3299,
+ 3300, 3301, 3302, 3303, 3304, 3305, 3306, 3307,
+ 3308, 3309, 3310, 3311, 3312, 3313, 3314, 3315,
+ 3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323,
+ 3324, 3325, 3326, 3327, 3328, 3329, 3330, 3331,
+ 3332, 3333, 3334, 3335, 3336, 3337, 3338, 3339,
+ 3340, 3341, 3342, 3343, 3344, 3345, 3346, 3347,
+ 3348, 3349, 3350, 3351, 32767, 32767, 3352, 3353,
+ 3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361,
+ 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369,
+ 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377,
+ 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385,
+ 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393,
+ 3394, 3395, 3396, 3397, 3398, 3399, 3400, 3401,
+ 3402, 3403, 3404, 3405, 3406, 3407, 4795, 3409,
+ 3410, 3411, 3412, 3413, 3414, 3415, 3416, 3417,
+ 3418, 3419, 3420, 3421, 3422, 3423, 3424, 3425,
+ 3426, 3427, 3428, 3429, 3430, 3431, 3432, 3433,
+ 3434, 3435, 3436, 3437, 3438, 3439, 3440, 3441,
+ 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3449,
+ 3450, 3451, 3452, 3453, 3454, 3455, 3456, 3457,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 3458,
+ 3459, 3460, 3461, 3462, -8139, 3464, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 3465, 3466, 2001, 3468, 3469, 32767,
+ 32767, 32767, 32767, 32767, 3470, 3471, 3472, 3473,
+ 3474, 3475, 3476, 3477, 3478, 3479, 3480, 3481,
+ 3482, 3483, 3484, 3485, 3486, 3487, 3488, 3489,
+ 3490, 3491, 3492, 3493, 3494, 3495, 32767, 3496,
+ 3497, 3498, 3499, 3500, 32767, 3501, 32767, 3502,
+ 3503, 32767, 3504, 3505, 32767, 3506, 0, 0,
+ 3509, 3510, 3511, 3512, 3513, 3514, 3515, 3516,
+ 3517, 3518, 3519, 3520, 3521, 3522, 3523, 3524,
+ 3525, 3526, 3527, 3528, 3529, 3530, 3531, 3532,
+ 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540,
+ 3541, 3542, 3543, 3544, 3545, 1902, 1902, 1902,
+ 1902, 9314, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 7644, 7645,
+ 7646, 7647, 7648, 7649, 7650, 7651, 7652, 7653,
+ 7654, 7655, 7656, 7657, 7658, 7659, 42, 42,
+ 1902, 0, 0, 0, 7067, 7068, 7069, 7070,
+ 7071, 7116, 7117, 7118, 7119, -292, 7121, 7122,
+ 7123, 7124, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3614, 3615, 3616, 10892, 3618, 3619,
+ 10854, 3621, 3622, 3623, 3624, 3625, 8994, -2751,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3640, 3641, 2783, -3331,
+ -3330, 3645, 3646, 0, 6053, 6054, 0, 6056,
+ 6057, 6058, 6059, 3767, 6061, 6858, 0, 0,
+ 3659, 0, 0, 1531, 1531, 1531, 1531, 1531,
+ 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531,
+ 1531, 1531, 9149, 9150, 7291, 7292, 7293, 7294,
+ 7295, 1032, 7297, 7298, 7299, 7300, 7301, 7302,
+ 7303, 7304, 0, 7307, 10710, 10711, 1955, 1955,
+ 10759, 10760, 10716, 4548, 4549, 4550, 1952, 1952,
+ 10764, 10765, 10721, 10722, 3711, 6314, 10679, 10726,
+ 10727, 10728, 10729, 10730, 3719, 3720, 1996, 1996,
+ 1996, 1996, 4428, 4473, 4473, 3728, 1994, 1994,
+ -11266, 3732, 3733, 3734, 0, 0, 0, 0,
+ 0, 0, 0, 3742, 10755, 10756, 1953, 1953,
+ 1998, 1998, 1998, 11730, 11731, 12711, 9397, 3867,
+ 11735, 3869, 6139, 9874, 9875, 9876, 9877, 9878,
+ 9879, 9880, 6139, -873, -873, 7931, -1839, -1839,
+ 7891, 7892, -1839, -1839, -2818, 497, 6028, -1839,
+ -1839, -66, -66, -66, -66, 2522, 2523, -6280,
+ -6280, -6235, -66, -66, -66, 2533, 2534, -6277,
+ -66, -6231, -6231, 781, -1821, -6185, -6231, 3867,
+ -1821, -6231, -1821, 782, 3076, 3873, 2511, -8720,
+ 84, 85, 41, 42, 43, -9688, -9688, -10667,
+ -7352, -1821, -9688, -1821, -4090, -7824, -7824, -7824,
+ -7824, -7824, -7824, -7824, -4082, 2931, 2932, -5871,
+ 3900, 3901, -5828, -5828, 3904, 3905, 4885, 1571,
+ -3959, 3909, 3910, 2138, 2139, 2140, 2141, -446,
+ -446, 8358, 8359, 8315, 2147, 2148, 2149, -449,
+ -449, 8363, 2153, 8319, 8320, 1309, 3912, 8277,
+ 8324, -1773, 3916, 8327, 3918, 1316, -977, -1773,
+ -410, 10822, 2019, 2019, 2064, 2064, 2064, 11796,
+ 11797, 12777, 9463, 3933, 11801, 3935, 6205, 9940,
+ 9941, 9942, 9943, 9944, 9945, 9946, 6205, -807,
+ -807, 7997, -1773, -1773, 7957, 7958, -1773, -1773,
+ -2752, 563, 6094, -1773, -1773, 0, 0, 0,
+ 0, 2588, 2589, -6214, -6214, -6169, 0, 0,
+ 0, 2599, 2600, -6211, 0, -6165, -6165, 847,
+ -1755, -6119, -6165, 3933, -1755, -6165, -1755, 848,
+ 3142, 3939, 2577, -8654, 150, 151, 107, 108,
+ 109, -9622, -9622, -10601, -7286, -1755, -9622, -1755,
+ -4024, -7758, -7758, -7758, -7758, -7758, -7758, -7758,
+ -4016, 2997, 2998, -5805, 3966, 3967, -5762, -5762,
+ 3970, 3971, 4951, 1637, -3893, 3975, 3976, 2204,
+ 2205, 2206, 2207, -380, -380, 8424, 8425, 8381,
+ 2213, 2214, 2215, -383, -383, 8429, 2219, 8385,
+ 8386, 1375, 3978, 8343, 8390, -1707, 3982, 8393,
+ 3984, 1382, -911, -1707, -344, 10888, 2085, 2085,
+ 2130, 2130, 2130, 11862, 11863, 12843, 9529, 3999,
+ 11867, 4001, 6271, 10006, 10007, 4005, -1951, 4007,
+ 4008, 4009, 4010, 4011, 4012, 4013, 4014, 4015,
+ 4016, 4017, 4018, 4019, 4020, 4021, 4022, 4023,
+ 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031,
+ 11943, 4033, 4034, 4035, 4036, 8637, 4038, 4039,
+ -116, 32767, 32767, 4041, 4042, 4043, 4044, 4045,
+ 2250, 4047, 4048, 4049, 5802, 4051, 4052, 4559,
+ 6119, 4055, 4056, 4057, 4058, 4059, 4060, 4061,
+ -47, 4063, -46, 4065, 4066, 4067, 4068, 4069,
+ -41, -13301, 4072, -9985, -6670, 4075, 4076, 4077,
+ 4078, 4079, 4080, 4081, 4082, 4083, 4084, 4085,
+ 4086, 4087, 4088, 4089, 4090, 8741, 4092, 4093,
+ -67, 32767, 32767, 32767, 32767, 32767, 2257, 32767,
+ 2258, 2259, 2260, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+ 32767, 32767, 32767, 32767, 2261, 32767, 2262, 32767,
+ 2263, 32767, 2264, 32767, 2265, 32767, 2266, 32767,
+ 2267, 8737, 8738, -26, -26, 8786, 4100, 4101,
+ 8746, 8747, 4104, 4105, 8752, 8753, 32767, 2274,
+ 32767, 2275, 32767, 32767, 32767, 32767, 32767, 32767,
+ 2276, 2277, 32767, 2278, 2279, 32767, 2280, 0,
+ 32767, 2282, 9695, 4109, -3486, -3486, 4112, 4113,
+ 4114, 4115, 4116, 4117, 32767, 32767, 32767, 32767,
+ 32767, 32767, 4118, 4119, 4120, 4121, 4122, 4123,
+ 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131,
+ 4132, 4133, 4134, 4849, 4136, 4137, 4851, 4851,
+ 4140, 4852, 4142, 4143, 4144, 4145, 4146, 4147,
+ 4148, 4149, 4150, 4151, 2293, 4153, 907, 32767,
+ 2295, 4155, 909, 4157, 910, 4159, 911, 4161,
+ 912, 4163, 913, 4165, 914, 32767, 915, 4168,
+ 916, 4170, 917, 4172, 4173, 918, 4175, 4176,
+ 4177, 4178, 4179, 4180, 4181, 4182, 4183, 4184,
+ 4185, 2309, 4186, 4187, 4188, 4189, 2312, 2313,
+ 32767, 2314, 4190, 4191, -2632, 2317, 4193, 32767,
+ 4194, 4195, 4196, 4197, 4198, 4199, 4200, 4201,
+ 4202, 4203, 4204, 4205, 4206, 0, 0, 4209,
+ 4210, 4211, 4212, 4213, 2318, 4215, 4216, 2319,
+ 2320, 2321, 2322, 4221, 4222, 4223, 2323, 2324,
+ 4226, 4227, 4228, 4229, 4230, 4231, 5551, 4233,
+ 4234, 4235, 4236, 4237, 4238, 4239, 4240, 4241,
+ 4242, 4243, 4244, 4245, 4246, 4247, 4248, 4249,
+ 4250, 4251, 4252, 4253, 4254, 4255, 4256, 4257,
+ 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265,
+ 4266, 4267, 4268, 4269, 4270, 4271, 4272, 4273,
+ 4274, 4275, -3342, -3342, -3342, 4276, 4277, 2418,
+ 2419, -2784, -2784, -2740, -2740, -2740, -2740, -2740,
+ -2784, -2784, -2784, -2784, 4628, -2784, -2784, -2784,
+ -2784, -2784, -2784, -2784, -2784, -2784, -2784, -2784,
+ -2784, 2958, 2959, 2960, 2961, 2962, 2963, 2964,
+ 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972,
+ 2973, -4644, -4644, -2784, -2784, 2420, 2421, 2378,
+ 2379, 2380, 2381, 2382, 2427, 2428, 2429, 2430,
+ -4981, 2432, 2433, 2434, 2435, 2436, 2437, 2438,
+ 2439, 2440, 2441, 2442, 2443, -3298, -3298, -3298,
+ -3298, -3298, -3298, -3298, -3298, -3298, -3298, -3298,
+ -3298, -3298, -3298, -3298, -3298, 4320, 4321, 2462,
+ 4365, 4366, 4367, -2699, -2699, -2699, -2699, -2699,
+ -2743, -2743, -2743, -2743, 4669, -2743, -2743, -2743,
+ -2743, 4382, 4383, 4384, 4385, 4386, 4387, 4388,
+ 4389, 4390, 4391, 4392, 4393, 4394, 4395, 4396,
+ 4397, 4398, 4399, 4400, 4401, 4402, 4403, 4404,
+ 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4412,
+ 4413, 4414, 4415, 4416, 4417, 4418, 4419, 4420,
+ 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428,
+ 4429, 816, 816, 816, -6459, 816, 816, -6418,
+ 816, 816, 816, 816, 816, -4552, 7194, 4444,
+ 4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452,
+ 4453, 4454, 4455, 816, 816, 1675, 7790, 7790,
+ 816, 816, 4463, -1589, -1589, 4466, -1589, -1589,
+ -1589, -1589, 704, -1589, -2385, 4474, 4475, 817,
+ 4477, 4478, 2948, 2949, 2950, 2951, 2952, 2953,
+ 2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961,
+ 2962, -4655, -4655, -2795, -2795, -2795, -2795, -2795,
+ 3469, -2795, -2795, -2795, -2795, -2795, -2795, -2795,
+ -2795, 4510, -2796, -6198, -6198, 2559, 2560, -6243,
+ -6243, -6198, -6198, -6198, -6198, 2567, 2568, -6243,
+ -6243, -6198, -6198, -6198, -6154, -6154, -6200, -6200,
+ -6200, -6200, -6200, -6200, -6200, 2535, 2536, 2537,
+ 2538, 107, 63, 2541, 2542, 2543, 2544, 15805,
+ 12491, 12492, 32767, 4540, 4541, 4542, 4543, 4544,
+ 4545, 4546, 2548, -6208, -6208, 2596, 2597, 2553,
+ 2554, 2555, 2556, -6208, -6208, 2604, 2605, 2561,
+ 2562, 2563, 2520, 2521, 2568, 2569, 2570, 2571,
+ 2572, 2573, 2574, -6160, -6160, -6160, -6160, -3728,
+ -3683, -6160, -6160, -6160, -6160, -19420, -16105, -16105,
+ -12790, -12790, -9475, -9475, -6160, -6160, -6160, -6160,
+ -6160, 32767, 2597, -6206, -6206, -6161, -6161, -6161,
+ -6161, 2604, 2605, -6206, -6206, -6161, -6161, -6161,
+ -6161, -6161, -6161, -6161, -6161, -6161, -6161, -6161,
+ -6161, 2574, 2575, 2576, 2577, 146, 102, 2580,
+ 2581, 2582, 2583, 15844, 12530, 12531, 9217, 9218,
+ 5904, 5905, 2591, 2592, 2593, 2594, 2595, -6161,
+ -6161, 2643, 2644, 2600, 2601, 2602, 2603, -6161,
+ -6161, 2651, 2652, 2608, 2609, 2610, 2611, 2612,
+ 2613, 2614, 2615, 2616, 2617, 2618, 2619, -6115,
+ -6115, -6115, -6115, -3683, -3638, -6115, -6115, -6115,
+ -6115, -19375, -16060, -16060, -12745, -12745, -9430, -9430,
+ -6115, -6115, -6115, -6115, -6115, 2642, 2643, -6160,
+ -6160, -6115, -6115, -6115, -6115, 2650, 2651, -6160,
+ -6160, -6115, -3460, -3459, -3458, -3457, -1026, -3455,
+ -3454, -6160, -3452, -6160, -12117, -6160, -12117, -6160,
+ -2848, -2848, -2848, 6893, 891, -5065, -2846, -6160,
+ -2845, -1264, 0, 9264, 5950, 5951, 2637, 2638,
+ 2639, 2640, 2641, -6115, -6115, 2689, 2690, 2646,
+ 2647, 2648, 2649, -6115, -6115, 2697, 2698, 2654,
+ 0, 0, 0, 0, -2430, 0, 0, 2707,
+ 0, 2709, 8667, 2711, 8669, 2713, -598, -597,
+ -596, -10336, -4333, 1624, -594, 2721, -593, -2173,
+ 2724, -592, -591, -590, -589, -588, -587, -586,
+ 12, -584, -583, 2735, -582, 2737, -581, 2739,
+ 2740, -580, -6115, -6115, -6115, 2745, 2746, -6115,
+ -6115, 0, 0, 0, 2752, 2753, 2754, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 6247, 6248, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,
+ };
+
+ const unsigned char *k = (const unsigned char *) key;
+ size_t keylen = 4;
+ uint32 a = 0;
+ uint32 b = 1;
+
+ while (keylen--)
+ {
+ unsigned char c = *k++;
+
+ a = a * 257 + c;
+ b = b * 8191 + c;
+ }
+ return h[a % 13209] + h[b % 13209];
+}
+
+/* Hash lookup information for decomposition */
+static const pg_unicode_decompinfo UnicodeDecompInfo = {
+ UnicodeDecompMain,
+ DecompMain_hash_func,
+ 6604
+};
+
/* codepoints array */
static const uint32 UnicodeDecomp_codepoints[5092] =
{
On Mon, Oct 12, 2020 at 05:46:16AM -0400, John Naylor wrote:
Hmm, I hadn't actually, but now that you mention it, that looks worth
optimizing that as well, since there are multiple callers that search that
table -- thanks for the reminder. The attached patch was easy to whip up,
being similar to the quick check (doesn't include the pg_hton32 fix). I'll
do some performance testing soon. Note that a 25kB increase in size could
be present in frontend binaries as well in this case. While looking at
decomposition, I noticed that recomposition does a linear search through
all 6600+ entries, although it seems only about 800 are valid for that.
That could be optimized as well now, since with hashing we have more
flexibility in the ordering and can put the recomp-valid entries in front.
I'm not yet sure if it's worth the additional complexity. I'll take a look
and start a new thread.
Starting a new thread for this topic sounds like a good idea to me,
with a separate performance analysis. Thanks!
--
Michael
On Mon, Oct 12, 2020 at 03:39:51PM +0900, Masahiko Sawada wrote:
Yes, this patch resolves the problem.
Okay, applied then.
--
Michael
On 2020-10-12 13:36, Michael Paquier wrote:
On Mon, Oct 12, 2020 at 03:39:51PM +0900, Masahiko Sawada wrote:
Yes, this patch resolves the problem.
Okay, applied then.
Could you adjust the generation script so that the resulting header file
passes the git whitespace check? Check the output of
git show --check 80f8eb79e24d9b7963eaf17ce846667e2c6b6e6f
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
On Mon, Oct 19, 2020 at 08:15:56AM +0200, Peter Eisentraut wrote:
On 2020-10-12 13:36, Michael Paquier wrote:
On Mon, Oct 12, 2020 at 03:39:51PM +0900, Masahiko Sawada wrote:
Yes, this patch resolves the problem.
Okay, applied then.
Could you adjust the generation script so that the resulting header file
passes the git whitespace check? Check the output ofgit show --check 80f8eb79e24d9b7963eaf17ce846667e2c6b6e6f
Hmm. Giving up on the left space padding would make the table harder
to read because the elements would not be aligned anymore across
multiple lines, and I'd rather keep 8 elements per lines as we do now.
This is generated by this part in PerfectHash.pm, where we apply a
at most 7 spaces of padding to all the members, except the first one
of a line that uses 6 spaces at most with two tabs:
for (my $i = 0; $i < $nhash; $i++)
{
$f .= sprintf "%s%6d,%s",
($i % 8 == 0 ? "\t\t" : " "),
$hashtab[$i],
($i % 8 == 7 ? "\n" : "");
}
Could we consider this stuff as a special case in .gitattributes
instead?
--
Michael
On Mon, Oct 19, 2020 at 2:16 AM Peter Eisentraut <
peter.eisentraut@2ndquadrant.com> wrote:
On 2020-10-12 13:36, Michael Paquier wrote:
On Mon, Oct 12, 2020 at 03:39:51PM +0900, Masahiko Sawada wrote:
Yes, this patch resolves the problem.
Okay, applied then.
Could you adjust the generation script so that the resulting header file
passes the git whitespace check? Check the output ofgit show --check 80f8eb79e24d9b7963eaf17ce846667e2c6b6e6f
My git manual says:
"By default, trailing
whitespaces (including lines that consist solely of
whitespaces) and a space character that is immediately
followed by a tab character inside the initial indent of the
line are considered whitespace errors."
The above would mean we should have errors for every function whose
parameters are lined with the opening paren, so I don't see why it would
fire in this case. Is the manual backwards?
--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
John Naylor <john.naylor@enterprisedb.com> writes:
On Mon, Oct 19, 2020 at 2:16 AM Peter Eisentraut <
peter.eisentraut@2ndquadrant.com> wrote:Could you adjust the generation script so that the resulting header file
passes the git whitespace check? Check the output of
git show --check 80f8eb79e24d9b7963eaf17ce846667e2c6b6e6f
My git manual says:
...
The above would mean we should have errors for every function whose
parameters are lined with the opening paren, so I don't see why it would
fire in this case. Is the manual backwards?
Probably not, but our whitespace rules are not git's default.
See .gitattributes at the top level of a git checkout.
regards, tom lane
On Mon, Oct 19, 2020 at 10:38 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:
John Naylor <john.naylor@enterprisedb.com> writes:
On Mon, Oct 19, 2020 at 2:16 AM Peter Eisentraut <
peter.eisentraut@2ndquadrant.com> wrote:Could you adjust the generation script so that the resulting header file
passes the git whitespace check? Check the output of
git show --check 80f8eb79e24d9b7963eaf17ce846667e2c6b6e6fMy git manual says:
...
The above would mean we should have errors for every function whose
parameters are lined with the opening paren, so I don't see why it would
fire in this case. Is the manual backwards?Probably not, but our whitespace rules are not git's default.
See .gitattributes at the top level of a git checkout
I see, I should have looked for that when Michael mentioned it. We could
left-justify instead, as in the attached. If it were up to me, though, I'd
just format it like pgindent expects, even if not nice looking. It's just a
bunch of numbers.
--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
Attachments:
fix-whitespace-hash-func.patchapplication/octet-stream; name=fix-whitespace-hash-func.patchDownload
diff --git a/src/tools/PerfectHash.pm b/src/tools/PerfectHash.pm
index d6841589a3..fbfac79163 100644
--- a/src/tools/PerfectHash.pm
+++ b/src/tools/PerfectHash.pm
@@ -121,13 +121,12 @@ sub generate_hash_function
{
$f .= sprintf "%s(const void *key, size_t keylen)\n{\n", $funcname;
}
- $f .= sprintf "\tstatic const %s h[%d] = {\n", $elemtype, $nhash;
+ $f .= sprintf "\tstatic const %s h[%d] = {\n\t\t", $elemtype, $nhash;
for (my $i = 0; $i < $nhash; $i++)
{
- $f .= sprintf "%s%6d,%s",
- ($i % 8 == 0 ? "\t\t" : " "),
+ $f .= sprintf "%d,%s",
$hashtab[$i],
- ($i % 8 == 7 ? "\n" : "");
+ ($i == $nhash-1 ? "" : $i % 8 == 7 ? "\n\t\t" : ' ' x (6 - length($hashtab[$i])));
}
$f .= sprintf "\n" if ($nhash % 8 != 0);
$f .= sprintf "\t};\n\n";
On Mon, Oct 19, 2020 at 12:12:00PM -0400, John Naylor wrote:
I see, I should have looked for that when Michael mentioned it. We could
left-justify instead, as in the attached. If it were up to me, though, I'd
just format it like pgindent expects, even if not nice looking. It's just a
bunch of numbers.
The aligned numbers have the advantage to make the checks of the code
generated easier, for the contents and the format produced. So using
a right padding as you are suggesting here rather than a new exception
in .gitattributes sounds fine to me. I simplified things a bit as the
attached, getting rid of the last comma while on it. Does that look
fine to you?
--
Michael
Attachments:
fix-whitespace-hash-func-v2.patchtext/x-diff; charset=us-asciiDownload
diff --git a/src/tools/PerfectHash.pm b/src/tools/PerfectHash.pm
index d6841589a3..964f79b71a 100644
--- a/src/tools/PerfectHash.pm
+++ b/src/tools/PerfectHash.pm
@@ -121,13 +121,16 @@ sub generate_hash_function
{
$f .= sprintf "%s(const void *key, size_t keylen)\n{\n", $funcname;
}
- $f .= sprintf "\tstatic const %s h[%d] = {\n", $elemtype, $nhash;
+ $f .= sprintf "\tstatic const %s h[%d] = {\n\t\t", $elemtype, $nhash;
for (my $i = 0; $i < $nhash; $i++)
{
- $f .= sprintf "%s%6d,%s",
- ($i % 8 == 0 ? "\t\t" : " "),
- $hashtab[$i],
- ($i % 8 == 7 ? "\n" : "");
+ # Hash element.
+ $f .= sprintf "%d", $hashtab[$i];
+ next if ($i == $nhash - 1);
+
+ # Optional indentation and newline, with eight items per line.
+ $f .= sprintf ",%s",
+ ($i % 8 == 7 ? "\n\t\t" : ' ' x (6 - length($hashtab[$i])));
}
$f .= sprintf "\n" if ($nhash % 8 != 0);
$f .= sprintf "\t};\n\n";
On Mon, Oct 19, 2020 at 9:49 PM Michael Paquier <michael@paquier.xyz> wrote:
The aligned numbers have the advantage to make the checks of the code
generated easier, for the contents and the format produced. So using
a right padding as you are suggesting here rather than a new exception
in .gitattributes sounds fine to me. I simplified things a bit as the
attached, getting rid of the last comma while on it. Does that look
fine to you?
This is cleaner, so I'm good with this.
--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company