Commit 54294c9a by Alexey Knyazev Committed by Commit Bot

Partially upgrade codegen to Python 3

Bug: angleproject:5707 Change-Id: I4e26c2c7ba4a36185b28ecd6e87be1161b60431a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2729567 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 8b55a3e5
{ {
"src/compiler/translator/ImmutableString_ESSL_autogen.cpp": "src/compiler/translator/ImmutableString_ESSL_autogen.cpp":
"fde39e0f48a46f22745815601f8c73aa", "a60ac3aafb91de4358c1d811494c95c9",
"src/compiler/translator/ImmutableString_autogen.cpp": "src/compiler/translator/ImmutableString_autogen.cpp":
"5c77d1341ef8f3d506aa918c646a90af", "16e37e1ca019440226125af698783034",
"src/compiler/translator/ParseContext_ESSL_autogen.h": "src/compiler/translator/ParseContext_ESSL_autogen.h":
"f11464c29f93b216b36561931fc6413f", "9efd14cccb9bc5a099ac5c24b87b01b0",
"src/compiler/translator/ParseContext_complete_autogen.h": "src/compiler/translator/ParseContext_complete_autogen.h":
"2db8d7d0efd13afdd4b971c89f785f7e", "5d70fc2310654e6bcb04fe27f883b6cd",
"src/compiler/translator/SymbolTable_ESSL_autogen.cpp": "src/compiler/translator/SymbolTable_ESSL_autogen.cpp":
"a43e41c822e17c3887750f773539096f", "a9526c6a57d0d7afa73ea1f19d49d5be",
"src/compiler/translator/SymbolTable_autogen.cpp": "src/compiler/translator/SymbolTable_autogen.cpp":
"eda3a3410d738d3bc3eb23c8c466869f", "bb5e4fe2438b7138ba79b31fa4bef4d4",
"src/compiler/translator/SymbolTable_autogen.h": "src/compiler/translator/SymbolTable_autogen.h":
"d43593050c4d1b31b0be9cdd3a2d0ea5", "d43593050c4d1b31b0be9cdd3a2d0ea5",
"src/compiler/translator/builtin_function_declarations.txt": "src/compiler/translator/builtin_function_declarations.txt":
...@@ -18,13 +18,13 @@ ...@@ -18,13 +18,13 @@
"src/compiler/translator/builtin_variables.json": "src/compiler/translator/builtin_variables.json":
"032da55c155d149d1930b4995d76e951", "032da55c155d149d1930b4995d76e951",
"src/compiler/translator/gen_builtin_symbols.py": "src/compiler/translator/gen_builtin_symbols.py":
"0b997ff6e25c823a62264ad618b070ed", "eb24e6333408abf3a0e7b42818dce507",
"src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h": "src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h":
"34d93fcd5085a4f4bc81c4b537828bef", "fb0e00d60b60f6c01b7e75d93c5a1fc3",
"src/compiler/translator/tree_util/BuiltIn_complete_autogen.h": "src/compiler/translator/tree_util/BuiltIn_complete_autogen.h":
"d812e52abb0baf983be9b0ccb4375885", "b7ba5f755b1708adc6658351a2ac960c",
"src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp": "src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp":
"b0ce4e0905740d612471ca1ad68cfaba", "19e3e2225d3decd5f212944fa3634abf",
"src/tests/compiler_tests/ImmutableString_test_autogen.cpp": "src/tests/compiler_tests/ImmutableString_test_autogen.cpp":
"0f9030c08262caae7b45a3ad38d3417f" "e947fe40ee401b2927a5d7832283a676"
} }
\ No newline at end of file
#!/usr/bin/python2 #!/usr/bin/python3
# #
# Copyright 2017 The ANGLE Project Authors. All rights reserved. # Copyright 2017 The ANGLE Project Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be # Use of this source code is governed by a BSD-style license that can be
...@@ -55,7 +55,7 @@ def grab_from_script(script, param): ...@@ -55,7 +55,7 @@ def grab_from_script(script, param):
f = open(os.path.basename(script), 'r') f = open(os.path.basename(script), 'r')
exe = get_executable_name(f.readline()) exe = get_executable_name(f.readline())
try: try:
res = subprocess.check_output([exe, script, param]).strip() res = subprocess.check_output([exe, script, param]).decode().strip()
except Exception: except Exception:
print('Error grabbing script output: %s, executable %s' % (script, exe)) print('Error grabbing script output: %s, executable %s' % (script, exe))
raise raise
...@@ -143,8 +143,8 @@ generators = { ...@@ -143,8 +143,8 @@ generators = {
def md5(fname): def md5(fname):
hash_md5 = hashlib.md5() hash_md5 = hashlib.md5()
with open(fname, "r") as f: with open(fname, "r") as f:
for chunk in iter(lambda: f.read(4096), b""): for chunk in iter(lambda: f.read(4096), ""):
hash_md5.update(chunk) hash_md5.update(chunk.encode())
return hash_md5.hexdigest() return hash_md5.hexdigest()
...@@ -169,12 +169,12 @@ def any_hash_dirty(name, filenames, new_hashes, old_hashes): ...@@ -169,12 +169,12 @@ def any_hash_dirty(name, filenames, new_hashes, old_hashes):
def any_old_hash_missing(all_new_hashes, all_old_hashes): def any_old_hash_missing(all_new_hashes, all_old_hashes):
result = False result = False
for file, old_hashes in all_old_hashes.iteritems(): for file, old_hashes in all_old_hashes.items():
if file not in all_new_hashes: if file not in all_new_hashes:
print('"%s" does not exist. Code gen dirty.' % file) print('"%s" does not exist. Code gen dirty.' % file)
result = True result = True
else: else:
for name, _ in old_hashes.iteritems(): for name, _ in old_hashes.items():
if name not in all_new_hashes[file]: if name not in all_new_hashes[file]:
print('Hash for %s is missing from "%s". Code gen is dirty.' % (name, file)) print('Hash for %s is missing from "%s". Code gen is dirty.' % (name, file))
result = True result = True
...@@ -212,7 +212,7 @@ def main(): ...@@ -212,7 +212,7 @@ def main():
if len(sys.argv) > 1 and sys.argv[1] == '--verify-no-dirty': if len(sys.argv) > 1 and sys.argv[1] == '--verify-no-dirty':
verify_only = True verify_only = True
for name, script in sorted(generators.iteritems()): for name, script in sorted(generators.items()):
info = auto_script(script) info = auto_script(script)
fname = get_hash_file_name(name) fname = get_hash_file_name(name)
filenames = info['inputs'] + info['outputs'] + [script] filenames = info['inputs'] + info['outputs'] + [script]
...@@ -251,14 +251,14 @@ def main(): ...@@ -251,14 +251,14 @@ def main():
sys.exit(1) sys.exit(1)
# Update the output hashes again since they can be formatted. # Update the output hashes again since they can be formatted.
for name, script in sorted(generators.iteritems()): for name, script in sorted(generators.items()):
info = auto_script(script) info = auto_script(script)
fname = get_hash_file_name(name) fname = get_hash_file_name(name)
update_output_hashes(name, info['outputs'], all_new_hashes[fname]) update_output_hashes(name, info['outputs'], all_new_hashes[fname])
os.chdir(script_dir) os.chdir(script_dir)
for fname, new_hashes in all_new_hashes.iteritems(): for fname, new_hashes in all_new_hashes.items():
hash_fname = os.path.join(hash_dir, fname) hash_fname = os.path.join(hash_dir, fname)
json.dump( json.dump(
new_hashes, new_hashes,
......
...@@ -24,216 +24,216 @@ std::ostream &operator<<(std::ostream &os, const sh::ImmutableString &str) ...@@ -24,216 +24,216 @@ std::ostream &operator<<(std::ostream &os, const sh::ImmutableString &str)
namespace namespace
{ {
constexpr int mangledkT1[] = {2557, 605, 1321, 1130, 1727, 1231, 727, 3007, 2250, 1369, constexpr int mangledkT1[] = {1865, 3158, 2853, 1682, 964, 2924, 357, 2994, 1417, 2512,
2871, 3084, 1811, 947, 2085, 1454, 3131, 2883, 84, 18, 1311, 1311, 2139, 1976, 1760, 582, 284, 1231, 2967, 2550,
561, 876, 2928, 943, 54, 2284, 960, 564, 1719, 2358, 557, 2450, 1390, 2263, 1589, 1298, 3121, 2215, 2366, 708,
1936, 1978, 3204, 2124, 1802, 1893, 2707, 1513, 2168, 3020}; 1827, 1707, 2405, 2487, 3075, 2597, 90, 1010, 2784, 2606};
constexpr int mangledkT2[] = {1014, 1853, 669, 390, 134, 630, 455, 3086, 1813, 416, constexpr int mangledkT2[] = {1020, 2468, 786, 2255, 1879, 342, 431, 224, 687, 2281,
3183, 2138, 1849, 2399, 2480, 1011, 2961, 450, 1843, 849, 2252, 3080, 1892, 2914, 2719, 1134, 2940, 1802, 617, 2244,
3206, 926, 2036, 1054, 1279, 2755, 1495, 1734, 5, 2194, 2471, 2754, 1169, 2072, 1955, 1834, 3185, 3182, 1842, 443,
2564, 2803, 442, 690, 3152, 2940, 1566, 1018, 2656, 351}; 1668, 2555, 569, 804, 2640, 839, 583, 2781, 2276, 3104};
constexpr int mangledkG[] = { constexpr int mangledkG[] = {
0, 0, 0, 0, 199, 0, 1821, 0, 0, 2017, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2177, 0, 0,
0, 0, 0, 0, 0, 1014, 0, 0, 2898, 0, 0, 0, 0, 0, 415, 0,
1473, 0, 0, 2295, 0, 813, 0, 0, 0, 0, 1195, 0, 0, 966, 0, 0,
0, 0, 0, 0, 0, 0, 843, 2206, 0, 1184, 0, 0, 0, 2525, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2985, 934, 986, 0, 0, 1663, 0, 0, 0, 1019, 0, 3131, 627, 2572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 2742, 0, 691, 963, 0, 0, 0, 0, 0, 0, 601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1850, 0, 0, 0, 1329, 2858,
719, 0, 0, 0, 0, 0, 0, 1706, 1266, 0, 0, 0, 0, 0, 1999, 0, 0, 0, 0, 1862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 311, 0, 0, 0, 9, 0, 3007, 0, 0, 0, 505, 2277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 823, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2177, 0, 0, 2651,
0, 0, 0, 631, 1012, 0, 0, 0, 1955, 130, 0, 0, 0, 1491, 0, 0, 0, 0, 422, 0, 0, 0, 0, 560, 0, 0, 0, 0, 0, 0, 0, 0,
895, 0, 3033, 0, 0, 0, 0, 0, 0, 0, 3058, 0, 102, 1873, 0, 0, 1600, 0, 3068, 799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1101, 0, 0, 399, 0, 839, 0, 1605, 0, 0, 2694, 113, 535, 0, 0, 1882, 746, 0, 0, 0, 2264, 0, 2364, 0, 0, 0, 0, 0, 2816,
0, 0, 0, 975, 0, 0, 1637, 0, 0, 3076, 3071, 0, 1596, 1138, 0, 0, 2133, 0, 0, 0, 564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2861, 1758,
0, 0, 0, 0, 0, 2645, 0, 577, 0, 2366, 0, 0, 1895, 2773, 0, 0, 0, 549, 700, 0, 0, 0, 0, 621, 0, 0, 953, 0, 0, 236, 0, 0,
0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 2703, 0, 0, 0, 0, 0, 1605, 0, 0, 0, 3018, 0, 0, 0, 0, 177, 0, 907, 2690, 0, 431, 1482,
0, 0, 0, 0, 0, 0, 0, 0, 382, 0, 75, 1820, 0, 1436, 0, 0, 1284, 0, 0, 709, 0, 0, 0, 223, 0, 0, 905, 0, 0, 0, 0, 0,
1618, 844, 0, 0, 3188, 661, 625, 0, 0, 0, 1659, 0, 3070, 0, 1874, 0, 670, 0, 0, 2949, 0, 3163, 0, 1372, 3123, 0, 0, 0, 0, 0, 724, 0,
0, 0, 0, 0, 0, 314, 0, 0, 2108, 3112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1173, 0, 1126, 617, 1050, 2666, 0, 0, 3191, 359, 0, 0, 0,
1832, 0, 0, 1469, 0, 746, 529, 0, 0, 0, 0, 0, 0, 267, 0, 0, 2813, 0, 0, 0, 242, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 732, 0, 0, 0, 0, 0, 0, 1812, 0, 0, 0, 0, 757, 333, 0, 0, 0, 0, 0, 0, 0, 0, 2220, 0, 1472, 0, 0,
0, 1488, 1740, 2326, 0, 0, 0, 0, 0, 0, 539, 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, 0, 0, 0, 0, 1430, 0, 0, 0, 0, 0, 2181,
0, 0, 0, 0, 1031, 0, 2565, 2531, 0, 160, 0, 0, 253, 0, 0, 0, 0, 0, 354, 0, 0, 0, 0, 0, 0, 0, 2087, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1372, 3200, 1836, 0, 0, 32, 275, 0, 0, 716, 0, 0, 0, 0, 0, 2999, 0, 0, 0, 0, 0, 0, 357, 791, 0, 0,
0, 0, 269, 0, 0, 1896, 0, 863, 0, 0, 822, 0, 2584, 0, 1664, 736, 1551, 0, 771, 0, 0, 0, 0, 0, 0, 939, 0, 0, 1168, 713, 727, 0,
0, 2471, 1064, 2702, 0, 0, 0, 0, 0, 2884, 2254, 1378, 0, 1401, 0, 137, 2891, 0, 1179, 0, 0, 488, 0, 0, 0, 0, 2055, 2141, 0, 427, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 927, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2322, 0, 494, 110, 0, 0, 0, 3014, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1726, 0, 0, 2161, 0, 0, 0, 412, 0, 1366, 1038, 0, 1180, 0, 0, 0, 274, 205, 0, 0, 2602, 2475, 2363, 0, 321, 0, 0, 0,
651, 0, 1667, 408, 0, 0, 0, 0, 0, 0, 90, 0, 0, 772, 0, 0, 326, 0, 0, 1524, 1388, 147, 1398, 0, 0, 1440, 0, 0, 0, 0, 846, 1008,
703, 0, 2857, 1327, 0, 574, 628, 1199, 3028, 0, 0, 0, 1245, 0, 104, 0, 0, 2242, 0, 0, 0, 193, 762, 0, 1474, 910, 0, 0, 0, 882, 316, 0,
0, 0, 0, 0, 0, 0, 376, 1075, 0, 0, 0, 177, 0, 2987, 3202, 1367, 651, 2287, 625, 2816, 414, 513, 0, 0, 0, 360, 0, 0, 0, 2544, 0, 0,
1575, 0, 0, 0, 0, 1115, 0, 0, 596, 0, 594, 0, 0, 2541, 0, 0, 0, 0, 0, 0, 0, 334, 1159, 2744, 0, 697, 0, 0, 3093, 3075, 0, 2294,
0, 0, 0, 772, 0, 1174, 0, 0, 0, 0, 0, 0, 0, 0, 1120, 0, 309, 3124, 0, 0, 1766, 2773, 0, 0, 0, 0, 0, 2615, 0, 0, 0, 0,
0, 0, 0, 2314, 113, 2470, 1583, 3193, 0, 0, 999, 0, 0, 0, 0, 2936, 0, 412, 3090, 0, 1460, 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0,
3191, 0, 806, 0, 2271, 0, 264, 0, 0, 0, 779, 0, 0, 277, 685, 601, 1978, 954, 2940, 1415, 0, 2782, 0, 0, 3142, 454, 0, 0, 433, 0, 0, 0,
0, 1246, 463, 0, 0, 0, 0, 307, 927, 0, 0, 857, 0, 3175, 0, 0, 0, 0, 0, 0, 0, 0, 2246, 2200, 0, 0, 1978, 0, 0, 0, 0, 0,
3017, 0, 1680, 0, 348, 0, 0, 0, 0, 1911, 0, 646, 0, 0, 0, 0, 402, 1098, 690, 0, 0, 0, 0, 0, 0, 0, 1593, 2920, 1333, 129, 0, 0,
1958, 688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 401, 0, 1026, 0, 3171, 525, 0, 934, 0, 2163, 175, 2369, 0, 0, 0, 0, 0, 0, 1919, 0,
1598, 428, 0, 2736, 797, 0, 0, 0, 0, 0, 2979, 0, 0, 3034, 2308, 2611, 0, 0, 0, 149, 304, 0, 0, 538, 96, 0, 1428, 2439, 2615, 252, 584, 0,
388, 0, 563, 2768, 1116, 0, 314, 0, 0, 502, 0, 0, 0, 0, 278, 1983, 1274, 0, 0, 0, 0, 919, 0, 0, 0, 0, 0, 0, 0, 584, 0, 0,
0, 2922, 0, 0, 2985, 1177, 1751, 0, 0, 2555, 164, 1853, 2484, 0, 0, 0, 1369, 2771, 2902, 0, 0, 352, 0, 0, 0, 0, 0, 424, 0, 0, 818, 0,
0, 92, 0, 0, 1188, 977, 859, 3044, 0, 0, 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, 0, 0, 0, 0, 1861, 0, 0, 0, 0, 2037, 884, 0,
0, 0, 0, 506, 1464, 526, 617, 0, 0, 3162, 0, 2282, 0, 465, 1923, 1774, 940, 1403, 899, 1550, 0, 0, 3130, 0, 0, 728, 0, 0, 121, 672, 820, 0,
0, 0, 0, 0, 0, 0, 1453, 0, 1496, 1932, 1834, 0, 0, 0, 1976, 1755, 1932, 3074, 0, 0, 0, 0, 2168, 923, 0, 0, 690, 0, 0, 1109, 838, 91,
0, 3179, 0, 375, 0, 342, 393, 1607, 129, 2309, 0, 0, 2369, 0, 1863, 1555, 1813, 0, 805, 3028, 0, 194, 1589, 0, 0, 1774, 0, 0, 0, 0, 131, 0,
0, 377, 630, 0, 0, 0, 0, 0, 0, 45, 0, 0, 1506, 2540, 2721, 0, 0, 0, 0, 0, 612, 0, 0, 0, 1494, 0, 0, 555, 2769, 0, 2365, 3155,
1347, 842, 0, 76, 2475, 2896, 3192, 0, 1423, 1549, 0, 0, 0, 2718, 1503, 302, 0, 0, 2909, 0, 0, 0, 0, 2813, 0, 640, 0, 2879, 0, 0, 0, 466,
0, 0, 1147, 416, 0, 1428, 0, 414, 2968, 0, 0, 0, 0, 0, 0, 200, 213, 0, 1802, 0, 2281, 20, 0, 0, 1105, 2588, 985, 3119, 0, 0, 0, 0,
0, 0, 0, 550, 2334, 0, 1183, 1545, 1456, 0, 0, 673, 0, 0, 0, 0, 0, 1140, 404, 435, 602, 0, 2753, 848, 0, 0, 1986, 0, 3004, 0, 643, 0,
0, 0, 889, 0, 0, 1001, 254, 0, 0, 0, 0, 0, 3139, 3040, 1271, 1979, 0, 1300, 0, 0, 0, 0, 0, 2533, 1445, 480, 1335, 362, 0, 1233, 529, 0,
0, 0, 0, 0, 840, 1494, 0, 0, 0, 0, 2543, 0, 1087, 0, 0, 0, 0, 0, 184, 0, 0, 828, 0, 13, 2768, 0, 0, 0, 254, 334, 2904, 0,
3207, 0, 0, 0, 0, 890, 727, 2929, 1600, 434, 0, 0, 0, 644, 0, 1277, 0, 0, 0, 0, 0, 0, 1205, 0, 0, 1363, 0, 1992, 3083, 0, 2480, 0,
0, 0, 0, 0, 0, 0, 0, 1765, 1544, 0, 0, 0, 0, 1583, 0, 0, 0, 3169, 0, 0, 2452, 0, 311, 0, 0, 0, 0, 0, 0, 0, 800, 2823,
0, 0, 2597, 0, 1644, 0, 0, 2455, 391, 0, 328, 0, 1556, 1230, 786, 366, 0, 717, 1950, 0, 0, 0, 2713, 1659, 1022, 0, 0, 892, 0, 347, 0, 2889,
0, 2806, 0, 1148, 0, 0, 618, 0, 10, 2687, 1604, 0, 0, 429, 0, 625, 85, 536, 0, 2011, 0, 1234, 0, 0, 0, 246, 0, 128, 0, 0, 586, 828,
0, 0, 944, 0, 0, 0, 630, 2974, 721, 0, 0, 0, 787, 158, 0, 0, 1942, 33, 0, 407, 2011, 1026, 0, 0, 608, 2261, 0, 0, 0, 0, 621, 2127,
0, 2939, 0, 0, 1021, 472, 0, 0, 2735, 0, 2572, 1670, 67, 2969, 144, 1713, 0, 0, 1030, 0, 631, 761, 1032, 1965, 2006, 1457, 0, 0, 0, 0, 0, 1213,
0, 652, 1974, 0, 40, 217, 1106, 0, 0, 832, 874, 2137, 2818, 0, 0, 0, 0, 311, 3073, 1105, 0, 390, 0, 0, 1938, 1763, 2095, 0, 0, 1065, 0, 1818,
0, 1114, 0, 1951, 0, 724, 0, 2484, 560, 0, 2951, 448, 0, 1072, 0, 0, 0, 0, 0, 1434, 0, 188, 0, 0, 0, 1617, 0, 0, 0, 998, 0, 717,
1466, 0, 0, 0, 766, 2167, 0, 0, 0, 2790, 1051, 310, 0, 2243, 1288, 1291, 695, 0, 426, 0, 21, 1485, 1309, 0, 2592, 2962, 908, 0, 784, 0, 1073, 1205,
707, 3175, 0, 600, 0, 0, 0, 0, 0, 0, 779, 160, 2398, 0, 1413, 0, 0, 0, 0, 207, 503, 230, 1422, 0, 0, 0, 1355, 0, 0, 1437, 2853, 0,
0, 0, 0, 0, 0, 60, 0, 519, 0, 0, 0, 0, 0, 1255, 0, 0, 0, 0, 0, 36, 2489, 0, 2874, 1042, 416, 651, 0, 0, 2161, 2759, 610, 0,
0, 673, 0, 0, 3006, 1294, 2677, 0, 0, 0, 205, 0, 548, 0, 0, 355, 0, 0, 0, 0, 0, 0, 0, 0, 1356, 0, 0, 1512, 1333, 0, 0, 649,
2366, 0, 0, 2213, 50, 151, 0, 506, 1341, 2296, 2783, 0, 522, 0, 2712, 0, 0, 0, 0, 0, 0, 500, 0, 0, 3044, 1747, 0, 0, 2457, 0, 0, 0,
2201, 2152, 908, 1529, 987, 0, 0, 0, 0, 0, 1373, 0, 0, 384, 2648, 0, 643, 519, 0, 0, 0, 0, 0, 0, 275, 0, 0, 870, 1531, 0, 1453, 1055,
0, 1430, 0, 0, 2830, 0, 471, 171, 0, 2434, 0, 677, 0, 2998, 0, 1530, 0, 0, 0, 0, 3062, 0, 3074, 0, 953, 0, 0, 0, 1156, 0, 840, 550,
2854, 1423, 1857, 1907, 0, 0, 0, 1568, 0, 0, 0, 0, 0, 179, 293, 0, 0, 1060, 2907, 2024, 0, 606, 0, 0, 2819, 2156, 309, 1841, 774, 0, 315, 3193,
633, 1307, 2711, 1555, 1950, 0, 1335, 2261, 438, 0, 1708, 491, 433, 0, 1224, 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, 783, 3089, 995, 2675, 1405, 0, 0,
1882, 7, 14, 13, 0, 2000, 0, 943, 0, 0, 1606, 901, 0, 0, 2753, 0, 0, 2172, 459, 3082, 1018, 0, 1082, 0, 0, 1040, 968, 0, 0, 1234, 39, 0,
1536, 0, 19, 645, 0, 0, 0, 174, 0, 0, 0, 0, 0, 2134, 0, 3, 0, 0, 558, 769, 469, 0, 1385, 0, 1020, 1853, 0, 1206, 0, 387, 0, 0,
1278, 0, 3108, 827, 797, 806, 0, 1400, 824, 53, 0, 584, 0, 249, 0, 1443, 0, 3031, 702, 412, 0, 1480, 671, 1605, 1280, 877, 183, 0, 0, 0, 0, 0,
1809, 1699, 0, 0, 1769, 2925, 1754, 0, 1467, 2817, 0, 880, 52, 1361, 611, 1417, 0, 249, 137, 0, 0, 0, 1033, 3024, 115, 0, 412, 0, 0, 835, 0, 0,
0, 0, 0, 0, 0, 0, 562, 0, 1503, 0, 0, 0, 2337, 0, 1528, 1481, 0, 1409, 417, 710, 0, 2945, 0, 0, 0, 0, 0, 0, 2735, 0, 1179, 0,
1335, 0, 0, 1150, 1043, 0, 0, 2038, 1531, 0, 0, 0, 660, 1735, 902, 2386, 692, 1583, 1391, 2889, 0, 1161, 0, 958, 0, 3006, 0, 0, 0, 832, 0, 0,
0, 0, 3204, 0, 0, 0, 1235, 0, 1060, 722, 197, 0, 0, 871, 3077, 0, 1869, 579, 0, 931, 1442, 1563, 675, 0, 642, 399, 0, 0, 0, 1474, 0, 0,
0, 676, 2647, 0, 1237, 0, 0, 0, 2958, 265, 2956, 1603, 0, 0, 0, 0, 521, 2053, 0, 1359, 0, 0, 0, 290, 0, 1347, 53, 0, 0, 1538, 3004, 0,
0, 0, 135, 1028, 0, 0, 2518, 3152, 2880, 0, 1423, 2834, 2500, 3034, 0, 0, 1927, 1715, 0, 3133, 0, 0, 3040, 0, 0, 0, 0, 2997, 0, 1066, 0, 0,
0, 1718, 0, 110, 116, 243, 0, 393, 0, 0, 1327, 0, 131, 383, 0, 156, 1580, 54, 0, 0, 541, 2649, 0, 0, 0, 2052, 0, 271, 0, 0, 0, 0,
67, 1846, 374, 1924, 0, 0, 2803, 1831, 0, 0, 0, 2482, 0, 588, 123, 0, 1245, 2525, 0, 1347, 2719, 1301, 1731, 0, 0, 0, 3163, 0, 0, 1234, 1171, 1507,
388, 1524, 0, 0, 0, 938, 1413, 2473, 0, 0, 1796, 878, 1292, 2676, 1043, 0, 0, 0, 1342, 873, 107, 0, 425, 1132, 0, 0, 0, 653, 0, 914, 0, 0,
0, 170, 2579, 0, 518, 0, 2572, 0, 923, 0, 0, 0, 0, 2087, 0, 217, 0, 0, 0, 1426, 593, 1099, 963, 1141, 0, 0, 0, 1475, 2824, 0, 0, 0,
421, 0, 1867, 0, 0, 3124, 1397, 668, 1100, 2221, 1187, 0, 0, 0, 372, 2749, 0, 0, 0, 0, 0, 723, 0, 2213, 2918, 0, 353, 2702, 2303, 647, 1467, 1092,
955, 0, 1523, 0, 2834, 3033, 1616, 1532, 1020, 24, 0, 27, 0, 0, 2535, 69, 793, 227, 0, 1128, 0, 0, 2314, 0, 0, 977, 848, 383, 0, 2071, 1518, 0,
0, 2494, 0, 0, 210, 0, 0, 2898, 0, 0, 0, 0, 0, 2613, 55, 1800, 3001, 928, 0, 0, 0, 110, 0, 0, 0, 931, 0, 1975, 0, 972, 131, 534,
1437, 0, 0, 320, 276, 0, 0, 2034, 444, 0, 1028, 244, 962, 0, 818, 0, 1739, 0, 370, 0, 0, 0, 1800, 27, 0, 844, 129, 0, 0, 0, 2981, 155,
816, 0, 2227, 0, 0, 833, 1343, 0, 0, 0, 0, 2297, 2946, 0, 0, 0, 0, 0, 0, 0, 0, 800, 0, 0, 315, 0, 1891, 0, 0, 548, 2963, 0,
0, 537, 0, 978, 0, 0, 0, 1330, 188, 953, 0, 119, 827, 387, 0, 0, 0, 489, 0, 0, 0, 269, 3117, 0, 886, 889, 0, 1021, 439, 574, 1241, 2946,
1043, 0, 3060, 759, 906, 0, 0, 0, 0, 675, 0, 2288, 2515, 3078, 0, 0, 1317, 0, 895, 698, 0, 0, 0, 1213, 593, 1624, 761, 1405, 0, 0, 0, 0,
605, 0, 811, 1389, 1809, 2682, 0, 0, 228, 0, 0, 0, 0, 0, 1088, 722, 744, 0, 0, 2848, 0, 2670, 0, 54, 0, 1125, 0, 0, 0, 0, 457, 0,
1952, 2904, 0, 1699, 0, 200, 0, 96, 13, 2644, 0, 0, 0, 3091, 0, 756, 0, 0, 504, 0, 928, 540, 1491, 0, 0, 0, 1145, 0, 0, 0, 92, 2864,
0, 0, 957, 322, 3105, 0, 0, 0, 3000, 0, 2, 0, 803, 224, 0, 0, 1036, 0, 148, 0, 1449, 2899, 2437, 0, 344, 540, 0, 19, 2306, 1062, 2138, 0,
27, 0, 0, 0, 0, 0, 709, 0, 0, 318, 2742, 2477, 0, 0, 1312, 18, 1255, 1066, 0, 0, 1900, 729, 0, 334, 667, 0, 92, 0, 981, 182, 747, 0,
0, 3180, 0, 0, 3096, 0, 0, 1073, 0, 785, 0, 1523, 0, 0, 1061, 3182, 398, 53, 761, 849, 0, 1401, 0, 0, 280, 2398, 0, 0, 0, 0, 1451, 2570,
730, 0, 0, 0, 339, 0, 0, 2318, 865, 0, 2875, 2469, 992, 757, 2630, 1846, 0, 841, 0, 0, 0, 1463, 1127, 2842, 0, 1304, 573, 1741, 1532, 0, 65, 0,
0, 611, 0, 0, 0, 0, 3034, 1404, 3165, 2894, 0, 0, 0, 0, 0, 409, 2492, 0, 0, 0, 1755, 756, 1400, 2830, 1363, 1412, 0, 0, 0, 0, 0, 3160,
19, 0, 464, 1177, 0, 0, 0, 0, 2027, 0, 2814, 2260, 1203, 447, 0, 0, 94, 0, 1274, 0, 100, 598, 0, 0, 0, 155, 674, 0, 0, 0, 154, 780,
2143, 226, 403, 0, 565, 854, 0, 333, 2783, 510, 0, 600, 0, 522, 1065, 385, 929, 0, 1597, 2997, 0, 2106, 165, 0, 0, 1495, 444, 0, 1139, 1404, 2574, 1648,
1578, 0, 0, 0, 2814, 0, 0, 550, 0, 1450, 1254, 1218, 1402, 0, 1219, 0, 0, 0, 0, 2660, 1557, 1462, 0, 0, 0, 0, 0, 0, 0, 0, 1565, 0,
0, 550, 2826, 0, 1614, 500, 1427, 0, 976, 0, 0, 0, 0, 0, 1201, 0, 955, 427, 1525, 2986, 1728, 0, 0, 559, 377, 0, 1529, 0, 0, 872, 954, 0,
584, 2189, 1174, 290, 903, 0, 0, 172, 926, 0, 0, 0, 0, 1454, 364, 1353, 0, 0, 49, 20, 0, 1430, 531, 0, 0, 0, 2355, 0, 524, 0, 3079, 31,
397, 1667, 0, 1151, 839, 0, 675, 1743, 0, 1344, 0, 0, 387, 405, 303, 320, 0, 2709, 0, 1307, 0, 2781, 0, 2797, 0, 986, 442, 112, 2436, 2868, 826, 0,
0, 0, 0, 354, 0, 1317, 0, 1246, 0, 124, 1015, 557, 286, 460, 915, 0, 1277, 0, 3022, 0, 2130, 0, 0, 0, 446, 0, 2153, 1656, 0, 0, 1234, 0,
3055, 0, 520, 0, 2296, 2276, 0, 0, 3055, 0, 871, 760, 2909, 0, 443, 0, 0, 95, 885, 0, 2608, 0, 0, 1948, 2947, 1170, 15, 0, 0, 332, 0, 6,
304, 0, 2433, 523, 0, 823, 654, 2695, 0, 409, 1602, 0, 699, 3114, 0, 0, 0, 0, 0, 1365, 0, 3000, 0, 0, 80, 0, 893, 0, 731, 1585, 1162, 1436,
2984, 1050, 1585, 0, 0, 1576, 0, 2016, 0, 0, 19, 290, 0, 2980, 1020, 1221, 0, 936, 1564, 1362, 1007, 1278, 2177, 219, 0, 1949, 2732, 0, 0, 3175, 1096, 316,
738, 0, 2782, 0, 0, 1457, 0, 2734, 1300, 708, 1403, 0, 0, 0, 264, 1498, 0, 0, 0, 1214, 853, 0, 0, 216, 2692, 0, 524, 135, 0, 0, 594, 0,
213, 0, 0, 2687, 0, 840, 1119, 1149, 0, 0, 0, 495, 554, 176, 0, 0, 0, 0, 822, 2791, 0, 1323, 0, 0, 1089, 2420, 534, 0, 0, 967, 968, 0,
3064, 155, 327, 0, 0, 0, 1858, 2597, 0, 1175, 429, 0, 1942, 661, 573, 757, 654, 0, 1050, 0, 1260, 0, 0, 0, 677, 0, 419, 1028, 502, 0, 0, 909,
383, 285, 533, 0, 422, 0, 2567, 0, 0, 2635, 2837, 1099, 0, 0, 0, 831, 299, 79, 0, 0, 2494, 0, 0, 1485, 0, 3119, 1164, 3107, 976, 2359, 0, 0,
0, 1263, 892, 1171, 1953, 0, 1156, 0, 0, 878, 0, 0, 0, 0, 1282, 0, 1183, 2778, 0, 2048, 455, 2015, 0, 0, 887, 811, 0, 1544, 390, 0, 0, 0,
0, 0, 145, 0, 1922, 0, 879, 112, 0, 429, 0, 2857, 0, 0, 1469, 2827, 0, 810, 485, 460, 0, 720, 2589, 600, 0, 0, 2576, 0, 3130, 0, 1144, 1111,
0, 1356, 378, 0, 394, 0, 1202, 755, 0, 1319, 2856, 1104, 0, 263, 0, 0, 0, 1500, 1349, 836, 254, 0, 509, 1711, 0, 2970, 0, 2799, 866, 0, 0, 1393,
1032, 0, 0, 0, 2903, 0, 409, 570, 0, 1565, 2081, 2308, 0, 1070, 0, 0, 0, 2682, 0, 2401, 0, 0, 705, 0, 0, 0, 1042, 1419, 0, 0, 1045, 0,
144, 494, 2750, 150, 0, 0, 1044, 745, 946, 0, 656, 0, 2631, 0, 0, 2623, 2933, 0, 0, 117, 0, 1472, 2464, 1268, 0, 46, 0, 0, 0, 0, 450, 0,
224, 0, 0, 0, 2409, 0, 0, 520, 0, 0, 0, 743, 911, 281, 0, 0, 0, 560, 0, 0, 0, 693, 406, 709, 744, 0, 0, 60, 1420, 1083, 857, 0,
2497, 1066, 2430, 0, 1356, 0, 0, 1018, 0, 3161, 0, 0, 0, 321, 1554, 0, 168, 1248, 1241, 799, 0, 0, 2154, 37, 0, 0, 603, 0, 1100, 0, 0, 0,
635, 161, 2593, 0, 0, 0, 0, 0, 0, 0, 0, 488, 1056, 1475, 0, 729, 831, 367, 1489, 0, 0, 2248, 2984, 0, 0, 0, 0, 265, 123, 0, 2369, 0,
2118, 0, 2627, 1008, 2499, 0, 319, 681, 3184, 15, 215, 0, 1118, 2971, 655, 0, 0, 2201, 0, 1094, 3200, 201, 841, 1898, 0, 0, 0, 0, 3018, 632, 0, 868,
295, 0, 0, 341, 2377, 647, 0, 0, 531, 571, 2024, 2976, 0, 268, 2240, 667, 2832, 0, 2591, 0, 0, 1197, 0, 0, 1028, 0, 0, 0, 770, 30, 2527, 799,
0, 2163, 485, 0, 407, 1446, 0, 2563, 0, 678, 490, 0, 3087, 783, 0, 0, 80, 255, 0, 0, 1315, 0, 0, 0, 1008, 0, 0, 0, 0, 0, 0, 0,
1444, 795, 0, 0, 630, 1185, 921, 1145, 0, 17, 0, 1778, 236, 674, 0, 340, 0, 544, 0, 1593, 311, 1114, 150, 2863, 3079, 407, 0, 0, 0, 2960, 1838, 425,
1471, 0, 202, 3107, 0, 0, 964, 0, 6, 967, 2575, 0, 174, 0, 98, 0, 0, 970, 1860, 653, 0, 163, 0, 0, 2968, 0, 0, 1515, 1019, 224, 0, 0,
851, 3058, 0, 0, 0, 0, 0, 0, 1080, 0, 0, 0, 0, 1126, 614, 0, 0, 707, 0, 0, 878, 0, 12, 1150, 0, 0, 664, 2961, 483, 0, 850, 1505,
0, 1062, 1140, 0, 0, 740, 0, 0, 1074, 0, 3087, 2871, 0, 3052, 40, 2835, 643, 2948, 657, 0, 0, 447, 0, 0, 2159, 754, 324, 0, 0, 3206, 167, 1189,
979, 754, 0, 0, 0, 0, 2563, 1152, 0, 1748, 0, 1407, 0, 296, 903, 1204, 3045, 1233, 642, 0, 1608, 0, 898, 0, 2375, 145, 1446, 0, 2687, 0, 0, 1600,
195, 0, 2718, 0, 0, 0, 2223, 1621, 2631, 1231, 0, 823, 0, 0, 1252, 72, 2197, 824, 0, 211, 0, 582, 1164, 1695, 818, 2658, 249, 922, 0, 0, 199, 266,
3159, 549, 132, 0, 916, 2786, 1056, 831, 0, 3105, 0, 0, 2367, 517, 0, 0, 931, 289, 545, 0, 0, 0, 572, 0, 1600, 2231, 164, 2762, 0, 639, 703, 383,
1210, 0, 633, 443, 0, 0, 1455, 477, 0, 2961, 1399, 2033, 2275, 0, 606, 1198, 0, 775, 2262, 0, 1109, 3159, 0, 0, 0, 0, 554, 0, 0, 0, 0, 0,
0, 3126, 484, 0, 0, 2831, 2157, 803, 0, 1200, 1131, 2217, 1136, 0, 223, 1927, 321, 294, 0, 192, 0, 321, 3108, 291, 765, 0, 725, 2588, 0, 3028, 2490, 0,
946, 0, 0, 1310, 198, 0, 0, 952, 3184, 0, 216, 1157, 0, 461, 1267, 2061, 1556, 0, 2366, 0, 0, 409, 221, 3156, 1225, 1408, 2705, 535, 2628, 705, 833, 0,
3131, 847, 1546, 148, 574, 0, 0, 0, 82, 880, 1495, 1090, 0, 0, 0, 2423, 1493, 1030, 0, 0, 0, 3056, 1803, 479, 164, 1224, 0, 1488, 0, 2977, 797, 1223,
3182, 0, 34, 2212, 2439, 2304, 0, 2504, 0, 0, 39, 766, 0, 3200, 157, 241, 1198, 2277, 920, 506, 1383, 558, 946, 0, 2423, 0, 562, 1979, 1709, 592, 127, 754,
0, 0, 0, 1763, 0, 1148, 1564, 0, 0, 0, 0, 142, 1164, 3076, 722, 0, 1363, 595, 122, 173, 0, 0, 2701, 1418, 1536, 517, 0, 2204, 0, 0, 325, 0,
1899, 0, 1103, 0, 1099, 0, 406, 0, 0, 3084, 0, 0, 30, 352, 0, 391, 0, 1777, 0, 0, 0, 1360, 0, 0, 642, 131, 1337, 0, 1171, 908, 0, 0,
556, 373, 0, 644, 0, 1557, 0, 31, 2704, 418, 0, 0, 0, 0, 1101, 472, 1999, 0, 1202, 0, 0, 2558, 496, 377, 610, 139, 896, 0, 298, 0, 1185, 0,
3099, 972, 327, 0, 2921, 338, 1985, 378, 0, 2580, 0, 0, 0, 2416, 0, 1107, 0, 668, 297, 1773, 0, 0, 0, 0, 3197, 0, 803, 3157, 0, 0, 901, 3035,
1622, 2991, 1057, 185, 1130, 172, 1320, 0, 0, 2384, 0, 1544, 2126, 403, 2522, 0, 3147, 1211, 0, 0, 1486, 0, 0, 1113, 0, 267, 0, 0, 0, 1921, 0, 0,
2050, 0, 1385, 0, 296, 2758, 0, 140, 1324, 2812, 754, 275, 1142, 354, 0, 0, 1293, 0, 121, 1346, 2100, 0, 0, 0, 0, 3086, 3002, 1318, 0, 545, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 2964, 94, 206, 703, 0, 0, 2435, 0, 104, 3048, 2323, 186, 0, 0, 0, 2822, 0, 619, 0, 0, 418, 0, 391,
0, 2225, 0, 682, 0, 269, 0, 860, 1295, 0, 2811, 940, 0, 0, 1070, 3207, 964, 2059, 796, 0, 0, 903, 1274, 2016, 1174, 65, 0, 718, 0, 568, 1080, 0,
1411, 343, 1107, 3117, 606, 1011, 1260, 86, 1061, 976, 1172, 0, 0, 0, 84, 0, 2813, 0, 0, 0, 2482, 0, 237, 0, 2786, 3029, 0, 2206, 1258, 1211, 1153, 0,
2984, 200, 1075, 1545, 0, 0, 247, 0, 0, 0, 0, 3089, 178, 1540, 0, 1877, 94, 0, 0, 0, 2373, 2980, 0, 0, 1146, 0, 2907, 0, 0, 1527, 0, 250,
1105, 0, 9, 633, 0, 0, 275, 0, 1534, 913, 1069, 0, 0, 0, 2983, 0, 0, 0, 0, 1058, 0, 2818, 0, 826, 0, 0, 1507, 369, 807, 0, 0, 0,
2394, 0, 0, 0, 723, 910, 601, 32, 2572, 139, 0, 0, 2496, 0, 1611, 1326, 989, 276, 2059, 1084, 288, 345, 1483, 244, 1138, 2383, 1837, 2474, 0, 0, 0, 548,
0, 1089, 0, 1477, 3082, 0, 3140, 0, 431, 1015, 1164, 0, 0, 951, 1267, 175, 0, 0, 295, 1406, 2462, 2250, 1260, 268, 1387, 0, 192, 2254, 0, 0, 1371, 0,
0, 355, 2565, 0, 0, 0, 104, 862, 0, 0, 377, 2114, 510, 0, 0, 1227, 91, 1428, 1077, 710, 0, 575, 0, 0, 1039, 806, 428, 1450, 1054, 838, 1118, 475,
2033, 1316, 1445, 269, 1266, 307, 741, 2569, 0, 0, 0, 0, 1009, 1522, 0, 1977, 0, 0, 0, 1298, 1029, 528, 0, 0, 479, 2412, 1195, 630, 2349, 280, 0, 2878,
2837, 422, 440, 1539, 1398, 739, 1206, 2488, 0, 0, 210, 0, 1502, 0, 2721, 2608, 2840, 943, 2001, 2729, 624, 999, 117, 901, 483, 2563, 0, 805, 152, 1489, 1230, 0,
717, 944, 2259, 2911, 652, 10, 226, 0, 0, 2224, 3104, 535, 0, 1125, 2805, 3203, 0, 994, 826, 0, 1129, 1034, 0, 1502, 2314, 0, 397, 1894, 515, 0, 1080, 888,
2804, 0, 3200, 572, 0, 352, 1523, 2722, 553, 0, 2357, 0, 1120, 1514, 0, 0, 752, 0, 2409, 0, 0, 0, 0, 439, 1102, 516, 2678, 1869, 0, 327, 890, 161,
0, 0, 582, 2827, 237, 736, 616, 771, 0, 0, 3150, 0, 0, 0, 1886, 3011, 0, 0, 0, 1524, 702, 1548, 944, 2834, 73, 0, 0, 2010, 0, 150, 0, 0,
2106, 1495, 2163, 515, 633, 672, 0, 0, 177, 0, 3161, 767, 681, 0, 2564, 802, 519, 868, 0, 1348, 739, 895, 2340, 929, 387, 0, 398, 396, 0, 0, 1683, 201,
0, 0, 2758, 0, 2874, 769, 653, 0, 751, 0, 2778, 0, 577, 825, 0, 0, 0, 0, 0, 1283, 279, 837, 0, 1111, 1407, 0, 0, 0, 1198, 859, 2059, 700,
0, 1544, 919, 0, 0, 0, 0, 2860, 1026, 2079, 1452, 0, 0, 0, 0, 0, 0, 0, 1744, 2010, 2351, 128, 438, 1010, 894, 0, 0, 1252, 2415, 1212, 1066, 0,
538, 1144, 0, 0, 0, 2597, 2440, 0, 0, 1064, 0, 0, 0, 779, 353, 0, 586, 797, 910, 2784, 3011, 2435, 58, 1053, 2021, 54, 0, 274, 0, 176, 0, 253,
2571, 0, 759, 2543, 1000, 295, 162, 0, 1548, 0, 1613, 0, 0, 1141, 1886, 0, 0, 0, 0, 560, 1530, 0, 0, 3106, 1330, 1405, 1114, 2217, 0, 1008, 3133, 802,
958, 2240, 836, 0, 0, 0, 0, 2605, 0, 446, 0, 788, 1659, 1592, 0, 3153, 2858, 0, 1541, 1434, 947, 0, 0, 547, 630, 0, 0, 2943, 0, 0, 0, 569,
1472, 0, 1497, 0, 596, 0, 0, 0, 0, 0, 3147, 0, 429, 0, 778, 0, 236, 864, 0, 0, 0, 0, 309, 1308, 2879, 0, 0, 0, 620, 0, 1093, 0,
517, 350, 1448, 1609, 2924, 0, 924, 0, 3106, 0, 1297, 2117, 0, 0, 1354, 1305, 125, 683, 0, 1026, 2743, 0, 781, 94, 1493, 1089, 1469, 0, 1622, 1940, 0, 447,
2684, 2562, 0, 0, 0, 140, 866, 1504, 0, 2915, 0, 0, 0, 0, 0, 1355, 128, 641, 0, 746, 0, 0, 1356, 335, 336, 0, 0, 0, 0, 499, 308, 1114,
97, 196, 0, 392, 484, 0, 0, 0, 380, 0, 0, 596, 1252, 0, 1698, 267, 0, 0, 757, 0, 0, 1358, 3198, 2122, 123, 915, 2951, 1088, 0, 0, 474, 1311,
2934, 0, 1013, 0, 3137, 1308, 0, 1359, 1315, 165, 0, 1420, 0, 0, 1410, 0, 229, 0, 1244, 740, 3016, 2603, 1362, 952, 1856, 0, 0, 597, 0, 0, 0, 0,
0, 234, 2902, 0, 1573, 0, 0, 1455, 3126, 531, 767, 3132, 935, 0, 0, 1220, 514, 2622, 0, 715, 916, 0, 0, 0, 1452, 17, 2435, 0, 687, 2183, 1335, 0,
0, 287, 1014, 3061, 0, 0, 2294, 0, 702, 0, 707, 978, 2462, 2758, 1124, 1650, 661, 682, 228, 0, 0, 0, 941, 0, 0, 1455, 2370, 2193, 483, 1432, 1058, 1954,
280, 0, 0, 919, 0, 2510, 1595, 83, 1729, 0, 815, 1011, 2545, 59, 0, 845, 940, 672, 0, 0, 772, 0, 90, 0, 234, 0, 1229, 0, 731, 1136, 0, 512,
0, 0, 20, 1392, 956, 1447, 254, 0, 0, 255, 0, 0, 0, 1608, 0, 0, 480, 0, 317, 0, 0, 12, 0, 1432, 0, 1157, 291, 1002, 58, 0, 0, 3088,
198, 679, 0, 260, 2618, 0, 215, 1533, 0, 0, 0, 0, 509, 0, 111, 975, 0, 293, 364, 0, 765, 0, 2422, 0, 0, 343, 487, 0, 0, 2178, 0, 0,
645, 0, 0, 278, 1189, 0, 0, 0, 0, 0, 2087, 0, 0, 0, 1487, 2687, 120, 1417, 690, 725, 2661, 851, 0, 1090, 461, 1897, 0, 2918, 2692, 0, 0, 0,
0, 546, 0, 0, 1508, 331, 615, 0, 2529, 1373, 89, 508, 78, 0, 267, 0, 2782, 0, 0, 84, 1579, 3081, 0, 0, 0, 2505, 0, 0, 395, 478, 0, 0,
797, 0, 613, 843, 995, 1339, 1439, 2847, 299, 2962, 867, 0, 0, 0, 0, 1739, 3136, 0, 0, 993, 1304, 1099, 0, 0, 408, 0, 1496, 0, 1325, 1091, 285, 626,
490, 2822, 49, 0, 533, 3131, 1323, 0, 1485, 717, 0, 1895, 1006, 367, 639, 1411, 1459, 0, 1180, 1456, 550, 456, 0, 0, 1182, 0, 0, 0, 321, 1423, 1381, 82,
961, 0, 647, 0, 0, 1166, 1734, 1121, 980, 3028, 122, 545, 366, 938, 220, 1197, 126, 1462, 0, 0, 0, 0, 0, 1253, 269, 2819, 0, 971, 852, 231, 3088, 3169,
0, 2037, 0, 166, 433, 0, 0, 0, 0, 988, 1618, 2576, 289, 475, 0, 0, 1310, 1275, 0, 2446, 2797, 9, 0, 0, 1074, 785, 3207, 386, 0, 1310, 0, 473,
596, 0, 255, 1352, 1212, 700, 0, 0, 0, 701, 873, 1194, 1246, 355, 66, 0, 0, 1963, 0, 0, 1060, 283, 0, 0, 521, 814, 2817, 2769, 409, 0, 742, 506,
0, 0, 1086, 0, 0, 1623, 0, 2542, 593, 1030, 0, 218, 489, 615, 2069, 1836, 0, 0, 3074, 0, 2333, 719, 530, 0, 0, 1565, 0, 0, 459, 0, 367, 3135,
0, 981, 0, 24, 108, 1516, 1098, 0, 896, 866, 0, 867, 456, 3060, 632, 0, 1601, 1046, 2334, 3185, 142, 601, 260, 233, 0, 0, 439, 214, 714, 1102, 0, 582,
762, 0, 0, 0, 0, 370, 466, 3142, 1240, 0, 0, 0, 868, 0, 142, 455, 0, 0, 1182, 125, 130, 777, 1161, 776, 0, 1665, 673, 2209, 3088, 2395, 902, 2312,
3019, 0, 2770, 0, 424, 711, 1326, 0, 0, 741, 853, 0, 631, 2839, 2022, 0, 0, 1433, 0, 198, 41, 116, 2806, 1231, 1122, 1545, 0, 2837, 632, 0, 1707, 0,
315, 2894, 35, 752, 1415, 282, 1135, 0, 2128, 1183, 0, 262, 726, 0, 0, 2150, 0, 0, 2100, 0, 0, 763, 0, 0, 0, 491, 154, 1161, 2678, 1299, 2738, 0,
0, 187, 608, 3192, 3090, 319, 995, 0, 0, 702, 954, 3077, 27, 0, 1311, 0, 2135, 0, 0, 0, 0, 0, 0, 0, 468, 33, 0, 0, 0, 0, 0, 0,
1239, 0, 1236, 314, 656, 660, 1467, 936, 905, 856, 1446, 1226, 0, 542, 842, 307, 894, 305, 490, 0, 978, 747, 374, 2062, 2364, 730, 0, 0, 0, 0, 151, 1520,
2486, 0, 1582, 3099, 238, 1058, 1682, 0, 55, 0, 2201, 708, 0, 25, 40, 1461, 1665, 0, 825, 0, 446, 1598, 2155, 505, 2116, 3111, 0, 0, 0, 0, 1177, 0,
1187, 57, 568, 783, 285, 0, 152, 793, 0, 511, 1275, 0, 1210, 1352, 303, 1602, 861, 2000, 840, 2769, 1374, 320, 997, 932, 1555, 1193, 13, 0, 325, 1991, 323, 0,
41, 59, 0, 1500, 1134, 705, 0, 0, 338, 200, 80, 194, 0, 649, 0, 2708, 0, 2974, 1281, 0, 0, 1239, 109, 770, 3180, 0, 535, 0, 0, 2743, 1699, 762,
0, 2487, 2413, 0, 0, 0, 0, 0, 20, 513, 2748, 1571, 1534, 2088, 2009, 0, 0, 0, 0, 1264, 0, 404, 1262, 1024, 306, 0, 197, 412, 2275, 1291, 0, 2523,
64, 813, 0, 0, 2475, 81, 149, 1690, 2795, 1363, 2989, 2227, 2597, 116, 0, 1480, 45, 0, 1428, 0, 1540, 335, 257, 1841, 0, 828, 653, 1110, 289, 2528, 892, 0,
0, 0, 944, 0, 0, 0, 460, 1336, 427, 0, 0, 1435, 0, 0, 0, 0, 0, 939, 1345, 190, 1891, 0, 0, 472, 0, 0, 0, 2161, 0, 0, 0, 1283,
0, 0, 0, 2368, 0, 2274, 0, 893, 2374, 0, 997, 0, 2799, 0, 904, 2494, 880, 627, 279, 601, 1163, 506, 81, 129, 20, 0, 600, 2876, 846, 779, 0, 236,
1026, 411, 0, 0, 0, 1143, 675, 1814, 0, 1074, 1332, 2656, 0, 0, 1424, 0, 224, 0, 0, 1411, 1708, 0, 498, 251, 2594, 2123, 262, 3052, 358, 0, 1276, 284,
4, 0, 2904, 1477, 1299, 2960, 0, 99, 0, 0, 0, 1407, 3064, 160, 0, 1452, 2924, 952, 707, 1416, 442, 0, 0, 0, 0, 0, 517, 0, 2839, 1035, 513, 2324,
2804, 2099, 0, 306, 948, 0, 1470, 0, 3030, 3202, 0, 2732, 0, 1260, 1195, 453, 0, 3092, 1199, 1105, 1101, 1373, 215, 1348, 1090, 0, 2831, 886, 631, 0, 0, 0,
471, 1017, 682, 0, 0, 0, 2620, 0, 1882, 0, 0, 911, 3062, 0, 838, 0, 1308, 2, 258, 579, 78, 0, 0, 2934, 0, 0, 1992, 0, 1075, 0, 0, 0,
2437, 68, 0, 0, 1027, 256, 580, 507, 546, 912, 245, 0, 0, 777, 1104, 1463, 0, 3120, 1055, 2680, 0, 0, 0, 0, 1811, 0, 2396, 1196, 0, 1043, 0, 2836,
970, 0, 0, 1945, 854, 1149, 0, 1343, 687, 0, 1329, 657, 0, 360, 0, 0, 373, 3173, 0, 2750, 269, 2658, 1526, 2918, 1559, 1426, 0, 2025, 990, 726, 0, 0,
0, 0, 2813, 1591, 2489, 0, 0, 2128, 648, 0, 1637, 0, 0, 1522, 2337, 0, 226, 0, 364, 0, 0, 3201, 363, 0, 0, 0, 0, 0, 149, 1038, 0, 0,
758, 2281, 708, 0, 103, 0, 2878, 1443, 0, 2074, 3200, 0, 0, 0, 0, 316, 295, 430, 507, 1232, 2367, 336, 911, 561, 0, 1027, 3046, 45, 0, 454, 1767, 0,
0, 461, 473, 0, 286, 3107, 0, 2850, 1451, 0, 128, 0, 186, 0, 0, 0, 903, 748, 887, 949, 0, 0, 0, 1015, 0, 1632, 984, 2941, 489, 173, 1549, 0,
0, 2551, 1109, 330, 1214, 0, 0, 0, 0, 1081, 1833, 0, 0, 0, 107, 833, 0, 602, 622, 2971, 2371, 549, 0, 2256, 509, 55, 45, 217, 1648, 0, 0, 405,
330, 658, 0, 2260, 0, 0, 940, 321, 507, 0, 1909, 1419, 0, 361, 1389, 1130, 2840, 324, 35, 0, 0, 0, 0, 2751, 185, 0, 2848, 0, 0, 0, 0, 2118,
77, 0, 2427, 0, 0, 0, 0, 1173}; 273, 1398, 0, 0, 697, 0, 1151, 199, 330, 1983, 294, 2845, 0, 262, 1584, 2080,
0, 0, 0, 0, 1425, 0, 324, 1161, 0, 371, 327, 1214, 428, 1314, 2901, 805,
0, 180, 331, 160, 101, 0, 0, 132, 2721, 176, 0, 881, 0, 0, 1986, 621,
0, 144, 3011, 0, 34, 0, 979, 61, 1322, 0, 0, 0, 44, 1197, 192, 772,
1490, 0, 2397, 0, 2559, 0, 675, 2070, 1072, 829, 0, 0, 0, 2587, 0, 2004,
1149, 411, 2956, 1118, 1052, 646, 0, 0};
int MangledHashG(const char *key, const int *T) int MangledHashG(const char *key, const int *T)
{ {
...@@ -255,30 +255,26 @@ int MangledPerfectHash(const char *key) ...@@ -255,30 +255,26 @@ int MangledPerfectHash(const char *key)
return (MangledHashG(key, mangledkT1) + MangledHashG(key, mangledkT2)) % 3208; return (MangledHashG(key, mangledkT1) + MangledHashG(key, mangledkT2)) % 3208;
} }
constexpr int unmangledkT1[] = {285, 346, 333, 258, 66, 132, 43, 79, 285, 59, 149, 22, 325, constexpr int unmangledkT1[] = {249, 268, 237, 143, 100, 53, 77, 99, 153, 196, 268, 119, 234,
301, 223, 334, 172, 84, 66, 242, 91, 132, 80, 231, 269, 334}; 218, 139, 142, 2, 98, 160, 173, 114, 214, 22, 46, 268, 9};
constexpr int unmangledkT2[] = {164, 118, 124, 168, 214, 55, 234, 346, 248, 200, 181, 9, 62, constexpr int unmangledkT2[] = {44, 159, 153, 267, 220, 238, 250, 184, 272, 262, 61, 213, 258,
284, 229, 292, 208, 216, 282, 186, 221, 2, 283, 336, 81, 207}; 149, 267, 118, 156, 254, 128, 97, 89, 159, 113, 184, 215, 101};
constexpr int unmangledkG[] = { constexpr int unmangledkG[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, 0, 230, 0, 0, 0, 0, 193, 273,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 67, 0, 0, 0, 0, 76, 202, 0, 0, 0, 0, 0, 161, 0, 0, 0, 78, 0, 0, 0, 0, 161, 193,
106, 0, 0, 197, 0, 146, 299, 0, 0, 0, 89, 0, 0, 344, 121, 0, 0, 0, 0, 0, 0, 231, 227, 0, 0, 0, 0, 0, 41, 0, 153, 42, 0, 86, 32, 0, 123, 90,
0, 73, 58, 0, 0, 136, 0, 0, 105, 145, 349, 0, 0, 0, 0, 0, 0, 0, 52, 0, 192, 0, 0, 94, 0, 93, 0, 0, 0, 0, 0, 0, 0, 63, 0, 156, 70, 184,
51, 118, 274, 280, 89, 335, 38, 0, 0, 27, 16, 0, 297, 0, 0, 42, 0, 0, 0, 64, 0, 189, 203, 274, 0, 184, 250, 0, 128, 0, 252, 180, 224, 0, 134, 116, 262, 0,
0, 0, 0, 0, 295, 0, 57, 10, 0, 147, 0, 0, 39, 0, 0, 58, 0, 0, 57, 75, 0, 0, 208, 155, 46, 0, 99, 100, 264, 38, 0, 193, 166, 31, 21, 129, 243, 140,
0, 111, 337, 23, 141, 0, 128, 256, 13, 0, 300, 0, 0, 135, 315, 179, 0, 0, 55, 206, 0, 18, 148, 214, 193, 114, 155, 0, 146, 0, 75, 128, 0, 244, 135, 0, 173, 105,
150, 27, 0, 0, 340, 31, 0, 0, 0, 97, 62, 0, 69, 0, 17, 171, 0, 85, 61, 0, 255, 0, 251, 86, 125, 73, 0, 132, 160, 159, 0, 225, 137, 109, 20, 96, 0, 0,
0, 0, 0, 43, 0, 0, 0, 305, 0, 40, 0, 96, 0, 0, 0, 0, 293, 8, 93, 102, 0, 0, 165, 0, 0, 47, 0, 0, 199, 101, 143, 108, 0, 144, 0, 0, 42, 0,
0, 0, 0, 0, 21, 99, 158, 57, 0, 114, 261, 0, 120, 0, 0, 0, 0, 81, 0, 118, 266, 0, 104, 222, 0, 0, 0, 131, 176, 138, 0, 0, 274, 95, 251, 182, 0, 129,
88, 319, 38, 0, 341, 0, 245, 260, 0, 159, 0, 0, 36, 0, 0, 0, 265, 0, 0, 0, 5, 105, 249, 0, 0, 69, 0, 0, 62, 152, 0, 0, 201, 167, 15, 0, 238, 0,
0, 0, 11, 0, 0, 0, 0, 0, 151, 195, 0, 132, 82, 209, 0, 0, 0, 100, 129, 0, 201, 100, 202, 0, 272, 275, 163, 87, 163, 142, 64, 63, 250, 0, 273, 107, 163, 157,
132, 0, 0, 0, 16, 0, 32, 337, 123, 72, 29, 0, 257, 78, 20, 130, 0, 80, 0, 198, 113, 8, 0, 0, 110, 233, 0, 0, 34, 104, 191, 262, 178, 123, 49, 13, 19, 91,
0, 20, 0, 5, 0, 87, 0, 39, 317, 14, 0, 162, 0, 33, 0, 310, 29, 0, 0, 41, 45, 278, 52, 154, 0, 0, 0, 0, 178, 27, 0, 110, 0, 31, 23, 196, 212, 0,
122, 330, 0, 75, 0, 15, 99, 96, 100, 67, 319, 47, 114, 91, 27, 0, 0, 0, 0, 0, 68, 0, 142, 267, 153, 79, 52, 179, 114, 94, 0, 0};
0, 134, 303, 118, 133, 341, 0, 0, 0, 0, 0, 131, 0, 0, 334, 60, 113, 138, 0,
0, 168, 311, 0, 294, 0, 233, 81, 0, 0, 0, 345, 150, 23, 0, 116, 0, 27, 26,
142, 0, 0, 0, 31, 137, 170, 341, 83, 346, 18, 266, 21, 0, 4, 28, 30, 107, 0,
0, 102, 14, 0, 290, 17, 344, 0, 119, 0, 0};
int UnmangledHashG(const char *key, const int *T) int UnmangledHashG(const char *key, const int *T)
{ {
...@@ -287,7 +283,7 @@ int UnmangledHashG(const char *key, const int *T) ...@@ -287,7 +283,7 @@ int UnmangledHashG(const char *key, const int *T)
for (int i = 0; key[i] != '\0'; i++) for (int i = 0; key[i] != '\0'; i++)
{ {
sum += T[i] * key[i]; sum += T[i] * key[i];
sum %= 353; sum %= 279;
} }
return unmangledkG[sum]; return unmangledkG[sum];
} }
...@@ -297,7 +293,7 @@ int UnmangledPerfectHash(const char *key) ...@@ -297,7 +293,7 @@ int UnmangledPerfectHash(const char *key)
if (strlen(key) > 26) if (strlen(key) > 26)
return 0; return 0;
return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 353; return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 279;
} }
} // namespace } // namespace
......
...@@ -24,298 +24,298 @@ std::ostream &operator<<(std::ostream &os, const sh::ImmutableString &str) ...@@ -24,298 +24,298 @@ std::ostream &operator<<(std::ostream &os, const sh::ImmutableString &str)
namespace namespace
{ {
constexpr int mangledkT1[] = {3739, 1631, 2789, 3000, 1313, 1833, 2647, 2265, 4243, 3275, constexpr int mangledkT1[] = {1888, 2201, 3289, 4099, 2901, 1271, 747, 2683, 1761, 343,
388, 3099, 2680, 2382, 1469, 3517, 4113, 1467, 2188, 3241, 3222, 1316, 1508, 3696, 1896, 3255, 3463, 226, 1192, 2360,
3443, 3499, 3370, 4109, 1589, 936, 1009, 2094, 714, 2729, 3131, 2856, 731, 1833, 362, 3777, 1563, 811, 24, 1643,
1131, 512, 2199, 2280, 3218, 4074, 983, 595, 997, 3186}; 4057, 1674, 4003, 1264, 35, 4299, 3725, 656, 3730, 1580};
constexpr int mangledkT2[] = {1278, 2599, 3960, 322, 3743, 3174, 3743, 4020, 3366, 3013, constexpr int mangledkT2[] = {3077, 2281, 2698, 1599, 4129, 1937, 298, 4024, 2022, 1682,
428, 2584, 153, 1976, 382, 2752, 147, 3332, 3015, 381, 2301, 357, 642, 1898, 3243, 2527, 364, 1671, 2441, 3982,
593, 4320, 2140, 2563, 411, 3650, 4300, 3733, 2052, 570, 924, 3750, 2979, 828, 2934, 2541, 2369, 557, 3564, 3320,
3398, 1746, 2534, 14, 1119, 2620, 140, 2374, 4039, 744}; 4253, 3872, 1318, 605, 3381, 2622, 1467, 2787, 4008, 3439};
constexpr int mangledkG[] = { constexpr int mangledkG[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1753, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 3743, 0, 1142, 4406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 486, 0, 2571, 0, 0, 0, 0, 0, 0, 0, 0, 1355, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 4057, 4358, 0, 0, 0, 2120, 0, 0, 0, 0, 0, 0, 2193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1158, 2155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3739, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 542, 0, 0, 0, 469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 841, 3728, 0, 0, 0, 3555, 0, 0, 4167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4377, 0, 0, 2790, 0, 1419,
0, 0, 0, 0, 0, 0, 606, 0, 0, 3503, 1148, 0, 2175, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, 627, 0, 0, 2149, 0, 0, 0, 0, 161,
0, 4395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3699, 0, 0, 0, 0,
4044, 1358, 173, 0, 0, 0, 0, 0, 0, 2895, 0, 0, 37, 1119, 768, 0, 0, 0, 20, 0, 4081, 0, 0, 3359, 0, 0, 0, 0, 2198, 0, 3804, 0,
0, 0, 3246, 0, 0, 0, 0, 3146, 164, 0, 0, 1169, 877, 1436, 0, 4032, 0, 339, 0, 3532, 0, 0, 0, 2703, 0, 0, 0, 0, 0, 0, 0, 0,
919, 0, 0, 0, 0, 0, 0, 0, 286, 0, 0, 0, 0, 0, 0, 4398, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 2907, 0, 0,
1858, 4128, 0, 0, 0, 0, 0, 0, 4194, 0, 1143, 0, 0, 0, 580, 0, 0, 0, 2776, 0, 0, 0, 0, 0, 0, 0, 0, 2815, 4211, 0, 0, 0,
0, 0, 0, 0, 0, 3421, 0, 0, 0, 0, 0, 0, 130, 1535, 3354, 0, 0, 0, 0, 0, 379, 1076, 0, 803, 0, 0, 0, 3831, 0, 533, 3698, 0,
0, 0, 0, 0, 0, 0, 1738, 0, 3458, 0, 0, 0, 1370, 0, 2618, 0, 0, 0, 1620, 0, 0, 1409, 0, 0, 0, 0, 0, 0, 1382, 0, 0, 0,
1315, 269, 0, 0, 0, 4394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4507, 0, 3481, 0, 0, 0, 0, 0, 0, 0, 4180, 0, 0, 0,
4021, 0, 0, 0, 1722, 0, 2988, 0, 4339, 0, 0, 1113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2874, 0, 0,
0, 0, 2554, 0, 0, 4468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, 4048, 0, 0, 1411, 696, 0, 0,
0, 3714, 1688, 0, 0, 3841, 3690, 0, 0, 0, 1154, 0, 0, 0, 0, 0, 0, 0, 1074, 0, 0, 0, 0, 3020, 0, 0, 0, 1998, 0, 0, 0, 0,
0, 0, 2734, 0, 368, 1579, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1020, 0, 989, 0, 1517, 0, 0, 1585, 0, 0, 144, 0, 1726, 0, 0,
0, 0, 0, 1085, 186, 0, 0, 0, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1963, 1033, 3939, 0, 0, 0, 4210, 0, 0,
0, 600, 2260, 0, 640, 0, 0, 0, 0, 0, 0, 0, 2698, 0, 0, 0, 0, 2000, 0, 2650, 0, 0, 0, 0, 0, 0, 0, 2014, 0, 0, 0, 0,
0, 4327, 0, 0, 0, 0, 0, 0, 0, 207, 0, 4125, 0, 0, 0, 2080, 0, 1629, 0, 0, 4472, 0, 0, 0, 0, 0, 0, 0, 0, 4340, 3259, 0,
0, 0, 2581, 1845, 0, 817, 2195, 0, 0, 2013, 0, 0, 0, 3529, 0, 0, 0, 0, 769, 0, 3612, 0, 86, 2744, 0, 0, 0, 742, 2877, 0, 2927, 0,
0, 0, 0, 0, 726, 647, 0, 2765, 1247, 0, 0, 3232, 0, 0, 0, 0, 0, 0, 291, 0, 1762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 3289, 0, 0, 4236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3695, 0, 852, 0, 0, 0, 954, 2381, 0, 496, 0, 0, 0, 0,
0, 0, 843, 0, 0, 0, 0, 0, 0, 652, 0, 0, 1669, 0, 0, 370, 0, 2876, 1498, 1718, 0, 0, 0, 1470, 0, 2919, 0, 0, 0, 0, 3949, 0,
4237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4517, 2240, 0, 0, 0, 0, 91, 4394, 4469, 0, 0, 0, 0, 0, 0, 0, 215, 0,
0, 0, 0, 0, 0, 0, 0, 740, 0, 2759, 3799, 4366, 0, 0, 0, 0, 0, 0, 526, 0, 0, 3164, 3081, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 3912, 479, 0, 0, 0, 0, 0, 4518, 0, 0, 0, 2717, 0, 0, 0, 0, 4429, 0, 3760, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0,
692, 0, 0, 0, 570, 0, 3639, 0, 0, 3926, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1281, 0, 0, 0, 0, 0, 3536, 0, 0,
2397, 1547, 1232, 0, 0, 2937, 1518, 0, 0, 0, 1222, 0, 2813, 0, 0, 2324, 0, 0, 1397, 0, 0, 0, 0, 0, 1772, 0, 0, 556, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 860, 0, 3950, 0, 0, 2826, 0, 0, 0, 0, 369, 1419, 0, 0, 700, 0, 0, 1517, 0, 0, 0, 0, 331, 0, 3449,
0, 0, 0, 925, 0, 0, 0, 1598, 0, 0, 0, 0, 227, 0, 0, 0, 1560, 4, 0, 0, 1861, 3457, 0, 0, 0, 0, 0, 0, 1232, 0, 0, 0,
0, 3468, 0, 0, 0, 0, 120, 1162, 2435, 387, 0, 0, 0, 0, 0, 0, 0, 0, 4005, 0, 4048, 0, 0, 0, 0, 0, 0, 0, 0, 2114, 0, 0,
0, 308, 0, 0, 0, 0, 0, 2650, 0, 0, 3881, 0, 4091, 0, 0, 501, 0, 0, 0, 1997, 1386, 0, 0, 0, 0, 3545, 0, 4236, 0, 0, 0, 0,
0, 0, 3368, 0, 0, 0, 4093, 0, 0, 0, 0, 0, 0, 934, 0, 0, 0, 0, 1008, 1013, 0, 3802, 1314, 1472, 0, 0, 0, 0, 1380, 2264, 0, 0,
0, 0, 2157, 0, 1082, 0, 0, 0, 1021, 3875, 0, 253, 0, 0, 140, 0, 1575, 573, 1572, 0, 0, 4297, 0, 0, 1801, 3658, 0, 0, 0, 0, 0, 0,
0, 1903, 0, 0, 0, 0, 2137, 1473, 0, 0, 461, 0, 0, 0, 3575, 0, 269, 0, 0, 0, 1070, 1761, 0, 1061, 0, 0, 0, 124, 0, 0, 0, 2598,
0, 958, 0, 0, 789, 0, 0, 3195, 0, 0, 0, 3853, 0, 2074, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 919, 1879, 0, 0, 0, 0, 0, 0,
0, 1681, 0, 0, 0, 1623, 982, 0, 0, 4204, 0, 0, 0, 0, 0, 0, 1983, 0, 0, 0, 4007, 4004, 0, 0, 1983, 1464, 2556, 3126, 0, 0, 0, 0,
926, 4075, 1657, 0, 0, 1534, 0, 0, 742, 3347, 0, 2568, 0, 0, 0, 0, 0, 0, 0, 0, 3649, 1472, 813, 0, 0, 0, 0, 737, 0, 0, 257, 3627,
3836, 0, 718, 3974, 3474, 0, 3682, 3367, 1057, 0, 0, 0, 0, 0, 567, 0, 0, 2613, 967, 0, 2630, 3309, 0, 0, 579, 0, 0, 0, 0, 0, 576, 0,
0, 753, 0, 1333, 0, 0, 4057, 0, 0, 0, 0, 291, 4398, 0, 0, 3324, 0, 0, 410, 0, 0, 0, 0, 0, 0, 1156, 0, 0, 0, 0, 1429, 0,
1344, 0, 0, 0, 1107, 0, 0, 0, 3756, 2315, 3176, 2972, 0, 0, 0, 0, 3859, 487, 0, 0, 0, 2969, 0, 0, 0, 0, 0, 1589, 3606, 747, 1853, 0,
0, 1958, 1448, 0, 2941, 2, 0, 225, 3233, 0, 2946, 0, 3610, 0, 876, 0, 0, 22, 2020, 4440, 0, 729, 3491, 0, 0, 0, 2476, 0, 2688, 0, 0, 0,
0, 0, 3606, 1662, 0, 0, 4469, 1999, 3846, 942, 0, 0, 0, 2089, 2152, 0, 1368, 2317, 0, 0, 0, 0, 0, 782, 0, 0, 0, 0, 0, 3066, 0, 0,
0, 0, 0, 1508, 0, 491, 633, 868, 0, 0, 36, 0, 0, 1767, 0, 0, 590, 0, 0, 0, 0, 0, 763, 0, 0, 0, 0, 0, 3301, 0, 4189, 545,
0, 0, 0, 0, 0, 0, 0, 0, 278, 212, 0, 0, 0, 0, 0, 0, 0, 0, 2796, 0, 1782, 0, 0, 0, 0, 420, 338, 0, 0, 0, 4008, 0,
956, 2657, 0, 2192, 0, 1829, 2305, 0, 0, 0, 0, 0, 0, 0, 3393, 4016, 1764, 2414, 0, 0, 0, 543, 1531, 1495, 903, 1971, 1737, 0, 0, 4523, 847, 0,
0, 0, 0, 0, 2033, 0, 0, 0, 0, 0, 543, 0, 0, 1619, 1394, 4136, 4475, 1014, 0, 0, 2336, 4235, 0, 0, 3454, 3152, 0, 0, 0, 2174, 0, 0,
0, 0, 0, 0, 1263, 0, 3559, 0, 0, 0, 1735, 3421, 0, 3999, 351, 791, 0, 227, 1563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1303, 0, 577,
0, 0, 0, 0, 2988, 0, 49, 647, 1231, 2090, 338, 86, 0, 0, 4294, 0, 1, 0, 1042, 0, 0, 0, 0, 0, 4353, 3158, 654, 0, 0, 0, 0, 135,
0, 0, 0, 0, 0, 317, 1168, 0, 1066, 0, 0, 0, 0, 726, 0, 0, 0, 0, 1723, 0, 0, 500, 4223, 3770, 0, 0, 0, 0, 1362, 0, 1656, 0,
1147, 0, 0, 0, 84, 0, 0, 0, 1282, 0, 561, 0, 4462, 1699, 454, 0, 0, 0, 834, 827, 1780, 0, 3478, 2979, 0, 0, 162, 0, 932, 0, 0, 0,
0, 0, 655, 0, 1560, 0, 0, 667, 0, 0, 118, 0, 1064, 509, 0, 0, 0, 3844, 4505, 3086, 834, 4478, 0, 0, 0, 0, 0, 3638, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 496, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2644, 18, 1144, 1811, 202, 0, 0, 0, 1193, 479, 214, 0, 588, 0,
0, 0, 4222, 3978, 0, 0, 0, 0, 0, 0, 1783, 2735, 2714, 2018, 0, 0, 745, 0, 0, 0, 0, 0, 2152, 0, 1321, 1174, 0, 4245, 537, 0, 4475, 0,
2421, 0, 0, 0, 0, 2271, 0, 3422, 1929, 0, 0, 714, 4436, 0, 0, 0, 1938, 0, 0, 4413, 76, 0, 1576, 1531, 0, 1038, 0, 2061, 0, 0, 3061, 4345,
2156, 0, 0, 2137, 0, 0, 1113, 0, 0, 4107, 0, 4353, 0, 0, 0, 0, 4402, 412, 0, 0, 0, 2004, 0, 1147, 0, 62, 0, 380, 1718, 3942, 0, 0,
655, 0, 0, 1111, 1404, 0, 1641, 3411, 2047, 0, 0, 0, 0, 0, 0, 2521, 0, 0, 0, 0, 0, 422, 1503, 0, 0, 2475, 0, 0, 0, 4134, 0, 0,
3273, 0, 0, 0, 0, 0, 0, 0, 0, 333, 401, 0, 0, 0, 0, 4406, 0, 3900, 0, 0, 4378, 0, 0, 2551, 898, 0, 0, 0, 1320, 0, 0, 0,
0, 0, 1119, 1739, 0, 0, 1880, 0, 130, 3433, 222, 4450, 0, 0, 3128, 201, 1225, 0, 0, 0, 0, 4293, 4360, 0, 0, 0, 205, 472, 451, 0, 0, 2965,
0, 0, 0, 0, 3749, 3181, 0, 3831, 0, 2766, 0, 0, 0, 679, 0, 393, 1650, 88, 0, 4411, 0, 0, 0, 0, 32, 495, 0, 0, 4083, 3617, 0, 630,
0, 0, 1739, 2450, 302, 1684, 417, 0, 0, 0, 30, 3334, 0, 1632, 0, 0, 0, 1205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, 0,
948, 0, 4211, 2980, 2106, 0, 0, 0, 1766, 767, 0, 0, 2707, 0, 978, 4412, 1086, 0, 0, 4178, 0, 2561, 0, 0, 2695, 0, 0, 1533, 3778, 0, 0, 3643,
0, 0, 4448, 0, 449, 1451, 4348, 0, 2607, 0, 0, 299, 0, 0, 209, 3891, 441, 0, 0, 0, 0, 404, 3981, 0, 0, 0, 579, 0, 0, 0, 440, 1083,
0, 1770, 574, 0, 1465, 0, 269, 2301, 520, 0, 0, 0, 1543, 1322, 0, 0, 0, 0, 0, 0, 0, 0, 387, 0, 0, 0, 0, 3652, 0, 0, 275, 0,
4263, 0, 0, 2241, 0, 0, 301, 0, 0, 3587, 0, 0, 0, 1319, 3975, 813, 1100, 0, 4359, 0, 0, 0, 3685, 4140, 3696, 0, 0, 4006, 0, 0, 0, 2558,
0, 0, 0, 924, 0, 0, 938, 0, 0, 0, 0, 0, 0, 0, 2307, 0, 0, 224, 0, 0, 964, 883, 0, 0, 396, 0, 0, 4403, 974, 0, 1937, 0,
0, 1403, 109, 988, 0, 0, 0, 0, 1179, 360, 2074, 0, 0, 0, 0, 0, 0, 0, 4350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 428, 0, 2042, 1301,
3246, 0, 265, 500, 0, 473, 3206, 0, 0, 124, 888, 969, 0, 0, 0, 2, 0, 0, 1855, 0, 4350, 0, 0, 794, 0, 0, 1414, 1525, 868, 0, 0, 15,
60, 2347, 4193, 0, 0, 3285, 0, 0, 1758, 0, 57, 1641, 1609, 325, 2401, 0, 0, 0, 1712, 0, 1579, 0, 2210, 0, 1963, 4022, 1272, 0, 423, 0, 1171, 0,
1970, 4444, 219, 0, 0, 0, 0, 4160, 0, 0, 0, 0, 0, 0, 0, 2540, 0, 140, 0, 1791, 0, 4442, 812, 0, 373, 4296, 0, 1413, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1071, 0, 0, 0, 0, 1461, 0, 0, 0, 0, 0, 2668, 1820, 4041, 0, 0, 125, 0, 3033, 0, 0, 0, 2214, 0, 873, 0, 659,
0, 1085, 0, 0, 3778, 1332, 636, 291, 0, 0, 2220, 0, 442, 0, 0, 0, 0, 4394, 197, 0, 0, 0, 3628, 4057, 0, 0, 0, 0, 1319, 3858, 1872, 283,
0, 1821, 0, 3654, 0, 635, 0, 0, 0, 269, 0, 0, 2333, 0, 1109, 0, 0, 0, 0, 0, 1104, 0, 0, 717, 0, 0, 1760, 0, 0, 0, 1265, 0,
0, 0, 1784, 0, 4306, 0, 0, 0, 861, 0, 1790, 2994, 0, 980, 0, 0, 1395, 0, 0, 0, 452, 628, 0, 0, 0, 0, 0, 1257, 0, 178, 992, 2180,
0, 1822, 4093, 3881, 0, 2709, 0, 0, 1908, 0, 0, 0, 0, 3265, 1149, 4035, 0, 3014, 1466, 0, 0, 1347, 0, 2156, 2313, 2583, 0, 2048, 0, 661, 0, 0,
0, 0, 3350, 1698, 1154, 1957, 0, 0, 0, 0, 0, 0, 0, 3686, 3238, 0, 0, 0, 1223, 2272, 28, 712, 987, 712, 740, 0, 578, 0, 0, 360, 0, 1816,
0, 0, 0, 1528, 0, 1609, 0, 1494, 1785, 211, 1055, 0, 0, 0, 4499, 0, 0, 3009, 1658, 0, 1338, 0, 1269, 3965, 0, 1989, 512, 0, 3756, 1426, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1251, 2175, 0, 0, 389, 0, 2192, 0, 0, 0, 2892, 2088, 0, 0, 1555, 0, 897, 0, 0, 0, 0, 0, 351, 0, 825,
0, 3467, 417, 0, 0, 1849, 1236, 1106, 0, 114, 2144, 1691, 2776, 0, 1190, 0, 1044, 0, 0, 0, 1392, 2154, 0, 0, 0, 1940, 0, 0, 0, 0, 0, 0,
523, 0, 0, 266, 2414, 4448, 3858, 0, 0, 0, 1116, 3321, 0, 0, 4208, 0, 0, 446, 1083, 0, 0, 0, 412, 0, 68, 2050, 1107, 1820, 1455, 1290, 0, 809,
609, 0, 3862, 2016, 0, 0, 737, 1214, 4516, 505, 0, 1725, 0, 0, 2011, 1777, 0, 1282, 3504, 0, 0, 0, 752, 0, 0, 1949, 4354, 0, 0, 0, 0, 3323,
0, 0, 0, 4180, 1709, 0, 3182, 0, 883, 0, 0, 0, 0, 0, 0, 1121, 0, 0, 2044, 0, 1298, 0, 0, 0, 0, 0, 215, 637, 1771, 821, 25, 0,
0, 0, 0, 0, 0, 937, 0, 3880, 1125, 1355, 0, 788, 282, 0, 1575, 155, 0, 0, 3048, 988, 0, 0, 3610, 3842, 0, 1187, 0, 1960, 0, 4255, 110, 3969,
0, 1732, 0, 0, 0, 4047, 1410, 1406, 0, 2013, 0, 0, 471, 176, 0, 0, 3725, 0, 0, 0, 0, 0, 0, 3543, 0, 630, 0, 0, 0, 0, 0, 219,
0, 3570, 0, 973, 1005, 0, 0, 0, 0, 895, 0, 626, 979, 0, 977, 0, 0, 4312, 0, 0, 0, 1183, 4144, 0, 1516, 1402, 0, 0, 1953, 3790, 0, 1389,
0, 663, 4079, 721, 0, 0, 0, 4111, 337, 615, 0, 137, 215, 0, 527, 0, 0, 0, 2130, 0, 1212, 0, 0, 0, 3251, 0, 0, 0, 0, 647, 2100, 0,
0, 0, 0, 4450, 0, 0, 2050, 21, 573, 0, 0, 0, 0, 0, 0, 2452, 0, 1155, 0, 0, 0, 897, 4318, 0, 0, 701, 3674, 3857, 1139, 0, 1944, 4480,
0, 0, 0, 0, 956, 0, 0, 0, 0, 556, 0, 0, 1261, 360, 0, 4177, 169, 0, 214, 0, 0, 0, 0, 0, 200, 925, 1032, 264, 271, 1456, 0, 4025,
0, 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4336, 1792, 3903, 2165, 874, 0, 0, 0, 0, 1979, 0, 4299, 722, 3755, 578, 50, 0, 0,
211, 0, 1706, 0, 0, 0, 0, 0, 0, 2432, 0, 4044, 701, 374, 1991, 3954, 0, 321, 955, 4384, 1706, 2966, 1703, 0, 0, 0, 0, 3356, 1648, 0, 0, 354,
4020, 238, 712, 0, 857, 999, 2016, 1290, 0, 431, 1471, 0, 0, 0, 0, 2106, 0, 0, 3316, 0, 1295, 0, 0, 0, 691, 4477, 0, 0, 898, 3820, 0, 0,
460, 0, 0, 1951, 1017, 0, 459, 0, 652, 0, 349, 0, 246, 0, 178, 0, 0, 1729, 1561, 1333, 741, 0, 0, 0, 927, 4469, 0, 2830, 0, 0, 0, 0,
1351, 1325, 0, 0, 0, 0, 0, 0, 0, 0, 163, 0, 3395, 0, 303, 3838, 0, 1241, 0, 0, 567, 670, 0, 0, 0, 0, 1912, 556, 0, 0, 0, 0,
0, 241, 0, 4274, 0, 2112, 2001, 0, 709, 493, 0, 0, 3640, 0, 1810, 0, 0, 1551, 1763, 0, 4312, 1462, 0, 0, 0, 0, 0, 4359, 0, 811, 0, 0,
1584, 3635, 0, 0, 1195, 752, 2363, 0, 0, 0, 0, 0, 1061, 1389, 0, 555, 1168, 979, 0, 0, 2024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 4032,
983, 326, 1546, 1521, 0, 0, 838, 676, 0, 0, 328, 2301, 4134, 4032, 0, 3019, 1642, 943, 0, 0, 4477, 0, 0, 3098, 0, 0, 45, 3771, 0, 0, 4494, 3609,
0, 982, 0, 0, 774, 2899, 0, 0, 0, 147, 26, 3651, 2118, 702, 0, 2382, 0, 0, 3132, 0, 0, 1768, 0, 0, 0, 0, 1479, 0, 605, 0, 1263, 0,
1146, 608, 194, 0, 2058, 0, 0, 1630, 0, 0, 0, 0, 0, 507, 0, 618, 0, 4253, 0, 2377, 0, 163, 0, 0, 787, 0, 0, 0, 193, 1534, 921, 0,
807, 340, 0, 0, 1152, 0, 0, 0, 1838, 1022, 0, 4463, 531, 0, 0, 377, 0, 0, 0, 1966, 0, 3025, 606, 757, 0, 3420, 0, 1331, 0, 0, 0, 1841,
787, 1053, 864, 3486, 16, 0, 0, 2133, 0, 0, 223, 0, 3898, 0, 0, 3865, 0, 156, 4419, 7, 0, 565, 0, 0, 0, 3325, 668, 1004, 4102, 1705, 0, 0,
0, 0, 0, 213, 0, 0, 0, 0, 1207, 1100, 0, 0, 0, 1884, 0, 1898, 0, 0, 0, 930, 71, 1301, 0, 0, 3875, 0, 0, 231, 0, 0, 2312, 157,
423, 1197, 3896, 535, 0, 582, 662, 0, 2310, 310, 0, 2709, 4489, 884, 1993, 68, 3671, 880, 0, 0, 2760, 1962, 2996, 0, 2109, 705, 987, 1605, 3646, 1501, 0, 0,
3161, 626, 0, 0, 0, 0, 0, 4078, 755, 164, 247, 0, 1210, 0, 1484, 279, 0, 0, 0, 3314, 2240, 0, 2957, 0, 0, 1128, 0, 232, 1482, 1403, 0, 0,
0, 573, 0, 0, 0, 1441, 3329, 2467, 1563, 0, 0, 0, 3011, 676, 1354, 0, 0, 0, 0, 3905, 0, 3378, 0, 1213, 4240, 1113, 2465, 1939, 0, 110, 0, 0,
0, 4380, 1935, 3695, 0, 967, 0, 632, 1353, 2014, 3712, 1407, 1087, 0, 4228, 0, 0, 2250, 178, 1079, 4094, 208, 0, 2270, 1136, 1498, 0, 0, 2254, 0, 4219, 0,
4185, 0, 0, 1429, 1735, 1634, 1947, 0, 0, 1585, 0, 0, 0, 2581, 1971, 0, 3678, 0, 0, 0, 38, 390, 330, 0, 0, 1818, 0, 0, 0, 0, 0, 1393,
2909, 0, 0, 0, 505, 0, 0, 0, 0, 2876, 776, 0, 0, 4053, 0, 0, 1680, 0, 0, 2144, 4037, 3062, 0, 3837, 3724, 0, 4490, 430, 0, 1841, 0, 298,
541, 0, 0, 1614, 2525, 4049, 3871, 1797, 244, 549, 0, 3490, 2532, 287, 0, 0, 1303, 1570, 0, 0, 68, 0, 909, 0, 397, 207, 1524, 0, 0, 0, 0, 0,
1555, 0, 0, 1125, 1717, 3731, 4240, 50, 1164, 761, 0, 2149, 0, 1401, 0, 1333, 0, 0, 0, 888, 0, 0, 0, 0, 0, 0, 36, 164, 0, 0, 550, 0,
3242, 0, 2049, 1773, 0, 0, 0, 4386, 0, 1811, 0, 951, 0, 483, 0, 3682, 938, 743, 4197, 279, 0, 4357, 0, 900, 1486, 257, 0, 0, 0, 127, 1375, 2029,
0, 1297, 991, 0, 229, 0, 3210, 1442, 2939, 1895, 3431, 0, 213, 855, 346, 681, 0, 694, 15, 674, 0, 1788, 0, 4433, 344, 44, 1676, 0, 0, 890, 3605, 0,
0, 2025, 0, 0, 0, 0, 0, 0, 2007, 4242, 0, 1045, 35, 0, 0, 0, 0, 0, 0, 3738, 3702, 0, 210, 199, 0, 734, 3335, 0, 976, 0, 2442, 309,
0, 0, 1905, 0, 3035, 0, 0, 0, 893, 3851, 0, 0, 0, 0, 3374, 38, 0, 0, 0, 0, 1152, 0, 3068, 0, 0, 1410, 0, 309, 1675, 2070, 0, 0,
0, 0, 1204, 0, 768, 0, 0, 0, 1134, 0, 0, 0, 0, 4315, 385, 1727, 4070, 0, 0, 0, 711, 0, 0, 3949, 0, 3826, 1466, 4358, 0, 0, 0, 0,
2540, 4128, 0, 3121, 0, 0, 0, 0, 0, 4163, 1475, 0, 1629, 1496, 0, 0, 0, 2029, 1190, 464, 0, 1988, 3664, 0, 1383, 0, 488, 0, 558, 0, 1842, 0,
985, 0, 0, 322, 0, 0, 2100, 0, 125, 0, 4466, 2035, 0, 0, 314, 1737, 3288, 531, 3460, 1350, 451, 0, 3753, 0, 4210, 1756, 0, 0, 1970, 0, 3586, 2057,
3186, 0, 21, 1472, 0, 0, 4448, 4158, 378, 2124, 0, 1020, 863, 485, 0, 4223, 4036, 702, 0, 1192, 3611, 0, 1179, 1130, 2981, 4166, 0, 0, 1216, 0, 0, 0,
0, 392, 0, 0, 0, 2440, 259, 0, 0, 0, 3445, 0, 615, 0, 0, 3693, 4368, 0, 0, 0, 0, 3698, 845, 0, 2927, 0, 0, 0, 935, 0, 0, 824,
1376, 0, 0, 203, 3723, 990, 1340, 332, 0, 0, 1289, 1313, 0, 2041, 0, 0, 909, 0, 0, 0, 959, 0, 1086, 0, 1730, 0, 0, 1830, 1775, 2123, 0, 0,
1085, 2095, 268, 786, 2146, 0, 0, 0, 2547, 0, 0, 0, 1956, 4320, 0, 0, 113, 0, 4484, 1245, 504, 1560, 1230, 0, 1769, 0, 0, 225, 432, 0, 1901, 1586,
0, 113, 0, 625, 0, 1052, 800, 4425, 2077, 0, 0, 881, 0, 0, 817, 537, 1568, 2632, 1823, 902, 1727, 1386, 0, 0, 74, 3397, 1622, 0, 2005, 0, 0, 0,
3707, 0, 1539, 0, 0, 0, 0, 0, 0, 728, 0, 48, 519, 0, 0, 874, 0, 0, 894, 0, 2986, 3145, 510, 0, 149, 1163, 0, 2239, 1341, 0, 0, 0,
0, 0, 0, 3739, 1225, 0, 0, 1063, 274, 3763, 762, 0, 3159, 0, 1176, 0, 1930, 2135, 4416, 0, 41, 0, 0, 0, 0, 240, 1223, 0, 464, 0, 0, 792,
1479, 324, 0, 1200, 0, 0, 0, 395, 0, 0, 4339, 0, 0, 518, 3197, 0, 0, 0, 81, 1111, 3425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2024, 177,
753, 676, 2199, 0, 278, 2788, 2215, 0, 1975, 1514, 17, 0, 0, 0, 0, 673, 6, 9, 3773, 664, 0, 0, 1111, 3745, 0, 0, 0, 0, 400, 1277, 0, 1786,
932, 115, 0, 4379, 1702, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4234, 0, 472, 0, 1670, 0, 0, 2021, 0, 0, 0, 0, 2003, 0, 0, 0,
972, 0, 1930, 1765, 0, 1923, 1036, 0, 4471, 0, 1491, 0, 0, 366, 0, 0, 779, 0, 0, 0, 295, 0, 700, 0, 2692, 311, 2495, 0, 0, 3621, 3344, 3658,
0, 4238, 1037, 0, 1760, 1693, 0, 0, 0, 4173, 256, 669, 0, 0, 3634, 28, 897, 1022, 2846, 3285, 699, 165, 1017, 0, 0, 1003, 4050, 3768, 649, 0, 748, 0,
0, 0, 0, 0, 0, 0, 0, 314, 936, 2871, 0, 450, 0, 2942, 1205, 44, 0, 0, 4459, 0, 0, 129, 2019, 0, 0, 0, 1026, 4340, 3955, 4361, 3983, 0,
3355, 1380, 230, 1159, 0, 0, 4014, 0, 0, 0, 0, 1196, 2832, 0, 0, 0, 0, 0, 0, 0, 3587, 1639, 0, 168, 356, 0, 155, 0, 0, 76, 238, 1179,
687, 0, 0, 0, 1043, 0, 0, 0, 4384, 752, 3135, 1242, 440, 1315, 0, 0, 0, 1503, 993, 4114, 0, 0, 1857, 0, 0, 1082, 1439, 1639, 0, 0, 0, 0,
3204, 0, 0, 1645, 0, 0, 1180, 0, 0, 0, 0, 0, 1216, 0, 0, 1005, 580, 0, 2787, 0, 609, 0, 0, 1720, 0, 0, 0, 685, 0, 1030, 0, 1905,
4204, 0, 0, 0, 0, 0, 0, 2484, 0, 3993, 0, 0, 4342, 0, 2982, 0, 896, 1648, 0, 434, 0, 3400, 0, 0, 634, 2077, 0, 119, 0, 285, 0, 0,
1078, 0, 0, 3889, 1175, 0, 0, 0, 1389, 0, 0, 0, 232, 2134, 0, 0, 21, 423, 1013, 0, 1091, 0, 0, 1798, 820, 0, 0, 0, 0, 0, 1394, 2176,
4295, 479, 3904, 0, 0, 1523, 328, 0, 0, 3944, 0, 0, 112, 636, 0, 3330, 381, 0, 3502, 0, 1688, 4387, 0, 0, 0, 3814, 4359, 99, 636, 0, 0, 328,
1169, 0, 0, 0, 3743, 3225, 0, 0, 0, 217, 0, 0, 0, 0, 3762, 0, 0, 0, 1813, 1344, 0, 1900, 0, 3800, 0, 563, 461, 0, 1814, 2390, 0, 2263,
47, 3469, 0, 1150, 1171, 0, 647, 750, 0, 3637, 2123, 2973, 3383, 126, 0, 977, 1363, 0, 0, 0, 3895, 1415, 0, 0, 0, 56, 0, 1465, 1685, 2377, 421, 3047,
0, 0, 0, 1542, 0, 0, 0, 1549, 1024, 1239, 2979, 1147, 0, 75, 1697, 0, 0, 159, 1459, 859, 0, 3498, 4137, 1200, 1159, 264, 582, 0, 0, 0, 3264, 0,
0, 0, 0, 0, 1523, 1058, 0, 285, 3098, 0, 0, 1907, 1206, 0, 2131, 1782, 0, 0, 3549, 107, 1539, 0, 1746, 0, 0, 0, 0, 0, 1088, 0, 4256, 508,
176, 1977, 1748, 1591, 0, 0, 0, 810, 172, 704, 1220, 96, 0, 4073, 435, 0, 3010, 0, 5, 4093, 0, 2526, 0, 0, 0, 0, 0, 0, 0, 0, 1055, 3507,
0, 1841, 472, 2086, 0, 637, 2857, 149, 3505, 0, 4124, 0, 1862, 242, 2002, 2175, 0, 0, 966, 3629, 0, 0, 2888, 4184, 643, 0, 716, 67, 0, 1848, 0, 196,
1872, 0, 0, 199, 0, 2119, 0, 0, 2060, 3079, 4300, 0, 0, 773, 724, 0, 1673, 770, 3503, 1230, 136, 1835, 1418, 360, 0, 0, 1975, 760, 0, 1562, 794, 0,
222, 0, 2314, 680, 0, 3165, 0, 0, 3920, 0, 0, 0, 729, 229, 313, 0, 0, 113, 0, 0, 3021, 1157, 1458, 3958, 1976, 0, 0, 0, 4280, 0, 0, 0,
0, 4205, 2248, 4500, 0, 0, 0, 14, 2992, 671, 0, 0, 0, 1762, 1994, 674, 4190, 0, 0, 0, 0, 925, 1435, 0, 0, 0, 4463, 4052, 522, 985, 3481, 1123,
1161, 2142, 4087, 1829, 425, 0, 495, 0, 2403, 0, 0, 946, 0, 0, 0, 0, 3390, 989, 3328, 3912, 0, 0, 0, 1628, 0, 3856, 784, 1296, 545, 768, 4063, 2832,
1433, 913, 0, 1263, 1985, 325, 0, 0, 2121, 0, 162, 0, 1945, 0, 2119, 0, 0, 0, 1480, 0, 71, 1854, 1416, 0, 839, 1212, 555, 0, 0, 4436, 958, 2112,
772, 1957, 0, 0, 0, 0, 1069, 0, 4320, 4413, 0, 0, 2423, 0, 0, 0, 586, 0, 3466, 0, 861, 0, 0, 1732, 0, 0, 425, 595, 601, 0, 0, 0,
2748, 964, 3686, 0, 2746, 0, 0, 0, 0, 0, 3144, 1396, 940, 533, 1670, 0, 0, 709, 0, 401, 0, 0, 1768, 885, 1168, 0, 2374, 1585, 0, 0, 0, 0,
0, 4025, 0, 1323, 100, 0, 1712, 0, 3711, 383, 0, 0, 3705, 860, 0, 0, 0, 3380, 0, 0, 0, 0, 2882, 377, 471, 0, 0, 0, 0, 696, 1107, 0,
2331, 1393, 513, 3693, 1964, 1412, 1561, 4360, 1252, 2113, 0, 3658, 0, 2093, 2868, 0, 0, 989, 0, 0, 4027, 3280, 847, 0, 0, 4084, 0, 698, 934, 94, 1973, 4167,
646, 771, 0, 0, 1452, 0, 4331, 0, 2091, 4103, 0, 0, 0, 3661, 1968, 1897, 40, 0, 737, 1921, 0, 0, 305, 471, 2395, 0, 1841, 4233, 0, 0, 0, 0,
3052, 3582, 2843, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 3747, 531, 31, 0, 3536, 733, 0, 0, 14, 0, 0, 0, 519, 0, 1208, 761, 0,
471, 0, 0, 0, 3159, 1740, 605, 0, 2316, 0, 0, 3725, 0, 1996, 0, 0, 0, 673, 0, 0, 0, 0, 2774, 0, 0, 0, 194, 4022, 0, 1112, 1262, 2266,
4289, 306, 0, 0, 1880, 0, 0, 4253, 0, 0, 1416, 716, 1067, 364, 1184, 0, 4400, 1568, 1521, 1032, 0, 107, 0, 0, 4289, 1848, 0, 1378, 0, 0, 4357, 2142,
0, 901, 0, 0, 0, 0, 1502, 0, 0, 398, 1346, 3817, 0, 778, 861, 0, 1686, 0, 543, 3294, 0, 0, 0, 0, 0, 2899, 3208, 947, 1660, 458, 3836, 104,
3471, 0, 0, 3181, 0, 0, 0, 0, 0, 0, 1947, 0, 0, 427, 0, 1079, 1713, 0, 176, 1424, 1561, 0, 2279, 420, 4077, 4072, 0, 2452, 2336, 796, 189, 0,
0, 2736, 1189, 2165, 941, 4424, 0, 1307, 0, 0, 965, 186, 2409, 0, 0, 1755, 1755, 0, 0, 359, 0, 469, 2113, 3939, 0, 0, 0, 0, 1860, 0, 0, 0,
0, 884, 4334, 0, 0, 0, 465, 0, 2370, 0, 10, 0, 749, 0, 2695, 0, 1280, 0, 1271, 196, 0, 0, 0, 3994, 707, 1641, 1191, 633, 0, 970, 0, 0,
0, 1203, 0, 0, 1469, 2493, 0, 0, 1105, 0, 0, 0, 616, 2795, 0, 0, 1316, 0, 2092, 0, 0, 1049, 0, 0, 0, 0, 0, 1540, 229, 1537, 0, 3447,
1614, 0, 1339, 0, 0, 1963, 2242, 1841, 151, 709, 0, 1196, 0, 0, 0, 1293, 0, 1778, 0, 0, 0, 0, 0, 2782, 0, 0, 0, 0, 0, 1034, 3509, 0,
110, 1404, 245, 0, 0, 913, 0, 0, 228, 1563, 402, 0, 0, 2028, 0, 107, 1615, 0, 272, 0, 0, 0, 563, 2254, 0, 0, 259, 2579, 361, 1614, 0, 0,
3387, 3070, 2015, 0, 1205, 0, 0, 3529, 4006, 1831, 806, 4448, 1900, 38, 820, 1450, 254, 1017, 809, 0, 0, 0, 1150, 0, 0, 2643, 0, 0, 4492, 923, 0, 745,
0, 0, 1237, 1232, 4492, 291, 1687, 143, 725, 665, 2097, 0, 0, 375, 0, 0, 0, 0, 23, 0, 3692, 4339, 3632, 0, 0, 1451, 0, 0, 657, 0, 0, 0,
0, 1742, 0, 0, 1430, 0, 739, 986, 1342, 0, 1145, 1199, 0, 1992, 2003, 635, 0, 0, 0, 0, 0, 1360, 283, 1099, 985, 1153, 1662, 175, 0, 0, 1693, 0,
0, 4368, 0, 0, 0, 0, 412, 4306, 3152, 2125, 0, 3107, 0, 4240, 0, 0, 297, 3768, 565, 2378, 0, 605, 0, 0, 1369, 4317, 0, 0, 0, 0, 0, 4344,
3046, 727, 0, 3965, 1517, 0, 3173, 0, 0, 4096, 0, 0, 0, 0, 0, 0, 0, 1279, 353, 0, 1339, 3978, 1492, 4028, 0, 0, 1638, 1851, 891, 0, 818, 2405,
1151, 530, 0, 0, 0, 474, 1267, 316, 2360, 4362, 992, 2209, 0, 0, 0, 0, 0, 0, 0, 4503, 0, 1338, 0, 443, 0, 673, 0, 283, 0, 2959, 0, 638,
2374, 699, 540, 800, 1861, 1078, 0, 2108, 2536, 0, 713, 323, 0, 273, 0, 0, 1549, 2039, 1087, 1112, 1735, 1206, 0, 0, 4235, 0, 1028, 1072, 381, 533, 0, 707,
355, 1817, 395, 0, 1508, 3151, 0, 2149, 4020, 0, 0, 372, 0, 0, 1137, 0, 0, 4145, 155, 3907, 3513, 1312, 762, 545, 1871, 1678, 0, 0, 0, 1137, 0, 0,
1351, 0, 0, 3212, 0, 0, 599, 0, 1852, 1899, 947, 0, 970, 0, 0, 0, 3006, 0, 0, 0, 840, 0, 2136, 0, 526, 0, 0, 3595, 0, 1490, 0, 0,
766, 950, 829, 419, 784, 0, 0, 225, 0, 1300, 179, 0, 85, 3598, 2487, 3185, 366, 945, 0, 0, 0, 0, 0, 3083, 1101, 1296, 2970, 437, 2050, 0, 0, 0,
0, 3289, 2580, 0, 1503, 1717, 177, 0, 2099, 294, 1226, 0, 2065, 3896, 0, 0, 0, 304, 2088, 3799, 0, 840, 2052, 0, 0, 386, 1131, 1553, 367, 0, 0, 3297,
3322, 1376, 3816, 4013, 4114, 917, 0, 3833, 0, 1692, 0, 477, 0, 0, 0, 71, 217, 1302, 0, 0, 4138, 0, 625, 2029, 4332, 448, 0, 606, 229, 773, 0, 1011,
0, 0, 0, 1156, 0, 1081, 4369, 0, 0, 1111, 2971, 0, 0, 0, 3585, 325, 0, 3753, 804, 178, 629, 772, 2554, 660, 1592, 242, 0, 497, 0, 106, 0, 0,
0, 1278, 0, 0, 129, 676, 0, 0, 2629, 2583, 489, 491, 613, 2031, 0, 1211, 242, 0, 1949, 389, 0, 1672, 1067, 0, 1270, 0, 0, 1124, 0, 3594, 535, 0,
0, 0, 1029, 271, 0, 0, 1203, 3794, 0, 4246, 0, 0, 2074, 3293, 1014, 4484, 0, 0, 0, 0, 0, 0, 3746, 2064, 4147, 2422, 914, 0, 0, 0, 1406, 0,
0, 0, 0, 3124, 0, 0, 0, 0, 269, 0, 549, 0, 1984, 0, 0, 2529, 1498, 1277, 612, 1717, 1860, 0, 0, 2032, 0, 3707, 1117, 1787, 0, 0, 726, 304,
0, 0, 614, 1175, 1915, 0, 0, 0, 885, 2791, 1914, 484, 4352, 1605, 4239, 0, 597, 501, 4368, 0, 1067, 0, 0, 0, 0, 4040, 635, 0, 4372, 3160, 0, 0,
0, 681, 896, 3954, 867, 156, 327, 2955, 0, 3523, 0, 1467, 689, 0, 0, 0, 0, 342, 0, 2347, 0, 981, 0, 0, 1507, 1625, 0, 0, 123, 2679, 3911, 4450,
635, 961, 0, 572, 0, 2331, 1526, 519, 1286, 0, 1865, 1864, 1651, 1304, 0, 4352, 1292, 2756, 205, 418, 0, 0, 0, 0, 3379, 0, 0, 3832, 537, 0, 1896, 0,
692, 0, 1476, 0, 0, 4112, 0, 692, 131, 2253, 1686, 143, 0, 4083, 1779, 0, 1228, 2737, 0, 4385, 4091, 0, 0, 0, 2149, 1659, 1304, 0, 0, 0, 531, 0,
0, 670, 0, 915, 1019, 0, 4444, 718, 1674, 1968, 0, 1035, 652, 1127, 2903, 0, 3391, 2865, 284, 3845, 0, 0, 0, 4102, 0, 276, 4200, 0, 0, 0, 0, 0,
1683, 0, 472, 4195, 4238, 0, 0, 2141, 3516, 0, 3348, 0, 0, 23, 372, 1138, 0, 1369, 0, 570, 3895, 1119, 2544, 0, 0, 767, 0, 1679, 0, 0, 4290, 649,
0, 0, 29, 1701, 0, 3048, 1892, 0, 0, 4071, 1390, 0, 98, 0, 1377, 0, 1227, 0, 4293, 3895, 0, 0, 4219, 853, 4322, 0, 0, 0, 0, 4286, 0, 469,
0, 0, 1715, 3063, 1441, 208, 0, 734, 1338, 0, 641, 4487, 0, 0, 0, 702, 0, 4415, 496, 0, 0, 2733, 12, 267, 0, 1668, 0, 226, 0, 0, 0, 2072,
2682, 0, 4442, 0, 1965, 1616, 0, 1024, 1628, 1662, 0, 1091, 2311, 0, 0, 422, 0, 1860, 0, 0, 1800, 0, 731, 0, 4401, 0, 3244, 0, 4247, 0, 716, 0,
0, 333, 0, 1889, 0, 0, 0, 0, 0, 4497, 0, 0, 2655, 3474, 1316, 123, 183, 735, 0, 0, 3970, 0, 0, 1024, 547, 2749, 0, 2869, 0, 0, 2509, 0,
1851, 3755, 3915, 0, 0, 0, 356, 1124, 325, 77, 0, 0, 3, 0, 0, 80, 0, 2024, 0, 0, 0, 0, 499, 1574, 688, 0, 1593, 842, 1752, 1395, 0, 1776,
1885, 0, 1638, 0, 0, 0, 3601, 2497, 1509, 0, 0, 0, 3401, 0, 0, 0, 0, 4201, 1715, 3533, 0, 0, 0, 0, 168, 0, 4413, 949, 3582, 2575, 4459, 0,
2679, 0, 2071, 1113, 0, 0, 3696, 0, 642, 0, 0, 1215, 1392, 2018, 3821, 12, 261, 3602, 0, 0, 967, 1366, 0, 3212, 1878, 0, 403, 1692, 0, 3341, 0, 1345,
1051, 2726, 677, 4340, 519, 1973, 2742, 820, 0, 0, 343, 191, 1390, 0, 0, 544, 3774, 1206, 646, 0, 758, 0, 0, 862, 0, 395, 472, 1354, 1158, 1791, 1014, 1738,
0, 4177, 4130, 70, 40, 1671, 0, 0, 1609, 366, 945, 0, 0, 3904, 7, 0, 0, 2629, 3590, 3782, 130, 0, 2122, 1204, 0, 0, 3072, 0, 0, 0, 0, 2092,
1974, 0, 0, 0, 3737, 1275, 0, 2572, 0, 2004, 0, 1502, 3277, 1408, 2631, 1647, 711, 0, 4269, 370, 0, 0, 4425, 59, 3247, 4306, 0, 0, 3970, 0, 132, 0,
2097, 970, 533, 0, 0, 0, 859, 1729, 705, 4030, 678, 1255, 0, 1015, 2392, 1084, 552, 588, 1231, 0, 3398, 1073, 0, 2079, 553, 1645, 1494, 1707, 623, 1704, 0, 2169,
1942, 0, 3962, 1676, 0, 2401, 4236, 0, 1342, 932, 0, 0, 224, 626, 837, 0, 0, 0, 0, 0, 0, 2601, 1778, 534, 627, 1886, 0, 375, 3679, 0, 393, 0,
4235, 0, 1045, 0, 0, 0, 0, 2050, 389, 0, 63, 4431, 0, 671, 0, 0, 0, 1470, 0, 0, 0, 0, 1915, 13, 1060, 4089, 0, 0, 4223, 0, 218, 3157,
1001, 0, 546, 4294, 132, 266, 2080, 1421, 0, 4103, 0, 9, 3595, 4457, 4036, 0, 0, 0, 0, 0, 740, 554, 1055, 0, 3460, 3238, 0, 3402, 0, 199, 0, 2859,
4363, 0, 77, 1380, 1354, 1642, 1112, 3747, 3346, 3697, 1455, 0, 1036, 2278, 526, 0, 1268, 1821, 3497, 3326, 1834, 0, 837, 0, 1844, 290, 664, 4423, 0, 1971, 4340, 0,
1815, 1725, 808, 562, 0, 0, 4484, 0, 0, 572, 0, 1920, 0, 0, 0, 0, 0, 1908, 0, 1408, 0, 0, 2038, 245, 0, 0, 0, 1529, 0, 0, 2078, 0,
945, 0, 0, 1157, 84, 1033, 0, 320, 0, 2610, 0, 1716, 0, 4409, 0, 497, 1967, 0, 750, 0, 0, 950, 4201, 212, 0, 550, 2122, 0, 0, 0, 855, 0,
1704, 0, 2874, 0, 0, 4379, 0, 0, 0, 0, 3601, 2325, 567, 2216, 0, 0, 1398, 2057, 3735, 1225, 0, 3495, 546, 0, 473, 410, 0, 91, 4299, 0, 3354, 1474,
0, 404, 630, 0, 2154, 2165, 649, 1156, 0, 0, 1375, 0, 2396, 474, 0, 447, 3562, 1471, 0, 520, 0, 0, 0, 683, 0, 0, 22, 685, 2008, 0, 0, 0,
0, 0, 734, 1511, 0, 0, 2640, 31, 0, 3815, 2055, 0, 1324, 1010, 0, 0, 181, 850, 0, 0, 1535, 0, 0, 1993, 356, 0, 0, 0, 1046, 28, 821, 0,
731, 1418, 0, 917, 747, 3421, 260, 0, 819, 0, 913, 1164, 3921, 0, 0, 0, 0, 0, 0, 0, 4112, 0, 548, 2594, 0, 4484, 0, 225, 4497, 0, 3905, 0,
1768, 2499, 2993, 1828, 0, 0, 0, 1078, 801, 3223, 0, 0, 1567, 0, 1602, 1074, 0, 526, 0, 1279, 0, 0, 2309, 1365, 0, 0, 2404, 4007, 1745, 0, 2171, 0,
0, 1798, 0, 1675, 0, 922, 4438, 1238, 1099, 0, 0, 0, 1212, 0, 0, 4498, 0, 0, 0, 1415, 630, 1532, 4223, 0, 704, 3570, 0, 1267, 630, 0, 916, 0,
4474, 0, 0, 0, 0, 127, 1732, 4295, 0, 4389, 2062, 882, 0, 0, 0, 0, 2443, 0, 309, 4326, 426, 0, 1234, 3454, 692, 0, 483, 1927, 1481, 108, 3347, 1288,
4388, 594, 0, 983, 1738, 0, 1550, 2284, 973, 1297, 0, 2360, 0, 0, 0, 629, 0, 0, 3246, 0, 0, 0, 375, 822, 0, 293, 3698, 4293, 1835, 851, 431, 1273,
974, 0, 2813, 483, 3879, 1311, 252, 3334, 3923, 0, 0, 0, 0, 0, 89, 0, 0, 0, 903, 0, 0, 97, 0, 1784, 574, 3951, 1484, 0, 882, 2129, 1950, 96,
0, 390, 0, 1728, 0, 0, 81, 0, 1509, 1582, 0, 4111, 589, 0, 0, 699, 294, 1331, 0, 439, 856, 0, 0, 1928, 0, 129, 924, 1894, 3792, 0, 0, 3607,
1836, 1006, 0, 0, 3364, 863, 838, 0, 1047, 0, 2427, 0, 0, 0, 0, 1871, 1700, 518, 0, 394, 4416, 216, 1132, 3809, 1876, 4045, 0, 0, 1010, 0, 0, 1520,
882, 0, 0, 4322, 0, 1216, 1522, 1237, 0, 0, 0, 0, 2351, 0, 0, 15, 0, 1971, 0, 1403, 0, 1688, 1574, 1589, 1571, 0, 1845, 0, 48, 2911, 0, 933,
1280, 1182, 0, 4414, 2595, 853, 2089, 415, 0, 2713, 2045, 0, 2842, 0, 1280, 904, 0, 333, 0, 0, 0, 1493, 315, 280, 0, 0, 0, 3785, 0, 2018, 4160, 1321,
287, 0, 0, 0, 1316, 0, 0, 0, 0, 80, 0, 3283, 0, 0, 0, 0, 19, 4353, 1500, 0, 0, 952, 1884, 542, 1808, 404, 912, 1739, 807, 2724, 0, 1487,
0, 939, 0, 0, 4114, 72, 2954, 152, 1248, 0, 172, 0, 0, 0, 0, 42, 352, 0, 398, 0, 2944, 0, 2055, 0, 0, 788, 0, 1111, 63, 519, 1644, 2640,
0, 0, 0, 0, 66, 1906, 3199, 200, 0, 0, 0, 507, 1222, 666, 1557, 4127, 0, 1677, 0, 142, 971, 4335, 4218, 2029, 2097, 0, 0, 369, 1976, 0, 1444, 244,
0, 3052, 0, 3079, 0, 0, 4484, 313, 955, 1252, 3818, 1452, 3742, 2990, 4194, 3515, 3851, 1429, 0, 3187, 0, 1733, 1468, 0, 2334, 0, 3181, 1430, 0, 3114, 3017, 0,
0, 0, 0, 1929, 1172, 3894, 38, 0, 817, 0, 1486, 1653, 1118, 3736, 668, 991, 0, 3874, 0, 0, 0, 0, 1461, 616, 0, 0, 895, 0, 0, 0, 520, 0,
0, 341, 1721, 0, 902, 0, 0, 340, 0, 0, 3725, 25, 0, 0, 0, 3197, 0, 0, 464, 0, 0, 1934, 415, 0, 0, 2228, 2165, 0, 0, 652, 1114, 0,
0, 0, 0, 0, 3530, 0, 0, 361, 0, 293, 1055, 4471, 0, 1263, 1416, 5, 3894, 1601, 0, 1878, 995, 3074, 3446, 1533, 0, 0, 856, 1861, 830, 361, 915, 0,
1898, 0, 186, 1187, 545, 0, 0, 0, 3627, 0, 0, 0, 121, 4013, 0, 2877, 318, 3225, 1310, 0, 4116, 4503, 2085, 0, 0, 111, 0, 0, 2222, 1382, 4234, 0,
0, 0, 61, 2722, 3121, 0, 0, 427, 0, 0, 3172, 1767, 2900, 0, 1894, 3877, 0, 0, 424, 978, 1385, 0, 1329, 1367, 759, 816, 0, 0, 260, 1665, 0, 0,
2537, 0, 0, 965, 1592, 3240, 336, 2650, 0, 779, 0, 1133, 0, 3582, 937, 443, 0, 957, 2518, 0, 2116, 632, 2996, 0, 9, 358, 0, 590, 4110, 0, 1825, 2289,
447, 0, 2169, 0, 1258, 1989, 1008, 420, 3077, 768, 0, 0, 949, 0, 2027, 0, 443, 0, 0, 0, 462, 0, 18, 2075, 1959, 1476, 1891, 4224, 248, 1282, 0, 525,
1499, 0, 0, 1698, 1863, 0, 0, 477, 2307, 2147, 3657, 755, 3798, 0, 0, 318, 0, 3186, 1416, 1625, 0, 1446, 1587, 1547, 532, 1741, 0, 1728, 2555, 1167, 1787, 4071,
0, 307, 0, 0, 0, 2790, 0, 1532, 781, 3186, 954, 608, 3536, 2017, 0, 0, 1935, 2779, 0, 3, 0, 0, 727, 4214, 1796, 0, 0, 0, 0, 0, 3771, 354,
1311, 3452, 1918, 2456, 3876, 0, 2298, 758, 0, 0, 856, 0, 0, 2898, 373, 3964, 0, 1945, 4009, 0, 4315, 458, 0, 0, 1957, 0, 0, 0, 0, 494, 0, 0,
750, 0, 1002, 126, 428, 1503, 0, 0, 862, 2059, 1484, 1419, 0, 0, 341, 0, 0, 2062, 0, 749, 201, 666, 0, 869, 1846, 3372, 1809, 0, 3727, 2634, 0, 461,
0, 0, 267, 0, 82, 4482, 58, 4435, 0, 0, 2588, 4297, 1434, 2456, 0, 806, 0, 1092, 0, 1640, 1316, 1637, 122, 376, 942, 1904, 1052, 812, 2051, 0, 0, 4298,
3847, 927, 459, 1877, 0, 4002, 4450, 1890, 0, 4120, 307, 0, 0, 1253, 0, 3792, 2514, 0, 0, 2028, 237, 0, 581, 0, 0, 0, 1538, 1417, 3060, 0, 150, 0,
0, 1825, 0, 0, 4230, 825, 458, 0, 0, 0, 1358, 1363, 2875, 0, 0, 2102, 1401, 2148, 2504, 1721, 4030, 0, 4214, 0, 1658, 1250, 4428, 0, 1663, 0, 0, 1025,
2662, 2342, 0, 0, 154, 1024, 415, 0, 3993, 0, 0, 2104, 1156, 2947, 0, 0, 0, 0, 727, 0, 799, 0, 1081, 686, 424, 1237, 453, 0, 4202, 4518, 0, 0,
1992, 158, 529, 1286, 277, 1585, 586, 0, 0, 0, 100, 0, 3378, 3339, 4468, 0, 0, 4327, 0, 1850, 1810, 0, 0, 0, 0, 1630, 3932, 42, 4298, 0, 282, 1313,
1330, 1103, 0, 3326, 1959, 0, 0, 0, 0, 1114, 0, 3779, 1334, 0, 0, 0, 2120, 1627, 3726, 0, 1122, 0, 0, 0, 501, 3043, 1704, 0, 0, 1487, 2166, 2880,
90, 0, 344, 0, 903, 3245, 1023, 0, 0, 0, 277, 2147, 0, 283, 1993, 561, 3093, 2146, 1451, 0, 737, 2166, 3616, 4405, 0, 1335, 679, 0, 187, 2169, 364, 171,
936, 0, 870, 646, 3981, 0, 3978, 0, 0, 1640, 904, 0, 0, 69, 2095, 0, 1287, 0, 0, 3454, 0, 2322, 59, 0, 620, 0, 1097, 226, 0, 1457, 4112, 4267,
956, 4499, 719, 0, 0, 0, 0, 4126, 1760, 746, 0, 352, 3597, 0, 697, 1639, 323, 0, 425, 677, 3863, 0, 2133, 2056, 2166, 4394, 1334, 0, 0, 1664, 0, 1753,
453, 0, 0, 3780, 0, 208, 3222, 206, 0, 0, 839, 0, 1931, 367, 0, 1978, 911, 0, 1120, 53, 1222, 0, 986, 3617, 0, 1177, 461, 1591, 0, 1611, 680, 1000,
0, 0, 0, 0, 3293, 1666, 3487, 4043, 0, 729, 4367, 0, 0, 221, 3711, 355, 3009, 0, 144, 0, 486, 0, 2817, 89, 1925, 679, 4144, 803, 2103, 0, 0, 1183,
0, 270, 1213, 526, 1594, 654, 0, 0, 0, 1386, 416, 0, 1279, 0, 2128, 1167, 699, 1530, 1975, 441, 0, 431, 0, 1108, 0, 133, 0, 0, 0, 3503, 0, 0,
3109, 1711, 0, 0, 1806, 555, 1541, 1646, 0, 1472, 65, 0, 1266, 1315, 0, 4001, 4310, 4208, 0, 1917, 0, 0, 0, 0, 1072, 2131, 843, 1389, 1933, 0, 0, 0,
4177, 152, 2030, 1277, 3220, 1558, 578, 3055, 0, 1393, 987, 1493, 2001, 0, 0, 360, 2806, 294, 2773, 247, 1613, 0, 1564, 0, 0, 4071, 2017, 0, 252, 0, 1062, 507,
0, 0, 0, 0, 0, 35, 1626, 3769, 0, 3872, 0, 1177, 790, 1999, 849, 4122, 0, 3313, 0, 929, 0, 449, 1595, 487, 1195, 0, 1379, 889, 1169, 0, 650, 0,
0, 0, 0, 0, 2280, 0, 0, 1590, 0, 0, 595, 541, 804, 1432, 250, 0, 0, 854, 3013, 0, 0, 1341, 250, 0, 0, 4010, 0, 0, 4091, 0, 1984, 1031,
1649, 1638, 1917, 1250, 148, 4278, 0, 505, 56, 989, 0, 0, 1254, 4158, 0, 4079, 2063, 529, 935, 82, 0, 0, 4251, 833, 4336, 2606, 1645, 0, 0, 571, 0, 644,
0, 0, 0, 0, 155, 2082, 0, 0, 1382, 688, 556, 3656, 1721, 0, 0, 718, 979, 0, 0, 1996, 2453, 0, 1196, 4122, 1689, 955, 4211, 3934, 1428, 0, 40, 0,
0, 1369, 0, 0, 566, 4358, 1749, 0, 0, 0, 374, 1218, 1323, 0, 0, 3482, 1869, 0, 3730, 100, 0, 2146, 0, 0, 0, 0, 4309, 0, 3531, 2402, 214, 0,
618, 4380, 1191, 1843, 0, 2269, 84, 548, 1337, 0, 554, 4152, 0, 1642, 2582, 3857, 123, 1093, 1842, 2408, 0, 0, 1326, 1759, 0, 0, 0, 28, 0, 1805, 4479, 0,
3875, 0, 0, 3980, 1244, 459, 0, 0, 486, 3379, 0, 727, 0, 3783, 438, 0, 0, 3970, 4173, 4196, 811, 0, 0, 1121, 356, 0, 0, 4144, 4078, 0, 1750, 1409,
0, 0, 0, 0, 430, 0, 0, 2406, 575, 595, 0, 329, 765, 2193, 0, 3032, 2860, 0, 0, 387, 514, 0, 97, 1915, 0, 1911, 2639, 942, 3656, 2205, 0, 911,
2704, 0, 1001, 275, 0, 668, 52, 1108, 1125, 862, 0, 2177, 0, 413, 550, 3915, 2711, 108, 940, 1858, 667, 152, 1073, 0, 0, 118, 268, 0, 0, 0, 0, 0,
0, 3168, 4220, 0, 0, 0, 24, 3699, 171, 0, 1772, 1512, 0, 0, 4276, 0, 1936, 0, 1827, 4208, 1973, 0, 2938, 0, 0, 892, 357, 2146, 0, 544, 1934, 689,
894, 0, 0, 2072, 908, 0, 0, 0, 557, 3741, 0, 1648, 0, 680, 1888, 0, 2962, 1443, 3680, 0, 462, 0, 1709, 1994, 0, 0, 2160, 3844, 0, 0, 289, 13,
872, 496, 2178, 0, 4518, 0, 623, 1117, 0, 0, 0, 292, 1850, 3090, 0, 0, 0, 1325, 2049, 2126, 2537, 766, 0, 0, 0, 2930, 1508, 1523, 1414, 0, 0, 568,
0, 1728, 3042, 878, 0, 0, 4241, 3643, 0, 2085, 0, 1173, 81, 2906, 1258, 1777, 1903, 0, 1931, 0, 0, 941, 1582, 904, 1657, 2076, 0, 1523, 0, 3774, 200, 1309,
0, 0, 1265, 933, 0, 0, 0, 0, 0, 0, 203, 3989, 0, 448, 0, 3851, 77, 0, 0, 16, 2162, 0, 41, 1173, 1393, 1886, 0, 562, 1503, 3631, 1246, 0,
0, 1272, 0, 4513, 4512, 1209, 0, 0, 1073, 2174, 0, 925, 0, 3377, 2781, 0, 4467, 500, 3727, 1877, 1080, 0, 3702, 2218, 0, 610, 4040, 0, 0, 261, 3399, 0,
0, 1800, 1375, 549, 0, 0, 0, 0, 0, 0, 2073, 2199, 615, 646, 0, 1291, 0, 1558, 0, 0, 2127, 0, 44, 1353, 728, 0, 4043, 774, 413, 0, 0, 2090,
1724, 0, 1800, 2094, 1176, 1423, 1546, 847, 0, 3215, 659, 165, 1385, 1753, 0, 495, 1607, 0, 427, 127, 1737, 0, 0, 1190, 1666, 0, 1322, 401, 181, 0, 186, 713,
0, 3581, 2303, 457, 2293, 1717, 0, 4458, 0, 0, 1126, 845, 0, 0, 921, 0, 0, 0, 3809, 1661, 0, 222, 112, 2143, 2930, 852, 1040, 3283, 224, 0, 0, 0,
4274, 0, 2425, 0, 122, 1469, 854, 0, 2114, 1766, 0, 0, 284, 283, 2520, 546, 0, 383, 1866, 39, 0, 0, 1084, 3118, 0, 1801, 0, 1509, 2170, 0, 0, 4256,
0, 0, 1334, 1879, 868, 2167, 1732, 251, 0, 2065, 1453, 4387, 0, 1121, 1570, 4147, 0, 312, 4423, 465, 1007, 1629, 49, 0, 1587, 265, 0, 105, 0, 0, 65, 538,
0, 0, 639, 1596, 0, 0, 0, 1620, 1011, 487, 0, 0, 831, 1070, 1580, 4238, 1263, 1215, 85, 1831, 3660, 25, 1242, 2218, 0, 0, 999, 1914, 3882, 0, 384, 661,
1540, 0, 606, 115, 0, 2423, 1617, 1503, 1486, 3554, 0, 0, 3090, 0, 1857, 0, 1327, 1245, 839, 4494, 2290, 0, 0, 3870, 795, 2084, 4072, 0, 1438, 0, 918, 0,
981, 54, 835, 0, 0, 1446, 1357, 1470, 0, 1063, 955, 4161, 698, 0, 710, 0, 0, 412, 1726, 0, 3400, 1328, 0, 0, 1259, 857, 2363, 0, 0, 0, 0, 0,
2031, 0, 0, 3897, 1095, 1852, 0, 0, 0, 2204, 873, 953, 59, 0, 3223, 2252, 0, 969, 477, 796, 0, 928, 4331, 3193, 1109, 4247, 1207, 78, 3223, 3321, 0, 678,
159, 246, 0, 89, 1139, 1544, 0, 4457, 2189, 896, 438, 196, 314, 0, 842, 0, 0, 1604, 1817, 0, 0, 3913, 0, 0, 350, 0, 3267, 759, 0, 1203, 0, 0,
3681, 0, 1705, 0, 4349, 1492, 6, 3426, 879, 0, 93, 0, 0, 0, 0, 0, 3363, 1589, 1045, 786, 395, 0, 818, 270, 38, 572, 2407, 376, 1702, 4363, 693, 0,
590, 0, 0, 0, 2105, 3552, 0, 4018, 2356, 601, 0, 0, 950, 498, 507, 4086, 4131, 468, 0, 719, 2937, 170, 569, 3307, 392, 3247, 0, 0, 0, 0, 3882, 871,
0, 0, 0, 0, 2045, 0, 1909, 576, 1428, 1660, 0, 0, 3853, 3807, 0, 3060, 0, 3698, 432, 1150, 0, 1994, 686, 1638, 0, 296, 1395, 0, 0, 3763, 0, 2150,
0, 3651, 0, 0, 259, 124, 0, 0, 3273, 1935, 0, 267, 4274, 68, 4185, 0, 2831, 0, 0, 1275, 0, 1038, 177, 0, 3937, 1148, 3372, 0, 3546, 0, 0, 1804,
0, 885, 0, 0, 1712, 0, 0, 1538, 914, 0, 0, 0, 76, 1796, 61, 2771, 51, 1549, 1744, 1184, 357, 0, 780, 1550, 2631, 3578, 3274, 0, 1635, 0, 0, 4231,
0, 4459, 813, 0, 2039, 4408, 1331, 0, 462, 0, 104, 0, 1950, 1736, 1621, 2281, 0, 0, 903, 3665, 4311, 0, 0, 0, 0, 3823, 2653, 0, 2119, 0, 844, 2037,
0, 2372, 0, 3945, 1440, 2015, 1654, 606, 0, 1611, 434, 147, 4516, 0, 1752, 2163, 0, 0, 2084, 3858, 1160, 488, 0, 0, 0, 479, 0, 0, 2507, 0, 3463, 0,
0, 1822, 2729, 1689, 737, 0, 37, 820, 408, 0, 4066, 188, 0, 918, 1445, 478, 0, 0, 4517, 0, 0, 0, 0, 781, 1153, 0, 1980, 0, 1654, 1947, 0, 1065,
33, 3353, 0, 2009, 0, 0, 1058, 0, 1466, 3964, 1282, 3105, 0, 0, 4133, 3400, 634, 0, 0, 478, 1033, 48, 0, 317, 1896, 0, 2292, 0, 0, 0, 0, 1472,
1230, 4261, 0, 0, 1318, 0, 411, 0, 2167, 0, 361, 2341, 1814}; 393, 945, 1083, 0, 1594, 1451, 0, 3174, 1455, 0, 2108, 789, 811, 1164, 3720, 2097,
224, 1422, 1581, 2819, 0, 0, 0, 0, 4209, 0, 0, 587, 0};
int MangledHashG(const char *key, const int *T) int MangledHashG(const char *key, const int *T)
{ {
...@@ -337,34 +337,30 @@ int MangledPerfectHash(const char *key) ...@@ -337,34 +337,30 @@ int MangledPerfectHash(const char *key)
return (MangledHashG(key, mangledkT1) + MangledHashG(key, mangledkT2)) % 4525; return (MangledHashG(key, mangledkT1) + MangledHashG(key, mangledkT2)) % 4525;
} }
constexpr int unmangledkT1[] = {302, 379, 163, 169, 248, 282, 8, 197, 129, 5, 332, 34, 237, constexpr int unmangledkT1[] = {171, 270, 202, 193, 51, 273, 319, 29, 312, 81, 181, 247, 334,
115, 333, 239, 99, 112, 161, 336, 130, 94, 170, 40, 318, 26}; 160, 186, 252, 234, 137, 189, 99, 312, 59, 196, 157, 87, 15};
constexpr int unmangledkT2[] = {168, 245, 303, 8, 51, 374, 166, 1, 422, 347, 141, 33, 240, constexpr int unmangledkT2[] = {0, 91, 210, 328, 207, 176, 17, 91, 234, 148, 315, 152, 334,
11, 188, 22, 20, 172, 272, 197, 205, 284, 310, 24, 358, 97}; 51, 88, 18, 221, 3, 190, 126, 270, 105, 214, 314, 190, 315};
constexpr int unmangledkG[] = { constexpr int unmangledkG[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 209, 71, 0, 156, 0, 0, 0, 0, 89, 0, 0, 0,
0, 106, 0, 20, 0, 0, 0, 0, 0, 50, 415, 0, 0, 0, 71, 0, 0, 0, 138, 0, 202, 145, 90, 254, 178, 0, 0, 0, 8, 0, 0, 140, 105, 0, 107, 0, 264, 28,
0, 0, 0, 339, 0, 32, 0, 0, 0, 177, 1, 147, 0, 0, 0, 110, 0, 403, 112, 193, 0, 0, 0, 0, 0, 0, 56, 38, 0, 136, 299, 142, 188, 137, 0, 19, 327, 0,
158, 0, 422, 0, 0, 0, 0, 166, 267, 105, 93, 0, 214, 362, 0, 133, 113, 0, 0, 7, 0, 0, 0, 108, 194, 0, 68, 186, 0, 181, 2, 305, 0, 281, 221, 0, 0, 0,
0, 320, 27, 0, 126, 0, 44, 79, 311, 78, 0, 0, 72, 0, 0, 0, 0, 0, 137, 0, 0, 39, 51, 0, 94, 138, 336, 344, 328, 0, 0, 0, 281, 86, 0, 0, 0, 301,
0, 238, 0, 0, 0, 0, 0, 0, 166, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 210, 254, 0, 113, 0, 0, 113, 0, 224, 132, 140, 0, 83, 0, 0, 101, 138, 164,
0, 297, 0, 0, 0, 73, 23, 256, 372, 77, 0, 0, 123, 196, 136, 0, 0, 347, 64, 151, 0, 254, 0, 0, 0, 123, 36, 0, 59, 189, 187, 0, 230, 348, 308, 2, 2, 0,
0, 60, 0, 101, 40, 0, 310, 411, 140, 0, 0, 0, 41, 0, 0, 0, 0, 177, 311, 0, 345, 0, 272, 83, 309, 0, 327, 0, 207, 202, 86, 331, 242, 0, 0, 0, 66, 0,
80, 144, 0, 198, 0, 0, 0, 149, 84, 0, 0, 0, 122, 88, 0, 354, 0, 81, 80, 0, 108, 0, 315, 0, 4, 0, 0, 5, 27, 251, 141, 185, 0, 206, 0, 0, 34, 61,
0, 100, 0, 156, 0, 0, 0, 276, 0, 107, 0, 0, 154, 0, 0, 0, 34, 368, 0, 326, 91, 279, 265, 312, 24, 156, 127, 238, 0, 68, 0, 0, 15, 198, 331, 198, 0, 196,
375, 0, 0, 330, 166, 0, 191, 34, 89, 0, 144, 0, 160, 0, 0, 220, 39, 0, 111, 31, 0, 135, 0, 0, 111, 71, 130, 0, 220, 192, 0, 321, 0, 212, 209, 0, 0, 124,
8, 28, 0, 18, 62, 138, 115, 0, 26, 27, 3, 4, 142, 13, 47, 127, 0, 209, 163, 219, 42, 52, 0, 0, 0, 168, 143, 0, 0, 20, 241, 0, 0, 172, 324, 122, 139, 0,
318, 0, 0, 17, 381, 0, 124, 0, 10, 0, 0, 156, 0, 0, 11, 316, 79, 0, 0, 159, 216, 42, 0, 0, 32, 31, 200, 39, 319, 0, 0, 17, 0, 0, 0, 0, 27, 193,
110, 0, 0, 330, 0, 13, 35, 0, 0, 24, 8, 138, 1, 387, 23, 202, 0, 0, 27, 150, 165, 29, 168, 0, 54, 110, 197, 172, 10, 169, 75, 304, 0, 0, 65, 96, 0, 0,
109, 11, 0, 174, 26, 291, 0, 0, 42, 197, 14, 134, 0, 94, 0, 0, 4, 0, 106, 21, 115, 0, 116, 79, 164, 73, 191, 324, 64, 6, 291, 38, 0, 199, 68, 16, 148, 283,
159, 292, 0, 49, 0, 347, 0, 62, 384, 131, 29, 0, 0, 153, 0, 164, 0, 172, 0, 197, 0, 0, 111, 12, 0, 255, 219, 344, 0, 76, 0, 302, 260, 258, 0, 344, 110, 187,
197, 0, 361, 0, 0, 7, 0, 0, 0, 311, 275, 212, 9, 118, 0, 0, 0, 42, 35, 0, 349, 82, 0, 0, 89, 0, 9, 0, 0, 16, 315, 74, 11, 111, 0, 0, 291, 0,
0, 0, 46, 116, 413, 398, 123, 229, 42, 0, 0, 200, 0, 142, 0, 296, 51, 0, 0, 0, 97, 39, 0, 1, 329, 0, 121, 0, 69, 0, 124, 0, 0, 53, 156, 164, 207, 117,
85, 341, 413, 0, 0, 0, 377, 0, 0, 0, 0, 24, 95, 183, 53, 18, 325, 0, 7, 0, 289, 0, 0, 0, 154, 0, 0, 0, 264, 262};
23, 202, 0, 0, 3, 387, 128, 0, 146, 63, 382, 0, 0, 0, 0, 0, 165, 0, 322,
59, 0, 107, 0, 90, 25, 0, 0, 114, 277, 0, 4, 37, 192, 0, 0, 0, 86, 0,
0, 182, 109, 139, 149, 0, 0, 0, 0, 0, 82, 0, 404, 0, 14, 55, 200, 0, 0,
301, 12, 0, 28, 0, 0, 0, 68, 382};
int UnmangledHashG(const char *key, const int *T) int UnmangledHashG(const char *key, const int *T)
{ {
...@@ -373,7 +369,7 @@ int UnmangledHashG(const char *key, const int *T) ...@@ -373,7 +369,7 @@ int UnmangledHashG(const char *key, const int *T)
for (int i = 0; key[i] != '\0'; i++) for (int i = 0; key[i] != '\0'; i++)
{ {
sum += T[i] * key[i]; sum += T[i] * key[i];
sum %= 427; sum %= 353;
} }
return unmangledkG[sum]; return unmangledkG[sum];
} }
...@@ -383,7 +379,7 @@ int UnmangledPerfectHash(const char *key) ...@@ -383,7 +379,7 @@ int UnmangledPerfectHash(const char *key)
if (strlen(key) > 26) if (strlen(key) > 26)
return 0; return 0;
return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 427; return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 353;
} }
} // namespace } // namespace
......
...@@ -28,35 +28,35 @@ bool isTextureOffsetBias(const TFunction *func) ...@@ -28,35 +28,35 @@ bool isTextureOffsetBias(const TFunction *func)
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3865 && id <= 3884; return id >= 3865 && id <= 3884;
} }
bool isTextureGatherOffsetsComp(const TFunction *func) bool isTextureGatherOffsetNoComp(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3922 && id <= 3934; return id >= 3922 && id <= 3929;
} }
bool isTextureGatherOffsetsNoComp(const TFunction *func) bool isTextureGatherOffsetComp(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3935 && id <= 3950; return id >= 3930 && id <= 3935;
} }
bool isTextureGatherOffsets(const TFunction *func) bool isTextureGatherOffset(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3922 && id <= 3950; return id >= 3922 && id <= 3935;
} }
bool isTextureGatherOffsetComp(const TFunction *func) bool isTextureGatherOffsetsNoComp(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3951 && id <= 3956; return id >= 3936 && id <= 3952;
} }
bool isTextureGatherOffsetNoComp(const TFunction *func) bool isTextureGatherOffsetsComp(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3957 && id <= 3964; return id >= 3953 && id <= 3964;
} }
bool isTextureGatherOffset(const TFunction *func) bool isTextureGatherOffsets(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3951 && id <= 3964; return id >= 3936 && id <= 3964;
} }
bool isTextureGather(const TFunction *func) bool isTextureGather(const TFunction *func)
{ {
...@@ -73,20 +73,20 @@ bool isAtomicMemory(const TFunction *func) ...@@ -73,20 +73,20 @@ bool isAtomicMemory(const TFunction *func)
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 4005 && id <= 4022; return id >= 4005 && id <= 4022;
} }
bool isImageLoad(const TFunction *func) bool isImageStore(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 4059 && id <= 4076; return id >= 4059 && id <= 4076;
} }
bool isImageAtomic(const TFunction *func) bool isImageLoad(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 4077 && id <= 4652; return id >= 4077 && id <= 4094;
} }
bool isImageStore(const TFunction *func) bool isImageAtomic(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 4653 && id <= 4670; return id >= 4095 && id <= 4670;
} }
bool isImage(const TFunction *func) bool isImage(const TFunction *func)
{ {
......
...@@ -28,35 +28,35 @@ bool isTextureOffsetBias(const TFunction *func) ...@@ -28,35 +28,35 @@ bool isTextureOffsetBias(const TFunction *func)
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 1279 && id <= 1313; return id >= 1279 && id <= 1313;
} }
bool isTextureGatherOffsetsComp(const TFunction *func) bool isTextureGatherOffsetNoComp(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 1358 && id <= 1373; return id >= 1358 && id <= 1369;
} }
bool isTextureGatherOffsetsNoComp(const TFunction *func) bool isTextureGatherOffsetComp(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 1374 && id <= 1393; return id >= 1370 && id <= 1378;
} }
bool isTextureGatherOffsets(const TFunction *func) bool isTextureGatherOffset(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 1358 && id <= 1393; return id >= 1358 && id <= 1378;
} }
bool isTextureGatherOffsetComp(const TFunction *func) bool isTextureGatherOffsetsNoComp(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 1394 && id <= 1402; return id >= 1379 && id <= 1399;
} }
bool isTextureGatherOffsetNoComp(const TFunction *func) bool isTextureGatherOffsetsComp(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 1403 && id <= 1414; return id >= 1400 && id <= 1414;
} }
bool isTextureGatherOffset(const TFunction *func) bool isTextureGatherOffsets(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 1394 && id <= 1414; return id >= 1379 && id <= 1414;
} }
bool isTextureGather(const TFunction *func) bool isTextureGather(const TFunction *func)
{ {
...@@ -73,20 +73,20 @@ bool isAtomicMemory(const TFunction *func) ...@@ -73,20 +73,20 @@ bool isAtomicMemory(const TFunction *func)
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 1488 && id <= 1505; return id >= 1488 && id <= 1505;
} }
bool isImageLoad(const TFunction *func) bool isImageStore(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 1578 && id <= 1613; return id >= 1578 && id <= 1613;
} }
bool isImageAtomic(const TFunction *func) bool isImageLoad(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 1614 && id <= 2735; return id >= 1614 && id <= 1646;
} }
bool isImageStore(const TFunction *func) bool isImageAtomic(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 2736 && id <= 2768; return id >= 1647 && id <= 2768;
} }
bool isImage(const TFunction *func) bool isImage(const TFunction *func)
{ {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
#!/usr/bin/env vpython #!/usr/bin/env vpython3
# #
# [VPYTHON:BEGIN] # [VPYTHON:BEGIN]
# wheel: < # wheel: <
...@@ -880,7 +880,7 @@ class UnmangledGroupedList: ...@@ -880,7 +880,7 @@ class UnmangledGroupedList:
class TType: class TType:
def __init__(self, glsl_header_type): def __init__(self, glsl_header_type):
if isinstance(glsl_header_type, basestring): if isinstance(glsl_header_type, str):
self.data = self.parse_type(glsl_header_type) self.data = self.parse_type(glsl_header_type)
else: else:
self.data = glsl_header_type self.data = glsl_header_type
...@@ -1189,16 +1189,16 @@ def get_function_names(group, mangled_names, unmangled_names): ...@@ -1189,16 +1189,16 @@ def get_function_names(group, mangled_names, unmangled_names):
parameters = get_parameters(function_props) parameters = get_parameters(function_props)
mangled_names.append(get_function_mangled_name(function_name, parameters)) mangled_names.append(get_function_mangled_name(function_name, parameters))
if 'subgroups' in group: if 'subgroups' in group:
for subgroup_name, subgroup in group['subgroups'].iteritems(): for subgroup_name, subgroup in group['subgroups'].items():
get_function_names(subgroup, mangled_names, unmangled_names) get_function_names(subgroup, mangled_names, unmangled_names)
def get_variable_names(group, mangled_names): def get_variable_names(group, mangled_names):
if 'variables' in group: if 'variables' in group:
for variable_name, props in group['variables'].iteritems(): for variable_name, props in group['variables'].items():
mangled_names.append(variable_name) mangled_names.append(variable_name)
if 'subgroups' in group: if 'subgroups' in group:
for subgroup_name, subgroup in group['subgroups'].iteritems(): for subgroup_name, subgroup in group['subgroups'].items():
get_variable_names(subgroup, mangled_names) get_variable_names(subgroup, mangled_names)
...@@ -1578,7 +1578,7 @@ def process_function_group( ...@@ -1578,7 +1578,7 @@ def process_function_group(
unmangled_script_generated_hash_tests, mangled_builtins) unmangled_script_generated_hash_tests, mangled_builtins)
if 'subgroups' in group: if 'subgroups' in group:
for subgroup_name, subgroup in group['subgroups'].iteritems(): for subgroup_name, subgroup in group['subgroups'].items():
process_function_group( process_function_group(
group_name + subgroup_name, subgroup, parameter_declarations, name_declarations, group_name + subgroup_name, subgroup, parameter_declarations, name_declarations,
unmangled_function_if_statements, defined_function_variants, unmangled_function_if_statements, defined_function_variants,
...@@ -1602,7 +1602,7 @@ def prune_parameters_arrays(parameter_declarations, function_declarations): ...@@ -1602,7 +1602,7 @@ def prune_parameters_arrays(parameter_declarations, function_declarations):
parameter_variable_name_replacements = {} parameter_variable_name_replacements = {}
used_param_variable_names = set() used_param_variable_names = set()
for param_variable_name, param_declaration in sorted( for param_variable_name, param_declaration in sorted(
parameter_declarations.iteritems(), key=lambda item: -len(item[0])): parameter_declarations.items(), key=lambda item: -len(item[0])):
replaced = False replaced = False
for used in used_param_variable_names: for used in used_param_variable_names:
if used.startswith(param_variable_name): if used.startswith(param_variable_name):
...@@ -1612,14 +1612,13 @@ def prune_parameters_arrays(parameter_declarations, function_declarations): ...@@ -1612,14 +1612,13 @@ def prune_parameters_arrays(parameter_declarations, function_declarations):
if not replaced: if not replaced:
used_param_variable_names.add(param_variable_name) used_param_variable_names.add(param_variable_name)
for i in xrange(len(function_declarations)): for i in range(len(function_declarations)):
for replaced, replacement in parameter_variable_name_replacements.iteritems(): for replaced, replacement in parameter_variable_name_replacements.items():
function_declarations[i] = function_declarations[i].replace( function_declarations[i] = function_declarations[i].replace(
'BuiltInParameters::' + replaced + ',', 'BuiltInParameters::' + replacement + ',') 'BuiltInParameters::' + replaced + ',', 'BuiltInParameters::' + replacement + ',')
return [ return [
value for key, value in parameter_declarations.iteritems() value for key, value in parameter_declarations.items() if key in used_param_variable_names
if key in used_param_variable_names
] ]
...@@ -1678,7 +1677,7 @@ def process_single_variable(shader_type, variable_name, props, builtin_id_declar ...@@ -1678,7 +1677,7 @@ def process_single_variable(shader_type, variable_name, props, builtin_id_declar
template_args['fields'] = 'fields_{name_with_suffix}'.format(**template_args) template_args['fields'] = 'fields_{name_with_suffix}'.format(**template_args)
init_member_variables.append( init_member_variables.append(
' TFieldList *{fields} = new TFieldList();'.format(**template_args)) ' TFieldList *{fields} = new TFieldList();'.format(**template_args))
for field_name, field_type in props['fields'].iteritems(): for field_name, field_type in props['fields'].items():
template_args['field_name'] = field_name template_args['field_name'] = field_name
template_args['field_type'] = TType(field_type).get_dynamic_type_string() template_args['field_type'] = TType(field_type).get_dynamic_type_string()
template_name_declaration = 'constexpr const ImmutableString {field_name}("{field_name}");' template_name_declaration = 'constexpr const ImmutableString {field_name}("{field_name}");'
...@@ -1780,7 +1779,7 @@ def process_single_variable_group(shader_type, group, builtin_id_declarations, ...@@ -1780,7 +1779,7 @@ def process_single_variable_group(shader_type, group, builtin_id_declarations,
global id_counter global id_counter
if 'variables' not in group: if 'variables' not in group:
return return
for variable_name, props in group['variables'].iteritems(): for variable_name, props in group['variables'].items():
process_single_variable(shader_type, variable_name, props, builtin_id_declarations, process_single_variable(shader_type, variable_name, props, builtin_id_declarations,
builtin_id_definitions, name_declarations, init_member_variables, builtin_id_definitions, name_declarations, init_member_variables,
get_variable_declarations, mangled_builtins, get_variable_declarations, mangled_builtins,
...@@ -1824,7 +1823,7 @@ def process_variable_group(shader_type, group_name, group, builtin_id_declaratio ...@@ -1824,7 +1823,7 @@ def process_variable_group(shader_type, group_name, group, builtin_id_declaratio
get_variable_definitions, script_generated_hash_tests) get_variable_definitions, script_generated_hash_tests)
if 'subgroups' in group: if 'subgroups' in group:
for subgroup_name, subgroup in group['subgroups'].iteritems(): for subgroup_name, subgroup in group['subgroups'].items():
process_variable_group( process_variable_group(
shader_type, subgroup_name, subgroup, builtin_id_declarations, shader_type, subgroup_name, subgroup, builtin_id_declarations,
builtin_id_definitions, name_declarations, init_member_variables, builtin_id_definitions, name_declarations, init_member_variables,
...@@ -1899,9 +1898,9 @@ def generate_files(essl_only, args, functions_txt_filename, variables_json_filen ...@@ -1899,9 +1898,9 @@ def generate_files(essl_only, args, functions_txt_filename, variables_json_filen
# This script uses a perfect hash function to avoid dealing with collisions # This script uses a perfect hash function to avoid dealing with collisions
mangled_names = [] mangled_names = []
unmangled_names = [] unmangled_names = []
for group_name, group in parsed_functions.iteritems(): for group_name, group in parsed_functions.items():
get_function_names(group, mangled_names, unmangled_names) get_function_names(group, mangled_names, unmangled_names)
for group_name, group in parsed_variables.iteritems(): for group_name, group in parsed_variables.items():
get_variable_names(group, mangled_names) get_variable_names(group, mangled_names)
# Hashing mangled names # Hashing mangled names
...@@ -1928,7 +1927,7 @@ def generate_files(essl_only, args, functions_txt_filename, variables_json_filen ...@@ -1928,7 +1927,7 @@ def generate_files(essl_only, args, functions_txt_filename, variables_json_filen
# Array for querying unmangled builtins # Array for querying unmangled builtins
unmangled_function_if_statements = UnmangledGroupedList(unmangled_hashfn, num_unmangled_names) unmangled_function_if_statements = UnmangledGroupedList(unmangled_hashfn, num_unmangled_names)
for group_name, group in parsed_functions.iteritems(): for group_name, group in parsed_functions.items():
process_function_group( process_function_group(
group_name, group, parameter_declarations, name_declarations, group_name, group, parameter_declarations, name_declarations,
unmangled_function_if_statements, defined_function_variants, builtin_id_declarations, unmangled_function_if_statements, defined_function_variants, builtin_id_declarations,
...@@ -1938,7 +1937,7 @@ def generate_files(essl_only, args, functions_txt_filename, variables_json_filen ...@@ -1938,7 +1937,7 @@ def generate_files(essl_only, args, functions_txt_filename, variables_json_filen
parameter_declarations = prune_parameters_arrays(parameter_declarations, function_declarations) parameter_declarations = prune_parameters_arrays(parameter_declarations, function_declarations)
for group_name, group in parsed_variables.iteritems(): for group_name, group in parsed_variables.items():
process_variable_group('NONE', group_name, group, builtin_id_declarations, process_variable_group('NONE', group_name, group, builtin_id_declarations,
builtin_id_definitions, name_declarations, init_member_variables, builtin_id_definitions, name_declarations, init_member_variables,
get_variable_declarations, mangled_builtins, get_variable_declarations, mangled_builtins,
...@@ -1997,9 +1996,9 @@ def generate_files(essl_only, args, functions_txt_filename, variables_json_filen ...@@ -1997,9 +1996,9 @@ def generate_files(essl_only, args, functions_txt_filename, variables_json_filen
'num_mangled_names': 'num_mangled_names':
num_mangled_names, num_mangled_names,
'script_generated_hash_tests': 'script_generated_hash_tests':
'\n'.join(script_generated_hash_tests.iterkeys()), '\n'.join(script_generated_hash_tests.keys()),
'unmangled_script_generated_hash_tests': 'unmangled_script_generated_hash_tests':
'\n'.join(unmangled_script_generated_hash_tests.iterkeys()), '\n'.join(unmangled_script_generated_hash_tests.keys()),
'mangled_S1': 'mangled_S1':
str(mangled_S1).replace('[', ' ').replace(']', ' '), str(mangled_S1).replace('[', ' ').replace(']', ' '),
'mangled_S2': 'mangled_S2':
...@@ -2090,9 +2089,9 @@ def main(): ...@@ -2090,9 +2089,9 @@ def main():
] ]
if args.auto_script_command == 'inputs': if args.auto_script_command == 'inputs':
print ','.join(inputs) print(','.join(inputs))
elif args.auto_script_command == 'outputs': elif args.auto_script_command == 'outputs':
print ','.join(outputs) print(','.join(outputs))
else: else:
print('Invalid script parameters') print('Invalid script parameters')
return 1 return 1
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment