Showing preview only (1,030K chars total). Download the full file or copy to clipboard to get everything.
Repository: thomasmueller/minperf
Branch: master
Commit: f97c859b5c4a
Files: 103
Total size: 983.5 KB
Directory structure:
gitextract_zbe5o8p1/
├── .gitignore
├── LICENSE
├── MAVEN.md
├── README.md
├── pom.xml
├── runjmh.sh
└── src/
├── main/
│ ├── c/
│ │ ├── Makefile
│ │ ├── filter/
│ │ │ ├── Makefile
│ │ │ └── xor.c
│ │ └── rec-split.c
│ └── java/
│ └── org/
│ └── minperf/
│ ├── BitBuffer.java
│ ├── RecSplitBuilder.java
│ ├── RecSplitEvaluator.java
│ ├── Settings.java
│ ├── bdz/
│ │ └── BDZ.java
│ ├── generator/
│ │ ├── ConcurrencyTool.java
│ │ └── Generator.java
│ ├── hash/
│ │ ├── HashPerformanceTest.java
│ │ ├── LongPair.java
│ │ ├── Mix.java
│ │ ├── Murmur2.java
│ │ ├── Murmur3.java
│ │ ├── SpookyHash.java
│ │ └── XXHash64.java
│ ├── hem/
│ │ ├── HemGenerator.java
│ │ ├── KeyReader.java
│ │ ├── Sort.java
│ │ ├── SortedSignatures.java
│ │ └── recsplit/
│ │ ├── Builder.java
│ │ ├── FastEvaluator.java
│ │ └── FastGenerator.java
│ ├── monotoneList/
│ │ ├── EliasFanoMonotoneList.java
│ │ ├── MonotoneList.java
│ │ └── MultiStageMonotoneList.java
│ ├── rank/
│ │ ├── Rank9.java
│ │ └── VerySimpleRank.java
│ ├── select/
│ │ ├── Select.java
│ │ ├── SimpleSelect.java
│ │ ├── SimpleSelectWrapper.java
│ │ └── VerySimpleSelect.java
│ ├── universal/
│ │ ├── LongHash.java
│ │ ├── StringHash.java
│ │ └── UniversalHash.java
│ └── utils/
│ ├── LargeLongList.java
│ ├── LongSet.java
│ ├── PoissonDistribution.java
│ ├── RandomSetGenerator.java
│ ├── RandomSetGeneratorSlow.java
│ └── Text.java
└── test/
└── java/
└── org/
└── minperf/
├── BitCodes.java
├── FunctionInfo.java
├── Graphics.java
├── LargeSetTest.java
├── Paper.java
├── PerformanceTest.java
├── Probability.java
├── RandomizedTest.java
├── SettingsTest.java
├── SpaceEstimator.java
├── SplitRuleTest.java
├── SplitRuleTest2.java
├── SplitRuleTest3.java
├── TestSplitStrategy.java
├── TextFileTest.java
├── TimeEstimator.java
├── WikipediaTest.java
├── bdz/
│ └── BDZTest.java
├── c/
│ └── HashGenerator.java
├── chd/
│ ├── CHD.java
│ ├── CHD2.java
│ ├── CHDTest.java
│ ├── EliasFanoList.java
│ └── EliasFanoListTest.java
├── cuckoo/
│ ├── CuckooHashMap.java
│ ├── CuckooHashTest.java
│ └── CuckooLongKeyHashSet.java
├── hash/
│ └── MixTest.java
├── hem/
│ ├── HEM.java
│ ├── MetaFile.java
│ ├── RandomGenerator.java
│ └── recsplit/
│ └── TestFast.java
├── hybrid/
│ └── HybridTest.java
├── medium/
│ ├── EstimateTimeForHugeSets.java
│ ├── EstimateTwoBillionEntries.java
│ ├── MediumRecSplit.java
│ ├── MediumTest.java
│ ├── PartitionIntoSimilarSizedSets.java
│ ├── RecSplitEliasFano.java
│ ├── SimulateProbFallIntoLarge.java
│ └── TestBBHash.java
├── monotoneList/
│ ├── FenwickTreeMonotoneList.java
│ └── MonotoneListTest.java
├── rank/
│ ├── Rank9Test.java
│ └── RankTest.java
├── select/
│ └── SelectTest.java
├── simple/
│ ├── LongCollection.java
│ ├── SimpleRecSplit.java
│ ├── SimpleTest.java
│ └── recsplit.md
├── tools/
│ ├── Dump.java
│ └── Load.java
└── utils/
├── FastDigitFromNumberExtraction.java
└── TextTest.java
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
.checkstyle
.classpath
.project
.settings
bin
/target/
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: MAVEN.md
================================================
Please ensure that unit tests actually pass.
```
mvn clean install -DskipTests
java -Xmx16g -cp target/minperf-1.0-SNAPSHOT-jar-with-dependencies.jar org.minperf.bloom.JmhBench
```
================================================
FILE: README.md
================================================
# minperf
A Minimal Perfect Hash Function Library.
* Mainly written in Java. Includes a C version (currently only evaluation of a MPHF).
* Can generate, in linear time, MPHFs that need less than 1.58 bits per key.
* Can generate MPHFs in less than 100 ns/key, evaluation faster than 100 ns/key, at less than 3 bits per key.
* Concurrent generation.
* Tested up to 1 billion keys.
* Two parameters to configure space needed, generation time, and evaluation time.
* Can be used as a static bloom filter, by storing a hash fingerprint per key.
* Performance very similar than the [Sux4J](https://github.com/vigna/Sux4J) CHD and GOV algorithms, but configurable, with ability to use less space.
This library should already be usable, but it is still work in progress. The plan is to publish a paper.
The algorithm used is described [here as text](https://github.com/thomasmueller/minperf/blob/master/src/test/java/org/minperf/simple/recsplit.md), and
[here as slideshow](https://github.com/thomasmueller/minperf/raw/master/src/test/java/org/minperf/simple/recsplit.pdf) ([also available on SlideShare](https://www.slideshare.net/ThomasMueller12/recsplit-minimal-perfect-hashing)).
================================================
FILE: pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>thomasmueller</groupId>
<artifactId>minperf</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<jmh.version>1.4</jmh.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<uberjar.name>benchmarks</uberjar.name>
</properties>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
================================================
FILE: runjmh.sh
================================================
mvn clean install -DskipTests && java -Xmx16g -cp target/minperf-1.0-SNAPSHOT-jar-with-dependencies.jar org.minperf.bloom.JmhBench > JmhBench.log && java -Xmx16g -cp target/minperf-1.0-SNAPSHOT-jar-with-dependencies.jar org.minperf.bloom.JmhBenchBloom > JmhBenchBloom.log && java -Xmx16g -cp target/minperf-1.0-SNAPSHOT-jar-with-dependencies.jar org.minperf.bloom.JmhBenchCuckoo8_4 > JmhBenchCuckoo8_4.log && java -Xmx16g -cp target/minperf-1.0-SNAPSHOT-jar-with-dependencies.jar org.minperf.bloom.JmhBenchCuckoo16_4 > JmhBenchCuckoo16_4.log && java -Xmx16g -cp target/minperf-1.0-SNAPSHOT-jar-with-dependencies.jar org.minperf.bloom.JmhBenchXor8 > JmhBenchXor8.log && java -Xmx16g -cp target/minperf-1.0-SNAPSHOT-jar-with-dependencies.jar org.minperf.bloom.JmhBenchXor16 > JmhBenchXor16.log && java -Xmx16g -cp target/minperf-1.0-SNAPSHOT-jar-with-dependencies.jar org.minperf.bloom.JmhBenchXor16 > JmhBenchXor16.log && java -Xmx16g -cp target/minperf-1.0-SNAPSHOT-jar-with-dependencies.jar org.minperf.bloom.JmhBenchXor > JmhBenchXor.log && java -Xmx16g -cp target/minperf-1.0-SNAPSHOT-jar-with-dependencies.jar org.minperf.bloom.JmhBenchCuckoo > JmhBenchCuckoo.log
================================================
FILE: src/main/c/Makefile
================================================
#
# RecSplit for C.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
TARGETS = rec-split
CC = gcc
CFLAGS = -Wall -g -O3
all: $(TARGETS)
rec-split: rec-split.o
# gcc rec-split.o -o rec-split
rec-split.o: rec-split.c
# gcc -c rec-split.c -o rec-split.o
clean:
rm -f *.a *.o $(TARGETS)
decompile:
objdump -S --disassemble rec-split
================================================
FILE: src/main/c/filter/Makefile
================================================
#
# RecSplit for C.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
TARGETS = xor
CC = gcc
CFLAGS = -Wall -g -O3
all: $(TARGETS)
xor: xor.o
# gcc xor.o -o xor
xor.o: xor.c
# gcc -c xor.c -o xor.o
clean:
rm -f *.a *.o $(TARGETS)
decompile:
objdump -S --disassemble xor
================================================
FILE: src/main/c/filter/xor.c
================================================
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <time.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
// file I/O
int64_t getFileSize(FILE* fp) {
struct stat buf;
int fd = fileno(fp);
fstat(fd, &buf);
int64_t size = buf.st_size;
return size;
}
int loadFile(char* directory, char* fileName, uint8_t** target) {
if (!fileName || !directory) {
printf("No file\n");
return 0;
}
char* fullFileName = malloc(strlen(directory) + strlen(fileName) + 2);
sprintf(fullFileName, "%s/%s", directory, fileName);
printf("Loading file %s\n", fullFileName);
FILE* fp = fopen(fullFileName, "r");
free(fullFileName);
if (!fp) {
printf("Could not open file\n");
return 0;
}
int64_t fileSize = getFileSize(fp);
printf("File size: %lld\n", fileSize);
*target = malloc(fileSize);
size_t len = fread(*target, fileSize, 1, fp);
if (len != 1) {
printf("Could not full read the file\n");
return 0;
}
fclose(fp);
printf("(%lld bytes)\n", fileSize);
return 1;
}
// bit manipulation
uint64_t rotateLeft64(uint64_t x, uint32_t n) {
// TODO check if this is the best way, and if it always works as expected
return (x << (n & 63)) | (x >> (64 - (n & 63)));
}
int numberOfLeadingZeros64(uint64_t x) {
// If x is 0, the result is undefined.
return __builtin_clzl(x);
}
int numberOfLeadingZeros32(uint32_t x) {
// If x is 0, the result is undefined.
return __builtin_clz(x);
}
// hashing related
inline uint32_t reduce(uint32_t hash, uint32_t n) {
// http://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/
return (uint32_t) (((uint64_t) hash * n) >> 32);
}
// from https://stackoverflow.com/questions/11656241/how-to-print-uint128-t-number-using-gcc/11660651#11660651
typedef unsigned __int128 uint128_t;
// data
uint8_t* data;
uint32_t getArrayLength(uint32_t size) {
return (uint32_t) (3 + (uint64_t) 123 * size / 100);
}
uint64_t hash64(uint64_t x) {
x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9L;
x = (x ^ (x >> 27)) * 0x94d049bb133111ebL;
x = x ^ (x >> 31);
return x;
}
uint32_t fingerprint(uint64_t hash) {
return (uint32_t) (hash & ((1 << 8) - 1));
}
// XorFilter8
struct XorFilter8 {
uint32_t size;
uint32_t arrayLength;
uint32_t blockLength;
uint32_t hashIndex;
uint8_t* fingerprints;
};
struct XorFilter8 filter;
void XorFilter_load(struct XorFilter8* this) {
printf("Loading...\n");
this->size = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
printf("Size %d\n", this->size);
this->hashIndex = (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7];
printf("HashIndex %d\n", this->hashIndex);
this->arrayLength = getArrayLength(this->size);
this->blockLength = this->arrayLength / 3;
this->fingerprints = data + 8;
}
uint32_t XorFilter_mayContain(struct XorFilter8* this, uint64_t key) {
uint64_t hash = hash64(key + this->hashIndex);
uint32_t f = fingerprint(hash);
uint32_t r0 = (uint32_t) hash;
uint32_t r1 = (uint32_t) (hash >> 16);
uint32_t r2 = (uint32_t) (hash >> 32);
uint32_t h0 = reduce(r0, this->blockLength);
uint32_t h1 = reduce(r1, this->blockLength) + this->blockLength;
uint32_t h2 = reduce(r2, this->blockLength) + 2 * this->blockLength;
f ^= this->fingerprints[h0] ^ this->fingerprints[h1] ^ this->fingerprints[h2];
return (f & 0xff) == 0;
}
// demo
int main(int argc, char** argv) {
char* directory = ".";
++argv;
--argc;
if (argc > 0) {
directory = argv[0];
++argv;
--argc;
}
printf("Directory %s\n", directory);
char* hashFile = "hash.bin";
char* keyFile = "keys.txt";
if (!loadFile(directory, hashFile, &data)) {
return 0;
}
FILE* input;
if(!keyFile) {
input = stdin;
} else {
char* fullFileName = malloc(strlen(directory) + strlen(keyFile) + 2);
sprintf(fullFileName, "%s/%s", directory, keyFile);
printf("Loading file %s\n", fullFileName);
input = fopen(fullFileName, "rb");
free(fullFileName);
if (!input) {
printf("Could not open file %s\n", keyFile);
return 0;
}
}
XorFilter_load(&filter);
char line[255];
// used to measure time of i/o
// (it turned out to be 50 ns / key)
/*
for(int i=0; i<5; i++) {
clock_t start = clock();
int64_t sum = 0;
while (fgets(line, 255, input)) {
int len = strlen(line);
// trim
while (len > 0 && line[len - 1] < ' ') {
line[--len] = 0;
}
sum += len;
}
clock_t time = (clock() - start);
printf("sum: %lld sec: %ld %d\n", sum, time, CLOCKS_PER_SEC);
rewind(input);
}
*/
clock_t start = clock();
int64_t sum = 0;
while (fgets(line, 255, input)) {
int len = strlen(line);
// trim
while (len > 0 && line[len - 1] < ' ') {
line[--len] = 0;
}
uint64_t key = atoll(line);
uint32_t contain = XorFilter_mayContain(&filter, key);
sum += contain;
}
clock_t time = (clock() - start);
printf("Sum: %lld time: %ld ticks, at %d ticks/second\n", sum, time, CLOCKS_PER_SEC);
free(data);
return 0;
}
================================================
FILE: src/main/c/rec-split.c
================================================
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <time.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
// file I/O
int64_t getFileSize(FILE* fp) {
struct stat buf;
int fd = fileno(fp);
fstat(fd, &buf);
int64_t size = buf.st_size;
return size;
}
void fixEndian(uint64_t* longArray, uint64_t byteCount) {
uint8_t* byteArray = (uint8_t*) longArray;
uint64_t l=0;
uint64_t b=0;
while(b<byteCount) {
uint64_t x = 0;
for(int i=0; i<8; i++) {
x = (x << 8) | byteArray[b++];
}
longArray[l++] = x;
}
}
int loadFile(char* directory, char* fileName, uint64_t** target) {
if (!fileName || !directory) {
printf("No file\n");
return 0;
}
char* fullFileName = malloc(strlen(directory) + strlen(fileName) + 2);
sprintf(fullFileName, "%s/%s", directory, fileName);
printf("Loading file %s\n", fullFileName);
FILE* fp = fopen(fullFileName, "r");
free(fullFileName);
if (!fp) {
printf("Could not open file\n");
return 0;
}
int64_t fileSize = getFileSize(fp);
printf("File size: %lld\n", fileSize);
*target = malloc(fileSize);
size_t len = fread(*target, fileSize, 1, fp);
if (len != 1) {
printf("Could not full read the file\n");
return 0;
}
fclose(fp);
printf("(%lld bytes)\n", fileSize);
fixEndian(*target, fileSize);
return 1;
}
// bit manipulation
uint64_t rotateLeft64(uint64_t x, uint32_t n) {
// TODO check if this is the best way, and if it always works as expected
return (x << (n & 63)) | (x >> (64 - (n & 63)));
}
int numberOfLeadingZeros64(uint64_t x) {
// If x is 0, the result is undefined.
return __builtin_clzl(x);
}
int numberOfLeadingZeros32(uint32_t x) {
// If x is 0, the result is undefined.
return __builtin_clz(x);
}
// hashing related
inline uint32_t reduce(uint32_t hash, uint32_t n) {
// http://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/
return (uint32_t) (((uint64_t) hash * n) >> 32);
}
uint64_t getScaleFactor(uint32_t multiply, uint32_t divide) {
return divide == 0 ? 0 : ((uint64_t) multiply << 32) / divide + 1;
}
// from https://stackoverflow.com/questions/11656241/how-to-print-uint128-t-number-using-gcc/11660651#11660651
typedef unsigned __int128 uint128_t;
uint128_t getSipHash24b128(char* b, int start, int end, uint64_t k0, uint64_t k1) {
uint64_t v0 = k0 ^ 0x736f6d6570736575L;
uint64_t v1 = k1 ^ 0x646f72616e646f6dL;
uint64_t v2 = k0 ^ 0x6c7967656e657261L;
uint64_t v3 = k1 ^ 0x7465646279746573L;
int repeat;
for (int off = start; off <= end + 8; off += 8) {
long m;
if (off <= end) {
m = 0;
int i = 0;
for (; i < 8 && off + i < end; i++) {
m |= ((uint64_t) b[off + i] & 255) << (8 * i);
}
if (i < 8) {
m |= ((uint64_t) end - start) << 56;
}
v3 ^= m;
repeat = 2;
} else {
m = 0;
v2 ^= 0xff;
repeat = 4;
}
for (int i = 0; i < repeat; i++) {
v0 += v1;
v2 += v3;
v1 = rotateLeft64(v1, 13);
v3 = rotateLeft64(v3, 16);
v1 ^= v0;
v3 ^= v2;
v0 = rotateLeft64(v0, 32);
v2 += v1;
v0 += v3;
v1 = rotateLeft64(v1, 17);
v3 = rotateLeft64(v3, 21);
v1 ^= v2;
v3 ^= v0;
v2 = rotateLeft64(v2, 32);
}
v0 ^= m;
}
return ((uint128_t) (v0 ^ v1) << 64) ^ v2 ^ v3;
}
uint64_t getSipHash24b(char* b, int start, int end, uint64_t k0, uint64_t k1) {
uint64_t v0 = k0 ^ 0x736f6d6570736575L;
uint64_t v1 = k1 ^ 0x646f72616e646f6dL;
uint64_t v2 = k0 ^ 0x6c7967656e657261L;
uint64_t v3 = k1 ^ 0x7465646279746573L;
int repeat;
for (int off = start; off <= end + 8; off += 8) {
long m;
if (off <= end) {
m = 0;
int i = 0;
for (; i < 8 && off + i < end; i++) {
m |= ((uint64_t) b[off + i] & 255) << (8 * i);
}
if (i < 8) {
m |= ((uint64_t) end - start) << 56;
}
v3 ^= m;
repeat = 2;
} else {
m = 0;
v2 ^= 0xff;
repeat = 4;
}
for (int i = 0; i < repeat; i++) {
v0 += v1;
v2 += v3;
v1 = rotateLeft64(v1, 13);
v3 = rotateLeft64(v3, 16);
v1 ^= v0;
v3 ^= v2;
v0 = rotateLeft64(v0, 32);
v2 += v1;
v0 += v3;
v1 = rotateLeft64(v1, 17);
v3 = rotateLeft64(v3, 21);
v1 ^= v2;
v3 ^= v0;
v2 = rotateLeft64(v2, 32);
}
v0 ^= m;
}
return v0 ^ v1 ^ v2 ^ v3;
}
uint64_t getSipHash24(char* b, uint64_t k0, uint64_t k1) {
// TODO assuming 8 bits per char
return getSipHash24b(b, 0, strlen(b), k0, k1);
}
uint64_t universalHash(char* key, uint64_t index) {
return getSipHash24(key, index, index);
}
// BitBuffer
uint64_t* data;
uint64_t pos;
uint64_t readBit() {
uint64_t p = pos++;
return (data[p >> 6] >> (63 - (p & 63))) & 1;
}
uint64_t readEliasDelta() {
int qq = 0;
while (readBit() == 0) {
qq++;
}
int64_t q = 1;
for (int i = qq; i > 0; i--) {
q = (q << 1) | readBit();
}
uint64_t x = 1;
for (int64_t i = q - 2; i >= 0; i--) {
x = (x << 1) | readBit();
}
return x;
}
uint64_t readNumber(uint64_t pos, int bitCount) {
if (bitCount == 0) {
return 0;
}
int remainingBits = 64 - (pos & 63);
int index = pos >> 6;
long x = data[index];
if (bitCount <= remainingBits) {
x >>= remainingBits - bitCount;
return x & ((1L << bitCount) - 1);
}
x = x & ((1L << remainingBits) - 1);
return (x << (bitCount - remainingBits)) |
(data[index + 1] >> (64 - bitCount + remainingBits));
}
uint32_t supplementalHash(uint64_t hash, uint64_t index) {
// it would be better to use long,
// but with some processors, 32-bit multiplication
// seem to be much faster
// (about 1200 ms for 32 bit, about 2000 ms for 64 bit)
uint32_t x = (uint32_t) (rotateLeft64(hash, (uint32_t) index) ^ index);
x = ((x >> 16) ^ x) * 0x45d9f3b;
x = ((x >> 16) ^ x) * 0x45d9f3b;
x = (x >> 16) ^ x;
return x;
}
uint64_t unfoldSigned(uint64_t x) {
return ((x & 1) == 1) ? (x + 1) / 2 : -(x / 2);
}
int getEliasDeltaSize(uint64_t value) {
if (value <= 0) {
// illegal argument
return -1;
}
int q = 64 - numberOfLeadingZeros64(value);
int qq = 31 - numberOfLeadingZeros32(q);
int len = qq + qq + q;
return len;
}
int readUntilZeroMore(int count, uint64_t pos) {
while (true) {
long x = data[++pos];
if (x == -1L) {
count += 64;
continue;
}
return count + numberOfLeadingZeros64(~x);
}
}
int readUntilZero(uint64_t pos) {
int remainingBits = 64 - (pos & 63);
uint64_t index = pos >> 6;
uint64_t x = data[index] << (64 - remainingBits);
int count = numberOfLeadingZeros64(~x);
if (count < remainingBits) {
return count;
}
return readUntilZeroMore(count, index);
}
uint64_t skipGolombRice(uint64_t pos, int shift) {
int q = readUntilZero(pos);
return pos + q + 1 + shift;
}
// MultiStageMonotoneList
struct MultiStageMonotoneList {
uint64_t startLevel1, startLevel2, startLevel3;
int bitCount1, bitCount2, bitCount3;
uint32_t count1, count2, count3;
uint64_t factor;
uint32_t add;
};
struct MultiStageMonotoneList list;
#define SHIFT1 6
#define SHIFT2 3
#define FACTOR1 32
#define FACTOR2 16
void MultiStageMonotoneList_load(struct MultiStageMonotoneList* this) {
this->count3 = (uint32_t) readEliasDelta() - 1;
int diff = (uint32_t) readEliasDelta() - 1;
this->factor = getScaleFactor(diff, this->count3);
this->add = (uint32_t) unfoldSigned(readEliasDelta() - 1);
this->bitCount1 = (int) readEliasDelta() - 1;
this->bitCount2 = (int) readEliasDelta() - 1;
this->bitCount3 = (int) readEliasDelta() - 1;
this->startLevel1 = pos;
this->count2 = (this->count3 + (1 << SHIFT2) - 1) >> SHIFT2;
this->count1 = (this->count3 + (1 << SHIFT1) - 1) >> SHIFT1;
this->startLevel2 = this->startLevel1 + this->count1 * this->bitCount1;
this->startLevel3 = this->startLevel2 + this->count2 * this->bitCount2;
pos = (this->startLevel3 + this->bitCount3 * this->count3);
}
uint32_t MultiStageMonotoneList_get(struct MultiStageMonotoneList* this, uint32_t i) {
int expected = (int) ((i * this->factor) >> 32) + this->add;
long a = readNumber(this->startLevel1 + (i >> SHIFT1) * this->bitCount1, this->bitCount1);
long b = readNumber(this->startLevel2 + (i >> SHIFT2) * this->bitCount2, this->bitCount2);
long c = readNumber(this->startLevel3 + i * this->bitCount3, this->bitCount3);
return (int) (expected + a * FACTOR1 + b * FACTOR2 + c);
}
uint64_t MultiStageMonotoneList_getPair(struct MultiStageMonotoneList* this, uint32_t i) {
return ((uint64_t) MultiStageMonotoneList_get(this, i) << 32) | (MultiStageMonotoneList_get(this, i + 1));
}
// Settings
#define MAX_SIZE 4096
#define SUPPLEMENTAL_HASH_SHIFT 18
struct Settings {
int leafSize;
int averageBucketSize;
int rice[MAX_SIZE];
int splits[MAX_SIZE];
};
struct Settings settings;
void Settings_load(struct Settings* this) {
this->leafSize = readEliasDelta() - 1;
this->averageBucketSize = readEliasDelta() - 1;
uint32_t len = readEliasDelta() - 1;
printf("Loading settings: leafSize: %d, averageBucketSize: %d, maxBucketSize: %d\n",
this->leafSize,
this->averageBucketSize,
len);
for(int i=0; i<len && i < MAX_SIZE; i++) {
this->splits[i] = unfoldSigned(readEliasDelta() - 1);
this->rice[i] = readEliasDelta() - 1;
// if (i < 32)
// printf(" %d: rice=%d, splits: %d\n", i, this->rice[i], this->splits[i]);
}
}
uint64_t getUniversalHashIndex(uint64_t index) {
return index >> SUPPLEMENTAL_HASH_SHIFT;
}
// RecSplitEvaluator
struct RecSplitEvaluator {
uint64_t size;
uint32_t bucketCount;
uint32_t minStartDiff;
struct MultiStageMonotoneList startList;
uint32_t minOffsetDiff;
struct MultiStageMonotoneList offsetList;
uint32_t startBuckets;
uint32_t endHeader;
uint32_t endOffsetList;
};
struct RecSplitEvaluator evaluator;
uint32_t getBucketCount(uint64_t size, int averageBucketSize) {
return (uint32_t) ((size + averageBucketSize - 1) / averageBucketSize);
}
void RecSplitEvaluator_load(struct RecSplitEvaluator* this) {
this->size = readEliasDelta() - 1;
printf("Hash size %lld\n", this->size);
this->bucketCount = getBucketCount(this->size, settings.averageBucketSize);
printf("Buckets: %d\n", this->bucketCount);
int alternative = readBit() != 0;
if (alternative) {
// not supported
printf("Not supported: alternative hash\n");
return;
}
this->minOffsetDiff = (uint32_t) (readEliasDelta() - 1);
// printf("minOffsetDiff: %d\n", this->minOffsetDiff);
this->minStartDiff = (uint32_t) (readEliasDelta() - 1);
// printf("minStartDiff: %d\n", this->minStartDiff);
this->endHeader = pos;
MultiStageMonotoneList_load(&(this->offsetList));
this->endOffsetList = pos;
MultiStageMonotoneList_load(&(this->startList));
this->startBuckets = pos;
// printf("hash loaded\n");
}
uint32_t getMinBitCount(uint32_t size) {
// at least 1.375 bits per key (if it is less, fill with zeroes)
return (size * 11 + 7) >> 3;
}
uint32_t skip(struct RecSplitEvaluator* this, uint64_t pos, uint32_t size) {
if (size < 2) {
return pos;
}
pos = skipGolombRice(pos, settings.rice[size]);
if (size <= settings.leafSize) {
return pos;
}
int split = settings.splits[size];
int firstPart, otherPart;
if (split < 0) {
firstPart = -split;
otherPart = size - firstPart;
split = 2;
} else {
firstPart = size / split;
otherPart = firstPart;
}
int s = firstPart;
for (int i = 0; i < split; i++) {
pos = skip(this, pos, s);
s = otherPart;
}
return pos;
}
uint32_t evaluate2(struct RecSplitEvaluator* this, uint64_t pos, char* obj, uint64_t hashCode,
uint64_t index, uint32_t add, uint32_t size) {
while (true) {
if (size < 2) {
return add;
}
int shift = settings.rice[size];
uint64_t q = readUntilZero(pos);
pos += q + 1;
uint64_t value = (q << shift) | readNumber(pos, shift);
pos += shift;
uint64_t oldX = getUniversalHashIndex(index);
index += value + 1;
uint64_t x = getUniversalHashIndex(index);
if (x != oldX) {
hashCode = universalHash(obj, x);
}
if (size <= settings.leafSize) {
int h = supplementalHash(hashCode, index);
h = reduce(h, size);
//printf("shift %d q %d value %lld oldX %lld x %lld size %d h %d add %d\n", shift, q, value, oldX, x, size, h, add);
return add + h;
}
int split = settings.splits[size];
int firstPart, otherPart;
if (split < 0) {
firstPart = -split;
otherPart = size - firstPart;
split = 2;
} else {
firstPart = size / split;
otherPart = firstPart;
}
int h = supplementalHash(hashCode, index);
if (firstPart != otherPart) {
h = reduce(h, size);
if (h < firstPart) {
size = firstPart;
continue;
}
pos = skip(this, pos, firstPart);
add += firstPart;
size = otherPart;
continue;
}
h = reduce(h, split);
for (int i = 0; i < h; i++) {
pos = skip(this, pos, firstPart);
add += firstPart;
}
size = firstPart;
}
}
uint64_t evaluate(struct RecSplitEvaluator* this, char* obj) {
uint64_t hashCode = universalHash(obj, 0);
//printf(" hashCode %s = %lld\n", obj, hashCode);
uint32_t b;
if (this->bucketCount == 1) {
b = 0;
} else {
b = reduce((uint32_t) hashCode, this->bucketCount);
}
//printf(" bucket %d\n", b);
uint32_t startPos;
uint64_t offsetPair = MultiStageMonotoneList_getPair(&this->offsetList, b);
uint32_t offset = (uint32_t) (offsetPair >> 32) + b * this->minOffsetDiff;
uint32_t offsetNext = ((uint32_t) offsetPair) + (b + 1) * this->minOffsetDiff;
if (offsetNext == offset) {
// entry not found
return 0;
}
uint32_t bucketSize = offsetNext - offset;
startPos = this->startBuckets +
getMinBitCount(offset) +
MultiStageMonotoneList_get(&this->startList, b) + b * this->minStartDiff;
// printf(" startPos %d offset %d bucketSize %d\n", startPos, offset, bucketSize);
return evaluate2(this, startPos, obj, hashCode, 0, offset, bucketSize);
}
// demo
int main(int argc, char** argv) {
char* directory = ".";
++argv;
--argc;
if (argc > 0) {
directory = argv[0];
++argv;
--argc;
}
printf("Directory %s\n", directory);
char* settingsFile = "settings.bin";
char* hashFile = "hash.bin";
char* keyFile = "keys.txt";
if (!loadFile(directory, settingsFile, &data)) {
return 0;
}
Settings_load(&settings);
free(data);
if (!loadFile(directory, hashFile, &data)) {
return 0;
}
FILE* input;
if(!keyFile) {
input = stdin;
} else {
char* fullFileName = malloc(strlen(directory) + strlen(keyFile) + 2);
sprintf(fullFileName, "%s/%s", directory, keyFile);
printf("Loading file %s\n", fullFileName);
input = fopen(fullFileName, "rb");
free(fullFileName);
if (!input) {
printf("Could not open file %s\n", keyFile);
return 0;
}
}
pos = 0;
RecSplitEvaluator_load(&evaluator);
char line[255];
// used to measure time of i/o
// (it turned out to be 50 ns / key)
/*
for(int i=0; i<5; i++) {
clock_t start = clock();
int64_t sum = 0;
while (fgets(line, 255, input)) {
int len = strlen(line);
// trim
while (len > 0 && line[len - 1] < ' ') {
line[--len] = 0;
}
sum += len;
}
clock_t time = (clock() - start);
printf("sum: %lld sec: %ld %d\n", sum, time, CLOCKS_PER_SEC);
rewind(input);
}
*/
clock_t start = clock();
int64_t sum = 0;
while (fgets(line, 255, input)) {
int len = strlen(line);
// trim
while (len > 0 && line[len - 1] < ' ') {
line[--len] = 0;
}
uint64_t index = evaluate(&evaluator, line);
sum += index;
}
clock_t time = (clock() - start);
// with leafSize 8 and averageBucketSize 128 and 10 million keys,
// that is 1.79 bits/key, average key length 55 bits/key,
// evaluate takes about 220 ns/key with -O3, and 260 ns/key with -Os
// with leafSize 6 and averageBucketSize 18 and 10 million keys,
// that is 2.33 bits/key, average key length 55 bits/key,
// evaluate takes about 140 ns/key with -O3
printf("sum: %lld time: %ld ticks, at %d ticks/second\n", sum, time, CLOCKS_PER_SEC);
free(data);
return 0;
}
================================================
FILE: src/main/java/org/minperf/BitBuffer.java
================================================
package org.minperf;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;
/**
* A simple bit buffer. It is partially optimized for reading, but writing is
* relatively slow. Writing will only add bits (bitwise or with existing bits).
*/
public class BitBuffer {
public final long[] data;
private int pos;
public BitBuffer(long bits) {
this.data = new long[(int)((bits + 63) / 64)];
}
public BitBuffer(byte[] data) {
this.data = new long[(data.length + 7) / 8];
if (this.data.length != data.length * 8) {
data = Arrays.copyOf(data, this.data.length * 8);
}
ByteBuffer.wrap(data).order(ByteOrder.BIG_ENDIAN).asLongBuffer().get(this.data);
}
/**
* Create a buffer that shared the byte data, but uses a separate position
* (initially 0).
*
* @param buffer the buffer
*/
public BitBuffer(BitBuffer buffer) {
this.data = buffer.data;
}
public void write(BitBuffer bits) {
int count = bits.pos;
bits.pos = 0;
// for (int i = 0; i < count; i++) {
// writeBit(bits.readBit());
// }
int i = 0;
for (; i < count - 31; i += 32) {
writeNumber(bits.readNumber(32), 32);
}
for (; i < count; i++) {
writeBit(bits.readBit());
}
}
public int position() {
return pos;
}
public void seek(int pos) {
this.pos = pos;
}
/**
* Read a number.
*
* @param bitCount the number of bits, at most 63
* @return the value
*/
public long readNumber(int bitCount) {
long x = readNumber(pos, bitCount);
pos += bitCount;
return x;
}
public long readLong() {
return (readNumber(32) << 32) | readNumber(32);
}
/**
* Read a number.
*
* @param pos the position
* @param bitCount the number of bits, at most 63
* @return the value
*/
public long readNumber(long pos, int bitCount) {
if (bitCount == 0) {
return 0;
}
int remainingBits = 64 - ((int) pos & 63);
int index = (int) (pos >>> 6);
long x = data[index];
if (bitCount <= remainingBits) {
x >>>= remainingBits - bitCount;
return x & ((1L << bitCount) - 1);
}
x = x & ((1L << remainingBits) - 1);
return (x << (bitCount - remainingBits)) |
(data[index + 1] >>> (64 - bitCount + remainingBits));
}
/**
* Fold a signed number into an unsigned number. Negative numbers are odd,
* and positive numbers are even. For example, -5 is converted to 11, and 5
* to 10.
*
* @param x a signed number
* @return an unsigned number
*/
public static long foldSigned(long x) {
return x > 0 ? x * 2 - 1 : -x * 2;
}
/**
* Unfold an unsigned number into a signed number.
*
* @param x an unsigned number
* @return a signed number
*/
public static long unfoldSigned(long x) {
return ((x & 1) == 1) ? (x + 1) / 2 : -(x / 2);
}
public void writeBit(long x) {
if (x == 1) {
data[pos >>> 6] |= 1L << (63 - (pos & 63));
}
pos++;
}
public long readBit() {
return (data[pos >>> 6] >>> (63 - (pos++ & 63))) & 1;
}
public int readUntilZero(int pos) {
int remainingBits = 64 - (pos & 63);
int index = pos >>> 6;
long x = data[index] << (64 - remainingBits);
int count = Long.numberOfLeadingZeros(~x);
if (count < remainingBits) {
return count;
}
return readUntilZeroMore(count, index);
}
private int readUntilZeroMore(int count, int index) {
while (true) {
long x = data[++index];
if (x == -1L) {
count += 64;
continue;
}
return count + Long.numberOfLeadingZeros(~x);
}
}
private int readUntilZero() {
int len = readUntilZero(pos);
pos += len + 1;
return len;
}
public void writeGolombRice(int shift, long value) {
writeGolombRiceFast(shift, value);
}
public void writeGolombRiceSlow(int shift, long value) {
long q = value >>> shift;
for (int i = 0; i < q; i++) {
writeBit(1);
}
writeBit(0);
for (int i = shift - 1; i >= 0; i--) {
writeBit((value >>> i) & 1);
}
}
public void writeGolombRiceFast(int shift, long value) {
long q = value >>> shift;
if (q < 63) {
long m = (2L << q) - 2;
writeNumber(m, (int) (q + 1));
} else {
for (int i = 0; i < q; i++) {
writeBit(1);
}
writeBit(0);
}
writeNumber(value & ((1L << shift) - 1), shift);
// for (int i = shift - 1; i >= 0; i--) {
// writeBit((value >>> i) & 1);
// }
}
// public void writeVarLong(long x) {
// while ((x & ~0x7f) != 0) {
// writeNumber((0x80 | (x & 0x7f)) & 0xff, 8);
// x >>>= 7;
// }
// writeNumber(x & 0xff, 8);
// }
// public long readVarLong() {
// long x = buff.get();
// if (x >= 0) {
// return x;
// }
// x &= 0x7f;
// for (int s = 7; s < 64; s += 7) {
// long b = buff.get();
// x |= (b & 0x7f) << s;
// if (b >= 0) {
// break;
// }
// }
// return x;
// }
public long readGolombRice(int pos, int shift) {
int q = readUntilZero(pos);
return (q << shift) | readNumber(pos + q + 1, shift);
}
public long readGolombRice(int shift) {
long q = readUntilZero();
return (q << shift) | readNumber(shift);
// int q = 0;
// while (readBit() == 1) {
// q++;
// }
// long x = ((long) q) << shift;
// for (int i = shift - 1; i >= 0; i--) {
// x |= readBit() << i;
// }
// return x;
}
public void skipGolombRice(int shift) {
pos = skipGolombRice(pos, shift);
}
public int skipGolombRice(int pos, int shift) {
int q = readUntilZero(pos);
return pos + q + 1 + shift;
}
public void writeEliasDelta(long value) {
if (value <= 0) {
throw new IllegalArgumentException();
}
int q = 64 - Long.numberOfLeadingZeros(value);
int qq = 31 - Integer.numberOfLeadingZeros(q);
for (int i = 0; i < qq; i++) {
writeBit(0);
}
for (int i = qq; i >= 0; i--) {
writeBit((q >>> i) & 1);
}
for (int i = q - 2; i >= 0; i--) {
writeBit((value >>> i) & 1);
}
}
public long readEliasDelta() {
int qq = 0;
while (readBit() == 0) {
qq++;
}
long q = 1;
for (int i = qq; i > 0; i--) {
q = (q << 1) | readBit();
}
long x = 1;
for (long i = q - 2; i >= 0; i--) {
x = (x << 1) | readBit();
}
return x;
}
/**
* Write a number of bits. The most significant bit is written first.
*
* @param x the number
* @param bitCount the number of bits, at most 63
*/
public void writeNumber(long x, int bitCount) {
// while (bitCount-- > 0) {
// writeBit((x >>> bitCount) & 1);
// }
if (bitCount == 0) {
return;
}
int remainingBits = 64 - (pos & 63);
int index = pos >>> 6;
if (bitCount <= remainingBits) {
data[index] |= x << (remainingBits - bitCount);
} else {
data[index] |= x >>> (bitCount - remainingBits);
data[index + 1] |= x << (64 - bitCount + remainingBits);
}
pos += bitCount;
}
public void clearBits(int bitCount) {
if (bitCount == 0) {
return;
}
int remainingBits = 64 - (pos & 63);
int index = pos >>> 6;
long x = (1 << bitCount) - 1;
if (bitCount <= remainingBits) {
data[index] &= ~(x << (remainingBits - bitCount));
} else {
data[index] &= ~(x >>> (bitCount - remainingBits));
data[index + 1] &= ~(x << (64 - bitCount + remainingBits));
}
pos += bitCount;
}
public byte[] toByteArray() {
byte[] d = new byte[data.length * 8];
ByteBuffer.wrap(d).order(ByteOrder.BIG_ENDIAN).asLongBuffer()
.put(data, 0, (pos + 63) / 64);
if ((pos + 7) / 8 == d.length) {
return d;
}
return Arrays.copyOf(d, (pos + 7) / 8);
}
public void clear() {
Arrays.fill(data, 0);
}
public long[] getLongArray() {
return data;
}
public static int getGolombRiceSize(int shift, long value) {
return (int) ((value >>> shift) + 1 + shift);
}
public static int getEliasDeltaSize(long value) {
if (value <= 0) {
throw new IllegalArgumentException();
}
int q = 64 - Long.numberOfLeadingZeros(value);
int qq = 31 - Integer.numberOfLeadingZeros(q);
int len = qq + qq + q;
return len;
}
}
================================================
FILE: src/main/java/org/minperf/RecSplitBuilder.java
================================================
package org.minperf;
import java.util.Collection;
import org.minperf.generator.ConcurrencyTool;
import org.minperf.generator.Generator;
import org.minperf.universal.UniversalHash;
/**
* A builder to generate a MPHF description, or to get an evaluator of a description.
*
* @param <T> the type
*/
public class RecSplitBuilder<T> {
private final UniversalHash<T> hash;
private int averageBucketSize = 256;
private int leafSize = 10;
private boolean eliasFanoMonotoneLists = true;
private int parallelism = Runtime.getRuntime().availableProcessors();
private int maxChunkSize = Integer.MAX_VALUE;
private RecSplitBuilder(UniversalHash<T> hash) {
this.hash = hash;
}
/**
* Create a new instance of the builder, with the given universal hash implementation.
*
* @param <T> the type
* @param hash the universal hash function
* @return the builder
*/
public static <T> RecSplitBuilder<T> newInstance(UniversalHash<T> hash) {
return new RecSplitBuilder<T>(hash);
}
public RecSplitBuilder<T> averageBucketSize(int averageBucketSize) {
if (averageBucketSize < 4 || averageBucketSize > 64 * 1024) {
throw new IllegalArgumentException("averageBucketSize out of range: " + averageBucketSize);
}
this.averageBucketSize = averageBucketSize;
return this;
}
public RecSplitBuilder<T> leafSize(int leafSize) {
if (leafSize < 1 || leafSize > 25) {
throw new IllegalArgumentException("leafSize out of range: " + leafSize);
}
this.leafSize = leafSize;
return this;
}
public RecSplitBuilder<T> eliasFanoMonotoneLists(boolean eliasFano) {
this.eliasFanoMonotoneLists = eliasFano;
return this;
}
public RecSplitBuilder<T> maxChunkSize(int maxChunkSize) {
this.maxChunkSize = maxChunkSize;
return this;
}
public RecSplitBuilder<T> parallelism(int parallelism) {
this.parallelism = parallelism;
return this;
}
/**
* Generate the hash function description for a collection.
* The entries in the collection must be unique.
*
* @param collection the collection
* @return the hash function description
*/
public BitBuffer generate(Collection<T> collection) {
Settings s = new Settings(leafSize, averageBucketSize);
ConcurrencyTool pool = new ConcurrencyTool(parallelism);
Generator<T> g = new Generator<T>(
pool, hash, s,
eliasFanoMonotoneLists, maxChunkSize);
BitBuffer result = g.generate(collection);
return result;
}
public RecSplitEvaluator<T> buildEvaluator(BitBuffer description) {
Settings s = new Settings(leafSize, averageBucketSize);
return new RecSplitEvaluator<T>(new BitBuffer(description), hash, s, eliasFanoMonotoneLists);
}
}
================================================
FILE: src/main/java/org/minperf/RecSplitEvaluator.java
================================================
package org.minperf;
import org.minperf.bdz.BDZ;
import org.minperf.generator.Generator;
import org.minperf.monotoneList.MonotoneList;
import org.minperf.universal.UniversalHash;
/**
* Evaluator for the hybrid mechanism.
*
* @param <T> the data type
*/
public class RecSplitEvaluator<T> {
private final Settings settings;
private final UniversalHash<T> hash;
private final BitBuffer buffer;
private final long size;
private final int bucketCount;
private final int minStartDiff;
private final MonotoneList startList;
private final int minOffsetDiff;
private final MonotoneList offsetList;
private final int startBuckets;
private final int endHeader;
private final int endOffsetList;
private final BDZ<T> alternative;
public RecSplitEvaluator(BitBuffer buffer, UniversalHash<T> hash, Settings settings, boolean eliasFanoMonotoneLists) {
this.settings = settings;
this.hash = hash;
this.buffer = buffer;
this.size = (int) (buffer.readEliasDelta() - 1);
this.bucketCount = Settings.getBucketCount(size, settings.getAverageBucketSize());
boolean alternative = buffer.readBit() != 0;
this.minOffsetDiff = (int) (buffer.readEliasDelta() - 1);
this.minStartDiff = (int) (buffer.readEliasDelta() - 1);
this.endHeader = buffer.position();
this.offsetList = MonotoneList.load(buffer, eliasFanoMonotoneLists);
this.endOffsetList = buffer.position();
this.startList = MonotoneList.load(buffer, eliasFanoMonotoneLists);
this.startBuckets = buffer.position();
if (alternative) {
int b = bucketCount;
int offset = offsetList.get(b);
int pos = startBuckets +
Generator.getMinBitCount(offset) +
startList.get(b) + b * minStartDiff;
buffer.seek(pos);
this.alternative = BDZ.load(hash, buffer);
} else {
this.alternative = null;
}
}
public int getHeaderSize() {
return endHeader;
}
public int getOffsetListSize() {
return endOffsetList - endHeader;
}
public int getStartListSize() {
return startBuckets - endOffsetList;
}
public int evaluate(T obj) {
int b;
long hashCode = hash.universalHash(obj, 0);
//System.out.println("hashCode " + obj + " =" + hashCode);
if (bucketCount == 1) {
b = 0;
} else {
b = Settings.reduce((int) hashCode, bucketCount);
}
//System.out.println("bucket " + b);
int startPos;
long offsetPair = offsetList.getPair(b);
int offset = (int) (offsetPair >>> 32) + b * minOffsetDiff;
int offsetNext = ((int) offsetPair) + (b + 1) * minOffsetDiff;
if (offsetNext == offset) {
if (alternative == null) {
// entry not found
return 0;
}
offset = offsetList.get(bucketCount) + bucketCount * minOffsetDiff;
return offset + alternative.evaluate(obj);
}
int bucketSize = offsetNext - offset;
startPos = startBuckets +
Generator.getMinBitCount(offset) +
startList.get(b) + b * minStartDiff;
//System.out.println("startPos " + startPos + " offset " + offset + " bucketSize " + bucketSize);
return evaluate(startPos, obj, hashCode, 0, offset, bucketSize);
}
private int skip(int pos, int size) {
if (size < 2) {
return pos;
}
pos = buffer.skipGolombRice(pos, settings.getGolombRiceShift(size));
if (size <= settings.getLeafSize()) {
return pos;
}
int split = settings.getSplit(size);
int firstPart, otherPart;
if (split < 0) {
firstPart = -split;
otherPart = size - firstPart;
split = 2;
} else {
firstPart = size / split;
otherPart = firstPart;
}
int s = firstPart;
for (int i = 0; i < split; i++) {
pos = skip(pos, s);
s = otherPart;
}
return pos;
}
private int evaluate(int pos, T obj, long hashCode,
long index, int add, int size) {
while (true) {
if (size < 2) {
return add;
}
int shift = settings.getGolombRiceShift(size);
long q = buffer.readUntilZero(pos);
pos += q + 1;
long value = (q << shift) | buffer.readNumber(pos, shift);
pos += shift;
long oldX = Settings.getUniversalHashIndex(index);
index += value + 1;
long x = Settings.getUniversalHashIndex(index);
if (x != oldX) {
hashCode = hash.universalHash(obj, x);
}
if (size <= settings.getLeafSize()) {
int h = Settings.supplementalHash(hashCode, index);
h = Settings.reduce(h, size);
//System.out.printf("shift %d q %lld value %d oldX %d x %d size %d h %d add %d\n", shift, q, value, oldX, x, size, h, add);
return add + h;
}
int split = settings.getSplit(size);
int firstPart, otherPart;
if (split < 0) {
firstPart = -split;
otherPart = size - firstPart;
split = 2;
} else {
firstPart = size / split;
otherPart = firstPart;
}
int h = Settings.supplementalHash(hashCode, index);
if (firstPart != otherPart) {
h = Settings.reduce(h, size);
if (h < firstPart) {
size = firstPart;
continue;
}
pos = skip(pos, firstPart);
add += firstPart;
size = otherPart;
continue;
}
h = Settings.reduce(h, split);
for (int i = 0; i < h; i++) {
pos = skip(pos, firstPart);
add += firstPart;
}
size = firstPart;
}
}
}
================================================
FILE: src/main/java/org/minperf/Settings.java
================================================
package org.minperf;
/**
* The settings used to generate the hash function.
*/
public class Settings {
public static final boolean IMPROVED_SPLIT_RULES = true;
/**
* The number of supplemental hash functions per universal hash is 2 ^ this
* number. Could be increased to reduce the number of universal hash
* function calls, which also speeds up evaluation time.
*/
public static final int SUPPLEMENTAL_HASH_SHIFT = 18;
/**
* The number of times the same universal hash is mixed using the
* supplemental hash function. Must be a power of 2.
*/
private static final long SUPPLEMENTAL_HASH_CALLS = 1 << SUPPLEMENTAL_HASH_SHIFT;
/**
* The Rice parameter k to use for leaves of size = array index.
*/
private static final int[] RICE_LEAF = { 0, 0, 0, 1, 3, 4, 5, 7, 8, 10, 11,
12, 14, 15, 16, 18, 19, 21, 22, 23, 25, 26, 28, 29, 30, 32, 33, 35,
36, 38, 39, 40, 42 };
/**
* The Rice parameter k that is used to split medium sized sets that are
* evenly split into subsets.
*/
private static final int[][] RICE_SPLIT_MORE = {
// 0 .. 6
{ }, { }, { }, { }, { }, { 4}, { 4},
// 7 .. 13
{ 4}, { 7}, { 7}, { 10, 7}, { 11, 7}, { 11, 7}, { 14, 8},
// 14 .. 18
{ 14, 8}, { 15, 8}, { 18, 8}, { 18, 8}, { 19, 8},
// 19 .. 23
{ 22, 13}, { 22, 13}, { 23, 14}, { 26, 14}, { 27, 14},
// 24 .. 25
{ 27, 14}, { 31, 20, 12}};
/**
* Convert an array of strings to an array of integers. This is needed to
* work around the bytecode limit of Java methods.
*/
private static int[] splitIntegerList(String x) {
if (x.trim().isEmpty()) {
return new int[0];
}
String[] array = x.split(",");
int[] result = new int[array.length];
for (int i = 0; i < array.length; i++) {
result[i] = Integer.parseInt(array[i].trim());
}
return result;
}
/**
* Array of size, split, k.
*/
static int[][] SPLIT_RULES = {
// leafSize 0
splitIntegerList(""),
// leafSize 1
splitIntegerList(""),
// leafSize 2
splitIntegerList("0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"),
// leafSize 3
splitIntegerList("0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"),
// leafSize 4
splitIntegerList("0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"),
// leafSize 5
splitIntegerList("0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"),
// leafSize 6
splitIntegerList("0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"),
// leafSize 7
splitIntegerList("1,1,0,2,2,0,3,3,1,4,4,3,5,5,4,6,6,5,7,7,7,8,-1,0,9,-2,1,10,-3,1,11,-4,1,12,-5,1,13,-6,1,14,-7,2,15,3,4,16,-7,2,17,-7,2,18,3,4,19,-7,2,20,-7,2,21,3,4,22,-1,1,23,-2,1,24,4,6,25,-4,2,26,-5,2,27,-6,2,28,-7,2,29,-5,2,30,-6,2,31,-7,2,32,-11,2,33,-12,2,34,-6,2,35,-7,2,36,-15,2,37,-6,2,38,-7,2,39,-18,2,40,-5,2,41,-6,2,42,2,2,43,-1,1,44,-2,1,45,-21,2,46,-4,2,47,-5,2,48,-6,2,49,-7,2,50,-5,2,51,-6,2,52,-7,2,53,-11,2,54,-5,2,55,-6,2,56,-7,2,57,-21,3,58,-6,2,59,-28,3,60,-21,3,61,-5,2,62,-6,2,63,3,6,64,-1,1,65,-2,1,66,-3,1,67,-4,2,68,-5,2,69,-6,2,70,-7,2,71,-8,2,72,-9,2,73,-10,2,74,-11,2,75,-5,2,76,-6,2,77,-7,2,78,-15,2,79,-7,2,80,-7,2,81,-18,3,82,-5,2,83,-6,2,84,-21,3,85,-22,3,86,-23,3,87,-24,3,88,-4,2,89,-26,3,90,-27,3,91,-28,3,92,-24,3,93,-30,3,94,-31,3,95,-32,3,96,-5,2,97,-34,3,98,-35,3,99,-36,3,100,-31,3,101,-38,3,102,-39,3,103,-5,2,104,-6,2,105,-42,3,106,-1,1,107,-44,3,108,-21,3,109,-4,2,110,-5,2,111,-6,2,112,-21,3,113,-21,3,114,-24,3,115,-24,3,116,-21,3,117,-21,3,118,-27,3,119,-28,3,120,-21,3,121,-28,3,122,-28,3,123,-21,3,124,-5,2,125,-28,3,126,-63,3,127,-1,1,128,-63,3,129,-63,3,130,-4,2,131,-5,2,132,-6,2,133,-7,2,134,-8,2,135,-63,3,136,-63,3,137,-63,3,138,-5,2,139,-6,2,140,-7,2,141,-15,3,142,-7,2,143,-7,2,144,-18,3,145,-5,2,146,-6,2,147,-21,3,148,-1,0,149,-2,1,150,-24,3,151,-4,2,152,-5,2,153,-6,2,154,-7,2,155,-5,2,156,-6,2,157,-7,2,158,-32,3,159,-5,2,160,-6,2,161,-7,2,162,-36,3,163,-6,2,164,-7,2,165,-39,3,166,-5,2,167,-6,2,168,-21,3,169,-21,3,170,-21,3,171,-21,3,172,-4,2,173,-21,3,174,-21,3,175,-21,3,176,-21,3,177,-21,3,178,-21,3,179,-21,3,180,-21,3,181,-21,3,182,-21,3,183,-21,3,184,-21,3,185,-21,3,186,-21,3,187,-21,3,188,-21,3,189,-63,3,190,-1,0,191,-2,1,192,-3,1,193,-4,2,194,-5,2,195,-6,2,196,-7,2,197,-7,2,198,-7,2,199,-7,2,200,-4,2,201,-5,2,202,-6,2,203,-7,2,204,-15,3,205,-7,2,206,-7,2,207,-18,3,208,-5,2,209,-6,2,210,-21,3,211,-21,3,212,-21,3,213,-24,3,214,-4,2,215,-21,3,216,-21,3,217,-21,3,218,-5,2,219,-24,3,220,-24,3,221,-32,3,222,-21,3,223,-21,3,224,-21,3,225,-99,4,226,-24,3,227,-24,3,228,-102,4,229,-21,3,230,-21,3,231,-21,3,232,-21,3,233,-21,3,234,-21,3,235,-4,2,236,-21,3,237,-21,3,238,-21,3,239,-21,3,240,-21,3,241,-21,3,242,-95,4,243,-21,3,244,-21,3,245,-21,3,246,-99,4,247,-21,3,248,-21,3,249,-102,4,250,-21,3,251,-21,3,252,-126,4,253,-1,0,254,-2,1,255,-3,1,256,-4,2,257,-5,2,258,-6,2,259,-7,2,260,-7,2,261,-7,2,262,-7,2,263,-4,2,264,-5,2,265,-6,2,266,-7,2,267,-15,3,268,-7,2,269,-7,2,270,-18,3,271,-5,2,272,-6,2,273,-126,4,274,-126,4,275,-126,4,276,-126,4,277,-4,2,278,-126,4,279,-126,4,280,-126,4,281,-126,4,282,-126,4,283,-126,4,284,-126,4,285,-126,4,286,-126,4,287,-126,4,288,-126,4,289,-126,4,290,-126,4,291,-126,4,292,-126,4,293,-126,4,294,-126,4,295,-126,4,296,-126,4,297,-126,4,298,-4,2,299,-126,4,300,-126,4,301,-126,4,302,-126,4,303,-126,4,304,-126,4,305,-126,4,306,-126,4,307,-126,4,308,-126,4,309,-126,4,310,-126,4,311,-126,4,312,-126,4,313,-126,4,314,-126,4,315,-126,4,316,-126,4,317,-126,4,318,-126,4,319,-4,2,320,-126,4,321,-126,4,322,-126,4,323,-126,4,324,-126,4,325,-126,4,326,-4,2,327,-126,4,328,-126,4,329,-126,4,330,-15,3,331,-126,4,332,-126,4,333,-18,3,334,-5,2,335,-126,4,336,-21,3,337,-21,3,338,-21,3,339,-150,4,340,-4,2,341,-21,3,342,-21,3,343,-21,3,344,-5,2,345,-156,4,346,-157,4,347,-95,4,348,-21,3,349,-21,3,350,-21,3,351,-99,4,352,-163,4,353,-164,4,354,-102,4,355,-5,2,356,-21,3,357,-21,3,358,-21,3,359,-21,3,360,-21,3,361,-4,2,362,-21,3,363,-21,3,364,-21,3,365,-5,2,366,-21,3,367,-21,3,368,-95,4,369,-21,3,370,-21,3,371,-21,3,372,-99,4,373,-21,3,374,-21,3,375,-102,4,376,-5,2,377,-21,3,378,-126,4,379,-126,4,380,-126,4,381,-126,4,382,-4,2,383,-5,2,384,-126,4,385,-126,4,386,-126,4,387,-126,4,388,-126,4,389,-4,2,390,-5,2,391,-126,4,392,-126,4,393,-15,3,394,-126,4,395,-126,4,396,-18,3,397,-5,2,398,-126,4,399,-126,4,400,-126,4,401,-126,4,402,-126,4,403,-4,2,404,-126,4,405,-126,4,406,-126,4,407,-126,4,408,-126,4,409,-126,4,410,-126,4,411,-126,4,412,-126,4,413,-126,4,414,-126,4,415,-126,4,416,-126,4,417,-126,4,418,-126,4,419,-126,4,420,-126,4,421,-126,4,422,-126,4,423,-126,4,424,-4,2,425,-126,4,426,-126,4,427,-126,4,428,-126,4,429,-126,4,430,-126,4,431,-126,4,432,-126,4,433,-126,4,434,-21,3,435,-21,3,436,-21,3,437,-21,3,438,-21,3,439,-21,3,440,-21,3,441,-126,4,442,-126,4,443,-126,4,444,-126,4,445,-4,2,446,-5,2,447,-126,4,448,-126,4,449,-126,4,450,-126,4,451,-126,4,452,-4,2,453,-5,2,454,-126,4,455,-126,4,456,-15,3,457,-126,4,458,-126,4,459,-18,3,460,-5,2,461,-126,4,462,-21,3,463,-21,3,464,-21,3,465,-126,4,466,-4,2,467,-5,2,468,-21,3,469,-21,3,470,-5,2,471,-126,4,472,-126,4,473,-95,4,474,-5,2,475,-21,3,476,-21,3,477,-99,4,478,-126,4,479,-126,4,480,-102,4,481,-5,2,482,-21,3,483,-21,3,484,-21,3,485,-21,3,486,-21,3,487,-4,2,488,-5,2,489,-21,3,490,-21,3,491,-5,2,492,-21,3,493,-91,4,494,-95,4,495,-5,2,496,-91,4,497,-91,4,498,-99,4,499,-91,4,500,-91,4,501,-102,4,502,-91,4,503,-91,4,504,-126,4,505,-126,4,506,-126,4,507,-126,4,508,-4,2,509,-5,2,510,-126,4,511,-126,4,512,-126,4,513,-126,4,514,-126,4,515,-4,2,516,-5,2,517,-126,4,518,-126,4,519,-15,3,520,-126,4,521,-126,4,522,-18,3,523,-5,2,524,-126,4,525,-126,4,526,-126,4,527,-126,4,528,-126,4,529,-4,2,530,-126,4,531,-126,4,532,-126,4,533,-126,4,534,-126,4,535,-126,4,536,-126,4,537,-126,4,538,-126,4,539,-126,4,540,-126,4,541,-126,4,542,-126,4,543,-126,4,544,-5,2,545,-126,4,546,-21,3,547,-21,3,548,-21,3,549,-21,3,550,-4,2,551,-21,3,552,-21,3,553,-21,3,554,-21,3,555,-21,3,556,-21,3,557,-21,3,558,-21,3,559,-21,3,560,-21,3,561,-21,3,562,-21,3,563,-21,3,564,-21,3,565,-5,2,566,-21,3,567,-126,4,568,-126,4,569,-126,4,570,-126,4,571,-4,2,572,-5,2,573,-126,4,574,-126,4,575,-126,4,576,-126,4,577,-126,4,578,-4,2,579,-5,2,580,-126,4,581,-126,4,582,-15,3,583,-126,4,584,-126,4,585,-18,3,586,-5,2,587,-126,4,588,-21,3,589,-21,3,590,-21,3,591,-126,4,592,-4,2,593,-5,2,594,-21,3,595,-91,4,596,-5,2,597,-126,4,598,-94,4,599,-95,4,600,-91,4,601,-91,4,602,-21,3,603,-99,4,604,-94,4,605,-94,4,606,-102,4,607,-5,2,608,-21,3,609,-105,4,610,-105,4,611,-105,4,612,-87,4,613,-4,2,614,-5,2,615,-105,4,616,-91,4,617,-87,4,618,-87,4,619,-91,4,620,-95,4,621,-91,4,622,-91,4,623,-91,4,624,-99,4,625,-91,4,626,-91,4,627,-102,4,628,-91,4,629,-91,4,630,-126,4,631,-126,4,632,-126,4,633,-126,4,634,-4,2,635,-5,2,636,-126,4,637,-126,4,638,-126,4,639,-126,4,640,-126,4,641,-4,2,642,-5,2,643,-126,4,644,-126,4,645,-15,3,646,-126,4,647,-126,4,648,-18,3,649,-5,2,650,-126,4,651,-126,4,652,-126,4,653,-126,4,654,-126,4,655,-4,2,656,-126,4,657,-126,4,658,-126,4,659,-5,2,660,-126,4,661,-126,4,662,-126,4,663,-5,2,664,-126,4,665,-126,4,666,-126,4,667,-126,4,668,-126,4,669,-126,4,670,-5,2,671,-126,4,672,-21,3,673,-21,3,674,-21,3,675,-21,3,676,-4,2,677,-21,3,678,-21,3,679,-21,3,680,-5,2,681,-21,3,682,-21,3,683,-21,3,684,-5,2,685,-21,3,686,-21,3,687,-21,3,688,-21,3,689,-21,3,690,-21,3,691,-5,2,692,-21,3,693,-126,4,694,-126,4,695,-126,4,696,-126,4,697,-4,2,698,-5,2,699,-126,4,700,-126,4,701,-126,4,702,-126,4,703,-126,4,704,-4,2,705,-5,2,706,-126,4,707,-126,4,708,-15,3,709,-126,4,710,-126,4,711,-18,3,712,-5,2,713,-126,4,714,-21,3,715,-21,3,716,-21,3,717,-87,4,718,-4,2,719,-5,2,720,-21,3,721,-91,4,722,-87,4,723,-87,4,724,-94,4,725,-95,4,726,-5,2,727,-91,4,728,-91,4,729,-99,4,730,-94,4,731,-94,4,732,-102,4,733,-5,2,734,-91,4,735,-105,4,736,-105,4,737,-105,4,738,-87,4,739,-4,2,740,-5,2,741,-105,4,742,-91,4,743,-87,4,744,-87,4,745,-91,4,746,-95,4,747,-91,4,748,-91,4,749,-91,4,750,-99,4,751,-91,4,752,-91,4,753,-102,4,754,-5,2,755,-91,4,756,-126,4,757,-126,4,758,-126,4,759,-126,4,760,-4,2,761,-5,2,762,-126,4,763,-126,4,764,-126,4,765,-126,4,766,-126,4,767,-4,2,768,-5,2,769,-126,4,770,-126,4,771,-15,3,772,-126,4,773,-126,4,774,-18,3,775,-5,2,776,-126,4,777,-126,4,778,-126,4,779,-126,4,780,-126,4,781,-4,2,782,-5,2,783,-126,4,784,-126,4,785,-5,2,786,-126,4,787,-126,4,788,-126,4,789,-5,2,790,-126,4,791,-126,4,792,-126,4,793,-126,4,794,-126,4,795,-126,4,796,-5,2,797,-126,4,798,-21,3,799,-21,3,800,-21,3,801,-21,3,802,-4,2,803,-5,2,804,-21,3,805,-21,3,806,-5,2,807,-21,3,808,-21,3,809,-21,3,810,-5,2,811,-21,3,812,-21,3,813,-21,3,814,-21,3,815,-21,3,816,-21,3,817,-5,2,818,-21,3,819,-126,4,820,-126,4,821,-126,4,822,-126,4,823,-4,2,824,-5,2,825,-126,4,826,-126,4,827,-126,4,828,-126,4,829,-126,4,830,-4,2,831,-5,2,832,-126,4,833,-126,4,834,-15,3,835,-126,4,836,-126,4,837,-18,3,838,-5,2,839,-126,4,840,-21,3,841,-21,3,842,-21,3,843,-87,4,844,-4,2,845,-5,2,846,-21,3,847,-91,4,848,-87,4,849,-87,4,850,-94,4,851,-95,4,852,-5,2,853,-91,4,854,-91,4,855,-99,4,856,-94,4,857,-94,4,858,-102,4,859,-5,2,860,-91,4,861,-105,4,862,-105,4,863,-105,4,864,-87,4,865,-4,2,866,-5,2,867,-105,4,868,-91,4,869,-87,4,870,-87,4,871,-91,4,872,-95,4,873,-5,2,874,-91,4,875,-91,4,876,-99,4,877,-91,4,878,-91,4,879,-102,4,880,-5,2,881,-91,4,882,-126,4,883,-126,4,884,-126,4,885,-126,4,886,-4,2,887,-5,2,888,-126,4,889,-126,4,890,-126,4,891,-126,4,892,-126,4,893,-4,2,894,-5,2,895,-126,4,896,-126,4,897,-15,3,898,-126,4,899,-126,4,900,-18,3,901,-5,2,902,-126,4,903,-21,3,904,-126,4,905,-126,4,906,-126,4,907,-4,2,908,-5,2,909,-126,4,910,-126,4,911,-5,2,912,-126,4,913,-126,4,914,-126,4,915,-5,2,916,-126,4,917,-126,4,918,-126,4,919,-126,4,920,-126,4,921,-126,4,922,-5,2,923,-126,4,924,-21,3,925,-21,3,926,-21,3,927,-21,3,928,-4,2,929,-5,2,930,-21,3,931,-21,3,932,-5,2,933,-21,3,934,-21,3,935,-21,3,936,-5,2,937,-21,3,938,-21,3,939,-21,3,940,-21,3,941,-21,3,942,-21,3,943,-5,2,944,-21,3,945,-126,4,946,-126,4,947,-126,4,948,-126,4,949,-4,2,950,-5,2,951,-126,4,952,-126,4,953,-126,4,954,-126,4,955,-126,4,956,-4,2,957,-5,2,958,-126,4,959,-126,4,960,-15,3,961,-126,4,962,-126,4,963,-18,3,964,-5,2,965,-126,4,966,-21,3,967,-21,3,968,-21,3,969,-87,4,970,-4,2,971,-5,2,972,-21,3,973,-91,4,974,-5,2,975,-87,4,976,-94,4,977,-95,4,978,-5,2,979,-91,4,980,-91,4,981,-99,4,982,-94,4,983,-94,4,984,-102,4,985,-5,2,986,-91,4,987,-105,4,988,-105,4,989,-105,4,990,-87,4,991,-4,2,992,-5,2,993,-105,4,994,-21,3,995,-5,2,996,-87,4,997,-91,4,998,-21,3,999,-5,2,1000,-91,4,1001,-91,4,1002,-21,3,1003,-91,4,1004,-91,4,1005,-21,3,1006,-5,2,1007,-91,4,1008,-126,4,1009,-126,4,1010,-126,4,1011,-126,4,1012,-4,2,1013,-5,2,1014,-126,4,1015,-126,4,1016,-126,4,1017,-126,4,1018,-126,4,1019,-4,2,1020,-5,2,1021,-126,4,1022,-126,4,1023,-15,3,1024,-126,4,1025,-126,4,1026,-18,3,1027,-5,2,1028,-6,2,1029,-21,3,1030,-126,4,1031,-126,4,1032,-126,4,1033,-4,2,1034,-5,2,1035,-126,4,1036,-126,4,1037,-5,2,1038,-126,4,1039,-126,4,1040,-126,4,1041,-5,2,1042,-126,4,1043,-126,4,1044,-126,4,1045,-126,4,1046,-126,4,1047,-126,4,1048,-5,2,1049,-126,4,1050,-21,3,1051,-21,3,1052,-21,3,1053,-21,3,1054,-4,2,1055,-5,2,1056,-21,3,1057,-21,3,1058,-5,2,1059,-21,3,1060,-21,3,1061,-21,3,1062,-5,2,1063,-21,3,1064,-21,3,1065,-21,3,1066,-21,3,1067,-21,3,1068,-21,3,1069,-5,2,1070,-21,3,1071,-126,4,1072,-126,4,1073,-126,4,1074,-126,4,1075,-4,2,1076,-5,2,1077,-126,4,1078,-126,4,1079,-126,4,1080,-126,4,1081,-126,4,1082,-4,2,1083,-5,2,1084,-126,4,1085,-126,4,1086,-15,3,1087,-126,4,1088,-126,4,1089,-18,3,1090,-5,2,1091,-126,4,1092,-21,3,1093,-21,3,1094,-21,3,1095,-87,4,1096,-4,2,1097,-5,2,1098,-21,3,1099,-91,4,1100,-5,2,1101,-87,4,1102,-94,4,1103,-95,4,1104,-5,2,1105,-91,4,1106,-91,4,1107,-99,4,1108,-94,4,1109,-94,4,1110,-102,4,1111,-5,2,1112,-91,4,1113,-105,4,1114,-105,4,1115,-105,4,1116,-87,4,1117,-4,2,1118,-5,2,1119,-105,4,1120,-21,3,1121,-5,2,1122,-87,4,1123,-91,4,1124,-21,3,1125,-5,2,1126,-91,4,1127,-91,4,1128,-21,3,1129,-91,4,1130,-91,4,1131,-21,3,1132,-5,2,1133,-91,4,1134,-126,4,1135,-126,4,1136,-126,4,1137,-126,4,1138,-4,2,1139,-5,2,1140,-126,4,1141,-126,4,1142,-126,4,1143,-126,4,1144,-126,4,1145,-4,2,1146,-5,2,1147,-6,2,1148,-126,4,1149,-15,3,1150,-126,4,1151,-126,4,1152,-18,3,1153,-5,2,1154,-6,2,1155,-21,3,1156,-126,4,1157,-126,4,1158,-126,4,1159,-4,2,1160,-5,2,1161,-126,4,1162,-126,4,1163,-5,2,1164,-126,4,1165,-126,4,1166,-126,4,1167,-5,2,1168,-126,4,1169,-126,4,1170,-126,4,1171,-126,4,1172,-126,4,1173,-126,4,1174,-5,2,1175,-126,4,1176,-21,3,1177,-21,3,1178,-21,3,1179,-21,3,1180,-4,2,1181,-5,2,1182,-21,3,1183,-21,3,1184,-5,2,1185,-21,3,1186,-21,3,1187,-21,3,1188,-5,2,1189,-21,3,1190,-21,3,1191,-21,3,1192,-21,3,1193,-21,3,1194,-21,3,1195,-5,2,1196,-21,3,1197,-126,4,1198,-126,4,1199,-126,4,1200,-126,4,1201,-4,2,1202,-5,2,1203,-126,4,1204,-126,4,1205,-126,4,1206,-126,4,1207,-126,4,1208,-4,2,1209,-5,2,1210,-126,4,1211,-126,4,1212,-15,3,1213,-126,4,1214,-126,4,1215,-18,3,1216,-5,2,1217,-126,4,1218,-21,3,1219,-21,3,1220,-21,3,1221,-87,4,1222,-4,2,1223,-5,2,1224,-21,3,1225,-91,4,1226,-5,2,1227,-87,4,1228,-94,4,1229,-95,4,1230,-5,2,1231,-91,4,1232,-91,4,1233,-99,4,1234,-94,4,1235,-94,4,1236,-102,4,1237,-5,2,1238,-91,4,1239,-105,4,1240,-105,4,1241,-105,4,1242,-87,4,1243,-4,2,1244,-5,2,1245,-105,4,1246,-21,3,1247,-5,2,1248,-87,4,1249,-91,4,1250,-21,3,1251,-5,2,1252,-91,4,1253,-91,4,1254,-21,3,1255,-91,4,1256,-91,4,1257,-21,3,1258,-5,2,1259,-91,4,1260,-126,4,1261,-126,4,1262,-126,4,1263,-126,4,1264,-4,2,1265,-5,2,1266,-6,2,1267,-126,4,1268,-126,4,1269,-126,4,1270,-126,4,1271,-4,2,1272,-5,2,1273,-6,2,1274,-126,4,1275,-15,3,1276,-126,4,1277,-126,4,1278,-18,3,1279,-5,2,1280,-6,2,1281,-21,3,1282,-126,4,1283,-126,4,1284,-126,4,1285,-4,2,1286,-5,2,1287,-126,4,1288,-126,4,1289,-5,2,1290,-126,4,1291,-126,4,1292,-126,4,1293,-5,2,1294,-126,4,1295,-126,4,1296,-126,4,1297,-126,4,1298,-126,4,1299,-126,4,1300,-5,2,1301,-126,4,1302,-21,3,1303,-21,3,1304,-21,3,1305,-21,3,1306,-4,2,1307,-5,2,1308,-21,3,1309,-21,3,1310,-5,2,1311,-21,3,1312,-21,3,1313,-21,3,1314,-5,2,1315,-21,3,1316,-21,3,1317,-21,3,1318,-21,3,1319,-21,3,1320,-21,3,1321,-5,2,1322,-21,3,1323,-63,4,1324,-126,4,1325,-126,4,1326,-126,4,1327,-63,4,1328,-63,4,1329,-126,4,1330,-126,4,1331,-126,4,1332,-126,4,1333,-73,4,1334,-4,2,1335,-5,2,1336,-126,4,1337,-126,4,1338,-15,3,1339,-126,4,1340,-126,4,1341,-63,4,1342,-5,2,1343,-126,4,1344,-63,4,1345,-63,4,1346,-63,4,1347,-87,4,1348,-63,4,1349,-63,4,1350,-63,4,1351,-91,4,1352,-5,2,1353,-87,4,1354,-94,4,1355,-95,4,1356,-5,2,1357,-91,4,1358,-91,4,1359,-99,4,1360,-94,4,1361,-94,4,1362,-102,4,1363,-5,2,1364,-91,4,1365,-105,4,1366,-105,4,1367,-105,4,1368,-87,4,1369,-4,2,1370,-5,2,1371,-6,2,1372,-21,3,1373,-5,2,1374,-87,4,1375,-91,4,1376,-21,3,1377,-5,2,1378,-91,4,1379,-91,4,1380,-21,3,1381,-91,4,1382,-91,4,1383,-21,3,1384,-5,2,1385,-91,4,1386,-126,4,1387,-126,4,1388,-126,4,1389,-126,4,1390,-4,2,1391,-5,2,1392,-6,2,1393,-126,4,1394,-126,4,1395,-126,4,1396,-126,4,1397,-4,2,1398,-5,2,1399,-6,2,1400,-126,4,1401,-15,3,1402,-126,4,1403,-126,4,1404,-18,3,1405,-5,2,1406,-6,2,1407,-21,3,1408,-126,4,1409,-126,4,1410,-126,4,1411,-4,2,1412,-5,2,1413,-126,4,1414,-126,4,1415,-5,2,1416,-126,4,1417,-126,4,1418,-126,4,1419,-5,2,1420,-126,4,1421,-126,4,1422,-126,4,1423,-126,4,1424,-126,4,1425,-126,4,1426,-5,2,1427,-126,4,1428,-21,3,1429,-21,3,1430,-21,3,1431,-21,3,1432,-4,2,1433,-5,2,1434,-21,3,1435,-21,3,1436,-5,2,1437,-21,3,1438,-21,3,1439,-21,3,1440,-5,2,1441,-21,3,1442,-21,3,1443,-21,3,1444,-21,3,1445,-21,3,1446,-21,3,1447,-5,2,1448,-21,3,1449,-63,4,1450,-63,4,1451,-63,4,1452,-126,4,1453,-63,4,1454,-63,4,1455,-63,4,1456,-126,4,1457,-126,4,1458,-126,4,1459,-73,4,1460,-4,2,1461,-5,2,1462,-126,4,1463,-126,4,1464,-15,3,1465,-709,5,1466,-73,4,1467,-63,4,1468,-5,2,1469,-713,5,1470,-63,4,1471,-63,4,1472,-63,4,1473,-87,4,1474,-63,4,1475,-63,4,1476,-63,4,1477,-91,4,1478,-5,2,1479,-87,4,1480,-94,4,1481,-95,4,1482,-5,2,1483,-91,4,1484,-91,4,1485,-99,4,1486,-94,4,1487,-94,4,1488,-102,4,1489,-5,2,1490,-91,4,1491,-105,4,1492,-105,4,1493,-105,4,1494,-87,4,1495,-4,2,1496,-5,2,1497,-6,2,1498,-21,3,1499,-5,2,1500,-87,4,1501,-91,4,1502,-21,3,1503,-5,2,1504,-91,4,1505,-91,4,1506,-21,3,1507,-91,4,1508,-91,4,1509,-21,3,1510,-5,2,1511,-91,4,1512,-756,5,1513,-756,5,1514,-756,5,1515,-756,5,1516,-4,2,1517,-5,2,1518,-756,5,1519,-756,5,1520,-757,5,1521,-758,5,1522,-759,5,1523,-4,2,1524,-5,2,1525,-762,5,1526,-763,5,1527,-15,3,1528,-763,5,1529,-763,5,1530,-18,3,1531,-5,2,1532,-763,5,1533,-21,3,1534,-756,5,1535,-756,5,1536,-756,5,1537,-4,2,1538,-5,2,1539,-756,5,1540,-756,5,1541,-5,2,1542,-756,5,1543,-756,5,1544,-756,5,1545,-5,2,1546,-756,5,1547,-756,5,1548,-756,5,1549,-756,5,1550,-756,5,1551,-756,5,1552,-5,2,1553,-756,5,1554,-21,3,1555,-21,3,1556,-21,3,1557,-21,3,1558,-4,2,1559,-5,2,1560,-21,3,1561,-21,3,1562,-5,2,1563,-21,3,1564,-21,3,1565,-21,3,1566,-5,2,1567,-21,3,1568,-21,3,1569,-21,3,1570,-21,3,1571,-784,5,1572,-21,3,1573,-5,2,1574,-784,5,1575,-756,5,1576,-756,5,1577,-756,5,1578,-756,5,1579,-4,2,1580,-5,2,1581,-756,5,1582,-756,5,1583,-756,5,1584,-756,5,1585,-73,4,1586,-4,2,1587,-5,2,1588,-756,5,1589,-756,5,1590,-15,3,1591,-756,5,1592,-756,5,1593,-18,3,1594,-5,2,1595,-756,5,1596,-21,3,1597,-778,5,1598,-779,5,1599,-87,4,1600,-4,2,1601,-5,2,1602,-63,4,1603,-91,4,1604,-5,2,1605,-87,4,1606,-94,4,1607,-95,4,1608,-5,2,1609,-91,4,1610,-91,4,1611,-99,4,1612,-94,4,1613,-63,4,1614,-102,4,1615,-5,2,1616,-91,4,1617,-105,4,1618,-105,4,1619,-105,4,1620,-87,4,1621,-4,2,1622,-5,2,1623,-105,4,1624,-21,3,1625,-5,2,1626,-87,4,1627,-91,4,1628,-21,3,1629,-5,2,1630,-91,4,1631,-91,4,1632,-21,3,1633,-91,4,1634,-91,4,1635,-21,3,1636,-5,2,1637,-91,4,1638,-756,5,1639,-757,5,1640,-758,5,1641,-759,5,1642,-4,2,1643,-5,2,1644,-762,5,1645,-763,5,1646,-763,5,1647,-763,5,1648,-763,5,1649,-4,2,1650,-5,2,1651,-763,5,1652,-763,5,1653,-15,3,1654,-765,5,1655,-766,5,1656,-18,3,1657,-5,2,1658,-6,2,1659,-21,3,1660,-778,5,1661,-779,5,1662,-780,5,1663,-4,2,1664,-5,2,1665,-783,5,1666,-784,5,1667,-5,2,1668,-786,5,1669,-787,5,1670,-788,5,1671,-5,2,1672,-790,5,1673,-791,5,1674,-792,5,1675,-793,5,1676,-794,5,1677,-795,5,1678,-5,2,1679,-797,5,1680,-21,3,1681,-21,3,1682,-21,3,1683,-21,3,1684,-4,2,1685,-5,2,1686,-21,3,1687,-21,3,1688,-5,2,1689,-21,3,1690,-21,3,1691,-21,3,1692,-5,2,1693,-21,3,1694,-21,3,1695,-21,3,1696,-21,3,1697,-21,3,1698,-21,3,1699,-5,2,1700,-21,3,1701,-63,4,1702,-63,4,1703,-63,4,1704,-822,5,1705,-63,4,1706,-63,4,1707,-63,4,1708,-63,4,1709,-827,5,1710,-828,5,1711,-73,4,1712,-63,4,1713,-63,4,1714,-832,5,1715,-833,5,1716,-15,3,1717,-835,5,1718,-73,4,1719,-63,4,1720,-5,2,1721,-839,5,1722,-63,4,1723,-63,4,1724,-63,4,1725,-87,4,1726,-63,4,1727,-63,4,1728,-63,4,1729,-91,4,1730,-5,2,1731,-87,4,1732,-94,4,1733,-95,4,1734,-5,2,1735,-91,4,1736,-91,4,1737,-99,4,1738,-94,4,1739,-94,4,1740,-102,4,1741,-5,2,1742,-91,4,1743,-105,4,1744,-63,4,1745,-105,4,1746,-87,4,1747,-4,2,1748,-5,2,1749,-63,4,1750,-21,3,1751,-5,2,1752,-87,4,1753,-91,4,1754,-21,3,1755,-5,2,1756,-91,4,1757,-91,4,1758,-21,3,1759,-91,4,1760,-91,4,1761,-21,3,1762,-5,2,1763,-91,4,1764,-756,5,1765,-757,5,1766,-758,5,1767,-759,5,1768,-4,2,1769,-5,2,1770,-6,2,1771,-763,5,1772,-763,5,1773,-763,5,1774,-763,5,1775,-4,2,1776,-5,2,1777,-6,2,1778,-763,5,1779,-15,3,1780,-763,5,1781,-763,5,1782,-18,3,1783,-5,2,1784,-6,2,1785,-21,3,1786,-756,5,1787,-756,5,1788,-756,5,1789,-4,2,1790,-5,2,1791,-756,5,1792,-756,5,1793,-5,2,1794,-756,5,1795,-756,5,1796,-756,5,1797,-5,2,1798,-756,5,1799,-756,5,1800,-756,5,1801,-756,5,1802,-756,5,1803,-756,5,1804,-5,2,1805,-756,5,1806,-21,3,1807,-21,3,1808,-21,3,1809,-21,3,1810,-4,2,1811,-5,2,1812,-21,3,1813,-21,3,1814,-5,2,1815,-21,3,1816,-21,3,1817,-21,3,1818,-5,2,1819,-21,3,1820,-21,3,1821,-21,3,1822,-21,3,1823,-21,3,1824,-21,3,1825,-5,2,1826,-21,3,1827,-63,4,1828,-63,4,1829,-63,4,1830,-63,4,1831,-63,4,1832,-63,4,1833,-63,4,1834,-63,4,1835,-63,4,1836,-63,4,1837,-73,4,1838,-63,4,1839,-63,4,1840,-63,4,1841,-63,4,1842,-15,3,1843,-63,4,1844,-73,4,1845,-63,4,1846,-63,4,1847,-63,4,1848,-63,4,1849,-63,4,1850,-63,4,1851,-87,4,1852,-63,4,1853,-63,4,1854,-63,4,1855,-91,4,1856,-5,2,1857,-87,4,1858,-94,4,1859,-95,4,1860,-5,2,1861,-91,4,1862,-91,4,1863,-99,4,1864,-94,4,1865,-94,4,1866,-102,4,1867,-5,2,1868,-91,4,1869,-105,4,1870,-63,4,1871,-105,4,1872,-21,3,1873,-4,2,1874,-5,2,1875,-63,4,1876,-21,3,1877,-5,2,1878,-87,4,1879,-91,4,1880,-21,3,1881,-5,2,1882,-91,4,1883,-91,4,1884,-21,3,1885,-91,4,1886,-91,4,1887,-21,3,1888,-5,2,1889,-91,4,1890,-630,5,1891,-631,5,1892,-632,5,1893,-633,5,1894,-4,2,1895,-5,2,1896,-6,2,1897,-637,5,1898,-637,5,1899,-637,5,1900,-637,5,1901,-4,2,1902,-5,2,1903,-6,2,1904,-637,5,1905,-15,3,1906,-639,5,1907,-640,5,1908,-18,3,1909,-5,2,1910,-6,2,1911,-21,3,1912,-652,5,1913,-653,5,1914,-654,5,1915,-4,2,1916,-5,2,1917,-657,5,1918,-658,5,1919,-5,2,1920,-660,5,1921,-661,5,1922,-662,5,1923,-5,2,1924,-664,5,1925,-665,5,1926,-666,5,1927,-667,5,1928,-668,5,1929,-669,5,1930,-5,2,1931,-671,5,1932,-21,3,1933,-21,3,1934,-21,3,1935,-21,3,1936,-4,2,1937,-5,2,1938,-21,3,1939,-21,3,1940,-5,2,1941,-21,3,1942,-21,3,1943,-21,3,1944,-5,2,1945,-21,3,1946,-21,3,1947,-21,3,1948,-21,3,1949,-21,3,1950,-21,3,1951,-5,2,1952,-21,3,1953,-63,4,1954,-63,4,1955,-63,4,1956,-63,4,1957,-63,4,1958,-63,4,1959,-63,4,1960,-63,4,1961,-63,4,1962,-63,4,1963,-73,4,1964,-63,4,1965,-63,4,1966,-63,4,1967,-63,4,1968,-15,3,1969,-63,4,1970,-73,4,1971,-63,4,1972,-63,4,1973,-63,4,1974,-63,4,1975,-63,4,1976,-63,4,1977,-87,4,1978,-63,4,1979,-63,4,1980,-63,4,1981,-91,4,1982,-5,2,1983,-87,4,1984,-94,4,1985,-95,4,1986,-5,2,1987,-91,4,1988,-91,4,1989,-99,4,1990,-94,4,1991,-94,4,1992,-102,4,1993,-5,2,1994,-91,4,1995,-63,4,1996,-63,4,1997,-63,4,1998,-21,3,1999,-63,4,2000,-63,4,2001,-63,4,2002,-21,3,2003,-5,2,2004,-87,4,2005,-91,4,2006,-21,3,2007,-5,2,2008,-91,4,2009,-91,4,2010,-21,3,2011,-91,4,2012,-91,4,2013,-21,3,2014,-5,2,2015,-91,4,2016,-630,5,2017,-631,5,2018,-632,5,2019,-633,5,2020,-4,2,2021,-5,2,2022,-6,2,2023,-637,5,2024,-637,5,2025,-637,5,2026,-637,5,2027,-4,2,2028,-5,2,2029,-6,2,2030,-637,5,2031,-15,3,2032,-637,5,2033,-637,5,2034,-18,3,2035,-5,2,2036,-6,2,2037,-21,3,2038,-526,5,2039,-527,5,2040,-528,5,2041,-4,2,2042,-5,2,2043,-531,5,2044,-532,5,2045,-5,2,2046,-534,5,2047,-535,5,0,0,0"),
// leafSize 8
splitIntegerList("1,1,0,2,2,0,3,3,1,4,4,3,5,5,4,6,6,5,7,7,7,8,8,8,9,-1,0,10,-2,1,11,-3,1,12,-4,1,13,-5,1,14,-7,2,15,-7,2,16,-8,2,17,-8,2,18,3,4,19,-8,2,20,-8,2,21,3,4,22,-7,2,23,-7,2,24,3,4,25,-1,1,26,-2,1,27,-3,1,28,4,7,29,-5,2,30,-6,2,31,-7,2,32,4,7,33,-1,1,34,-2,1,35,-3,1,36,-4,2,37,-5,2,38,-6,2,39,-7,2,40,-8,2,41,-9,2,42,-10,2,43,-11,2,44,-12,2,45,-5,2,46,-7,2,47,-7,2,48,-8,2,49,-21,2,50,-18,2,51,-8,2,52,-24,3,53,-21,3,54,-7,2,55,-7,2,56,-24,3,57,-25,3,58,-26,3,59,-27,3,60,-28,3,61,-29,3,62,-30,3,63,-31,3,64,-32,3,65,-32,3,66,-32,3,67,-32,3,68,-4,2,69,-32,3,70,-32,3,71,-32,3,72,-32,3,73,-32,3,74,-32,3,75,-32,3,76,-32,3,77,-32,3,78,-39,3,79,-39,3,80,-40,3,81,-21,3,82,-32,3,83,-40,3,84,-24,3,85,-21,3,86,-40,3,87,-40,3,88,-24,3,89,-24,3,90,-26,3,91,-27,3,92,-28,3,93,-24,3,94,-24,3,95,-24,3,96,3,6,97,-1,1,98,-2,1,99,-3,1,100,-4,2,101,-5,2,102,-6,2,103,-7,2,104,-8,2,105,-9,2,106,-8,2,107,-11,2,108,-4,2,109,-5,2,110,-7,2,111,-7,2,112,-8,2,113,-8,2,114,-18,3,115,-8,2,116,-20,3,117,-21,3,118,-7,2,119,-7,2,120,-24,3,121,-1,1,122,-26,3,123,-27,3,124,-28,3,125,-24,3,126,-30,3,127,-31,3,128,-32,3,129,-1,1,130,-34,3,131,-35,3,132,-4,2,133,-5,2,134,-6,2,135,-32,3,136,-40,3,137,-41,3,138,-42,3,139,-43,3,140,-44,3,141,-5,2,142,-32,3,143,-7,2,144,-8,2,145,-21,3,146,-18,3,147,-3,1,148,-24,3,149,-21,3,150,-7,2,151,-7,2,152,-24,3,153,-1,0,154,-2,1,155,-3,1,156,-28,3,157,-5,2,158,-6,2,159,-7,2,160,-32,3,161,-1,0,162,-2,1,163,-3,1,164,-4,2,165,-5,2,166,-6,2,167,-7,2,168,-8,2,169,-8,2,170,-8,2,171,-8,2,172,-4,2,173,-5,2,174,-7,2,175,-7,2,176,-8,2,177,-21,3,178,-18,3,179,-8,2,180,-24,3,181,-21,3,182,-7,2,183,-7,2,184,-24,3,185,-24,3,186,-24,3,187,-24,3,188,-28,3,189,-5,2,190,-24,3,191,-24,3,192,-96,4,193,-1,0,194,-2,1,195,-3,1,196,-4,2,197,-5,2,198,-6,2,199,-7,2,200,-8,2,201,-8,2,202,-8,2,203,-8,2,204,-4,2,205,-5,2,206,-7,2,207,-7,2,208,-8,2,209,-8,2,210,-96,4,211,-8,2,212,-4,2,213,-96,4,214,-7,2,215,-7,2,216,-96,4,217,-1,0,218,-2,1,219,-3,1,220,-96,4,221,-5,2,222,-6,2,223,-7,2,224,-96,4,225,-1,0,226,-2,1,227,-3,1,228,-4,2,229,-5,2,230,-6,2,231,-7,2,232,-8,2,233,-8,2,234,-8,2,235,-8,2,236,-4,2,237,-5,2,238,-7,2,239,-7,2,240,-96,4,241,-96,4,242,-96,4,243,-96,4,244,-96,4,245,-96,4,246,-7,2,247,-96,4,248,-96,4,249,-96,4,250,-96,4,251,-96,4,252,-124,4,253,-96,4,254,-96,4,255,-96,4,256,-128,4,257,-1,0,258,-2,1,259,-3,1,260,-4,2,261,-5,2,262,-6,2,263,-7,2,264,-8,2,265,-8,2,266,-8,2,267,-96,4,268,-4,2,269,-5,2,270,-7,2,271,-96,4,272,-96,4,273,-128,4,274,-18,3,275,-128,4,276,-128,4,277,-128,4,278,-96,4,279,-128,4,280,-128,4,281,-128,4,282,-128,4,283,-128,4,284,-128,4,285,-128,4,286,-128,4,287,-128,4,288,-96,4,289,-96,4,290,-96,4,291,-96,4,292,-4,2,293,-96,4,294,-96,4,295,-96,4,296,-96,4,297,-96,4,298,-96,4,299,-96,4,300,-4,2,301,-96,4,302,-96,4,303,-96,4,304,-96,4,305,-96,4,306,-96,4,307,-96,4,308,-4,2,309,-96,4,310,-96,4,311,-96,4,312,-96,4,313,-96,4,314,-96,4,315,-96,4,316,-96,4,317,-96,4,318,-96,4,319,-96,4,320,-96,4,321,-96,4,322,-96,4,323,-96,4,324,-4,2,325,-96,4,326,-96,4,327,-96,4,328,-96,4,329,-96,4,330,-96,4,331,-96,4,332,-4,2,333,-96,4,334,-96,4,335,-96,4,336,-96,4,337,-96,4,338,-96,4,339,-96,4,340,-96,4,341,-96,4,342,-96,4,343,-96,4,344,-96,4,345,-96,4,346,-96,4,347,-96,4,348,-96,4,349,-96,4,350,-96,4,351,-96,4,352,-96,4,353,-96,4,354,-96,4,355,-96,4,356,-4,2,357,-96,4,358,-96,4,359,-96,4,360,-96,4,361,-96,4,362,-96,4,363,-96,4,364,-4,2,365,-96,4,366,-96,4,367,-96,4,368,-96,4,369,-96,4,370,-18,3,371,-96,4,372,-96,4,373,-96,4,374,-96,4,375,-96,4,376,-96,4,377,-96,4,378,-96,4,379,-96,4,380,-96,4,381,-96,4,382,-96,4,383,-96,4,384,-96,4,385,-96,4,386,-96,4,387,-96,4,388,-4,2,389,-96,4,390,-96,4,391,-96,4,392,-96,4,393,-96,4,394,-96,4,395,-96,4,396,-4,2,397,-96,4,398,-96,4,399,-96,4,400,-96,4,401,-96,4,402,-96,4,403,-96,4,404,-4,2,405,-96,4,406,-96,4,407,-96,4,408,-96,4,409,-96,4,410,-96,4,411,-96,4,412,-96,4,413,-96,4,414,-96,4,415,-96,4,416,-96,4,417,-96,4,418,-96,4,419,-96,4,420,-4,2,421,-96,4,422,-96,4,423,-96,4,424,-96,4,425,-96,4,426,-96,4,427,-96,4,428,-4,2,429,-96,4,430,-96,4,431,-96,4,432,-96,4,433,-96,4,434,-96,4,435,-96,4,436,-96,4,437,-96,4,438,-96,4,439,-96,4,440,-96,4,441,-96,4,442,-96,4,443,-96,4,444,-96,4,445,-96,4,446,-96,4,447,-96,4,448,-96,4,449,-96,4,450,-96,4,451,-96,4,452,-4,2,453,-96,4,454,-96,4,455,-96,4,456,-96,4,457,-96,4,458,-96,4,459,-96,4,460,-4,2,461,-96,4,462,-96,4,463,-96,4,464,-96,4,465,-96,4,466,-18,3,467,-96,4,468,-96,4,469,-96,4,470,-96,4,471,-96,4,472,-96,4,473,-96,4,474,-96,4,475,-96,4,476,-96,4,477,-96,4,478,-96,4,479,-96,4,480,-96,4,481,-96,4,482,-96,4,483,-96,4,484,-4,2,485,-96,4,486,-96,4,487,-96,4,488,-96,4,489,-96,4,490,-96,4,491,-96,4,492,-4,2,493,-96,4,494,-96,4,495,-96,4,496,-96,4,497,-96,4,498,-18,3,499,-96,4,500,-4,2,501,-96,4,502,-96,4,503,-96,4,504,-96,4,505,-96,4,506,-96,4,507,-96,4,508,-96,4,509,-96,4,510,-96,4,511,-96,4,512,-96,4,513,-96,4,514,-96,4,515,-96,4,516,-4,2,517,-96,4,518,-96,4,519,-96,4,520,-96,4,521,-96,4,522,-96,4,523,-96,4,524,-4,2,525,-96,4,526,-96,4,527,-96,4,528,-96,4,529,-96,4,530,-96,4,531,-96,4,532,-96,4,533,-96,4,534,-96,4,535,-96,4,536,-96,4,537,-96,4,538,-96,4,539,-96,4,540,-96,4,541,-96,4,542,-96,4,543,-96,4,544,-96,4,545,-96,4,546,-96,4,547,-96,4,548,-4,2,549,-96,4,550,-96,4,551,-96,4,552,-96,4,553,-96,4,554,-96,4,555,-96,4,556,-4,2,557,-96,4,558,-96,4,559,-96,4,560,-96,4,561,-96,4,562,-18,3,563,-96,4,564,-96,4,565,-96,4,566,-96,4,567,-96,4,568,-96,4,569,-96,4,570,-96,4,571,-96,4,572,-96,4,573,-96,4,574,-96,4,575,-96,4,576,-96,4,577,-96,4,578,-96,4,579,-96,4,580,-4,2,581,-96,4,582,-96,4,583,-96,4,584,-96,4,585,-96,4,586,-96,4,587,-96,4,588,-4,2,589,-96,4,590,-96,4,591,-96,4,592,-96,4,593,-96,4,594,-18,3,595,-96,4,596,-4,2,597,-96,4,598,-96,4,599,-96,4,600,-96,4,601,-96,4,602,-96,4,603,-96,4,604,-96,4,605,-96,4,606,-96,4,607,-96,4,608,-96,4,609,-96,4,610,-96,4,611,-96,4,612,-4,2,613,-96,4,614,-96,4,615,-96,4,616,-96,4,617,-96,4,618,-96,4,619,-96,4,620,-4,2,621,-96,4,622,-96,4,623,-96,4,624,-96,4,625,-96,4,626,-96,4,627,-96,4,628,-96,4,629,-96,4,630,-96,4,631,-96,4,632,-96,4,633,-96,4,634,-96,4,635,-96,4,636,-96,4,637,-96,4,638,-96,4,639,-96,4,640,-96,4,641,-96,4,642,-96,4,643,-96,4,644,-4,2,645,-96,4,646,-96,4,647,-96,4,648,-96,4,649,-96,4,650,-96,4,651,-96,4,652,-4,2,653,-96,4,654,-96,4,655,-96,4,656,-96,4,657,-96,4,658,-18,3,659,-96,4,660,-96,4,661,-96,4,662,-96,4,663,-96,4,664,-96,4,665,-96,4,666,-96,4,667,-96,4,668,-96,4,669,-96,4,670,-96,4,671,-96,4,672,-96,4,673,-96,4,674,-96,4,675,-96,4,676,-4,2,677,-96,4,678,-96,4,679,-96,4,680,-96,4,681,-96,4,682,-96,4,683,-96,4,684,-4,2,685,-96,4,686,-96,4,687,-96,4,688,-96,4,689,-96,4,690,-18,3,691,-96,4,692,-4,2,693,-96,4,694,-96,4,695,-96,4,696,-96,4,697,-96,4,698,-96,4,699,-96,4,700,-96,4,701,-96,4,702,-96,4,703,-96,4,704,-96,4,705,-96,4,706,-96,4,707,-96,4,708,-4,2,709,-96,4,710,-96,4,711,-96,4,712,-96,4,713,-96,4,714,-96,4,715,-96,4,716,-4,2,717,-96,4,718,-96,4,719,-96,4,720,-96,4,721,-96,4,722,-96,4,723,-96,4,724,-96,4,725,-96,4,726,-96,4,727,-96,4,728,-96,4,729,-96,4,730,-96,4,731,-96,4,732,-96,4,733,-96,4,734,-96,4,735,-96,4,736,-96,4,737,-96,4,738,-96,4,739,-96,4,740,-4,2,741,-96,4,742,-96,4,743,-96,4,744,-96,4,745,-96,4,746,-96,4,747,-96,4,748,-4,2,749,-96,4,750,-96,4,751,-96,4,752,-96,4,753,-96,4,754,-18,3,755,-96,4,756,-96,4,757,-96,4,758,-96,4,759,-96,4,760,-96,4,761,-96,4,762,-96,4,763,-96,4,764,-96,4,765,-96,4,766,-96,4,767,-96,4,768,-96,4,769,-96,4,770,-96,4,771,-96,4,772,-4,2,773,-96,4,774,-96,4,775,-96,4,776,-96,4,777,-96,4,778,-96,4,779,-96,4,780,-4,2,781,-96,4,782,-96,4,783,-96,4,784,-96,4,785,-96,4,786,-18,3,787,-96,4,788,-4,2,789,-96,4,790,-96,4,791,-96,4,792,-96,4,793,-96,4,794,-96,4,795,-96,4,796,-96,4,797,-96,4,798,-96,4,799,-96,4,800,-96,4,801,-96,4,802,-96,4,803,-96,4,804,-4,2,805,-96,4,806,-96,4,807,-96,4,808,-96,4,809,-96,4,810,-96,4,811,-96,4,812,-4,2,813,-96,4,814,-96,4,815,-96,4,816,-96,4,817,-96,4,818,-96,4,819,-96,4,820,-96,4,821,-96,4,822,-96,4,823,-96,4,824,-96,4,825,-96,4,826,-96,4,827,-96,4,828,-96,4,829,-96,4,830,-96,4,831,-96,4,832,-96,4,833,-96,4,834,-96,4,835,-96,4,836,-4,2,837,-96,4,838,-96,4,839,-96,4,840,-96,4,841,-96,4,842,-96,4,843,-96,4,844,-4,2,845,-96,4,846,-96,4,847,-96,4,848,-96,4,849,-96,4,850,-18,3,851,-96,4,852,-96,4,853,-96,4,854,-96,4,855,-96,4,856,-96,4,857,-96,4,858,-96,4,859,-96,4,860,-96,4,861,-96,4,862,-96,4,863,-96,4,864,-96,4,865,-96,4,866,-96,4,867,-96,4,868,-4,2,869,-96,4,870,-96,4,871,-96,4,872,-96,4,873,-96,4,874,-96,4,875,-96,4,876,-4,2,877,-96,4,878,-96,4,879,-96,4,880,-96,4,881,-96,4,882,-18,3,883,-96,4,884,-4,2,885,-96,4,886,-96,4,887,-96,4,888,-96,4,889,-96,4,890,-96,4,891,-96,4,892,-96,4,893,-96,4,894,-96,4,895,-96,4,896,-96,4,897,-96,4,898,-96,4,899,-96,4,900,-4,2,901,-96,4,902,-96,4,903,-96,4,904,-96,4,905,-96,4,906,-96,4,907,-96,4,908,-4,2,909,-96,4,910,-96,4,911,-96,4,912,-96,4,913,-96,4,914,-96,4,915,-96,4,916,-96,4,917,-96,4,918,-96,4,919,-96,4,920,-96,4,921,-96,4,922,-96,4,923,-96,4,924,-96,4,925,-96,4,926,-96,4,927,-96,4,928,-96,4,929,-96,4,930,-96,4,931,-96,4,932,-4,2,933,-96,4,934,-96,4,935,-96,4,936,-96,4,937,-96,4,938,-96,4,939,-96,4,940,-4,2,941,-96,4,942,-96,4,943,-96,4,944,-96,4,945,-96,4,946,-18,3,947,-96,4,948,-96,4,949,-96,4,950,-96,4,951,-96,4,952,-96,4,953,-96,4,954,-96,4,955,-96,4,956,-96,4,957,-96,4,958,-96,4,959,-96,4,960,-96,4,961,-96,4,962,-96,4,963,-96,4,964,-4,2,965,-96,4,966,-96,4,967,-96,4,968,-96,4,969,-96,4,970,-96,4,971,-96,4,972,-4,2,973,-96,4,974,-96,4,975,-96,4,976,-96,4,977,-96,4,978,-18,3,979,-96,4,980,-4,2,981,-96,4,982,-96,4,983,-96,4,984,-96,4,985,-96,4,986,-96,4,987,-96,4,988,-96,4,989,-96,4,990,-96,4,991,-96,4,992,-96,4,993,-96,4,994,-96,4,995,-96,4,996,-4,2,997,-96,4,998,-96,4,999,-96,4,1000,-96,4,1001,-96,4,1002,-96,4,1003,-96,4,1004,-4,2,1005,-96,4,1006,-96,4,1007,-96,4,1008,-96,4,1009,-96,4,1010,-96,4,1011,-96,4,1012,-96,4,1013,-96,4,1014,-96,4,1015,-96,4,1016,-96,4,1017,-96,4,1018,-96,4,1019,-96,4,1020,-96,4,1021,-96,4,1022,-96,4,1023,-96,4,1024,-96,4,1025,-96,4,1026,-96,4,1027,-96,4,1028,-4,2,1029,-96,4,1030,-96,4,1031,-96,4,1032,-96,4,1033,-96,4,1034,-96,4,1035,-96,4,1036,-4,2,1037,-96,4,1038,-96,4,1039,-96,4,1040,-96,4,1041,-96,4,1042,-18,3,1043,-96,4,1044,-96,4,1045,-96,4,1046,-96,4,1047,-96,4,1048,-96,4,1049,-96,4,1050,-96,4,1051,-96,4,1052,-96,4,1053,-96,4,1054,-96,4,1055,-96,4,1056,-96,4,1057,-96,4,1058,-96,4,1059,-96,4,1060,-4,2,1061,-96,4,1062,-96,4,1063,-96,4,1064,-96,4,1065,-96,4,1066,-96,4,1067,-96,4,1068,-4,2,1069,-96,4,1070,-96,4,1071,-96,4,1072,-96,4,1073,-96,4,1074,-18,3,1075,-96,4,1076,-4,2,1077,-96,4,1078,-96,4,1079,-96,4,1080,-96,4,1081,-96,4,1082,-96,4,1083,-96,4,1084,-96,4,1085,-96,4,1086,-96,4,1087,-96,4,1088,-96,4,1089,-96,4,1090,-96,4,1091,-96,4,1092,-4,2,1093,-96,4,1094,-96,4,1095,-96,4,1096,-96,4,1097,-96,4,1098,-96,4,1099,-96,4,1100,-4,2,1101,-96,4,1102,-96,4,1103,-96,4,1104,-96,4,1105,-96,4,1106,-96,4,1107,-96,4,1108,-96,4,1109,-96,4,1110,-96,4,1111,-96,4,1112,-96,4,1113,-96,4,1114,-96,4,1115,-96,4,1116,-96,4,1117,-96,4,1118,-96,4,1119,-96,4,1120,-96,4,1121,-96,4,1122,-96,4,1123,-96,4,1124,-4,2,1125,-96,4,1126,-96,4,1127,-96,4,1128,-96,4,1129,-96,4,1130,-96,4,1131,-96,4,1132,-4,2,1133,-96,4,1134,-96,4,1135,-96,4,1136,-96,4,1137,-96,4,1138,-18,3,1139,-96,4,1140,-96,4,1141,-96,4,1142,-96,4,1143,-96,4,1144,-96,4,1145,-96,4,1146,-96,4,1147,-96,4,1148,-96,4,1149,-96,4,1150,-96,4,1151,-96,4,1152,-96,4,1153,-96,4,1154,-96,4,1155,-96,4,1156,-4,2,1157,-96,4,1158,-96,4,1159,-96,4,1160,-96,4,1161,-96,4,1162,-96,4,1163,-96,4,1164,-4,2,1165,-96,4,1166,-96,4,1167,-96,4,1168,-96,4,1169,-96,4,1170,-18,3,1171,-96,4,1172,-4,2,1173,-96,4,1174,-96,4,1175,-96,4,1176,-96,4,1177,-96,4,1178,-96,4,1179,-96,4,1180,-96,4,1181,-96,4,1182,-96,4,1183,-96,4,1184,-96,4,1185,-96,4,1186,-96,4,1187,-96,4,1188,-4,2,1189,-96,4,1190,-96,4,1191,-96,4,1192,-96,4,1193,-96,4,1194,-96,4,1195,-96,4,1196,-4,2,1197,-96,4,1198,-96,4,1199,-96,4,1200,-96,4,1201,-96,4,1202,-96,4,1203,-96,4,1204,-96,4,1205,-96,4,1206,-96,4,1207,-96,4,1208,-96,4,1209,-96,4,1210,-96,4,1211,-96,4,1212,-96,4,1213,-96,4,1214,-96,4,1215,-96,4,1216,-96,4,1217,-96,4,1218,-96,4,1219,-96,4,1220,-4,2,1221,-96,4,1222,-96,4,1223,-96,4,1224,-96,4,1225,-96,4,1226,-96,4,1227,-96,4,1228,-4,2,1229,-96,4,1230,-96,4,1231,-96,4,1232,-96,4,1233,-96,4,1234,-18,3,1235,-96,4,1236,-96,4,1237,-96,4,1238,-96,4,1239,-96,4,1240,-96,4,1241,-96,4,1242,-96,4,1243,-96,4,1244,-96,4,1245,-96,4,1246,-96,4,1247,-96,4,1248,-96,4,1249,-96,4,1250,-96,4,1251,-96,4,1252,-4,2,1253,-96,4,1254,-96,4,1255,-96,4,1256,-96,4,1257,-96,4,1258,-96,4,1259,-96,4,1260,-4,2,1261,-96,4,1262,-96,4,1263,-96,4,1264,-96,4,1265,-96,4,1266,-18,3,1267,-96,4,1268,-4,2,1269,-96,4,1270,-96,4,1271,-96,4,1272,-96,4,1273,-96,4,1274,-96,4,1275,-96,4,1276,-96,4,1277,-96,4,1278,-96,4,1279,-96,4,1280,-96,4,1281,-96,4,1282,-96,4,1283,-96,4,1284,-4,2,1285,-96,4,1286,-96,4,1287,-96,4,1288,-96,4,1289,-96,4,1290,-96,4,1291,-96,4,1292,-4,2,1293,-96,4,1294,-96,4,1295,-96,4,1296,-96,4,1297,-96,4,1298,-96,4,1299,-96,4,1300,-96,4,1301,-96,4,1302,-96,4,1303,-96,4,1304,-96,4,1305,-96,4,1306,-96,4,1307,-96,4,1308,-96,4,1309,-96,4,1310,-96,4,1311,-96,4,1312,-96,4,1313,-96,4,1314,-96,4,1315,-96,4,1316,-4,2,1317,-96,4,1318,-96,4,1319,-96,4,1320,-96,4,1321,-96,4,1322,-96,4,1323,-96,4,1324,-4,2,1325,-96,4,1326,-96,4,1327,-96,4,1328,-96,4,1329,-96,4,1330,-18,3,1331,-96,4,1332,-96,4,1333,-96,4,1334,-96,4,1335,-96,4,1336,-96,4,1337,-96,4,1338,-96,4,1339,-96,4,1340,-96,4,1341,-96,4,1342,-96,4,1343,-96,4,1344,-96,4,1345,-96,4,1346,-96,4,1347,-96,4,1348,-4,2,1349,-96,4,1350,-96,4,1351,-96,4,1352,-96,4,1353,-96,4,1354,-96,4,1355,-96,4,1356,-4,2,1357,-96,4,1358,-96,4,1359,-96,4,1360,-96,4,1361,-96,4,1362,-18,3,1363,-96,4,1364,-4,2,1365,-96,4,1366,-96,4,1367,-96,4,1368,-96,4,1369,-96,4,1370,-96,4,1371,-96,4,1372,-96,4,1373,-96,4,1374,-96,4,1375,-96,4,1376,-96,4,1377,-96,4,1378,-96,4,1379,-96,4,1380,-4,2,1381,-96,4,1382,-96,4,1383,-96,4,1384,-96,4,1385,-96,4,1386,-96,4,1387,-96,4,1388,-4,2,1389,-96,4,1390,-96,4,1391,-96,4,1392,-96,4,1393,-96,4,1394,-96,4,1395,-96,4,1396,-96,4,1397,-96,4,1398,-96,4,1399,-96,4,1400,-96,4,1401,-96,4,1402,-96,4,1403,-96,4,1404,-96,4,1405,-96,4,1406,-96,4,1407,-96,4,1408,-96,4,1409,-96,4,1410,-96,4,1411,-96,4,1412,-4,2,1413,-96,4,1414,-96,4,1415,-96,4,1416,-96,4,1417,-96,4,1418,-96,4,1419,-96,4,1420,-4,2,1421,-96,4,1422,-96,4,1423,-96,4,1424,-96,4,1425,-96,4,1426,-18,3,1427,-96,4,1428,-96,4,1429,-96,4,1430,-96,4,1431,-96,4,1432,-96,4,1433,-96,4,1434,-96,4,1435,-96,4,1436,-96,4,1437,-96,4,1438,-96,4,1439,-96,4,1440,-96,4,1441,-96,4,1442,-96,4,1443,-96,4,1444,-4,2,1445,-96,4,1446,-96,4,1447,-96,4,1448,-96,4,1449,-96,4,1450,-96,4,1451,-96,4,1452,-4,2,1453,-96,4,1454,-96,4,1455,-96,4,1456,-96,4,1457,-96,4,1458,-18,3,1459,-96,4,1460,-4,2,1461,-96,4,1462,-96,4,1463,-96,4,1464,-96,4,1465,-96,4,1466,-96,4,1467,-96,4,1468,-96,4,1469,-96,4,1470,-96,4,1471,-96,4,1472,-96,4,1473,-96,4,1474,-96,4,1475,-96,4,1476,-4,2,1477,-96,4,1478,-96,4,1479,-96,4,1480,-96,4,1481,-96,4,1482,-96,4,1483,-96,4,1484,-4,2,1485,-96,4,1486,-96,4,1487,-96,4,1488,-96,4,1489,-96,4,1490,-96,4,1491,-96,4,1492,-96,4,1493,-96,4,1494,-96,4,1495,-96,4,1496,-96,4,1497,-96,4,1498,-96,4,1499,-96,4,1500,-96,4,1501,-96,4,1502,-96,4,1503,-96,4,1504,-96,4,1505,-96,4,1506,-96,4,1507,-96,4,1508,-4,2,1509,-96,4,1510,-96,4,1511,-96,4,1512,-96,4,1513,-96,4,1514,-96,4,1515,-96,4,1516,-4,2,1517,-96,4,1518,-96,4,1519,-96,4,1520,-96,4,1521,-96,4,1522,-18,3,1523,-96,4,1524,-96,4,1525,-96,4,1526,-96,4,1527,-96,4,1528,-96,4,1529,-96,4,1530,-96,4,1531,-96,4,1532,-96,4,1533,-96,4,1534,-96,4,1535,-96,4,1536,-96,4,1537,-96,4,1538,-96,4,1539,-96,4,1540,-4,2,1541,-96,4,1542,-96,4,1543,-96,4,1544,-96,4,1545,-96,4,1546,-96,4,1547,-96,4,1548,-4,2,1549,-96,4,1550,-96,4,1551,-96,4,1552,-96,4,1553,-96,4,1554,-18,3,1555,-96,4,1556,-4,2,1557,-96,4,1558,-96,4,1559,-96,4,1560,-96,4,1561,-96,4,1562,-96,4,1563,-96,4,1564,-96,4,1565,-96,4,1566,-96,4,1567,-96,4,1568,-96,4,1569,-96,4,1570,-96,4,1571,-96,4,1572,-4,2,1573,-96,4,1574,-96,4,1575,-96,4,1576,-96,4,1577,-96,4,1578,-96,4,1579,-96,4,1580,-4,2,1581,-96,4,1582,-96,4,1583,-96,4,1584,-96,4,1585,-96,4,1586,-18,3,1587,-96,4,1588,-96,4,1589,-96,4,1590,-96,4,1591,-96,4,1592,-96,4,1593,-96,4,1594,-96,4,1595,-96,4,1596,-96,4,1597,-96,4,1598,-96,4,1599,-96,4,1600,-96,4,1601,-96,4,1602,-96,4,1603,-96,4,1604,-4,2,1605,-96,4,1606,-96,4,1607,-96,4,1608,-96,4,1609,-96,4,1610,-96,4,1611,-96,4,1612,-4,2,1613,-96,4,1614,-96,4,1615,-96,4,1616,-96,4,1617,-96,4,1618,-18,3,1619,-96,4,1620,-96,4,1621,-96,4,1622,-96,4,1623,-96,4,1624,-96,4,1625,-96,4,1626,-96,4,1627,-96,4,1628,-96,4,1629,-96,4,1630,-96,4,1631,-96,4,1632,-96,4,1633,-96,4,1634,-96,4,1635,-96,4,1636,-4,2,1637,-96,4,1638,-96,4,1639,-96,4,1640,-96,4,1641,-96,4,1642,-96,4,1643,-96,4,1644,-4,2,1645,-96,4,1646,-96,4,1647,-96,4,1648,-96,4,1649,-96,4,1650,-18,3,1651,-96,4,1652,-4,2,1653,-96,4,1654,-96,4,1655,-96,4,1656,-96,4,1657,-96,4,1658,-96,4,1659,-96,4,1660,-96,4,1661,-96,4,1662,-96,4,1663,-96,4,1664,-96,4,1665,-96,4,1666,-96,4,1667,-96,4,1668,-4,2,1669,-96,4,1670,-96,4,1671,-96,4,1672,-96,4,1673,-96,4,1674,-96,4,1675,-96,4,1676,-4,2,1677,-96,4,1678,-96,4,1679,-96,4,1680,-96,4,1681,-96,4,1682,-18,3,1683,-96,4,1684,-96,4,1685,-96,4,1686,-96,4,1687,-96,4,1688,-96,4,1689,-96,4,1690,-96,4,1691,-96,4,1692,-96,4,1693,-96,4,1694,-96,4,1695,-96,4,1696,-96,4,1697,-96,4,1698,-96,4,1699,-96,4,1700,-4,2,1701,-96,4,1702,-96,4,1703,-96,4,1704,-96,4,1705,-96,4,1706,-96,4,1707,-96,4,1708,-4,2,1709,-96,4,1710,-96,4,1711,-96,4,1712,-96,4,1713,-96,4,1714,-18,3,1715,-96,4,1716,-96,4,1717,-96,4,1718,-96,4,1719,-96,4,1720,-96,4,1721,-96,4,1722,-96,4,1723,-96,4,1724,-96,4,1725,-96,4,1726,-96,4,1727,-96,4,1728,-96,4,1729,-96,4,1730,-96,4,1731,-96,4,1732,-4,2,1733,-96,4,1734,-96,4,1735,-96,4,1736,-96,4,1737,-96,4,1738,-96,4,1739,-96,4,1740,-4,2,1741,-96,4,1742,-96,4,1743,-96,4,1744,-96,4,1745,-96,4,1746,-18,3,1747,-96,4,1748,-4,2,1749,-96,4,1750,-96,4,1751,-96,4,1752,-96,4,1753,-96,4,1754,-96,4,1755,-96,4,1756,-96,4,1757,-96,4,1758,-96,4,1759,-96,4,1760,-96,4,1761,-96,4,1762,-96,4,1763,-96,4,1764,-4,2,1765,-96,4,1766,-96,4,1767,-96,4,1768,-96,4,1769,-96,4,1770,-96,4,1771,-96,4,1772,-4,2,1773,-96,4,1774,-96,4,1775,-96,4,1776,-96,4,1777,-96,4,1778,-18,3,1779,-96,4,1780,-96,4,1781,-96,4,1782,-96,4,1783,-96,4,1784,-96,4,1785,-96,4,1786,-96,4,1787,-96,4,1788,-96,4,1789,-96,4,1790,-96,4,1791,-96,4,1792,-96,4,1793,-96,4,1794,-96,4,1795,-96,4,1796,-4,2,1797,-96,4,1798,-96,4,1799,-96,4,1800,-96,4,1801,-96,4,1802,-96,4,1803,-96,4,1804,-4,2,1805,-96,4,1806,-96,4,1807,-96,4,1808,-96,4,1809,-96,4,1810,-18,3,1811,-96,4,1812,-96,4,1813,-96,4,1814,-96,4,1815,-96,4,1816,-96,4,1817,-96,4,1818,-96,4,1819,-96,4,1820,-96,4,1821,-96,4,1822,-96,4,1823,-96,4,1824,-96,4,1825,-96,4,1826,-96,4,1827,-96,4,1828,-4,2,1829,-96,4,1830,-96,4,1831,-96,4,1832,-96,4,1833,-96,4,1834,-96,4,1835,-96,4,1836,-4,2,1837,-96,4,1838,-96,4,1839,-96,4,1840,-96,4,1841,-96,4,1842,-18,3,1843,-96,4,1844,-4,2,1845,-96,4,1846,-96,4,1847,-96,4,1848,-96,4,1849,-96,4,1850,-96,4,1851,-96,4,1852,-96,4,1853,-96,4,1854,-96,4,1855,-96,4,1856,-96,4,1857,-96,4,1858,-96,4,1859,-96,4,1860,-4,2,1861,-96,4,1862,-96,4,1863,-96,4,1864,-96,4,1865,-96,4,1866,-96,4,1867,-96,4,1868,-4,2,1869,-96,4,1870,-96,4,1871,-96,4,1872,-96,4,1873,-96,4,1874,-18,3,1875,-96,4,1876,-96,4,1877,-96,4,1878,-96,4,1879,-96,4,1880,-96,4,1881,-96,4,1882,-96,4,1883,-96,4,1884,-96,4,1885,-96,4,1886,-96,4,1887,-96,4,1888,-96,4,1889,-96,4,1890,-96,4,1891,-96,4,1892,-4,2,1893,-96,4,1894,-96,4,1895,-96,4,1896,-96,4,1897,-96,4,1898,-96,4,1899,-96,4,1900,-4,2,1901,-96,4,1902,-96,4,1903,-96,4,1904,-96,4,1905,-96,4,1906,-18,3,1907,-96,4,1908,-96,4,1909,-96,4,1910,-96,4,1911,-96,4,1912,-96,4,1913,-96,4,1914,-96,4,1915,-96,4,1916,-96,4,1917,-96,4,1918,-96,4,1919,-96,4,1920,-96,4,1921,-96,4,1922,-96,4,1923,-96,4,1924,-4,2,1925,-96,4,1926,-96,4,1927,-96,4,1928,-96,4,1929,-96,4,1930,-96,4,1931,-96,4,1932,-4,2,1933,-96,4,1934,-96,4,1935,-96,4,1936,-96,4,1937,-96,4,1938,-18,3,1939,-96,4,1940,-4,2,1941,-96,4,1942,-96,4,1943,-96,4,1944,-96,4,1945,-96,4,1946,-96,4,1947,-96,4,1948,-96,4,1949,-96,4,1950,-96,4,1951,-96,4,1952,-96,4,1953,-96,4,1954,-96,4,1955,-96,4,1956,-4,2,1957,-96,4,1958,-96,4,1959,-96,4,1960,-96,4,1961,-96,4,1962,-96,4,1963,-96,4,1964,-4,2,1965,-96,4,1966,-96,4,1967,-96,4,1968,-96,4,1969,-96,4,1970,-18,3,1971,-96,4,1972,-96,4,1973,-96,4,1974,-96,4,1975,-96,4,1976,-96,4,1977,-96,4,1978,-96,4,1979,-96,4,1980,-96,4,1981,-96,4,1982,-96,4,1983,-96,4,1984,-96,4,1985,-96,4,1986,-96,4,1987,-96,4,1988,-4,2,1989,-96,4,1990,-96,4,1991,-96,4,1992,-96,4,1993,-96,4,1994,-96,4,1995,-96,4,1996,-4,2,1997,-5,2,1998,-96,4,1999,-96,4,2000,-96,4,2001,-96,4,2002,-18,3,2003,-96,4,2004,-96,4,2005,-96,4,2006,-96,4,2007,-96,4,2008,-96,4,2009,-96,4,2010,-96,4,2011,-96,4,2012,-96,4,2013,-96,4,2014,-96,4,2015,-96,4,2016,-96,4,2017,-96,4,2018,-96,4,2019,-96,4,2020,-4,2,2021,-96,4,2022,-96,4,2023,-96,4,2024,-96,4,2025,-96,4,2026,-96,4,2027,-96,4,2028,-4,2,2029,-96,4,2030,-96,4,2031,-96,4,2032,-96,4,2033,-96,4,2034,-18,3,2035,-96,4,2036,-4,2,2037,-96,4,2038,-96,4,2039,-96,4,2040,-96,4,2041,-96,4,2042,-96,4,2043,-96,4,2044,-96,4,2045,-96,4,2046,-96,4,2047,-96,4,0,0,0"),
// leafSize 9
splitIntegerList("1,1,0,2,2,0,3,3,1,4,4,3,5,5,4,6,6,5,7,7,7,8,8,8,9,9,10,10,-2,1,11,-2,1,12,-3,1,13,-5,1,14,-7,2,15,-7,2,16,-8,2,17,-8,2,18,-9,2,19,-9,2,20,-9,2,21,3,4,22,-7,2,23,-7,2,24,3,4,25,-8,2,26,-8,2,27,3,4,28,4,7,29,-2,1,30,-6,2,31,-7,2,32,4,7,33,-9,2,34,-7,2,35,5,9,36,4,7,37,-1,1,38,-2,1,39,-7,2,40,-8,2,41,-9,2,42,-6,2,43,-7,2,44,-8,2,45,-9,2,46,-10,2,47,-9,2,48,-8,2,49,-8,2,50,-9,2,51,-7,2,52,-8,2,53,-8,2,54,-9,2,55,-27,3,56,-24,3,57,-21,3,58,-8,2,59,-27,3,60,-24,3,61,-8,2,62,-8,2,63,-27,3,64,-32,3,65,-32,3,66,-32,3,67,-32,3,68,-32,3,69,-33,3,70,-34,3,71,-35,3,72,-36,3,73,-32,3,74,-36,3,75,-36,3,76,-36,3,77,-36,3,78,-36,3,79,-36,3,80,-36,3,81,-36,3,82,-36,3,83,-38,3,84,-40,3,85,-41,3,86,-41,3,87,-43,3,88,-44,3,89,-44,3,90,-45,3,91,-27,3,92,-24,3,93,-21,3,94,-45,3,95,-27,3,96,3,6,97,-45,3,98,-45,3,99,-27,3,100,-32,3,101,-5,2,102,-6,2,103,-7,2,104,-32,3,105,-9,2,106,-27,3,107,-35,3,108,3,6,109,-1,1,110,-2,1,111,-3,1,112,-4,2,113,-5,2,114,-6,2,115,-7,2,116,-8,2,117,-9,2,118,-8,2,119,-9,2,120,-4,2,121,-5,2,122,-7,2,123,-7,2,124,-8,2,125,-8,2,126,-9,2,127,-8,2,128,-32,3,129,-21,3,130,-7,2,131,-7,2,132,-24,3,133,-8,2,134,-26,3,135,-27,3,136,-28,3,137,-29,3,138,-24,3,139,-31,3,140,-32,3,141,-33,3,142,-34,3,143,-35,3,144,-36,3,145,-1,0,146,-2,1,147,-7,2,148,-8,2,149,-9,2,150,-6,2,151,-7,2,152,-8,2,153,-9,2,154,-9,2,155,-2,1,156,-8,2,157,-8,2,158,-9,2,159,-7,2,160,-8,2,161,-8,2,162,-9,2,163,-27,3,164,-24,3,165,-21,3,166,-8,2,167,-27,3,168,-24,3,169,-8,2,170,-8,2,171,-27,3,172,-32,3,173,-27,3,174,-27,3,175,-32,3,176,-32,3,177,-33,3,178,-27,3,179,-35,3,180,-36,3,181,-36,3,182,-36,3,183,-32,3,184,-32,3,185,-32,3,186,-6,2,187,-7,2,188,-36,3,189,-36,3,190,-36,3,191,-36,3,192,-32,3,193,-32,3,194,-32,3,195,-7,2,196,-36,3,197,-36,3,198,-36,3,199,-27,3,200,-24,3,201,-21,3,202,-32,3,203,-27,3,204,-96,4,205,-36,3,206,-36,3,207,-27,3,208,-32,3,209,-5,2,210,-6,2,211,-7,2,212,-32,3,213,-105,4,214,-27,3,215,-35,3,216,-108,4,217,-1,0,218,-2,1,219,-3,1,220,-4,2,221,-5,2,222,-6,2,223,-7,2,224,-8,2,225,-9,2,226,-9,2,227,-2,1,228,-9,2,229,-5,2,230,-7,2,231,-7,2,232,-8,2,233,-8,2,234,-9,2,235,-9,2,236,-108,4,237,-108,4,238,-7,2,239,-27,3,240,-108,4,241,-8,2,242,-8,2,243,-108,4,244,-108,4,245,-2,1,246,-6,2,247,-7,2,248,-108,4,249,-108,4,250,-7,2,251,-108,4,252,-108,4,253,-108,4,254,-108,4,255,-108,4,256,-108,4,257,-108,4,258,-108,4,259,-108,4,260,-108,4,261,-108,4,262,-108,4,263,-108,4,264,-108,4,265,-108,4,266,-108,4,267,-108,4,268,-108,4,269,-108,4,270,-108,4,271,-108,4,272,-108,4,273,-108,4,274,-108,4,275,-135,4,276,-108,4,277,-108,4,278,-108,4,279,-135,4,280,-140,4,281,-135,4,282,-135,4,283,-140,4,284,-140,4,285,-141,4,286,-135,4,287,-143,4,288,-144,4,289,-144,4,290,-144,4,291,-144,4,292,-144,4,293,-144,4,294,-144,4,295,-144,4,296,-144,4,297,-144,4,298,-145,4,299,-146,4,300,-148,4,301,-149,4,302,-149,4,303,-151,4,304,-152,4,305,-152,4,306,-153,4,307,-140,4,308,-144,4,309,-144,4,310,-153,4,311,-144,4,312,-96,4,313,-153,4,314,-153,4,315,-144,4,316,-144,4,317,-96,4,318,-96,4,319,-96,4,320,-144,4,321,-96,4,322,-151,4,323,-144,4,324,3,8,325,-1,0,326,-2,1,327,-3,1,328,-4,2,329,-5,2,330,-6,2,331,-7,2,332,-8,2,333,-9,2,334,-9,2,335,-2,1,336,-9,2,337,-5,2,338,-7,2,339,-7,2,340,-8,2,341,-8,2,342,-9,2,343,-9,2,344,-2,1,345,-21,3,346,-7,2,347,-7,2,348,-24,3,349,-8,2,350,-8,2,351,-27,3,352,-28,3,353,-27,3,354,-24,3,355,-24,3,356,-32,3,357,-33,3,358,-27,3,359,-35,3,360,-36,3,361,-36,3,362,-2,1,363,-7,2,364,-32,3,365,-32,3,366,-6,2,367,-7,2,368,-8,2,369,-36,3,370,-36,3,371,-2,1,372,-32,3,373,-32,3,374,-32,3,375,-7,2,376,-8,2,377,-8,2,378,-36,3,379,-27,3,380,-24,3,381,-21,3,382,-32,3,383,-27,3,384,-24,3,385,-8,2,386,-8,2,387,-27,3,388,-32,3,389,-27,3,390,-27,3,391,-32,3,392,-32,3,393,-33,3,394,-27,3,395,-35,3,396,-36,3,397,-36,3,398,-2,1,399,-7,2,400,-32,3,401,-32,3,402,-6,2,403,-7,2,404,-8,2,405,-81,4,406,-81,4,407,-81,4,408,-32,3,409,-32,3,410,-86,4,411,-7,2,412,-88,4,413,-89,4,414,-90,4,415,-27,3,416,-24,3,417,-21,3,418,-94,4,419,-27,3,420,-96,4,421,-97,4,422,-98,4,423,-27,3,424,-32,3,425,-96,4,426,-96,4,427,-96,4,428,-104,4,429,-96,4,430,-27,3,431,-107,4,432,-108,4,433,-108,4,434,-108,4,435,-108,4,436,-4,2,437,-5,2,438,-108,4,439,-108,4,440,-108,4,441,-108,4,442,-108,4,443,-108,4,444,-108,4,445,-5,2,446,-108,4,447,-108,4,448,-108,4,449,-108,4,450,-108,4,451,-108,4,452,-128,4,453,-21,3,454,-108,4,455,-108,4,456,-108,4,457,-108,4,458,-108,4,459,-108,4,460,-108,4,461,-108,4,462,-108,4,463,-108,4,464,-140,4,465,-141,4,466,-108,4,467,-143,4,468,-144,4,469,-145,4,470,-146,4,471,-147,4,472,-148,4,473,-149,4,474,-6,2,475,-151,4,476,-152,4,477,-153,4,478,-154,4,479,-155,4,480,-156,4,481,-157,4,482,-158,4,483,-159,4,484,-160,4,485,-161,4,486,-162,4,487,-108,4,488,-24,3,489,-21,3,490,-166,4,491,-140,4,492,-24,3,493,-169,4,494,-170,4,495,-27,3,496,-172,4,497,-27,3,498,-27,3,499,-175,4,500,-176,4,501,-177,4,502,-27,3,503,-179,4,504,-180,4,505,-181,4,506,-182,4,507,-7,2,508,-152,4,509,-153,4,510,-6,2,511,-7,2,512,-188,4,513,-189,4,514,-190,4,515,-191,4,516,-160,4,517,-161,4,518,-162,4,519,-7,2,520,-196,4,521,-197,4,522,-90,4,523,-27,3,524,-24,3,525,-21,3,526,-170,4,527,-27,3,528,-96,4,529,-205,4,530,-98,4,531,-27,3,532,-144,4,533,-5,2,534,-96,4,535,-96,4,536,-180,4,537,-96,4,538,-27,3,539,-180,4,540,-108,4,541,-108,4,542,-108,4,543,-108,4,544,-4,2,545,-5,2,546,-108,4,547,-108,4,548,-108,4,549,-108,4,550,-108,4,551,-108,4,552,-108,4,553,-5,2,554,-108,4,555,-108,4,556,-108,4,557,-108,4,558,-108,4,559,-108,4,560,-108,4,561,-21,3,562,-108,4,563,-108,4,564,-108,4,565,-108,4,566,-108,4,567,-108,4,568,-108,4,569,-108,4,570,-108,4,571,-108,4,572,-108,4,573,-108,4,574,-108,4,575,-108,4,576,-108,4,577,-108,4,578,-108,4,579,-108,4,580,-108,4,581,-108,4,582,-108,4,583,-108,4,584,-108,4,585,-108,4,586,-108,4,587,-108,4,588,-108,4,589,-108,4,590,-108,4,591,-108,4,592,-108,4,593,-108,4,594,-108,4,595,-108,4,596,-108,4,597,-21,3,598,-108,4,599,-108,4,600,-108,4,601,-108,4,602,-108,4,603,-108,4,604,-140,4,605,-108,4,606,-108,4,607,-140,4,608,-140,4,609,-141,4,610,-108,4,611,-143,4,612,-144,4,613,-144,4,614,-144,4,615,-140,4,616,-140,4,617,-140,4,618,-6,2,619,-144,4,620,-144,4,621,-144,4,622,-144,4,623,-144,4,624,-140,4,625,-144,4,626,-144,4,627,-144,4,628,-144,4,629,-144,4,630,-144,4,631,-27,3,632,-24,3,633,-21,3,634,-144,4,635,-27,3,636,-96,4,637,-144,4,638,-144,4,639,-27,3,640,-144,4,641,-5,2,642,-96,4,643,-96,4,644,-144,4,645,-96,4,646,-27,3,647,-144,4,648,-324,4,649,-324,4,650,-2,1,651,-324,4,652,-4,2,653,-5,2,654,-6,2,655,-7,2,656,-8,2,657,-9,2,658,-9,2,659,-2,1,660,-4,2,661,-5,2,662,-7,2,663,-7,2,664,-8,2,665,-8,2,666,-9,2,667,-9,2,668,-2,1,669,-21,3,670,-7,2,671,-7,2,672,-24,3,673,-8,2,674,-8,2,675,-27,3,676,-28,3,677,-27,3,678,-24,3,679,-24,3,680,-32,3,681,-33,3,682,-27,3,683,-35,3,684,-36,3,685,-36,3,686,-2,1,687,-7,2,688,-32,3,689,-32,3,690,-6,2,691,-7,2,692,-8,2,693,-36,3,694,-36,3,695,-2,1,696,-32,3,697,-32,3,698,-32,3,699,-7,2,700,-8,2,701,-8,2,702,-36,3,703,-27,3,704,-24,3,705,-21,3,706,-32,3,707,-27,3,708,-24,3,709,-8,2,710,-8,2,711,-27,3,712,-32,3,713,-27,3,714,-27,3,715,-32,3,716,-32,3,717,-24,3,718,-27,3,719,-35,3,720,-36,3,721,-36,3,722,-2,1,723,-7,2,724,-32,3,725,-77,4,726,-6,2,727,-79,4,728,-80,4,729,-81,4,730,-81,4,731,-81,4,732,-84,4,733,-85,4,734,-86,4,735,-80,4,736,-88,4,737,-89,4,738,-90,4,739,-27,3,740,-24,3,741,-21,3,742,-94,4,743,-27,3,744,-96,4,745,-97,4,746,-98,4,747,-99,4,748,-100,4,749,-5,2,750,-96,4,751,-96,4,752,-104,4,753,-96,4,754,-99,4,755,-107,4,756,-108,4,757,-108,4,758,-108,4,759,-108,4,760,-4,2,761,-5,2,762,-108,4,763,-108,4,764,-108,4,765,-108,4,766,-108,4,767,-108,4,768,-4,2,769,-5,2,770,-108,4,771,-108,4,772,-108,4,773,-108,4,774,-108,4,775,-108,4,776,-128,4,777,-21,3,778,-108,4,779,-108,4,780,-24,3,781,-108,4,782,-108,4,783,-108,4,784,-108,4,785,-108,4,786,-24,3,787,-24,3,788,-140,4,789,-141,4,790,-108,4,791,-143,4,792,-144,4,793,-145,4,794,-146,4,795,-7,2,796,-148,4,797,-149,4,798,-6,2,799,-7,2,800,-152,4,801,-153,4,802,-154,4,803,-155,4,804,-156,4,805,-149,4,806,-324,5,807,-331,5,808,-332,5,809,-332,5,810,-324,5,811,-108,4,812,-24,3,813,-21,3,814,-332,5,815,-351,5,816,-348,5,817,-340,5,818,-332,5,819,-351,5,820,-356,5,821,-351,5,822,-358,5,823,-356,5,824,-356,5,825,-357,5,826,-358,5,827,-359,5,828,-360,5,829,-360,5,830,-360,5,831,-363,5,832,-356,5,833,-356,5,834,-366,5,835,-367,5,836,-360,5,837,-360,5,838,-360,5,839,-360,5,840,-356,5,841,-356,5,842,-356,5,843,-367,5,844,-360,5,845,-89,4,846,-90,4,847,-383,5,848,-380,5,849,-381,5,850,-364,5,851,-383,5,852,-96,4,853,-368,5,854,-98,4,855,-351,5,856,-388,5,857,-5,2,858,-96,4,859,-96,4,860,-356,5,861,-96,4,862,-358,5,863,-359,5,864,-108,4,865,-108,4,866,-108,4,867,-432,5,868,-4,2,869,-5,2,870,-432,5,871,-432,5,872,-432,5,873,-432,5,874,-433,5,875,-434,5,876,-435,5,877,-437,5,878,-439,5,879,-439,5,880,-440,5,881,-440,5,882,-441,5,883,-441,5,884,-432,5,885,-432,5,886,-440,5,887,-440,5,888,-432,5,889,-441,5,890,-441,5,891,-432,5,892,-432,5,893,-434,5,894,-438,5,895,-439,5,896,-432,5,897,-432,5,898,-439,5,899,-432,5,900,-432,5,901,-432,5,902,-432,5,903,-432,5,904,-432,5,905,-432,5,906,-438,5,907,-439,5,908,-432,5,909,-432,5,910,-432,5,911,-432,5,912,-432,5,913,-432,5,914,-432,5,915,-439,5,916,-432,5,917,-432,5,918,-432,5,919,-459,5,920,-456,5,921,-453,5,922,-432,5,923,-459,5,924,-456,5,925,-432,5,926,-440,5,927,-459,5,928,-464,5,929,-459,5,930,-459,5,931,-464,5,932,-464,5,933,-465,5,934,-459,5,935,-467,5,936,-468,5,937,-468,5,938,-468,5,939,-468,5,940,-468,5,941,-468,5,942,-468,5,943,-468,5,944,-468,5,945,-468,5,946,-469,5,947,-470,5,948,-472,5,949,-473,5,950,-473,5,951,-475,5,952,-476,5,953,-476,5,954,-477,5,955,-464,5,956,-468,5,957,-468,5,958,-477,5,959,-468,5,960,-432,5,961,-477,5,962,-477,5,963,-468,5,964,-468,5,965,-437,5,966,-438,5,967,-439,5,968,-468,5,969,-441,5,970,-475,5,971,-468,5,972,-324,5,973,-325,5,974,-326,5,975,-327,5,976,-328,5,977,-329,5,978,-330,5,979,-331,5,980,-332,5,981,-333,5,982,-334,5,983,-335,5,984,-336,5,985,-337,5,986,-338,5,987,-339,5,988,-340,5,989,-341,5,990,-342,5,991,-343,5,992,-344,5,993,-345,5,994,-346,5,995,-347,5,996,-348,5,997,-349,5,998,-350,5,999,-351,5,1000,-352,5,1001,-353,5,1002,-354,5,1003,-355,5,1004,-356,5,1005,-357,5,1006,-358,5,1007,-359,5,1008,-360,5,1009,-361,5,1010,-362,5,1011,-363,5,1012,-364,5,1013,-365,5,1014,-366,5,1015,-367,5,1016,-368,5,1017,-369,5,1018,-370,5,1019,-371,5,1020,-372,5,1021,-373,5,1022,-374,5,1023,-375,5,1024,-376,5,1025,-377,5,1026,-378,5,1027,-379,5,1028,-380,5,1029,-381,5,1030,-382,5,1031,-383,5,1032,-384,5,1033,-385,5,1034,-386,5,1035,-387,5,1036,-388,5,1037,-389,5,1038,-390,5,1039,-391,5,1040,-392,5,1041,-393,5,1042,-394,5,1043,-395,5,1044,-396,5,1045,-397,5,1046,-398,5,1047,-399,5,1048,-400,5,1049,-401,5,1050,-402,5,1051,-403,5,1052,-404,5,1053,-405,5,1054,-406,5,1055,-407,5,1056,-408,5,1057,-409,5,1058,-410,5,1059,-411,5,1060,-412,5,1061,-413,5,1062,-414,5,1063,-415,5,1064,-416,5,1065,-417,5,1066,-418,5,1067,-419,5,1068,-420,5,1069,-421,5,1070,-422,5,1071,-423,5,1072,-424,5,1073,-425,5,1074,-426,5,1075,-427,5,1076,-428,5,1077,-429,5,1078,-430,5,1079,-431,5,1080,-432,5,1081,-433,5,1082,-434,5,1083,-435,5,1084,-4,2,1085,-437,5,1086,-438,5,1087,-439,5,1088,-440,5,1089,-441,5,1090,-442,5,1091,-443,5,1092,-444,5,1093,-445,5,1094,-446,5,1095,-447,5,1096,-448,5,1097,-449,5,1098,-450,5,1099,-451,5,1100,-452,5,1101,-453,5,1102,-454,5,1103,-455,5,1104,-456,5,1105,-457,5,1106,-458,5,1107,-459,5,1108,-460,5,1109,-461,5,1110,-462,5,1111,-463,5,1112,-464,5,1113,-465,5,1114,-466,5,1115,-467,5,1116,-468,5,1117,-469,5,1118,-470,5,1119,-471,5,1120,-472,5,1121,-473,5,1122,-474,5,1123,-475,5,1124,-476,5,1125,-477,5,1126,-478,5,1127,-479,5,1128,-480,5,1129,-481,5,1130,-482,5,1131,-483,5,1132,-484,5,1133,-485,5,1134,-486,5,1135,-487,5,1136,-488,5,1137,-489,5,1138,-490,5,1139,-491,5,1140,-492,5,1141,-493,5,1142,-494,5,1143,-495,5,1144,-496,5,1145,-497,5,1146,-498,5,1147,-499,5,1148,-500,5,1149,-501,5,1150,-502,5,1151,-503,5,1152,-504,5,1153,-505,5,1154,-506,5,1155,-507,5,1156,-508,5,1157,-509,5,1158,-510,5,1159,-511,5,1160,-512,5,1161,-513,5,1162,-514,5,1163,-515,5,1164,-516,5,1165,-517,5,1166,-518,5,1167,-519,5,1168,-520,5,1169,-521,5,1170,-522,5,1171,-523,5,1172,-524,5,1173,-525,5,1174,-526,5,1175,-527,5,1176,-528,5,1177,-529,5,1178,-530,5,1179,-531,5,1180,-532,5,1181,-533,5,1182,-534,5,1183,-535,5,1184,-536,5,1185,-537,5,1186,-538,5,1187,-539,5,1188,-540,5,1189,-541,5,1190,-542,5,1191,-543,5,1192,-4,2,1193,-545,5,1194,-546,5,1195,-547,5,1196,-548,5,1197,-549,5,1198,-550,5,1199,-551,5,1200,-552,5,1201,-553,5,1202,-554,5,1203,-555,5,1204,-556,5,1205,-557,5,1206,-558,5,1207,-559,5,1208,-560,5,1209,-561,5,1210,-562,5,1211,-563,5,1212,-564,5,1213,-565,5,1214,-566,5,1215,-567,5,1216,-568,5,1217,-569,5,1218,-570,5,1219,-571,5,1220,-572,5,1221,-573,5,1222,-574,5,1223,-575,5,1224,-576,5,1225,-577,5,1226,-578,5,1227,-579,5,1228,-580,5,1229,-581,5,1230,-582,5,1231,-583,5,1232,-584,5,1233,-585,5,1234,-586,5,1235,-587,5,1236,-588,5,1237,-589,5,1238,-590,5,1239,-591,5,1240,-592,5,1241,-593,5,1242,-594,5,1243,-595,5,1244,-596,5,1245,-597,5,1246,-598,5,1247,-599,5,1248,-600,5,1249,-601,5,1250,-602,5,1251,-603,5,1252,-604,5,1253,-605,5,1254,-606,5,1255,-607,5,1256,-608,5,1257,-609,5,1258,-610,5,1259,-611,5,1260,-612,5,1261,-613,5,1262,-614,5,1263,-615,5,1264,-616,5,1265,-617,5,1266,-618,5,1267,-619,5,1268,-620,5,1269,-621,5,1270,-622,5,1271,-623,5,1272,-624,5,1273,-625,5,1274,-626,5,1275,-627,5,1276,-628,5,1277,-629,5,1278,-324,5,1279,-351,5,1280,-348,5,1281,-633,5,1282,-324,5,1283,-351,5,1284,-636,5,1285,-324,5,1286,-324,5,1287,-351,5,1288,-356,5,1289,-5,2,1290,-642,5,1291,-643,5,1292,-356,5,1293,-645,5,1294,-351,5,1295,-359,5,1296,-648,5,1297,-648,5,1298,-648,5,1299,-648,5,1300,-4,2,1301,-5,2,1302,-648,5,1303,-648,5,1304,-648,5,1305,-648,5,1306,-649,5,1307,-650,5,1308,-4,2,1309,-5,2,1310,-655,5,1311,-655,5,1312,-656,5,1313,-656,5,1314,-657,5,1315,-657,5,1316,-657,5,1317,-648,5,1318,-656,5,1319,-656,5,1320,-648,5,1321,-657,5,1322,-657,5,1323,-648,5,1324,-648,5,1325,-650,5,1326,-654,5,1327,-655,5,1328,-648,5,1329,-648,5,1330,-655,5,1331,-648,5,1332,-648,5,1333,-649,5,1334,-650,5,1335,-655,5,1336,-656,5,1337,-657,5,1338,-654,5,1339,-655,5,1340,-332,5,1341,-333,5,1342,-334,5,1343,-335,5,1344,-332,5,1345,-333,5,1346,-333,5,1347,-339,5,1348,-340,5,1349,-341,5,1350,-342,5,1351,-675,5,1352,-672,5,1353,-324,5,1354,-341,5,1355,-351,5,1356,-324,5,1357,-341,5,1358,-342,5,1359,-351,5,1360,-356,5,1361,-351,5,1362,-331,5,1363,-356,5,1364,-356,5,1365,-357,5,1366,-351,5,1367,-359,5,1368,-360,5,1369,-360,5,1370,-360,5,1371,-356,5,1372,-356,5,1373,-356,5,1374,-360,5,1375,-360,5,1376,-360,5,1377,-81,4,1378,-81,4,1379,-81,4,1380,-356,5,1381,-85,4,1382,-86,4,1383,-360,5,1384,-88,4,1385,-89,4,1386,-90,4,1387,-356,5,1388,-356,5,1389,-360,5,1390,-648,5,1391,-356,5,1392,-648,5,1393,-648,5,1394,-648,5,1395,-360,5,1396,-360,5,1397,-5,2,1398,-648,5,1399,-648,5,1400,-324,5,1401,-333,5,1402,-360,5,1403,-324,5,1404,-324,5,1405,-325,5,1406,-326,5,1407,-327,5,1408,-328,5,1409,-329,5,1410,-330,5,1411,-331,5,1412,-332,5,1413,-333,5,1414,-334,5,1415,-335,5,1416,-336,5,1417,-337,5,1418,-338,5,1419,-339,5,1420,-340,5,1421,-341,5,1422,-342,5,1423,-343,5,1424,-324,5,1425,-345,5,1426,-346,5,1427,-347,5,1428,-348,5,1429,-349,5,1430,-350,5,1431,-351,5,1432,-352,5,1433,-353,5,1434,-354,5,1435,-355,5,1436,-324,5,1437,-324,5,1438,-358,5,1439,-324,5,1440,-324,5,1441,-324,5,1442,-324,5,1443,-331,5,1444,-324,5,1445,-324,5,1446,-330,5,1447,-331,5,1448,-324,5,1449,-324,5,1450,-324,5,1451,-324,5,1452,-324,5,1453,-324,5,1454,-324,5,1455,-331,5,1456,-324,5,1457,-324,5,1458,-324,5,1459,-352,5,1460,-348,5,1461,-345,5,1462,-332,5,1463,-351,5,1464,-348,5,1465,-332,5,1466,-332,5,1467,-351,5,1468,-356,5,1469,-351,5,1470,-351,5,1471,-356,5,1472,-356,5,1473,-357,5,1474,-358,5,1475,-359,5,1476,-360,5,1477,-360,5,1478,-360,5,1479,-356,5,1480,-356,5,1481,-356,5,1482,-330,5,1483,-331,5,1484,-360,5,1485,-360,5,1486,-360,5,1487,-360,5,1488,-356,5,1489,-356,5,1490,-356,5,1491,-367,5,1492,-360,5,1493,-360,5,1494,-360,5,1495,-383,5,1496,-380,5,1497,-345,5,1498,-356,5,1499,-383,5,1500,-420,5,1501,-360,5,1502,-360,5,1503,-351,5,1504,-388,5,1505,-420,5,1506,-420,5,1507,-420,5,1508,-356,5,1509,-420,5,1510,-358,5,1511,-359,5,1512,-432,5,1513,-432,5,1514,-432,5,1515,-432,5,1516,-4,2,1517,-432,5,1518,-432,5,1519,-432,5,1520,-432,5,1521,-432,5,1522,-432,5,1523,-432,5,1524,-432,5,1525,-432,5,1526,-432,5,1527,-432,5,1528,-432,5,1529,-432,5,1530,-432,5,1531,-432,5,1532,-432,5,1533,-432,5,1534,-432,5,1535,-432,5,1536,-432,5,1537,-432,5,1538,-432,5,1539,-432,5,1540,-432,5,1541,-432,5,1542,-432,5,1543,-432,5,1544,-432,5,1545,-432,5,1546,-432,5,1547,-432,5,1548,-432,5,1549,-432,5,1550,-432,5,1551,-432,5,1552,-432,5,1553,-432,5,1554,-432,5,1555,-432,5,1556,-432,5,1557,-432,5,1558,-432,5,1559,-432,5,1560,-432,5,1561,-432,5,1562,-432,5,1563,-439,5,1564,-432,5,1565,-432,5,1566,-432,5,1567,-432,5,1568,-432,5,1569,-432,5,1570,-432,5,1571,-459,5,1572,-432,5,1573,-432,5,1574,-432,5,1575,-459,5,1576,-464,5,1577,-459,5,1578,-459,5,1579,-464,5,1580,-464,5,1581,-465,5,1582,-459,5,1583,-467,5,1584,-468,5,1585,-468,5,1586,-468,5,1587,-464,5,1588,-468,5,1589,-468,5,1590,-468,5,1591,-468,5,1592,-468,5,1593,-468,5,1594,-469,5,1595,-470,5,1596,-472,5,1597,-473,5,1598,-473,5,1599,-468,5,1600,-476,5,1601,-476,5,1602,-477,5,1603,-464,5,1604,-464,5,1605,-468,5,1606,-477,5,1607,-464,5,1608,-432,5,1609,-477,5,1610,-477,5,1611,-468,5,1612,-468,5,1613,-432,5,1614,-432,5,1615,-432,5,1616,-468,5,1617,-432,5,1618,-468,5,1619,-468,5,1620,-324,5,1621,-325,5,1622,-326,5,1623,-327,5,1624,-4,2,1625,-329,5,1626,-330,5,1627,-331,5,1628,-332,5,1629,-333,5,1630,-334,5,1631,-335,5,1632,-336,5,1633,-337,5,1634,-338,5,1635,-339,5,1636,-340,5,1637,-341,5,1638,-342,5,1639,-343,5,1640,-344,5,1641,-345,5,1642,-346,5,1643,-347,5,1644,-348,5,1645,-349,5,1646,-350,5,1647,-351,5,1648,-352,5,1649,-353,5,1650,-354,5,1651,-355,5,1652,-356,5,1653,-357,5,1654,-358,5,1655,-359,5,1656,-360,5,1657,-361,5,1658,-362,5,1659,-363,5,1660,-364,5,1661,-365,5,1662,-366,5,1663,-367,5,1664,-368,5,1665,-369,5,1666,-370,5,1667,-371,5,1668,-372,5,1669,-373,5,1670,-374,5,1671,-375,5,1672,-376,5,1673,-377,5,1674,-378,5,1675,-379,5,1676,-380,5,1677,-381,5,1678,-382,5,1679,-383,5,1680,-384,5,1681,-385,5,1682,-386,5,1683,-387,5,1684,-388,5,1685,-389,5,1686,-390,5,1687,-391,5,1688,-392,5,1689,-393,5,1690,-394,5,1691,-395,5,1692,-396,5,1693,-397,5,1694,-398,5,1695,-399,5,1696,-400,5,1697,-401,5,1698,-402,5,1699,-403,5,1700,-404,5,1701,-324,5,1702,-325,5,1703,-326,5,1704,-408,5,1705,-409,5,1706,-410,5,1707,-411,5,1708,-412,5,1709,-413,5,1710,-414,5,1711,-415,5,1712,-416,5,1713,-417,5,1714,-418,5,1715,-419,5,1716,-420,5,1717,-421,5,1718,-422,5,1719,-423,5,1720,-424,5,1721,-425,5,1722,-426,5,1723,-427,5,1724,-428,5,1725,-429,5,1726,-430,5,1727,-431,5,1728,-432,5,1729,-433,5,1730,-434,5,1731,-435,5,1732,-4,2,1733,-5,2,1734,-438,5,1735,-439,5,1736,-440,5,1737,-441,5,1738,-442,5,1739,-443,5,1740,-444,5,1741,-5,2,1742,-446,5,1743,-447,5,1744,-448,5,1745,-449,5,1746,-450,5,1747,-451,5,1748,-452,5,1749,-432,5,1750,-454,5,1751,-455,5,1752,-456,5,1753,-457,5,1754,-458,5,1755,-459,5,1756,-460,5,1757,-461,5,1758,-462,5,1759,-463,5,1760,-464,5,1761,-465,5,1762,-466,5,1763,-467,5,1764,-468,5,1765,-469,5,1766,-470,5,1767,-471,5,1768,-472,5,1769,-473,5,1770,-474,5,1771,-475,5,1772,-476,5,1773,-477,5,1774,-478,5,1775,-479,5,1776,-480,5,1777,-481,5,1778,-482,5,1779,-483,5,1780,-484,5,1781,-485,5,1782,-486,5,1783,-351,5,1784,-324,5,1785,-21,3,1786,-490,5,1787,-324,5,1788,-324,5,1789,-324,5,1790,-324,5,1791,-324,5,1792,-324,5,1793,-324,5,1794,-331,5,1795,-324,5,1796,-324,5,1797,-324,5,1798,-331,5,1799,-324,5,1800,-324,5,1801,-324,5,1802,-324,5,1803,-331,5,1804,-324,5,1805,-324,5,1806,-324,5,1807,-324,5,1808,-324,5,1809,-324,5,1810,-324,5,1811,-324,5,1812,-324,5,1813,-324,5,1814,-324,5,1815,-331,5,1816,-324,5,1817,-324,5,1818,-324,5,1819,-351,5,1820,-348,5,1821,-324,5,1822,-332,5,1823,-351,5,1824,-324,5,1825,-332,5,1826,-332,5,1827,-324,5,1828,-356,5,1829,-329,5,1830,-330,5,1831,-331,5,1832,-324,5,1833,-333,5,1834,-331,5,1835,-324,5,1836,-324,5,1837,-325,5,1838,-326,5,1839,-327,5,1840,-4,2,1841,-329,5,1842,-330,5,1843,-331,5,1844,-332,5,1845,-333,5,1846,-334,5,1847,-335,5,1848,-336,5,1849,-337,5,1850,-338,5,1851,-339,5,1852,-340,5,1853,-341,5,1854,-342,5,1855,-342,5,1856,-324,5,1857,-345,5,1858,-339,5,1859,-339,5,1860,-348,5,1861,-341,5,1862,-341,5,1863,-351,5,1864,-352,5,1865,-351,5,1866,-348,5,1867,-348,5,1868,-324,5,1869,-324,5,1870,-351,5,1871,-324,5,1872,-324,5,1873,-324,5,1874,-324,5,1875,-331,5,1876,-324,5,1877,-324,5,1878,-330,5,1879,-331,5,1880,-324,5,1881,-324,5,1882,-324,5,1883,-324,5,1884,-324,5,1885,-324,5,1886,-324,5,1887,-331,5,1888,-324,5,1889,-324,5,1890,-324,5,1891,-352,5,1892,-348,5,1893,-345,5,1894,-332,5,1895,-351,5,1896,-348,5,1897,-332,5,1898,-332,5,1899,-351,5,1900,-324,5,1901,-351,5,1902,-351,5,1903,-324,5,1904,-324,5,1905,-324,5,1906,-351,5,1907,-324,5,1908,-324,5,1909,-324,5,1910,-324,5,1911,-331,5,1912,-324,5,1913,-324,5,1914,-330,5,1915,-331,5,1916,-324,5,1917,-324,5,1918,-324,5,1919,-324,5,1920,-324,5,1921,-324,5,1922,-324,5,1923,-331,5,1924,-324,5,1925,-324,5,1926,-324,5,1927,-351,5,1928,-348,5,1929,-345,5,1930,-324,5,1931,-351,5,1932,-324,5,1933,-324,5,1934,-324,5,1935,-351,5,1936,-356,5,1937,-329,5,1938,-330,5,1939,-331,5,1940,-356,5,1941,-333,5,1942,-351,5,1943,-359,5,1944,-324,5,1945,-324,5,1946,-324,5,1947,-324,5,1948,-4,2,1949,-324,5,1950,-324,5,1951,-324,5,1952,-324,5,1953,-324,5,1954,-325,5,1955,-326,5,1956,-327,5,1957,-324,5,1958,-324,5,1959,-324,5,1960,-324,5,1961,-332,5,1962,-333,5,1963,-333,5,1964,-333,5,1965,-324,5,1966,-331,5,1967,-332,5,1968,-324,5,1969,-332,5,1970,-333,5,1971,-324,5,1972,-324,5,1973,-326,5,1974,-330,5,1975,-331,5,1976,-324,5,1977,-324,5,1978,-331,5,1979,-324,5,1980,-324,5,1981,-325,5,1982,-326,5,1983,-331,5,1984,-332,5,1985,-333,5,1986,-330,5,1987,-331,5,1988,-332,5,1989,-333,5,1990,-334,5,1991,-335,5,1992,-340,5,1993,-341,5,1994,-342,5,1995,-339,5,1996,-340,5,1997,-341,5,1998,-342,5,1999,-351,5,2000,-348,5,2001,-345,5,2002,-350,5,2003,-351,5,2004,-348,5,2005,-349,5,2006,-350,5,2007,-351,5,2008,-356,5,2009,-353,5,2010,-351,5,2011,-356,5,2012,-356,5,2013,-357,5,2014,-351,5,2015,-359,5,2016,-360,5,2017,-360,5,2018,-360,5,2019,-356,5,2020,-360,5,2021,-360,5,2022,-360,5,2023,-360,5,2024,-360,5,2025,-360,5,2026,-360,5,2027,-360,5,2028,-360,5,2029,-360,5,2030,-324,5,2031,-360,5,2032,-360,5,2033,-324,5,2034,-324,5,2035,-356,5,2036,-360,5,2037,-360,5,2038,-324,5,2039,-360,5,2040,-324,5,2041,-324,5,2042,-324,5,2043,-360,5,2044,-360,5,2045,-329,5,2046,-330,5,2047,-331,5,0,0,0"),
// leafSize 10
splitIntegerList("1,1,0,2,2,0,3,3,1,4,4,3,5,5,4,6,6,5,7,7,7,8,8,8,9,9,10,10,10,11,11,-1,0,12,-2,1,13,-3,1,14,-4,1,15,-5,1,16,-8,2,17,-7,2,18,-8,2,19,-9,2,20,-10,2,21,3,4,22,-10,2,23,-10,2,24,3,4,25,-5,2,26,-8,2,27,3,4,28,-8,2,29,-9,2,30,3,5,31,-1,1,32,4,7,33,-3,1,34,-10,2,35,-5,2,36,4,7,37,-7,2,38,-8,2,39,-9,2,40,4,7,41,-1,1,42,-2,1,43,-3,1,44,-4,2,45,5,10,46,-6,2,47,-7,2,48,-8,2,49,-9,2,50,5,10,51,-1,1,52,-2,1,53,-3,1,54,-4,2,55,-5,2,56,-6,2,57,-7,2,58,-8,2,59,-9,2,60,-10,2,61,-1,1,62,-2,1,63,-13,2,64,-4,2,65,-5,2,66,-8,2,67,-7,2,68,-8,2,69,-9,2,70,-10,2,71,-21,3,72,-32,3,73,-23,3,74,-24,3,75,-30,3,76,-36,3,77,-27,3,78,-28,3,79,-29,3,80,-30,3,81,-36,3,82,-32,3,83,-33,3,84,-4,2,85,-40,3,86,-36,3,87,-37,3,88,-38,3,89,-39,3,90,-40,3,91,-1,1,92,-42,3,93,-43,3,94,-4,2,95,-45,3,96,-6,2,97,-47,3,98,-48,3,99,-49,3,100,-50,3,101,-1,1,102,-50,3,103,-50,3,104,-4,2,105,-5,2,106,-6,2,107,-7,2,108,-50,3,109,-50,3,110,-50,3,111,-1,1,112,-52,3,113,-50,3,114,-4,2,115,-5,2,116,-50,3,117,-7,2,118,-50,3,119,-59,3,120,3,7,121,-1,1,122,-2,1,123,-3,1,124,-24,3,125,-5,2,126,-6,2,127,-7,2,128,-8,2,129,-9,2,130,-30,3,131,-36,3,132,-32,3,133,-33,3,134,-4,2,135,-40,3,136,-36,3,137,-30,3,138,-38,3,139,-39,3,140,-40,3,141,-1,1,142,-40,3,143,-43,3,144,-4,2,145,-45,3,146,-6,2,147,-7,2,148,-8,2,149,-9,2,150,3,7,151,-1,0,152,-2,1,153,-3,1,154,-4,2,155,-5,2,156,-6,2,157,-7,2,158,-8,2,159,-9,2,160,-10,2,161,-10,2,162,-2,1,163,-10,2,164,-4,2,165,-5,2,166,-8,2,167,-7,2,168,-8,2,169,-9,2,170,-20,3,171,-21,3,172,-20,3,173,-23,3,174,-24,3,175,-20,3,176,-8,2,177,-27,3,178,-28,3,179,-29,3,180,-30,3,181,-30,3,182,-32,3,183,-30,3,184,-4,2,185,-5,2,186,-36,3,187,-30,3,188,-30,3,189,-30,3,190,-40,3,191,-40,3,192,-40,3,193,-40,3,194,-4,2,195,-45,3,196,-6,2,197,-7,2,198,-8,2,199,-40,3,200,-50,3,201,-50,3,202,-2,1,203,-50,3,204,-4,2,205,-5,2,206,-6,2,207,-7,2,208,-8,2,209,-9,2,210,-10,2,211,-10,2,212,-2,1,213,-10,2,214,-4,2,215,-5,2,216,-8,2,217,-7,2,218,-8,2,219,-9,2,220,-20,3,221,-21,3,222,-32,3,223,-23,3,224,-24,3,225,-30,3,226,-36,3,227,-27,3,228,-28,3,229,-29,3,230,-30,3,231,-30,3,232,-32,3,233,-30,3,234,-4,2,235,-40,3,236,-36,3,237,-30,3,238,-30,3,239,-30,3,240,-90,4,241,-90,4,242,-90,4,243,-90,4,244,-90,4,245,-95,4,246,-90,4,247,-90,4,248,-90,4,249,-99,4,250,-100,4,251,-100,4,252,-100,4,253,-100,4,254,-100,4,255,-100,4,256,-100,4,257,-100,4,258,-100,4,259,-100,4,260,-110,4,261,-110,4,262,-110,4,263,-110,4,264,-4,2,265,-110,4,266,-100,4,267,-110,4,268,-110,4,269,-110,4,270,-120,4,271,-120,4,272,-120,4,273,-120,4,274,-100,4,275,-120,4,276,-120,4,277,-120,4,278,-120,4,279,-120,4,280,-130,4,281,-130,4,282,-132,4,283,-130,4,284,-4,2,285,-135,4,286,-136,4,287,-130,4,288,-130,4,289,-139,4,290,-140,4,291,-140,4,292,-140,4,293,-140,4,294,-4,2,295,-145,4,296,-146,4,297,-147,4,298,-148,4,299,-149,4,300,-150,4,301,-150,4,302,-150,4,303,-150,4,304,-4,2,305,-150,4,306,-150,4,307,-150,4,308,-150,4,309,-150,4,310,-150,4,311,-151,4,312,-152,4,313,-153,4,314,-4,2,315,-5,2,316,-158,4,317,-157,4,318,-158,4,319,-159,4,320,-20,3,321,-21,3,322,-20,3,323,-150,4,324,-150,4,325,-20,3,326,-160,4,327,-150,4,328,-150,4,329,-150,4,330,-150,4,331,-151,4,332,-150,4,333,-153,4,334,-4,2,335,-5,2,336,-150,4,337,-157,4,338,-158,4,339,-159,4,340,-150,4,341,-151,4,342,-152,4,343,-153,4,344,-4,2,345,-150,4,346,-156,4,347,-157,4,348,-158,4,349,-159,4,350,-150,4,351,-151,4,352,-152,4,353,-153,4,354,-4,2,355,-5,2,356,-156,4,357,-157,4,358,-158,4,359,-159,4,360,-160,4,361,-161,4,362,-162,4,363,-163,4,364,-4,2,365,-5,2,366,-166,4,367,-167,4,368,-168,4,369,-169,4,370,-20,3,371,-21,3,372,-182,4,373,-23,3,374,-24,3,375,-180,4,376,-186,4,377,-177,4,378,-178,4,379,-179,4,380,-180,4,381,-181,4,382,-182,4,383,-183,4,384,-4,2,385,-190,4,386,-86,4,387,-187,4,388,-188,4,389,-89,4,390,-90,4,391,-90,4,392,-90,4,393,-90,4,394,-4,2,395,-95,4,396,-90,4,397,-90,4,398,-90,4,399,-99,4,400,-100,4,401,-100,4,402,-100,4,403,-100,4,404,-4,2,405,-100,4,406,-100,4,407,-100,4,408,-100,4,409,-100,4,410,-110,4,411,-110,4,412,-110,4,413,-110,4,414,-4,2,415,-110,4,416,-100,4,417,-110,4,418,-110,4,419,-110,4,420,-120,4,421,-120,4,422,-120,4,423,-120,4,424,-100,4,425,-5,2,426,-120,4,427,-120,4,428,-120,4,429,-120,4,430,-100,4,431,-100,4,432,-100,4,433,-100,4,434,-4,2,435,-135,4,436,-136,4,437,-100,4,438,-100,4,439,-100,4,440,-140,4,441,-140,4,442,-140,4,443,-140,4,444,-4,2,445,-145,4,446,-140,4,447,-140,4,448,-140,4,449,-140,4,450,3,9,451,-1,0,452,-2,1,453,-3,1,454,-4,2,455,-5,2,456,-6,2,457,-7,2,458,-8,2,459,-9,2,460,-10,2,461,-10,2,462,-2,1,463,-10,2,464,-4,2,465,-5,2,466,-8,2,467,-7,2,468,-8,2,469,-19,3,470,-20,3,471,-21,3,472,-20,3,473,-23,3,474,-24,3,475,-20,3,476,-8,2,477,-27,3,478,-28,3,479,-29,3,480,-30,3,481,-30,3,482,-32,3,483,-30,3,484,-4,2,485,-5,2,486,-36,3,487,-7,2,488,-30,3,489,-30,3,490,-40,3,491,-40,3,492,-2,1,493,-40,3,494,-4,2,495,-45,3,496,-6,2,497,-7,2,498,-8,2,499,-9,2,500,-50,3,501,-50,3,502,-2,1,503,-50,3,504,-4,2,505,-5,2,506,-6,2,507,-7,2,508,-58,4,509,-59,4,510,-60,4,511,-60,4,512,-60,4,513,-60,4,514,-60,4,515,-60,4,516,-66,4,517,-67,4,518,-68,4,519,-69,4,520,-70,4,521,-71,4,522,-32,3,523,-73,4,524,-74,4,525,-75,4,526,-76,4,527,-77,4,528,-78,4,529,-79,4,530,-80,4,531,-80,4,532,-82,4,533,-80,4,534,-4,2,535,-85,4,536,-86,4,537,-87,4,538,-88,4,539,-89,4,540,-90,4,541,-90,4,542,-90,4,543,-90,4,544,-4,2,545,-95,4,546,-90,4,547,-90,4,548,-98,4,549,-99,4,550,-100,4,551,-100,4,552,-100,4,553,-100,4,554,-4,2,555,-5,2,556,-100,4,557,-100,4,558,-100,4,559,-109,4,560,-110,4,561,-110,4,562,-110,4,563,-110,4,564,-4,2,565,-5,2,566,-100,4,567,-110,4,568,-110,4,569,-110,4,570,-120,4,571,-120,4,572,-120,4,573,-120,4,574,-100,4,575,-5,2,576,-6,2,577,-120,4,578,-120,4,579,-120,4,580,-130,4,581,-130,4,582,-132,4,583,-130,4,584,-4,2,585,-135,4,586,-136,4,587,-130,4,588,-130,4,589,-139,4,590,-140,4,591,-140,4,592,-140,4,593,-140,4,594,-4,2,595,-145,4,596,-6,2,597,-140,4,598,-148,4,599,-149,4,600,-150,4,601,-151,4,602,-152,4,603,-153,4,604,-4,2,605,-5,2,606,-6,2,607,-7,2,608,-158,4,609,-159,4,610,-160,4,611,-161,4,612,-162,4,613,-163,4,614,-4,2,615,-5,2,616,-166,4,617,-7,2,618,-168,4,619,-169,4,620,-20,3,621,-21,3,622,-20,3,623,-23,3,624,-24,3,625,-20,3,626,-168,4,627,-27,3,628,-28,3,629,-29,3,630,-30,3,631,-30,3,632,-150,4,633,-30,3,634,-4,2,635,-5,2,636,-186,4,637,-7,2,638,-30,3,639,-30,3,640,-190,4,641,-191,4,642,-2,1,643,-193,4,644,-4,2,645,-195,4,646,-6,2,647,-7,2,648,-8,2,649,-199,4,650,-200,4,651,-201,4,652,-2,1,653,-203,4,654,-4,2,655,-5,2,656,-6,2,657,-7,2,658,-8,2,659,-59,4,660,-60,4,661,-60,4,662,-60,4,663,-60,4,664,-60,4,665,-60,4,666,-66,4,667,-67,4,668,-68,4,669,-69,4,670,-70,4,671,-21,3,672,-32,3,673,-23,3,674,-74,4,675,-75,4,676,-76,4,677,-77,4,678,-78,4,679,-79,4,680,-80,4,681,-80,4,682,-82,4,683,-80,4,684,-4,2,685,-85,4,686,-86,4,687,-87,4,688,-88,4,689,-89,4,690,-90,4,691,-90,4,692,-90,4,693,-90,4,694,-4,2,695,-95,4,696,-90,4,697,-90,4,698,-98,4,699,-99,4,700,-100,4,701,-100,4,702,-100,4,703,-100,4,704,-4,2,705,-5,2,706,-100,4,707,-100,4,708,-100,4,709,-109,4,710,-110,4,711,-110,4,712,-110,4,713,-110,4,714,-4,2,715,-5,2,716,-100,4,717,-110,4,718,-110,4,719,-110,4,720,-120,4,721,-120,4,722,-120,4,723,-120,4,724,-100,4,725,-5,2,726,-6,2,727,-120,4,728,-120,4,729,-120,4,730,-130,4,731,-130,4,732,-132,4,733,-130,4,734,-4,2,735,-135,4,736,-136,4,737,-130,4,738,-130,4,739,-139,4,740,-140,4,741,-140,4,742,-140,4,743,-140,4,744,-4,2,745,-145,4,746,-6,2,747,-7,2,748,-140,4,749,-149,4,750,-150,4,751,-150,4,752,-150,4,753,-150,4,754,-4,2,755,-5,2,756,-6,2,757,-7,2,758,-150,4,759,-150,4,760,-150,4,761,-151,4,762,-150,4,763,-150,4,764,-4,2,765,-5,2,766,-150,4,767,-7,2,768,-150,4,769,-150,4,770,-20,3,771,-21,3,772,-20,3,773,-23,3,774,-24,3,775,-20,3,776,-150,4,777,-27,3,778,-28,3,779,-29,3,780,-30,3,781,-30,3,782,-150,4,783,-30,3,784,-4,2,785,-5,2,786,-150,4,787,-7,2,788,-30,3,789,-30,3,790,-150,4,791,-151,4,792,-152,4,793,-153,4,794,-4,2,795,-150,4,796,-6,2,797,-7,2,798,-150,4,799,-159,4,800,-150,4,801,-151,4,802,-152,4,803,-153,4,804,-4,2,805,-5,2,806,-6,2,807,-7,2,808,-150,4,809,-59,4,810,-60,4,811,-60,4,812,-60,4,813,-60,4,814,-60,4,815,-60,4,816,-66,4,817,-67,4,818,-68,4,819,-69,4,820,-70,4,821,-21,3,822,-150,4,823,-70,4,824,-74,4,825,-75,4,826,-76,4,827,-77,4,828,-78,4,829,-79,4,830,-80,4,831,-80,4,832,-82,4,833,-80,4,834,-4,2,835,-85,4,836,-86,4,837,-87,4,838,-88,4,839,-89,4,840,-90,4,841,-90,4,842,-90,4,843,-90,4,844,-4,2,845,-95,4,846,-90,4,847,-90,4,848,-98,4,849,-99,4,850,-100,4,851,-100,4,852,-100,4,853,-100,4,854,-4,2,855,-5,2,856,-100,4,857,-100,4,858,-100,4,859,-100,4,860,-110,4,861,-110,4,862,-110,4,863,-110,4,864,-4,2,865,-5,2,866,-100,4,867,-110,4,868,-110,4,869,-110,4,870,-120,4,871,-120,4,872,-120,4,873,-120,4,874,-100,4,875,-5,2,876,-6,2,877,-120,4,878,-120,4,879,-120,4,880,-100,4,881,-100,4,882,-132,4,883,-100,4,884,-4,2,885,-135,4,886,-136,4,887,-100,4,888,-100,4,889,-100,4,890,-140,4,891,-140,4,892,-140,4,893,-140,4,894,-4,2,895,-145,4,896,-6,2,897,-7,2,898,-140,4,899,-140,4,900,-450,5,901,-450,5,902,-450,5,903,-450,5,904,-450,5,905,-450,5,906,-450,5,907,-450,5,908,-450,5,909,-450,5,910,-450,5,911,-451,5,912,-452,5,913,-453,5,914,-454,5,915,-455,5,916,-458,5,917,-457,5,918,-458,5,919,-450,5,920,-450,5,921,-450,5,922,-452,5,923,-450,5,924,-450,5,925,-455,5,926,-460,5,927,-450,5
gitextract_zbe5o8p1/
├── .gitignore
├── LICENSE
├── MAVEN.md
├── README.md
├── pom.xml
├── runjmh.sh
└── src/
├── main/
│ ├── c/
│ │ ├── Makefile
│ │ ├── filter/
│ │ │ ├── Makefile
│ │ │ └── xor.c
│ │ └── rec-split.c
│ └── java/
│ └── org/
│ └── minperf/
│ ├── BitBuffer.java
│ ├── RecSplitBuilder.java
│ ├── RecSplitEvaluator.java
│ ├── Settings.java
│ ├── bdz/
│ │ └── BDZ.java
│ ├── generator/
│ │ ├── ConcurrencyTool.java
│ │ └── Generator.java
│ ├── hash/
│ │ ├── HashPerformanceTest.java
│ │ ├── LongPair.java
│ │ ├── Mix.java
│ │ ├── Murmur2.java
│ │ ├── Murmur3.java
│ │ ├── SpookyHash.java
│ │ └── XXHash64.java
│ ├── hem/
│ │ ├── HemGenerator.java
│ │ ├── KeyReader.java
│ │ ├── Sort.java
│ │ ├── SortedSignatures.java
│ │ └── recsplit/
│ │ ├── Builder.java
│ │ ├── FastEvaluator.java
│ │ └── FastGenerator.java
│ ├── monotoneList/
│ │ ├── EliasFanoMonotoneList.java
│ │ ├── MonotoneList.java
│ │ └── MultiStageMonotoneList.java
│ ├── rank/
│ │ ├── Rank9.java
│ │ └── VerySimpleRank.java
│ ├── select/
│ │ ├── Select.java
│ │ ├── SimpleSelect.java
│ │ ├── SimpleSelectWrapper.java
│ │ └── VerySimpleSelect.java
│ ├── universal/
│ │ ├── LongHash.java
│ │ ├── StringHash.java
│ │ └── UniversalHash.java
│ └── utils/
│ ├── LargeLongList.java
│ ├── LongSet.java
│ ├── PoissonDistribution.java
│ ├── RandomSetGenerator.java
│ ├── RandomSetGeneratorSlow.java
│ └── Text.java
└── test/
└── java/
└── org/
└── minperf/
├── BitCodes.java
├── FunctionInfo.java
├── Graphics.java
├── LargeSetTest.java
├── Paper.java
├── PerformanceTest.java
├── Probability.java
├── RandomizedTest.java
├── SettingsTest.java
├── SpaceEstimator.java
├── SplitRuleTest.java
├── SplitRuleTest2.java
├── SplitRuleTest3.java
├── TestSplitStrategy.java
├── TextFileTest.java
├── TimeEstimator.java
├── WikipediaTest.java
├── bdz/
│ └── BDZTest.java
├── c/
│ └── HashGenerator.java
├── chd/
│ ├── CHD.java
│ ├── CHD2.java
│ ├── CHDTest.java
│ ├── EliasFanoList.java
│ └── EliasFanoListTest.java
├── cuckoo/
│ ├── CuckooHashMap.java
│ ├── CuckooHashTest.java
│ └── CuckooLongKeyHashSet.java
├── hash/
│ └── MixTest.java
├── hem/
│ ├── HEM.java
│ ├── MetaFile.java
│ ├── RandomGenerator.java
│ └── recsplit/
│ └── TestFast.java
├── hybrid/
│ └── HybridTest.java
├── medium/
│ ├── EstimateTimeForHugeSets.java
│ ├── EstimateTwoBillionEntries.java
│ ├── MediumRecSplit.java
│ ├── MediumTest.java
│ ├── PartitionIntoSimilarSizedSets.java
│ ├── RecSplitEliasFano.java
│ ├── SimulateProbFallIntoLarge.java
│ └── TestBBHash.java
├── monotoneList/
│ ├── FenwickTreeMonotoneList.java
│ └── MonotoneListTest.java
├── rank/
│ ├── Rank9Test.java
│ └── RankTest.java
├── select/
│ └── SelectTest.java
├── simple/
│ ├── LongCollection.java
│ ├── SimpleRecSplit.java
│ ├── SimpleTest.java
│ └── recsplit.md
├── tools/
│ ├── Dump.java
│ └── Load.java
└── utils/
├── FastDigitFromNumberExtraction.java
└── TextTest.java
SYMBOL INDEX (919 symbols across 94 files)
FILE: src/main/c/filter/xor.c
function getFileSize (line 13) | int64_t getFileSize(FILE* fp) {
function loadFile (line 21) | int loadFile(char* directory, char* fileName, uint8_t** target) {
function rotateLeft64 (line 51) | uint64_t rotateLeft64(uint64_t x, uint32_t n) {
function numberOfLeadingZeros64 (line 56) | int numberOfLeadingZeros64(uint64_t x) {
function numberOfLeadingZeros32 (line 61) | int numberOfLeadingZeros32(uint32_t x) {
function reduce (line 68) | inline uint32_t reduce(uint32_t hash, uint32_t n) {
type uint128_t (line 74) | typedef unsigned __int128 uint128_t;
function getArrayLength (line 80) | uint32_t getArrayLength(uint32_t size) {
function hash64 (line 84) | uint64_t hash64(uint64_t x) {
function fingerprint (line 91) | uint32_t fingerprint(uint64_t hash) {
type XorFilter8 (line 97) | struct XorFilter8 {
type XorFilter8 (line 105) | struct XorFilter8
function XorFilter_load (line 107) | void XorFilter_load(struct XorFilter8* this) {
function XorFilter_mayContain (line 118) | uint32_t XorFilter_mayContain(struct XorFilter8* this, uint64_t key) {
function main (line 133) | int main(int argc, char** argv) {
FILE: src/main/c/rec-split.c
function getFileSize (line 13) | int64_t getFileSize(FILE* fp) {
function fixEndian (line 21) | void fixEndian(uint64_t* longArray, uint64_t byteCount) {
function loadFile (line 34) | int loadFile(char* directory, char* fileName, uint64_t** target) {
function rotateLeft64 (line 65) | uint64_t rotateLeft64(uint64_t x, uint32_t n) {
function numberOfLeadingZeros64 (line 70) | int numberOfLeadingZeros64(uint64_t x) {
function numberOfLeadingZeros32 (line 75) | int numberOfLeadingZeros32(uint32_t x) {
function reduce (line 82) | inline uint32_t reduce(uint32_t hash, uint32_t n) {
function getScaleFactor (line 87) | uint64_t getScaleFactor(uint32_t multiply, uint32_t divide) {
type uint128_t (line 92) | typedef unsigned __int128 uint128_t;
function uint128_t (line 94) | uint128_t getSipHash24b128(char* b, int start, int end, uint64_t k0, uin...
function getSipHash24b (line 139) | uint64_t getSipHash24b(char* b, int start, int end, uint64_t k0, uint64_...
function getSipHash24 (line 184) | uint64_t getSipHash24(char* b, uint64_t k0, uint64_t k1) {
function universalHash (line 189) | uint64_t universalHash(char* key, uint64_t index) {
function readBit (line 198) | uint64_t readBit() {
function readEliasDelta (line 203) | uint64_t readEliasDelta() {
function readNumber (line 219) | uint64_t readNumber(uint64_t pos, int bitCount) {
function supplementalHash (line 235) | uint32_t supplementalHash(uint64_t hash, uint64_t index) {
function unfoldSigned (line 247) | uint64_t unfoldSigned(uint64_t x) {
function getEliasDeltaSize (line 251) | int getEliasDeltaSize(uint64_t value) {
function readUntilZeroMore (line 262) | int readUntilZeroMore(int count, uint64_t pos) {
function readUntilZero (line 273) | int readUntilZero(uint64_t pos) {
function skipGolombRice (line 284) | uint64_t skipGolombRice(uint64_t pos, int shift) {
type MultiStageMonotoneList (line 291) | struct MultiStageMonotoneList {
type MultiStageMonotoneList (line 299) | struct MultiStageMonotoneList
function MultiStageMonotoneList_load (line 306) | void MultiStageMonotoneList_load(struct MultiStageMonotoneList* this) {
function MultiStageMonotoneList_get (line 322) | uint32_t MultiStageMonotoneList_get(struct MultiStageMonotoneList* this,...
function MultiStageMonotoneList_getPair (line 330) | uint64_t MultiStageMonotoneList_getPair(struct MultiStageMonotoneList* t...
type Settings (line 339) | struct Settings {
type Settings (line 346) | struct Settings
function Settings_load (line 348) | void Settings_load(struct Settings* this) {
function getUniversalHashIndex (line 364) | uint64_t getUniversalHashIndex(uint64_t index) {
type RecSplitEvaluator (line 371) | struct RecSplitEvaluator {
type RecSplitEvaluator (line 383) | struct RecSplitEvaluator
function getBucketCount (line 385) | uint32_t getBucketCount(uint64_t size, int averageBucketSize) {
function RecSplitEvaluator_load (line 389) | void RecSplitEvaluator_load(struct RecSplitEvaluator* this) {
function getMinBitCount (line 414) | uint32_t getMinBitCount(uint32_t size) {
function skip (line 419) | uint32_t skip(struct RecSplitEvaluator* this, uint64_t pos, uint32_t siz...
function evaluate2 (line 445) | uint32_t evaluate2(struct RecSplitEvaluator* this, uint64_t pos, char* o...
function evaluate (line 499) | uint64_t evaluate(struct RecSplitEvaluator* this, char* obj) {
function main (line 527) | int main(int argc, char** argv) {
FILE: src/main/java/org/minperf/BitBuffer.java
class BitBuffer (line 11) | public class BitBuffer {
method BitBuffer (line 16) | public BitBuffer(long bits) {
method BitBuffer (line 20) | public BitBuffer(byte[] data) {
method BitBuffer (line 34) | public BitBuffer(BitBuffer buffer) {
method write (line 38) | public void write(BitBuffer bits) {
method position (line 53) | public int position() {
method seek (line 57) | public void seek(int pos) {
method readNumber (line 67) | public long readNumber(int bitCount) {
method readLong (line 73) | public long readLong() {
method readNumber (line 84) | public long readNumber(long pos, int bitCount) {
method foldSigned (line 108) | public static long foldSigned(long x) {
method unfoldSigned (line 118) | public static long unfoldSigned(long x) {
method writeBit (line 122) | public void writeBit(long x) {
method readBit (line 129) | public long readBit() {
method readUntilZero (line 133) | public int readUntilZero(int pos) {
method readUntilZeroMore (line 144) | private int readUntilZeroMore(int count, int index) {
method readUntilZero (line 155) | private int readUntilZero() {
method writeGolombRice (line 161) | public void writeGolombRice(int shift, long value) {
method writeGolombRiceSlow (line 165) | public void writeGolombRiceSlow(int shift, long value) {
method writeGolombRiceFast (line 176) | public void writeGolombRiceFast(int shift, long value) {
method readGolombRice (line 217) | public long readGolombRice(int pos, int shift) {
method readGolombRice (line 222) | public long readGolombRice(int shift) {
method skipGolombRice (line 236) | public void skipGolombRice(int shift) {
method skipGolombRice (line 240) | public int skipGolombRice(int pos, int shift) {
method writeEliasDelta (line 245) | public void writeEliasDelta(long value) {
method readEliasDelta (line 262) | public long readEliasDelta() {
method writeNumber (line 284) | public void writeNumber(long x, int bitCount) {
method clearBits (line 302) | public void clearBits(int bitCount) {
method toByteArray (line 318) | public byte[] toByteArray() {
method clear (line 328) | public void clear() {
method getLongArray (line 332) | public long[] getLongArray() {
method getGolombRiceSize (line 336) | public static int getGolombRiceSize(int shift, long value) {
method getEliasDeltaSize (line 340) | public static int getEliasDeltaSize(long value) {
FILE: src/main/java/org/minperf/RecSplitBuilder.java
class RecSplitBuilder (line 14) | public class RecSplitBuilder<T> {
method RecSplitBuilder (line 23) | private RecSplitBuilder(UniversalHash<T> hash) {
method newInstance (line 34) | public static <T> RecSplitBuilder<T> newInstance(UniversalHash<T> hash) {
method averageBucketSize (line 38) | public RecSplitBuilder<T> averageBucketSize(int averageBucketSize) {
method leafSize (line 46) | public RecSplitBuilder<T> leafSize(int leafSize) {
method eliasFanoMonotoneLists (line 54) | public RecSplitBuilder<T> eliasFanoMonotoneLists(boolean eliasFano) {
method maxChunkSize (line 59) | public RecSplitBuilder<T> maxChunkSize(int maxChunkSize) {
method parallelism (line 64) | public RecSplitBuilder<T> parallelism(int parallelism) {
method generate (line 76) | public BitBuffer generate(Collection<T> collection) {
method buildEvaluator (line 86) | public RecSplitEvaluator<T> buildEvaluator(BitBuffer description) {
FILE: src/main/java/org/minperf/RecSplitEvaluator.java
class RecSplitEvaluator (line 13) | public class RecSplitEvaluator<T> {
method RecSplitEvaluator (line 29) | public RecSplitEvaluator(BitBuffer buffer, UniversalHash<T> hash, Sett...
method getHeaderSize (line 56) | public int getHeaderSize() {
method getOffsetListSize (line 60) | public int getOffsetListSize() {
method getStartListSize (line 64) | public int getStartListSize() {
method evaluate (line 68) | public int evaluate(T obj) {
method skip (line 98) | private int skip(int pos, int size) {
method evaluate (line 124) | private int evaluate(int pos, T obj, long hashCode,
FILE: src/main/java/org/minperf/Settings.java
class Settings (line 6) | public class Settings {
method splitIntegerList (line 50) | private static int[] splitIntegerList(String x) {
method Settings (line 128) | public Settings(int leafSize, int averageBucketSize) {
method getMaxBucketSize (line 174) | public int getMaxBucketSize() {
method calcRiceParamSplitByTwo (line 179) | public static int calcRiceParamSplitByTwo(int size) {
method calcNextSplit (line 188) | static int calcNextSplit(int factor) {
method calcSplit (line 192) | private static int calcSplit(int size, int leafSize) {
method getSplit (line 204) | public int getSplit(int size) {
method calcGolombRiceShift (line 214) | public static int calcGolombRiceShift(int size, int leafSize) {
method getGolombRiceShift (line 235) | public int getGolombRiceShift(int size) {
method needNewUniversalHashIndex (line 242) | public static boolean needNewUniversalHashIndex(long index) {
method getUniversalHashIndex (line 246) | public static long getUniversalHashIndex(long index) {
method getLeafSize (line 250) | public int getLeafSize() {
method getAverageBucketSize (line 254) | public int getAverageBucketSize() {
method supplementalHashShift (line 258) | public static int supplementalHashShift(long hash, long index) {
method supplementalHashInt (line 266) | public static int supplementalHashInt(long hash, long index) {
method supplementalHash (line 277) | public static int supplementalHash(long hash, long index) {
method getBucketCount (line 287) | public static int getBucketCount(long size, int averageBucketSize) {
method reduce (line 291) | public static int reduce(int hash, int n) {
FILE: src/main/java/org/minperf/bdz/BDZ.java
class BDZ (line 24) | public class BDZ<T> {
method BDZ (line 49) | private BDZ(UniversalHash<T> hash, BitBuffer data) {
method evaluate (line 60) | public int evaluate(T x) {
method load (line 74) | public static <T> BDZ<T> load(UniversalHash<T> hash, BitBuffer data) {
method generate (line 78) | @SuppressWarnings("unchecked")
method getSize (line 182) | public int getSize() {
method getArrayLength (line 186) | private static int getArrayLength(int size) {
method getHash (line 190) | private static <T> int getHash(T x, UniversalHash<T> hash,
method toString (line 198) | @Override
FILE: src/main/java/org/minperf/generator/ConcurrencyTool.java
class ConcurrencyTool (line 10) | public class ConcurrencyTool {
method ConcurrencyTool (line 14) | public ConcurrencyTool(int parallelism) {
method invoke (line 22) | public <T> T invoke(ForkJoinTask<T> task) {
method invokeAll (line 29) | public void invokeAll(ForkJoinTask<?>... tasks) {
method shutdown (line 39) | public void shutdown() {
FILE: src/main/java/org/minperf/generator/Generator.java
class Generator (line 20) | public class Generator<T> {
method Generator (line 31) | public Generator(ConcurrencyTool pool,
method generate (line 43) | @SuppressWarnings("unchecked")
method getIndex (line 99) | private long getIndex(T[] data, long[] hashes, long startIndex) {
method trySplitEvenly (line 127) | private boolean trySplitEvenly(long[] hashes, long index) {
method splitEvenly (line 169) | private void splitEvenly(T[] data, long[] hashes, long index, T[][] da...
method tryUnique (line 212) | static <T> boolean tryUnique(long[] hashes, long index) {
method generate (line 230) | public BitBuffer generate(Collection<T> collection) {
method processBuckets (line 363) | private void processBuckets(long size, int bucketCount, final ArrayLis...
method shrinkList (line 393) | public static void shrinkList(int[] targetList, int[] sourceList) {
method shrinkList (line 405) | public static int shrinkList(int[] list) {
method getMinBitCount (line 417) | public static int getMinBitCount(int size) {
class Bucket (line 425) | class Bucket {
method Bucket (line 431) | Bucket(int averageBucketSize) {
method toString (line 435) | @Override
method moveToAlternative (line 440) | public void moveToAlternative(ArrayList<T> alternativeList) {
method add (line 449) | void add(T obj) {
method generateBucket (line 453) | void generateBucket(UniversalHash<T> hash, int maxBucketSize, int ma...
FILE: src/main/java/org/minperf/hash/HashPerformanceTest.java
class HashPerformanceTest (line 5) | public class HashPerformanceTest {
method main (line 7) | public static void main(String... args) throws InterruptedException {
method test (line 13) | private static void test() throws InterruptedException {
FILE: src/main/java/org/minperf/hash/LongPair.java
class LongPair (line 3) | public class LongPair {
FILE: src/main/java/org/minperf/hash/Mix.java
class Mix (line 3) | public class Mix {
method supplementalHashWeyl (line 5) | public static int supplementalHashWeyl(long hash, long index) {
method hash32 (line 12) | public static int hash32(int x) {
method unhash32 (line 19) | public static int unhash32(int x) {
method hash64 (line 26) | public static long hash64(long x) {
method unhash64 (line 33) | public static long unhash64(long x) {
FILE: src/main/java/org/minperf/hash/Murmur2.java
class Murmur2 (line 3) | public class Murmur2 {
method hash (line 7) | public static long hash(byte[] data, int length, long seed) {
method hash64 (line 40) | public static long hash64(byte[] data, int length, long seed) {
method hash64x8 (line 84) | public static long hash64x8(byte[] data, int length, long seed) {
FILE: src/main/java/org/minperf/hash/Murmur3.java
class Murmur3 (line 16) | public class Murmur3 {
method hash64 (line 20) | public static long hash64(byte[] data, int length, long seed) {
method hash64x8 (line 60) | public static long hash64x8(byte[] data, int length, long seed) {
method fmix32 (line 87) | public static int fmix32(int h) {
method hash32 (line 96) | public static int hash32(byte[] data, int offset, int len, int seed) {
method hash128 (line 147) | public static void hash128(byte[] key, int offset, int len, int seed, ...
method hash128x16 (line 230) | public static void hash128x16(byte[] key, int offset, int len, long se...
method getLongLittleEndian (line 269) | private static long getLongLittleEndian(byte[] data, int pos) {
method fmix64 (line 280) | private static long fmix64(long k) {
FILE: src/main/java/org/minperf/hash/SpookyHash.java
class SpookyHash (line 3) | public class SpookyHash {
method hash128x32 (line 5) | static void hash128x32(byte[] key, int offset, int len, int seed, Long...
method shortEnd (line 56) | static void shortEnd(long a, long b, long c, long d) {
method shortMix (line 70) | static void shortMix(long a, long b, long c, long d) {
method readLong (line 85) | private static long readLong(byte[] data, int pos) {
FILE: src/main/java/org/minperf/hash/XXHash64.java
class XXHash64 (line 8) | public class XXHash64 {
method hash64 (line 16) | public static long hash64(byte[] buf, int off, int len, long seed) {
method hash64 (line 96) | public static long hash64(ByteBuffer buf, int off, int len, long seed) {
method checkRange (line 180) | private static void checkRange(ByteBuffer buf, int off, int len) {
method checkRange (line 188) | private static void checkRange(ByteBuffer buf, int off) {
method inLittleEndianOrder (line 194) | private static ByteBuffer inLittleEndianOrder(ByteBuffer buf) {
method readByte (line 202) | private static byte readByte(ByteBuffer buf, int i) {
method readIntLE (line 206) | private static int readIntLE(ByteBuffer buf, int i) {
method readLongLE (line 211) | private static long readLongLE(ByteBuffer buf, int i) {
method checkRange (line 216) | private static void checkRange(byte[] buf, int off) {
method checkRange (line 222) | private static void checkRange(byte[] buf, int off, int len) {
method checkLength (line 230) | private static void checkLength(int len) {
method readByte (line 236) | private static byte readByte(byte[] buf, int i) {
method readIntLE (line 240) | private static int readIntLE(byte[] buf, int i) {
method readLongLE (line 244) | private static long readLongLE(byte[] buf, int i) {
FILE: src/main/java/org/minperf/hem/HemGenerator.java
class HemGenerator (line 17) | public class HemGenerator {
method main (line 19) | public static void main(String... args) throws Exception {
method test_10_12_64 (line 23) | public void test_10_12_64() throws Exception {
method testRead (line 78) | static void testRead(String fileName) throws IOException {
method write (line 109) | synchronized void write(BlockInfo info, BitBuffer buff) {
method generateKeys (line 127) | synchronized BlockInfo generateKeys(long[] data) {
class BlockInfo (line 140) | static class BlockInfo {
class RandomHashGenerator (line 145) | static class RandomHashGenerator implements HashGenerator {
method RandomHashGenerator (line 153) | public RandomHashGenerator(long size) {
method generateBlock (line 158) | @Override
type HashGenerator (line 183) | interface HashGenerator {
method generateBlock (line 184) | int generateBlock(long[] data, int lowBits);
FILE: src/main/java/org/minperf/hem/KeyReader.java
class KeyReader (line 23) | public class KeyReader {
method main (line 28) | public static void main(String... args) {
method readSignaturesFromTextFile (line 46) | static Iterator<UUID> readSignaturesFromTextFile(final String fileName) {
method readSignaturesFromTextFile2 (line 120) | public static Iterator<UUID> readSignaturesFromTextFile2(final String ...
method readSignaturesFromTextFile64 (line 193) | static PrimitiveIterator.OfLong readSignaturesFromTextFile64(final Str...
method readSignaturesFromTextFile64input (line 243) | public static Iterator<Long> readSignaturesFromTextFile64input(final S...
method readSignaturesFromTextFile64b (line 284) | static Iterator<Long> readSignaturesFromTextFile64b(final String fileN...
method readSignaturesFromTextFile64async (line 337) | static Iterator<Long> readSignaturesFromTextFile64async(final String f...
FILE: src/main/java/org/minperf/hem/Sort.java
class Sort (line 9) | public class Sort extends RecursiveAction {
method main (line 13) | public static void main(String... args) {
method testSortUnsigned (line 65) | private static void testSortUnsigned() {
method Sort (line 93) | Sort(long[] data, int start, int end, int shift, int level) {
method parallelSortUnsigned (line 101) | public static void parallelSortUnsigned(long[] data, int offset, int l...
method parallelSortUnsigned (line 109) | public static void parallelSortUnsigned(long[] data) {
method compute (line 113) | @Override
method sortUnsignedSimple (line 173) | static void sortUnsignedSimple(long[] data, int offset, int len) {
method sort (line 193) | static void sort(long[] data) {
method sort (line 197) | static void sort(long[] data, int start, int end, int shift) {
FILE: src/main/java/org/minperf/hem/SortedSignatures.java
class SortedSignatures (line 14) | public class SortedSignatures {
class FileIterator (line 21) | static class FileIterator {
method FileIterator (line 29) | FileIterator(String fileName) {
method position (line 40) | private long position() {
method remap (line 44) | void remap() {
method remapIfNeeded (line 56) | void remapIfNeeded() {
method close (line 62) | void close() {
method iteratorVarLong (line 70) | PrimitiveIterator.OfLong iteratorVarLong(final int len) {
method iteratorGolombRice (line 87) | PrimitiveIterator.OfLong iteratorGolombRice(final int len, final int...
class FileWriter (line 126) | static class FileWriter {
method FileWriter (line 130) | FileWriter(String fileName) {
method close (line 140) | void close() {
method writeDiffsGolombRice (line 149) | void writeDiffsGolombRice(long[] data, int shift) {
method writeBlock (line 164) | void writeBlock(BitBuffer buff) {
method writeDiffsVarLong (line 177) | void writeDiffsVarLong(long[] data) {
method write (line 195) | void write(ByteBuffer data) {
class FileWriterChannel (line 206) | static class FileWriterChannel {
method FileWriterChannel (line 210) | FileWriterChannel(String fileName) {
method close (line 221) | void close() {
method writeDiffsEliasDelta (line 229) | void writeDiffsEliasDelta(long[] data) {
method writeBitBuffer (line 246) | void writeBitBuffer(BitBuffer buff, boolean always) {
method writeDiffsGolombRice (line 260) | void writeDiffsGolombRice(long[] data, int shift) {
method writeDiffs (line 273) | void writeDiffs(long[] data) {
method write (line 291) | void write(ByteBuffer data) {
method writeVarLong (line 301) | public static void writeVarLong(ByteBuffer buff, long x) {
method readVarLong (line 309) | public static long readVarLong(ByteBuffer buff) {
FILE: src/main/java/org/minperf/hem/recsplit/Builder.java
class Builder (line 6) | public class Builder {
method leafSize (line 15) | public Builder leafSize(int leafSize) {
method averageBucketSize (line 20) | public Builder averageBucketSize(int averageBucketSize) {
method generate (line 25) | public BitBuffer generate(long[] keys) {
method generate (line 29) | public BitBuffer generate(long[] keys, int len) {
method evaluator (line 33) | public FastEvaluator evaluator(BitBuffer buff) {
method supplementalHash (line 37) | public static int supplementalHash(long x, int index) {
method reduce (line 43) | public static int reduce(int hash, int n) {
method getBucketCount (line 48) | public static int getBucketCount(long size, int averageBucketSize) {
method nextPowerOf2 (line 53) | static int nextPowerOf2(int x) {
method getGolombRiceShift (line 60) | public static int getGolombRiceShift(int size) {
FILE: src/main/java/org/minperf/hem/recsplit/FastEvaluator.java
class FastEvaluator (line 6) | public class FastEvaluator {
method FastEvaluator (line 17) | FastEvaluator(BitBuffer buffer, int averageBucketSize, int leafSize, i...
method evaluate (line 29) | public int evaluate(long hashCode) {
method skip (line 49) | private int skip(int pos, int size) {
method evaluate (line 63) | private int evaluate(int pos, long hashCode,
FILE: src/main/java/org/minperf/hem/recsplit/FastGenerator.java
class FastGenerator (line 8) | public class FastGenerator {
method FastGenerator (line 16) | FastGenerator(int leafSize, int averageBucketSize) {
method generate (line 21) | BitBuffer generate(long[] keys) {
method generate (line 25) | BitBuffer generate(long[] keys, int len) {
method sortIntoBuckets (line 56) | private static void sortIntoBuckets(long[] keys, int len, int shift, i...
method generateBucket (line 116) | private void generateBucket(long[] keys, int start, int end, int[] sta...
method generateSet (line 149) | private void generateSet(long[] keys, int start, int end, int index) {
method generateSetHalf (line 176) | private void generateSetHalf(long[] keys, int start, int end, int inde...
method checkDuplicateKey (line 203) | private void checkDuplicateKey(long[] keys, int start, int end) {
method sort (line 212) | private static void sort(long[] keys, int start, int end, long bits) {
method emit (line 235) | private void emit(int size, int indexDiff) {
method generateBucket2 (line 240) | private void generateBucket2(long[] keys, int start, int index) {
method generateBucket3 (line 252) | private void generateBucket3(long[] keys, int start, int index) {
method generateBucket4 (line 265) | private void generateBucket4(long[] keys, int start, int index) {
method generateBucket5 (line 279) | private void generateBucket5(long[] keys, int start, int index) {
method generateBucket6 (line 294) | private void generateBucket6(long[] keys, int start, int index) {
FILE: src/main/java/org/minperf/monotoneList/EliasFanoMonotoneList.java
class EliasFanoMonotoneList (line 13) | public class EliasFanoMonotoneList extends MonotoneList {
method EliasFanoMonotoneList (line 20) | private EliasFanoMonotoneList(BitBuffer buffer, int start, int lowBitC...
method generate (line 27) | public static EliasFanoMonotoneList generate(int[] data, BitBuffer buf...
method getSize (line 53) | public static int getSize(int[] data) {
method load (line 69) | public static EliasFanoMonotoneList load(BitBuffer buffer) {
method get (line 78) | @Override
method getPair (line 85) | @Override
FILE: src/main/java/org/minperf/monotoneList/MonotoneList.java
class MonotoneList (line 8) | public abstract class MonotoneList {
method get (line 10) | public abstract int get(int i);
method getPair (line 12) | public abstract long getPair(int i);
method generate (line 14) | public static MonotoneList generate(int[] data, BitBuffer buffer, bool...
method getSize (line 27) | public static int getSize(int[] data, boolean eliasFano) {
method load (line 33) | public static MonotoneList load(BitBuffer buffer, boolean eliasFano) {
FILE: src/main/java/org/minperf/monotoneList/MultiStageMonotoneList.java
class MultiStageMonotoneList (line 10) | public class MultiStageMonotoneList extends MonotoneList {
method MultiStageMonotoneList (line 24) | private MultiStageMonotoneList(BitBuffer buffer) {
method getScaleFactor (line 41) | private static long getScaleFactor(int multiply, int divide) {
method generate (line 45) | public static MultiStageMonotoneList generate(int[] data, BitBuffer bu...
method getSize (line 142) | public static int getSize(int[] data) {
method load (line 232) | public static MultiStageMonotoneList load(BitBuffer buffer) {
method get (line 236) | @Override
method getPair (line 245) | @Override
FILE: src/main/java/org/minperf/rank/Rank9.java
class Rank9 (line 29) | public class Rank9 {
method mostSignificantBit (line 34) | long mostSignificantBit(long x) {
method Rank9 (line 38) | public Rank9(BitSet set, long bitCount) {
method rank (line 68) | public long rank(long pos) {
method get (line 83) | public long get(long pos) {
method rankAndGet (line 93) | public long rankAndGet(long pos) {
method getAndPartialRank (line 111) | public long getAndPartialRank(long pos) {
method remainingRank (line 123) | public long remainingRank(long pos) {
method getBitCount (line 130) | public int getBitCount() {
FILE: src/main/java/org/minperf/rank/VerySimpleRank.java
class VerySimpleRank (line 17) | public class VerySimpleRank {
method VerySimpleRank (line 33) | private VerySimpleRank(BitBuffer buffer, int size) {
method generate (line 58) | public static VerySimpleRank generate(BitSet set, BitBuffer buffer) {
method load (line 108) | public static VerySimpleRank load(BitBuffer buffer) {
method get (line 121) | public boolean get(long x) {
method rank (line 135) | public long rank(long x) {
method countBits (line 146) | private int countBits(int start, int end) {
method select (line 157) | public long select(long x) {
method countBits (line 171) | private static int countBits(BitSet set, int start, int end) {
method getReadBits (line 179) | public int getReadBits() {
method getOverhead (line 183) | public int getOverhead() {
method getSize (line 187) | public int getSize() {
method toString (line 191) | @Override
FILE: src/main/java/org/minperf/select/Select.java
class Select (line 12) | public abstract class Select {
method generate (line 23) | public static Select generate(BitSet set, BitBuffer buffer) {
method getSize (line 36) | public static int getSize(BitSet set) {
method load (line 49) | public static Select load(BitBuffer buffer) {
method select (line 62) | public abstract long select(long x);
method selectPair (line 64) | public abstract long selectPair(long x);
FILE: src/main/java/org/minperf/select/SimpleSelect.java
class SimpleSelect (line 30) | public class SimpleSelect extends Select {
method SimpleSelect (line 215) | private SimpleSelect(BitBuffer buffer) {
method SimpleSelect (line 248) | private SimpleSelect(BitSet bitSet) {
method load (line 376) | public static SimpleSelect load(BitBuffer buffer) {
method generate (line 380) | public static SimpleSelect generate(BitSet bitSet, BitBuffer buffer) {
method getSize (line 403) | public static int getSize(BitSet bitSet) {
method setSubInventory16 (line 419) | void setSubInventory16(int index, int x) {
method getSubInventory16 (line 423) | int getSubInventory16(int index) {
method select (line 427) | @Override
method selectInLong (line 469) | public static int selectInLong(long x, int rank) {
method selectPair (line 487) | @Override
FILE: src/main/java/org/minperf/select/SimpleSelectWrapper.java
class SimpleSelectWrapper (line 20) | public class SimpleSelectWrapper {
FILE: src/main/java/org/minperf/select/VerySimpleSelect.java
class VerySimpleSelect (line 16) | public class VerySimpleSelect extends Select {
method VerySimpleSelect (line 49) | private VerySimpleSelect(BitBuffer buffer) {
method generate (line 62) | public static VerySimpleSelect generate(BitSet set, BitBuffer buffer) {
method getSize (line 109) | public static int getSize(BitSet set) {
method getScaleFactor (line 151) | private static long getScaleFactor(int multiply, int divide) {
method load (line 155) | public static VerySimpleSelect load(BitBuffer buffer) {
method select (line 159) | @Override
method selectPair (line 177) | @Override
method selectBitSlowReverse (line 213) | public static int selectBitSlowReverse(long x, int n) {
method selectBitSlow (line 217) | public static int selectBitSlow(long x, int n) {
method selectBitLongReverse (line 231) | public static int selectBitLongReverse(long x, int n) {
method selectBitLong (line 250) | public static int selectBitLong(long x, int n) {
method selectBitReverse (line 266) | public static int selectBitReverse(int x, int n) {
method selectBit (line 280) | public static int selectBit(int x, int n) {
FILE: src/main/java/org/minperf/universal/LongHash.java
class LongHash (line 6) | public class LongHash implements UniversalHash<Long> {
method universalHash (line 8) | public static long universalHash(long x, long index) {
method universalHash (line 34) | @Override
method toString (line 39) | @Override
FILE: src/main/java/org/minperf/universal/StringHash.java
class StringHash (line 8) | public class StringHash implements UniversalHash<String> {
method universalHash (line 12) | @Override
method getSipHash24 (line 26) | public static long getSipHash24(String o, long k0, long k1) {
method getSipHash24 (line 42) | public static long getSipHash24(byte[] b, int start, int end, long k0,
method toString (line 88) | @Override
FILE: src/main/java/org/minperf/universal/UniversalHash.java
type UniversalHash (line 14) | public interface UniversalHash<T> {
method universalHash (line 23) | long universalHash(T key, long index);
FILE: src/main/java/org/minperf/utils/LargeLongList.java
class LargeLongList (line 18) | public class LargeLongList extends AbstractList<Long> {
method LargeLongList (line 27) | LargeLongList(int size, ArrayList<LargeLongArray> list) {
method get (line 32) | @Override
method size (line 40) | @Override
method finalize (line 45) | @Override
method dispose (line 50) | public void dispose() {
method create (line 56) | public static LargeLongList create(Collection<Long> collection) {
method spliterator (line 70) | @Override
class LargeLongArray (line 78) | static class LargeLongArray {
method LargeLongArray (line 85) | public LargeLongArray(int size, File file, FileChannel channel,
method create (line 93) | static LargeLongArray create(Iterator<Long> iterator, int size) {
method finalize (line 112) | @Override
method dispose (line 117) | public void dispose() {
method get (line 130) | public Long get(int index) {
FILE: src/main/java/org/minperf/utils/LongSet.java
class LongSet (line 12) | public class LongSet extends AbstractSet<Long> {
method LongSet (line 18) | public LongSet(int capacity) {
method size (line 24) | @Override
method isEmpty (line 29) | @Override
method add (line 34) | @Override
method iterator (line 66) | @Override
method spliterator (line 123) | @Override
class LargeLongArray (line 131) | static class LargeLongArray {
method LargeLongArray (line 138) | LargeLongArray(long size) {
method get (line 150) | long get(long i) {
method set (line 154) | void set(long i, long x) {
method size (line 158) | long size() {
FILE: src/main/java/org/minperf/utils/PoissonDistribution.java
class PoissonDistribution (line 26) | public class PoissonDistribution {
method probability (line 50) | public static double probability(double p, int x) {
method logProbability (line 58) | private static double logProbability(double p, int x) {
method getStirlingError (line 77) | private static double getStirlingError(double z) {
method getDeviancePart (line 107) | private static double getDeviancePart(double x, double mu) {
FILE: src/main/java/org/minperf/utils/RandomSetGenerator.java
class RandomSetGenerator (line 11) | public class RandomSetGenerator {
method main (line 13) | public static void main(String... args) {
method randomHashProducer (line 53) | public static RandomBlockProducer randomHashProducer(Random r, long si...
method randomProducer (line 57) | private static RandomBlockProducer randomProducer(final Random r, fina...
method randomHalf (line 130) | static long randomHalf(Random r, long samples) {
method probabilityBucketAtMost (line 145) | static double probabilityBucketAtMost(long flips, long heads) {
method phi (line 159) | static double phi(double x) {
method hash64 (line 163) | public static long hash64(long x) {
method hash44 (line 170) | public static long hash44(long x) {
method hash32 (line 180) | public static long hash32(long x) {
method hash16 (line 189) | public static long hash16(long x) {
type RandomBlockProducer (line 198) | public interface RandomBlockProducer {
method produce (line 200) | int produce(long[] data, int offset, int len, long add);
method remaining (line 202) | long remaining();
FILE: src/main/java/org/minperf/utils/RandomSetGeneratorSlow.java
class RandomSetGeneratorSlow (line 13) | public class RandomSetGeneratorSlow {
method main (line 15) | public static void main(String... args) {
method randomSequence (line 35) | public static Iterable<Long> randomSequence(final long size) {
method randomSequence (line 52) | static Iterator<Long> randomSequence(final Random r, final long size, ...
method randomHalf (line 104) | static long randomHalf(Random r, long samples) {
method probabilityBucketAtMost (line 119) | static double probabilityBucketAtMost(long flips, long heads) {
method phi (line 132) | static double phi(double x) {
FILE: src/main/java/org/minperf/utils/Text.java
class Text (line 11) | public class Text implements CharSequence {
method Text (line 28) | public Text(byte[] data, int offset, int len) {
method indexOf (line 34) | public static int indexOf(byte[] data, int index, int character) {
method hashCode (line 47) | public long hashCode(long index) {
method hashCode (line 51) | @Override
method equals (line 56) | @Override
method compareFast (line 75) | public int compareFast(Text o) {
method toString (line 90) | @Override
method length (line 95) | @Override
method charAt (line 100) | @Override
method subSequence (line 105) | @Override
class UniversalTextHash (line 113) | public static class UniversalTextHash implements UniversalHash<Text> {
method universalHash (line 115) | @Override
class FastComparator (line 127) | public static class FastComparator implements Comparator<Text> {
method compare (line 131) | @Override
method equalCount (line 140) | public int equalCount() {
FILE: src/test/java/org/minperf/BitCodes.java
class BitCodes (line 13) | public class BitCodes {
method main (line 15) | public static void main(String... args) {
method testPerformance (line 21) | private static void testPerformance() {
method printRiceExamples (line 38) | public static void printRiceExamples() {
method testGolombRiceCoding (line 50) | @Test
method getRice (line 82) | private static String getRice(long value, int shift) {
method calcEntropy (line 96) | static double calcEntropy(double p) {
method calcAverageRiceGolombBits (line 106) | public static double calcAverageRiceGolombBits(int k, double p) {
method calcBestGolombRiceShift (line 111) | public static int calcBestGolombRiceShift(double p) {
method calcBestGolombRiceShiftFromMean (line 117) | public static int calcBestGolombRiceShiftFromMean(double mean) {
method verifyRiceParameterFormula (line 133) | public static void verifyRiceParameterFormula() {
method verifyRiceParameterFormula (line 142) | private static void verifyRiceParameterFormula(double p) {
method printEliasDeltaExample (line 204) | public static void printEliasDeltaExample() {
method testEliasDeltaRoundtrip (line 216) | @Test
method testNumberRoundtrip (line 237) | public void testNumberRoundtrip() {
method testEliasDeltaCoding (line 265) | @Test
method getEliasDelta (line 280) | static String getEliasDelta(int value) {
method testWriteBuffer (line 298) | @Test
method testWriteBuffer2 (line 313) | @Test
method testSeek (line 342) | @Test
method testFoldUnfold (line 356) | @Test
method testFoldUnfold (line 376) | private static void testFoldUnfold(long x) {
method testGolombRice (line 380) | @Test
method printPositiveMapping (line 402) | public static void printPositiveMapping() {
FILE: src/test/java/org/minperf/FunctionInfo.java
class FunctionInfo (line 6) | public class FunctionInfo {
method toString (line 18) | @Override
method hashCode (line 35) | @Override
method equals (line 40) | @Override
FILE: src/test/java/org/minperf/Graphics.java
class Graphics (line 14) | public class Graphics {
method main (line 16) | public static void main(String... args) {
method generateSplitTrees (line 21) | public static void generateSplitTrees() {
method generateSplitTree (line 65) | public static String generateSplitTree(int leafSize, int size) {
method generateSampleTikz (line 81) | public static void generateSampleTikz() {
method generateSampleTikz (line 144) | private static String generateSampleTikz(Settings settings, int size) {
method generateSampleTikzWithX (line 155) | private static String generateSampleTikzWithX(Settings settings, int s...
method getSizeTikz (line 201) | private static String getSizeTikz(int size) {
method generateBitDescription (line 208) | private static void generateBitDescription(Settings settings, BitBuffe...
method appendLastBits (line 244) | private static void appendLastBits(StringBuilder bits, BitBuffer in,
FILE: src/test/java/org/minperf/LargeSetTest.java
class LargeSetTest (line 20) | public class LargeSetTest {
method main (line 24) | public static void main(String... args) {
method test (line 29) | private static void test(boolean eliasFano) {
method createSet (line 82) | public static LongSet createSet(int size, int seed) {
method randomSet (line 95) | @Test
method smallSet (line 111) | @Test
method toString (line 136) | private static String toString(LongSet set) {
FILE: src/test/java/org/minperf/Paper.java
class Paper (line 9) | public class Paper {
method main (line 11) | public static void main(String... args) {
method simpleTest (line 104) | private static void simpleTest() {
method supplementalHashPerfTest (line 113) | private static void supplementalHashPerfTest() {
FILE: src/test/java/org/minperf/PerformanceTest.java
class PerformanceTest (line 14) | public class PerformanceTest {
method main (line 33) | public static void main(String... args) {
method execute (line 37) | private void execute(String... args) {
method printUsage (line 62) | void printUsage() {
method runMicroBenchmark (line 71) | void runMicroBenchmark(boolean fastHash) {
method createSet (line 137) | public static HashSet<Long> createSet(int size, int seed) {
class FastLongHash (line 151) | static class FastLongHash implements UniversalHash<Long> {
method universalHash (line 153) | @Override
method toString (line 158) | @Override
class CountingHash (line 170) | static class CountingHash<K> implements UniversalHash<K> {
method CountingHash (line 175) | CountingHash(UniversalHash<K> base) {
method getCount (line 179) | long getCount() {
method universalHash (line 183) | @Override
method toString (line 189) | @Override
FILE: src/test/java/org/minperf/Probability.java
class Probability (line 13) | public class Probability {
method veryLargeBucketProbability (line 18) | public static void veryLargeBucketProbability() {
method probabilityLargeBucket2 (line 34) | public static double probabilityLargeBucket2(int averageBucketSize, in...
method simulateKeyInOverflow (line 45) | public static void simulateKeyInOverflow() {
method simulateProbabilityBucketLargerOrEqualTo (line 89) | private static double simulateProbabilityBucketLargerOrEqualTo(int lam...
method probabilityLargeBucket (line 110) | public static double probabilityLargeBucket(int lambda, int x) {
method getProbabilityOfBucketSize (line 115) | public static double getProbabilityOfBucketSize(int averageBucketSize,...
method getProbabilityOfBucketFallsIntoBinOfSize (line 121) | public static double getProbabilityOfBucketFallsIntoBinOfSize(int aver...
method asymmetricCase (line 128) | public static void asymmetricCase() {
method asymmetricSplitProbability (line 140) | public static void asymmetricSplitProbability() {
method calcExactAsymmetricSplitProbability (line 150) | public static double calcExactAsymmetricSplitProbability(int size, int...
method calcApproxAsymmetricSplitProbability (line 166) | private static double calcApproxAsymmetricSplitProbability(int size, i...
method calcAsymmetricSplitProbability (line 175) | private static double calcAsymmetricSplitProbability(int size, int fir...
method simulateAsymmetricSplitProbability (line 196) | private static double simulateAsymmetricSplitProbability(int size, int...
method calcCombinations (line 220) | public static double calcCombinations(int n, int k) {
method probabilitySplitIntoMSubsetsOfSizeN (line 241) | public static double probabilitySplitIntoMSubsetsOfSizeN(int m, int n) {
method factorial (line 258) | static BigInteger factorial(long n) {
method recursiveFactorial (line 267) | private static BigInteger recursiveFactorial(long start, long n) {
method probabilityOfDuplicates (line 280) | public static double probabilityOfDuplicates(long n, int bits) {
FILE: src/test/java/org/minperf/RandomizedTest.java
class RandomizedTest (line 22) | public class RandomizedTest {
method main (line 39) | public static void main(String... args) {
method printLargeSet (line 43) | public static void printLargeSet() {
method printTimeVersusSpace (line 50) | public static void printTimeVersusSpace() {
method printEvaluationTimeVersusSpaceMedium (line 124) | public static void printEvaluationTimeVersusSpaceMedium() {
method printEvaluationAndGenerationTimeVersusSpace (line 164) | public static void printEvaluationAndGenerationTimeVersusSpace() {
method printTables (line 1085) | private static void printTables(ArrayList<FunctionInfo> list) {
method printTables (line 1094) | private static void printTables(ArrayList<FunctionInfo> list, int type) {
method printGenerationTimeVersusSpace (line 1131) | public static void printGenerationTimeVersusSpace() {
method runTests (line 1195) | public static void runTests() {
method verifyParameters (line 1208) | static void verifyParameters() {
method verifyParametersBestSize (line 1226) | static void verifyParametersBestSize() {
method verifyOneTest (line 1242) | private static boolean verifyOneTest() {
method experimentalResults (line 1265) | public static void experimentalResults() {
method experimentalResults (line 1276) | static void experimentalResults(int size, int averageBucketSize) {
method reasonableParameterValues (line 1297) | public static void reasonableParameterValues() {
method test (line 1324) | private static <T> long test(HashSet<T> set, UniversalHash<T> hash,
method attemptGc (line 1384) | public static int attemptGc() {
method testAndMeasure (line 1398) | public static FunctionInfo testAndMeasure(int leafSize, int averageBuc...
method test (line 1402) | public static FunctionInfo test(int leafSize, int averageBucketSize, i...
method test (line 1406) | public static FunctionInfo test(int leafSize, int averageBucketSize, i...
method createSet (line 1448) | public static HashSet<Long> createSet(int size, int seed) {
method convertBytesToHex (line 1463) | public static String convertBytesToHex(byte[] value) {
method convertHexToBytes (line 1481) | public static byte[] convertHexToBytes(String s) {
FILE: src/test/java/org/minperf/SettingsTest.java
class SettingsTest (line 15) | public class SettingsTest {
method main (line 21) | public static void main(String... args) {
method printSplitRulesList (line 31) | public static void printSplitRulesList() {
method generateSplitRules (line 175) | static void generateSplitRules() {
method generateSplitRules (line 190) | private static void generateSplitRules(int leafSize) {
method getBitsPerKey (line 280) | private static double getBitsPerKey(double[] bitsPerKeyList, int size,...
method getSimplifiedProbabilitySplit (line 296) | private static double getSimplifiedProbabilitySplit(int size, int spli...
method getProbabilitySplit (line 305) | private static double getProbabilitySplit(int size, int split) {
method printSplit (line 313) | static void printSplit() {
method printSplitRule (line 346) | public static void printSplitRule() {
method verifyRiceLeaf (line 367) | public void verifyRiceLeaf() {
method verifyRiceSplitMore (line 377) | public void verifyRiceSplitMore() {
method verifyUniversalHashIndex (line 406) | @Test
method generateRiceLeaf (line 417) | static void generateRiceLeaf() {
method generateRiceSplitMore (line 432) | private static void generateRiceSplitMore() {
method generateRiceSplit2 (line 462) | private static void generateRiceSplit2() {
method binarySearchFirstSizeWithRice (line 486) | private static int binarySearchFirstSizeWithRice(int min, int max,
method testSplit (line 506) | public void testSplit() {
FILE: src/test/java/org/minperf/SpaceEstimator.java
class SpaceEstimator (line 15) | public class SpaceEstimator {
method main (line 22) | public static void main(String... args) {
method getExpectedSpaceEstimate (line 58) | public static double getExpectedSpaceEstimate(int leafSize, int averag...
method getExpectedSpace (line 86) | public static double getExpectedSpace(int leafSize, int averageBucketS...
method getExpectedSpace (line 91) | public static double getExpectedSpace(int leafSize, int averageBucketS...
method getExpectedBucketSpace (line 144) | public static double getExpectedBucketSpace(Settings s, int size, int ...
method getSplitProbability (line 229) | public static double getSplitProbability(int size, int split) {
method getExpectedBucketSpace (line 245) | private static double getExpectedBucketSpace(Settings s, int size, int...
method listEvalulationTimes (line 261) | public static void listEvalulationTimes() {
method listMaxRecursionDepth (line 281) | public static void listMaxRecursionDepth() {
method spaceUsageEstimateSmallSet (line 300) | public static void spaceUsageEstimateSmallSet() {
method spaceUsageEstimate (line 311) | public static void spaceUsageEstimate() {
method calcGoodAverageBucketSizes (line 320) | public static void calcGoodAverageBucketSizes() {
FILE: src/test/java/org/minperf/SplitRuleTest.java
class SplitRuleTest (line 8) | public class SplitRuleTest {
method main (line 10) | public static void main(String... args) {
method generateSplitRules (line 14) | static void generateSplitRules() {
method generateSplitRules (line 29) | private static void generateSplitRules(int leafSize) {
method getBitsPerKey (line 73) | private static double getBitsPerKey(double[] bitsPerKeyList, int size,...
method getSimplifiedProbabilitySplit (line 89) | private static double getSimplifiedProbabilitySplit(int size, int spli...
method getProbabilitySplit (line 98) | private static double getProbabilitySplit(int size, int split) {
method calcBest (line 106) | private static void calcBest() {
method addOrReplace (line 200) | static void addOrReplace(ArrayList<FunctionInfo> list, FunctionInfo in...
FILE: src/test/java/org/minperf/SplitRuleTest2.java
class SplitRuleTest2 (line 12) | public class SplitRuleTest2 {
method main (line 23) | public static void main(String... args) {
method generateSplitRules (line 27) | static void generateSplitRules() {
method getBest (line 51) | int[] getBest() {
method generate (line 101) | void generate(int leafSize) {
method merge (line 159) | void merge(Split s) {
class Split (line 202) | static class Split {
method getFirstSize (line 212) | int getFirstSize() {
method getOtherSize (line 216) | int getOtherSize() {
method toString (line 220) | public String toString() {
method getTimePerKey (line 224) | double getTimePerKey() {
FILE: src/test/java/org/minperf/SplitRuleTest3.java
class SplitRuleTest3 (line 9) | public class SplitRuleTest3 {
method main (line 20) | public static void main(String... args) {
method generateSplitRules (line 24) | static void generateSplitRules() {
method getBest (line 65) | int[] getBest() {
method generate (line 111) | void generate(int leafSize) {
method merge (line 177) | boolean merge(Split s) {
class Split (line 197) | static class Split {
method getFirstSize (line 207) | int getFirstSize() {
method getOtherSize (line 211) | int getOtherSize() {
method toString (line 215) | public String toString() {
method getTimePerKey (line 219) | double getTimePerKey() {
FILE: src/test/java/org/minperf/TestSplitStrategy.java
class TestSplitStrategy (line 6) | public class TestSplitStrategy {
method reduce (line 10) | public static int reduce(int hash, int n) {
method main (line 14) | public static void main(String... args) {
method test (line 18) | public void test() {
method showSplitStrategy (line 40) | private void showSplitStrategy(int leafSize, int maxBucketSize, boolea...
type OptimizeTarget (line 111) | enum OptimizeTarget {
method isBetter (line 114) | @Override
method isBetter (line 121) | @Override
method isBetter (line 128) | @Override
method isBetter (line 135) | @Override
method isBetter (line 142) | @Override
method isBetter (line 148) | abstract boolean isBetter(Split alt, Split old);
method getSplit (line 151) | private Split getSplit(int m, double p, int[] parts) {
method getParts1 (line 173) | private static int[] getParts1(int m, int leafSize, int fanout) {
method getParts (line 202) | private static int[] getParts(int m, int leafSize) {
method main2 (line 233) | public static void main2(String... args) {
method approximateProbability (line 257) | static double approximateProbability(int[] parts) {
class Split (line 403) | static class Split {
method toString (line 410) | public String toString() {
FILE: src/test/java/org/minperf/TextFileTest.java
class TextFileTest (line 17) | public class TextFileTest {
method main (line 27) | public static void main(String... args) throws IOException {
method execute (line 31) | private void execute(String... args) throws IOException {
method generateIndexes (line 78) | private void generateIndexes(int threadCount) throws IOException {
method readFile (line 124) | private static byte[] readFile(String fileName) throws IOException {
method writeFile (line 132) | private static void writeFile(String fileName, byte[] data) throws IOE...
method makeListUnique (line 138) | private static ArrayList<Text> makeListUnique(ArrayList<Text> list) {
method readTextFile (line 164) | private static ArrayList<Text> readTextFile(String fileName) throws IO...
method generateFromTextFile (line 190) | private void generateFromTextFile(int threadCount) throws IOException {
method printUsage (line 219) | void printUsage(int threadCount) {
FILE: src/test/java/org/minperf/TimeEstimator.java
class TimeEstimator (line 10) | public class TimeEstimator {
method main (line 12) | public static void main(String... args) {
method test (line 16) | static String[] test() {
method getExpectedEvaluationSupplementalHashCalls (line 68) | public static double getExpectedEvaluationSupplementalHashCalls(int le...
method getExpectedGenerationTime (line 87) | public static double getExpectedGenerationTime(int leafSize, int avera...
method getExpectedGenerationTime (line 106) | private static double getExpectedGenerationTime(Settings s, int size, ...
method getExpectedEvaluationSupplementalHashCalls (line 120) | private static double getExpectedEvaluationSupplementalHashCalls(Setti...
method getExpectedEvaluationSupplementalHashCalls (line 134) | private static double getExpectedEvaluationSupplementalHashCalls(Setti...
method getExpectedGenerationTime (line 149) | private static double getExpectedGenerationTime(Settings s, int size, ...
method getExpectedHashFunctionCalls (line 163) | public static double getExpectedHashFunctionCalls(int size) {
method simulateExpectedHashFunctionCalls (line 179) | private static double simulateExpectedHashFunctionCalls(int leafSize) {
method calcEstimatedHashCallsPerKey (line 212) | static double calcEstimatedHashCallsPerKey(long size, int split) {
method calcEstimatedHashCallsPerKey (line 217) | static long calcEstimatedHashCallsPerKey(int leafSize) {
FILE: src/test/java/org/minperf/WikipediaTest.java
class WikipediaTest (line 17) | public class WikipediaTest {
method main (line 24) | public static void main(String... a) {
method largeFileWithUniqueEntries (line 38) | private static boolean largeFileWithUniqueEntries(String fileName) thr...
method largeFile (line 163) | private static void largeFile(String fileName) throws IOException {
method test (line 198) | private static void test(Collection<Text> set, int leafSize, int avera...
method test (line 226) | private static <T> long test(Collection<T> set, RecSplitEvaluator<T> e...
FILE: src/test/java/org/minperf/bdz/BDZTest.java
class BDZTest (line 20) | public class BDZTest {
method main (line 22) | public static void main(String... args) {
method test (line 29) | @Test
method testPerformance (line 34) | private static void testPerformance(int size) {
method test (line 65) | private static void test(int size) {
FILE: src/test/java/org/minperf/c/HashGenerator.java
class HashGenerator (line 19) | public class HashGenerator {
method main (line 21) | public static void main(String... args) throws IOException {
method storeSettings (line 90) | private static void storeSettings(Settings s, String fileName) throws ...
method storeBuffer (line 104) | private static void storeBuffer(String fileName, BitBuffer buff) throw...
FILE: src/test/java/org/minperf/chd/CHD.java
class CHD (line 20) | public class CHD<T> {
method CHD (line 33) | CHD(UniversalHash<T> hash, BitBuffer buff) {
method CHD (line 37) | CHD(UniversalHash<T> hash, BitBuffer buff, int lambda, double factor) {
method generate (line 44) | public void generate(Collection<T> set) {
method load (line 126) | public void load() {
method evaluate (line 136) | public int evaluate(T x) {
method holesBelow (line 148) | private int holesBelow(int x) {
FILE: src/test/java/org/minperf/chd/CHD2.java
class CHD2 (line 17) | public class CHD2<T> {
method CHD2 (line 28) | CHD2(UniversalHash<T> hash, BitBuffer buff) {
method CHD2 (line 32) | CHD2(UniversalHash<T> hash, BitBuffer buff, int lambda, int k) {
method generate (line 39) | public void generate(Collection<T> set) {
method load (line 106) | public void load() {
method evaluate (line 113) | public int evaluate(T x) {
FILE: src/test/java/org/minperf/chd/CHDTest.java
class CHDTest (line 15) | public class CHDTest<T> {
method main (line 17) | public static void main(String... args) {
method testSizeK (line 39) | private static double testSizeK(int size, int lambda, int k) {
method testK (line 44) | @SuppressWarnings("unchecked")
method testSize (line 64) | private static void testSize(int size, int lambda, double factor) {
method test (line 69) | @SuppressWarnings("unchecked")
method verify (line 92) | private static <T> void verify(CHD<T> eval, Set<T> set) {
method verifyK (line 107) | private static <T> void verifyK(CHD2<T> eval, Set<T> set, int k) {
FILE: src/test/java/org/minperf/chd/EliasFanoList.java
class EliasFanoList (line 6) | public class EliasFanoList {
method EliasFanoList (line 13) | EliasFanoList(int offset, BitBuffer buff, int bitsStart, EliasFanoMono...
method generate (line 20) | public static EliasFanoList generate(int[] list, BitBuffer buffer) {
method load (line 46) | public static EliasFanoList load(BitBuffer buffer) {
method get (line 55) | public int get(int i) {
FILE: src/test/java/org/minperf/chd/EliasFanoListTest.java
class EliasFanoListTest (line 8) | public class EliasFanoListTest {
method test (line 9) | @Test
FILE: src/test/java/org/minperf/cuckoo/CuckooHashMap.java
class CuckooHashMap (line 15) | public class CuckooHashMap<K, V> {
method CuckooHashMap (line 24) | @SuppressWarnings("unchecked")
method index (line 40) | private int index(K key, int id) {
method get (line 53) | public V get(K key) {
method tryAddAll (line 67) | private boolean tryAddAll(Map<K, V> map) {
method tryAdd (line 76) | private boolean tryAdd(K key, V value) {
FILE: src/test/java/org/minperf/cuckoo/CuckooHashTest.java
class CuckooHashTest (line 20) | public class CuckooHashTest {
method main (line 22) | public static void main(String... args) {
method testPerf (line 28) | private static void testPerf() {
method test (line 54) | @Test
method test (line 61) | static void test(int size) {
method testLongKey (line 78) | @Test
method testLongKey (line 85) | static void testLongKey(int size) {
FILE: src/test/java/org/minperf/cuckoo/CuckooLongKeyHashSet.java
class CuckooLongKeyHashSet (line 8) | public class CuckooLongKeyHashSet {
method CuckooLongKeyHashSet (line 16) | public CuckooLongKeyHashSet(Set<Long> set) {
method index (line 29) | public int index(long key, int id) {
method contains (line 42) | public boolean contains(long key) {
method index (line 52) | public int index(long key) {
method arrayLength (line 63) | public int arrayLength() {
method tryAddAll (line 67) | private boolean tryAddAll(Set<Long> set) {
method tryAdd (line 76) | private boolean tryAdd(long x) {
method supplementalHash (line 92) | public static int supplementalHash(long hash, long index, int size) {
method scaleInt (line 104) | private static int scaleInt(int x, int size) {
FILE: src/test/java/org/minperf/hash/MixTest.java
class MixTest (line 10) | public class MixTest {
method main (line 12) | public static void main(String... args) {
method inverse64 (line 23) | @Test
method random32 (line 39) | @Test
method random64 (line 48) | @Test
method modify (line 57) | private static long modify(long x, int bit) {
method modify128 (line 61) | private static UUID modify128(UUID x, int bit) {
method findFirstSupplementalHashDifference (line 68) | private static long findFirstSupplementalHashDifference(long a, long b...
method findFirstSupplementalHashDifference128 (line 79) | private static long findFirstSupplementalHashDifference128(UUID a, UUI...
method measureSupplementalHashCollisions (line 90) | private static void measureSupplementalHashCollisions(int changedBitsC...
method measureSupplementalHashCollisions128 (line 122) | private static void measureSupplementalHashCollisions128(int changedBi...
method measureSupplementalHashSpeed (line 154) | private static void measureSupplementalHashSpeed() {
method measureSupplementalHashSpeed128 (line 173) | private static void measureSupplementalHashSpeed128() {
method supplementalHash (line 194) | private static long supplementalHash(long a, long index) {
method supplementalHash128 (line 206) | private static long supplementalHash128(UUID signature, long index) {
method findInverse64 (line 235) | private static long findInverse64(long x) {
method f64 (line 245) | private static long f64(long x, long y) {
FILE: src/test/java/org/minperf/hem/HEM.java
class HEM (line 11) | public class HEM<T> {
method main (line 87) | public static void main(String... args) throws InterruptedException {
method test (line 106) | private static void test(String fileName) throws InterruptedException {
FILE: src/test/java/org/minperf/hem/MetaFile.java
class MetaFile (line 24) | public class MetaFile implements ConcurrentMap<String, String> {
method MetaFile (line 31) | public MetaFile(String fileName) {
method main (line 35) | public static void main(String... args) {
method size (line 44) | @Override
method isEmpty (line 50) | @Override
method containsKey (line 56) | @Override
method containsValue (line 62) | @Override
method values (line 68) | @Override
method keySet (line 74) | @Override
method entrySet (line 80) | @Override
method get (line 86) | @Override
method read (line 92) | private void read() {
method lockForWriting (line 107) | @SuppressWarnings("resource")
method writeAndUnlock (line 123) | private void writeAndUnlock() {
method clear (line 150) | @Override
method remove (line 160) | @Override
method put (line 170) | @Override
method putIfAbsent (line 180) | @Override
method putAll (line 190) | @Override
method remove (line 200) | @Override
method replace (line 210) | @Override
method replace (line 220) | @Override
FILE: src/test/java/org/minperf/hem/RandomGenerator.java
class RandomGenerator (line 11) | public class RandomGenerator {
method main (line 13) | public static void main(String... args) {
method test (line 19) | private static void test() {
method sum (line 37) | public static long sum(long[] data) {
method createRandomUniqueListSlow (line 45) | public static void createRandomUniqueListSlow(long[] list, int seed) {
method createRandomUniqueList (line 54) | public static void createRandomUniqueList(long[] list, int seed) {
method createRandomUniqueListFast (line 92) | public static void createRandomUniqueListFast(long[] list, int seed) {
FILE: src/test/java/org/minperf/hem/recsplit/TestFast.java
class TestFast (line 10) | public class TestFast {
method main (line 12) | public static void main(String... args) {
method test (line 18) | static void test() {
FILE: src/test/java/org/minperf/hybrid/HybridTest.java
class HybridTest (line 23) | public class HybridTest {
method main (line 25) | public static void main(String... args) {
method test (line 31) | @Test
method test (line 36) | private static void test(int size) {
FILE: src/test/java/org/minperf/medium/EstimateTimeForHugeSets.java
class EstimateTimeForHugeSets (line 7) | public class EstimateTimeForHugeSets {
method main (line 9) | public static void main(String... args) {
method getAverageAdditionalTime (line 163) | private static long getAverageAdditionalTime(long totalTimeSeconds, do...
method formatBits (line 172) | public static String formatBits(long bits) {
method formatSeconds (line 184) | public static String formatSeconds(long seconds) {
method mainChunked (line 220) | public static void mainChunked(String... args) {
method mainFullWithStripes (line 255) | public static void mainFullWithStripes(String... args) {
method getBitsForProbability (line 287) | public static int getBitsForProbability(long size, double d) {
method bitsPerGapEliasFano (line 296) | private static int bitsPerGapEliasFano(long avgGap) {
FILE: src/test/java/org/minperf/medium/EstimateTwoBillionEntries.java
class EstimateTwoBillionEntries (line 6) | public class EstimateTwoBillionEntries {
method main (line 8) | public static void main(String... args) {
method testMultipleLists (line 51) | static double testMultipleLists(long size, double factor) {
method probDuplicate (line 68) | private static double probDuplicate(int n, int bits) {
FILE: src/test/java/org/minperf/medium/MediumRecSplit.java
class MediumRecSplit (line 16) | public class MediumRecSplit<T> {
method universalHash (line 26) | static <T> int universalHash(UniversalHash<T> hash, T x, int index, in...
class Generator (line 34) | public static class Generator<T> {
method Generator (line 39) | public Generator(UniversalHash<T> hash, Settings settings) {
method generate (line 51) | public int[] generate(Set<T> set) {
method partition (line 86) | List<Set<T>> partition(Set<T> set, int bucketCount) {
method processRecursively (line 104) | void processRecursively(Set<T> set, List<Integer> description) {
method canMapDirectly (line 136) | boolean canMapDirectly(Set<T> set, int index) {
method trySplit (line 152) | List<Set<T>> trySplit(Set<T> set, int index) {
class Evaluator (line 194) | public static class Evaluator<T> {
method Evaluator (line 200) | Evaluator(UniversalHash<T> hash, Settings settings, int[] descriptio...
method evaluate (line 213) | public int evaluate(T x) {
method skip (line 268) | int skip(int[] description, int setSize, int pos) {
FILE: src/test/java/org/minperf/medium/MediumTest.java
class MediumTest (line 16) | public class MediumTest {
method main (line 18) | public static void main(String... args) {
method compareSpace (line 23) | private static void compareSpace() {
method compressBucketData (line 68) | private static BitBuffer compressBucketData(Settings settings, boolean...
method expandBucketData (line 94) | private static int[] expandBucketData(Settings settings, boolean monot...
method eliasFanoList2 (line 124) | private static void eliasFanoList2(int[] bucketData, BitBuffer buff) {
method test (line 136) | public static void test() {
FILE: src/test/java/org/minperf/medium/PartitionIntoSimilarSizedSets.java
class PartitionIntoSimilarSizedSets (line 9) | public class PartitionIntoSimilarSizedSets {
method main (line 11) | public static void main(String... args) {
method test (line 17) | private static void test(long size) {
method partition (line 27) | private static void partition(Iterable<Long> set, long size, int avera...
method distribute (line 96) | private static void distribute(ArrayList<Bucket<Long>> buckets, int ta...
method supplementalHash (line 137) | public static int supplementalHash(long hash, long index) {
method randomSet (line 145) | static Iterable<Long> randomSet(long size, long seed) {
method reduce (line 163) | public static int reduce(int hash, int n) {
class Bucket (line 168) | static class Bucket<T> {
FILE: src/test/java/org/minperf/medium/RecSplitEliasFano.java
class RecSplitEliasFano (line 6) | public class RecSplitEliasFano {
method main (line 8) | public static void main(String... args) {
FILE: src/test/java/org/minperf/medium/SimulateProbFallIntoLarge.java
class SimulateProbFallIntoLarge (line 5) | public class SimulateProbFallIntoLarge {
method main (line 6) | public static void main(String... args) {
FILE: src/test/java/org/minperf/medium/TestBBHash.java
class TestBBHash (line 12) | public class TestBBHash {
method main (line 14) | public static void main(String... args) {
method test (line 29) | private static void test(int size) {
method generate (line 41) | public void generate(Collection<Long> set) {
FILE: src/test/java/org/minperf/monotoneList/FenwickTreeMonotoneList.java
class FenwickTreeMonotoneList (line 7) | public class FenwickTreeMonotoneList extends MonotoneList {
method FenwickTreeMonotoneList (line 11) | FenwickTreeMonotoneList(int[] array) {
method generate (line 15) | public static FenwickTreeMonotoneList generate(int[] data) {
method add (line 31) | private static void add(int[] array, int index, int value) {
method sum (line 40) | private static int sum(int[] array, int index) {
method get (line 50) | @Override
method getPair (line 55) | @Override
FILE: src/test/java/org/minperf/monotoneList/MonotoneListTest.java
class MonotoneListTest (line 13) | public class MonotoneListTest {
method main (line 15) | public static void main(String... args) {
method testPerformance (line 24) | private static void testPerformance() {
method test (line 30) | @Test
method testSaving (line 42) | public void testSaving() {
method testBestSize (line 53) | private static void testBestSize(int bucketSize, int size, boolean eli...
method test (line 92) | private static void test(int bucketSize, int size, boolean eliasFano) {
method randomSizes (line 156) | private static int[] randomSizes(int size, int bucketCount) {
method expectedPosList (line 165) | private static int[] expectedPosList(int size, int bucketCount) {
method offsets (line 173) | private static int[] offsets(int[] got, int[] expected) {
method min (line 181) | private static int min(int[] sizes) {
method max (line 189) | private static int max(int[] sizes) {
method plus (line 197) | private static int[] plus(int[] list, int plus) {
method posList (line 205) | private static int[] posList(int[] sizes) {
FILE: src/test/java/org/minperf/rank/Rank9Test.java
class Rank9Test (line 16) | public class Rank9Test {
method main (line 18) | public static void main(String... args) {
method testPerformance (line 23) | private void testPerformance() {
method test (line 93) | @Test
method test (line 103) | private static void test(int size) {
method testEmpty (line 109) | private static void testEmpty(int size) {
method testRandom (line 119) | private static void testRandom(int size) {
method testFull (line 148) | private static void testFull(int size) {
FILE: src/test/java/org/minperf/rank/RankTest.java
class RankTest (line 17) | public class RankTest {
method main (line 19) | public static void main(String... args) {
method test (line 23) | @Test
method test (line 47) | private static void test(int size) {
method testEmpty (line 53) | private static void testEmpty(int size) {
method testRandom (line 66) | private static void testRandom(int size) {
method testFull (line 95) | private static void testFull(int size) {
method reopen (line 108) | private static VerySimpleRank reopen(VerySimpleRank rank, BitBuffer bu...
FILE: src/test/java/org/minperf/select/SelectTest.java
class SelectTest (line 15) | public class SelectTest {
method main (line 17) | public static void main(String... args) {
method testBitInInt (line 28) | @Test
method testLongSelectPerformance (line 72) | private static void testLongSelectPerformance() {
method testSelect (line 92) | @Test
method testSelect (line 102) | private static void testSelect(int size, int fill) {
method testPerformance (line 146) | private static void testPerformance() {
FILE: src/test/java/org/minperf/simple/LongCollection.java
class LongCollection (line 11) | public class LongCollection implements Collection<Long> {
method main (line 13) | public static void main(String... args) {
method LongCollection (line 40) | LongCollection(long[] data) {
method size (line 44) | @Override
method isEmpty (line 49) | @Override
method contains (line 54) | @Override
method iterator (line 70) | @Override
method toArray (line 89) | @Override
method toArray (line 94) | @Override
method add (line 99) | @Override
method remove (line 104) | @Override
method containsAll (line 109) | @Override
method addAll (line 114) | @Override
method removeAll (line 119) | @Override
method retainAll (line 124) | @Override
method clear (line 129) | @Override
FILE: src/test/java/org/minperf/simple/SimpleRecSplit.java
class SimpleRecSplit (line 15) | public class SimpleRecSplit {
method universalHash (line 40) | static int universalHash(String x, int index, int mod) {
class Generator (line 48) | public static class Generator {
method generate (line 57) | public static int[] generate(Set<String> set) {
method partition (line 91) | static List<Set<String>> partition(Set<String> set, int bucketCount) {
method processRecursively (line 109) | static void processRecursively(Set<String> set, List<Integer> descri...
method canMapDirectly (line 140) | static boolean canMapDirectly(Set<String> set, int index) {
method trySplit (line 156) | static List<Set<String>> trySplit(Set<String> set, int index) {
class Evaluator (line 173) | public static class Evaluator {
method evaluate (line 182) | public static int evaluate(String x, int[] description) {
method skip (line 217) | static int skip(int[] description, int setSize, int pos) {
FILE: src/test/java/org/minperf/simple/SimpleTest.java
class SimpleTest (line 15) | public class SimpleTest {
method main (line 17) | public static void main(String... args) {
method compareSpace (line 25) | private static void compareSpace() {
method example (line 35) | private static void example() {
method printProbabilityOfLargeBucket (line 44) | private static void printProbabilityOfLargeBucket() {
method printAbcKeySample (line 61) | private static void printAbcKeySample() {
method printMonthSample (line 74) | private static void printMonthSample() {
method test (line 104) | public static void test() {
FILE: src/test/java/org/minperf/tools/Dump.java
class Dump (line 16) | public class Dump {
method main (line 18) | public static void main(String... args) throws IOException {
FILE: src/test/java/org/minperf/tools/Load.java
class Load (line 15) | public class Load {
method main (line 17) | public static void main(String... args) throws IOException {
FILE: src/test/java/org/minperf/utils/FastDigitFromNumberExtraction.java
class FastDigitFromNumberExtraction (line 11) | public class FastDigitFromNumberExtraction {
method main (line 13) | public static void main(String... args) {
method test (line 20) | private static void test() {
method getMaxArraySize (line 136) | static int getMaxArraySize(int base) {
method convertToBase3 (line 147) | static int convertToBase3(int[] data) {
method extractDivLoop (line 164) | static int extractDivLoop(int x, int index) {
method extractDivMod (line 179) | static int extractDivMod(int x, int index) {
method div3 (line 185) | static long div3(long y, int index) {
method extractMulMod (line 201) | static int extractMulMod(int x, int index) {
method extractMulMul (line 223) | static int extractMulMul(int x, int index) {
FILE: src/test/java/org/minperf/utils/TextTest.java
class TextTest (line 10) | public class TextTest {
method test (line 12) | @Test
Condensed preview — 103 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,037K chars).
[
{
"path": ".gitignore",
"chars": 55,
"preview": ".checkstyle\n.classpath\n.project\n.settings\nbin\n/target/\n"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "MAVEN.md",
"chars": 189,
"preview": "Please ensure that unit tests actually pass.\n\n```\n mvn clean install -DskipTests\n java -Xmx16g -cp target/minperf-1"
},
{
"path": "README.md",
"chars": 1180,
"preview": "# minperf\nA Minimal Perfect Hash Function Library.\n\n* Mainly written in Java. Includes a C version (currently only evalu"
},
{
"path": "pom.xml",
"chars": 2124,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "runjmh.sh",
"chars": 1178,
"preview": "mvn clean install -DskipTests && java -Xmx16g -cp target/minperf-1.0-SNAPSHOT-jar-with-dependencies.jar org.minperf.blo"
},
{
"path": "src/main/c/Makefile",
"chars": 841,
"preview": "# \n# RecSplit for C.\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file ex"
},
{
"path": "src/main/c/filter/Makefile",
"chars": 782,
"preview": "# \n# RecSplit for C.\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file ex"
},
{
"path": "src/main/c/filter/xor.c",
"chars": 5499,
"preview": "#include <stdio.h>\n#include <stddef.h>\n#include <stdlib.h>\n#include <stdint.h>\n#include <stdbool.h>\n#include <time.h>\n#i"
},
{
"path": "src/main/c/rec-split.c",
"chars": 17812,
"preview": "#include <stdio.h>\n#include <stddef.h>\n#include <stdlib.h>\n#include <stdint.h>\n#include <stdbool.h>\n#include <time.h>\n#i"
},
{
"path": "src/main/java/org/minperf/BitBuffer.java",
"chars": 9454,
"preview": "package org.minperf;\n\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\nimport java.util.Arrays;\n\n/**\n * A simple b"
},
{
"path": "src/main/java/org/minperf/RecSplitBuilder.java",
"chars": 2935,
"preview": "package org.minperf;\n\nimport java.util.Collection;\n\nimport org.minperf.generator.ConcurrencyTool;\nimport org.minperf.gen"
},
{
"path": "src/main/java/org/minperf/RecSplitEvaluator.java",
"chars": 6194,
"preview": "package org.minperf;\n\nimport org.minperf.bdz.BDZ;\nimport org.minperf.generator.Generator;\nimport org.minperf.monotoneLis"
},
{
"path": "src/main/java/org/minperf/Settings.java",
"chars": 333910,
"preview": "package org.minperf;\n\n/**\n * The settings used to generate the hash function.\n */\npublic class Settings {\n\npublic static"
},
{
"path": "src/main/java/org/minperf/bdz/BDZ.java",
"chars": 6731,
"preview": "package org.minperf.bdz;\n\nimport java.util.ArrayList;\nimport java.util.BitSet;\nimport java.util.Collection;\nimport java."
},
{
"path": "src/main/java/org/minperf/generator/ConcurrencyTool.java",
"chars": 1018,
"preview": "package org.minperf.generator;\n\nimport java.util.concurrent.ForkJoinPool;\nimport java.util.concurrent.ForkJoinTask;\n\n/**"
},
{
"path": "src/main/java/org/minperf/generator/Generator.java",
"chars": 17376,
"preview": "package org.minperf.generator;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport"
},
{
"path": "src/main/java/org/minperf/hash/HashPerformanceTest.java",
"chars": 2365,
"preview": "package org.minperf.hash;\n\nimport java.util.Random;\n\npublic class HashPerformanceTest {\n\n public static void main(Str"
},
{
"path": "src/main/java/org/minperf/hash/LongPair.java",
"chars": 98,
"preview": "package org.minperf.hash;\n\npublic class LongPair {\n public long val1;\n public long val2;\n}\n\n"
},
{
"path": "src/main/java/org/minperf/hash/Mix.java",
"chars": 1074,
"preview": "package org.minperf.hash;\n\npublic class Mix {\n\n public static int supplementalHashWeyl(long hash, long index) {\n "
},
{
"path": "src/main/java/org/minperf/hash/Murmur2.java",
"chars": 3731,
"preview": "package org.minperf.hash;\n\npublic class Murmur2 {\n\n public static final long UINT_MASK = 0xFFFFFFFFl;\n\n public sta"
},
{
"path": "src/main/java/org/minperf/hash/Murmur3.java",
"chars": 9394,
"preview": "/**\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance"
},
{
"path": "src/main/java/org/minperf/hash/SpookyHash.java",
"chars": 3998,
"preview": "package org.minperf.hash;\n\npublic class SpookyHash {\n\n static void hash128x32(byte[] key, int offset, int len, int se"
},
{
"path": "src/main/java/org/minperf/hash/XXHash64.java",
"chars": 8257,
"preview": "package org.minperf.hash;\n\nimport static java.lang.Long.rotateLeft;\n\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrd"
},
{
"path": "src/main/java/org/minperf/hem/HemGenerator.java",
"chars": 6182,
"preview": "package org.minperf.hem;\n\nimport java.io.BufferedInputStream;\nimport java.io.BufferedOutputStream;\nimport java.io.DataIn"
},
{
"path": "src/main/java/org/minperf/hem/KeyReader.java",
"chars": 13011,
"preview": "package org.minperf.hem;\n\nimport java.io.BufferedInputStream;\nimport java.io.DataInputStream;\nimport java.io.File;\nimpor"
},
{
"path": "src/main/java/org/minperf/hem/Sort.java",
"chars": 7803,
"preview": "package org.minperf.hem;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Random;\nimport java.util"
},
{
"path": "src/main/java/org/minperf/hem/SortedSignatures.java",
"chars": 9816,
"preview": "package org.minperf.hem;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.RandomAccessFile;\nimport java."
},
{
"path": "src/main/java/org/minperf/hem/recsplit/Builder.java",
"chars": 2019,
"preview": "package org.minperf.hem.recsplit;\n\nimport org.minperf.BitBuffer;\nimport org.minperf.hash.Mix;\n\npublic class Builder {\n\n "
},
{
"path": "src/main/java/org/minperf/hem/recsplit/FastEvaluator.java",
"chars": 3294,
"preview": "package org.minperf.hem.recsplit;\n\nimport org.minperf.BitBuffer;\nimport org.minperf.monotoneList.MultiStageMonotoneList;"
},
{
"path": "src/main/java/org/minperf/hem/recsplit/FastGenerator.java",
"chars": 10868,
"preview": "package org.minperf.hem.recsplit;\n\nimport java.util.Arrays;\n\nimport org.minperf.BitBuffer;\nimport org.minperf.monotoneLi"
},
{
"path": "src/main/java/org/minperf/monotoneList/EliasFanoMonotoneList.java",
"chars": 3547,
"preview": "package org.minperf.monotoneList;\n\nimport java.util.BitSet;\n\nimport org.minperf.BitBuffer;\nimport org.minperf.select.Sel"
},
{
"path": "src/main/java/org/minperf/monotoneList/MonotoneList.java",
"chars": 1104,
"preview": "package org.minperf.monotoneList;\n\nimport org.minperf.BitBuffer;\n\n/**\n * A list of monotone increasing values.\n */\npubli"
},
{
"path": "src/main/java/org/minperf/monotoneList/MultiStageMonotoneList.java",
"chars": 9430,
"preview": "package org.minperf.monotoneList;\n\nimport org.minperf.BitBuffer;\n\n/**\n * This implementation uses a linear regression, a"
},
{
"path": "src/main/java/org/minperf/rank/Rank9.java",
"chars": 4424,
"preview": "/*\n * Sux4J: Succinct data structures for Java\n *\n * Copyright (C) 2008-2016 Sebastiano Vigna\n *\n * This library is fre"
},
{
"path": "src/main/java/org/minperf/rank/VerySimpleRank.java",
"chars": 6337,
"preview": "package org.minperf.rank;\n\nimport java.util.BitSet;\n\nimport org.minperf.BitBuffer;\n\n/**\n * A simple rank+select data str"
},
{
"path": "src/main/java/org/minperf/select/Select.java",
"chars": 1644,
"preview": "package org.minperf.select;\n\nimport java.util.BitSet;\n\nimport org.minperf.BitBuffer;\n\n/**\n * A select data structure for"
},
{
"path": "src/main/java/org/minperf/select/SimpleSelect.java",
"chars": 24195,
"preview": "/*\n * Sux4J: Succinct data structures for Java\n *\n * Copyright (C) 2008-2016 Sebastiano Vigna\n *\n * This library is fre"
},
{
"path": "src/main/java/org/minperf/select/SimpleSelectWrapper.java",
"chars": 2595,
"preview": "package org.minperf.select;\n\n//import it.unimi.dsi.bits.LongArrayBitVector;\n//import it.unimi.dsi.sux4j.bits.SimpleSelec"
},
{
"path": "src/main/java/org/minperf/select/VerySimpleSelect.java",
"chars": 11029,
"preview": "package org.minperf.select;\n\nimport java.util.ArrayList;\nimport java.util.BitSet;\n\nimport org.minperf.BitBuffer;\n\n/**\n *"
},
{
"path": "src/main/java/org/minperf/universal/LongHash.java",
"chars": 1155,
"preview": "package org.minperf.universal;\n\n/**\n * A sample hash implementation for long keys.\n */\npublic class LongHash implements "
},
{
"path": "src/main/java/org/minperf/universal/StringHash.java",
"chars": 2715,
"preview": "package org.minperf.universal;\n\nimport java.nio.charset.Charset;\n\n/**\n * A hash implementation for string keys.\n */\npubl"
},
{
"path": "src/main/java/org/minperf/universal/UniversalHash.java",
"chars": 749,
"preview": "package org.minperf.universal;\n\n/**\n * An interface that can calculate multiple hash values for an object. The\n * return"
},
{
"path": "src/main/java/org/minperf/utils/LargeLongList.java",
"chars": 3919,
"preview": "package org.minperf.utils;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.RandomAccessFile;\nimport jav"
},
{
"path": "src/main/java/org/minperf/utils/LongSet.java",
"chars": 4162,
"preview": "package org.minperf.utils;\n\nimport java.util.AbstractSet;\nimport java.util.Iterator;\nimport java.util.Spliterator;\nimpor"
},
{
"path": "src/main/java/org/minperf/utils/PoissonDistribution.java",
"chars": 5061,
"preview": "/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOT"
},
{
"path": "src/main/java/org/minperf/utils/RandomSetGenerator.java",
"chars": 6907,
"preview": "package org.minperf.utils;\n\nimport java.util.Random;\n\n/**\n * A PRNG that returns unique (distinct) 64-bit entries in som"
},
{
"path": "src/main/java/org/minperf/utils/RandomSetGeneratorSlow.java",
"chars": 4752,
"preview": "package org.minperf.utils;\n\nimport java.util.HashSet;\nimport java.util.Iterator;\nimport java.util.Random;\n\n/**\n * A PRNG"
},
{
"path": "src/main/java/org/minperf/utils/Text.java",
"chars": 3327,
"preview": "package org.minperf.utils;\n\nimport java.util.Comparator;\n\nimport org.minperf.universal.StringHash;\nimport org.minperf.un"
},
{
"path": "src/test/java/org/minperf/BitCodes.java",
"chars": 14278,
"preview": "package org.minperf;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.fail;\n\nimport java.uti"
},
{
"path": "src/test/java/org/minperf/FunctionInfo.java",
"chars": 1546,
"preview": "package org.minperf;\n\n/**\n * The information (time and space usage) of a minimum perfect hash function.\n */\npublic class"
},
{
"path": "src/test/java/org/minperf/Graphics.java",
"chars": 10322,
"preview": "package org.minperf;\n\nimport java.util.HashMap;\nimport java.util.HashSet;\n\nimport org.minperf.generator.Generator;\nimpor"
},
{
"path": "src/test/java/org/minperf/LargeSetTest.java",
"chars": 4953,
"preview": "package org.minperf;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport st"
},
{
"path": "src/test/java/org/minperf/Paper.java",
"chars": 5170,
"preview": "package org.minperf;\n\nimport java.util.Random;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * A helper class to "
},
{
"path": "src/test/java/org/minperf/PerformanceTest.java",
"chars": 6421,
"preview": "package org.minperf;\n\nimport java.util.ArrayList;\nimport java.util.BitSet;\nimport java.util.HashSet;\nimport java.util.Ra"
},
{
"path": "src/test/java/org/minperf/Probability.java",
"chars": 11170,
"preview": "package org.minperf;\n\nimport java.math.BigDecimal;\nimport java.math.BigInteger;\nimport java.util.HashMap;\nimport java.ut"
},
{
"path": "src/test/java/org/minperf/RandomizedTest.java",
"chars": 71885,
"preview": "package org.minperf;\n\nimport static org.junit.Assert.assertTrue;\n\nimport java.lang.ref.WeakReference;\nimport java.sql.Ti"
},
{
"path": "src/test/java/org/minperf/SettingsTest.java",
"chars": 20173,
"preview": "package org.minperf;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\n\nimport ja"
},
{
"path": "src/test/java/org/minperf/SpaceEstimator.java",
"chars": 18839,
"preview": "package org.minperf;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java"
},
{
"path": "src/test/java/org/minperf/SplitRuleTest.java",
"chars": 9602,
"preview": "package org.minperf;\n\nimport java.util.ArrayList;\n\n/**\n * Generate and test split rules.\n */\npublic class SplitRuleTest "
},
{
"path": "src/test/java/org/minperf/SplitRuleTest2.java",
"chars": 8341,
"preview": "package org.minperf;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.uti"
},
{
"path": "src/test/java/org/minperf/SplitRuleTest3.java",
"chars": 8195,
"preview": "package org.minperf;\n\nimport java.util.Arrays;\nimport java.util.HashMap;\n\n/**\n * Generate and test split rules.\n */\npubl"
},
{
"path": "src/test/java/org/minperf/TestSplitStrategy.java",
"chars": 17915,
"preview": "package org.minperf;\n\nimport java.util.Arrays;\nimport java.util.Locale;\n\npublic class TestSplitStrategy {\n \n Split"
},
{
"path": "src/test/java/org/minperf/TextFileTest.java",
"chars": 9819,
"preview": "package org.minperf;\n\nimport java.io.BufferedWriter;\nimport java.io.FileOutputStream;\nimport java.io.FileWriter;\nimport "
},
{
"path": "src/test/java/org/minperf/TimeEstimator.java",
"chars": 8620,
"preview": "package org.minperf;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Random;\n\n/**\n * Methods to e"
},
{
"path": "src/test/java/org/minperf/WikipediaTest.java",
"chars": 9716,
"preview": "package org.minperf;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.RandomAccessFile;\nimport java.util"
},
{
"path": "src/test/java/org/minperf/bdz/BDZTest.java",
"chars": 2659,
"preview": "package org.minperf.bdz;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimpor"
},
{
"path": "src/test/java/org/minperf/c/HashGenerator.java",
"chars": 4028,
"preview": "package org.minperf.c;\n\nimport java.io.BufferedReader;\nimport java.io.FileReader;\nimport java.io.IOException;\nimport jav"
},
{
"path": "src/test/java/org/minperf/chd/CHD.java",
"chars": 4279,
"preview": "package org.minperf.chd;\n\nimport java.util.ArrayList;\nimport java.util.BitSet;\nimport java.util.Collection;\nimport java."
},
{
"path": "src/test/java/org/minperf/chd/CHD2.java",
"chars": 2935,
"preview": "package org.minperf.chd;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport "
},
{
"path": "src/test/java/org/minperf/chd/CHDTest.java",
"chars": 4444,
"preview": "package org.minperf.chd;\n\nimport java.util.BitSet;\nimport java.util.HashMap;\nimport java.util.Set;\n\nimport org.junit.Ass"
},
{
"path": "src/test/java/org/minperf/chd/EliasFanoList.java",
"chars": 2224,
"preview": "package org.minperf.chd;\n\nimport org.minperf.BitBuffer;\nimport org.minperf.monotoneList.EliasFanoMonotoneList;\n\npublic c"
},
{
"path": "src/test/java/org/minperf/chd/EliasFanoListTest.java",
"chars": 816,
"preview": "package org.minperf.chd;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport org.minperf.BitBuf"
},
{
"path": "src/test/java/org/minperf/cuckoo/CuckooHashMap.java",
"chars": 2306,
"preview": "package org.minperf.cuckoo;\n\nimport java.util.Map;\nimport java.util.Map.Entry;\n\nimport org.minperf.Settings;\nimport org."
},
{
"path": "src/test/java/org/minperf/cuckoo/CuckooHashTest.java",
"chars": 2874,
"preview": "package org.minperf.cuckoo;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\nimp"
},
{
"path": "src/test/java/org/minperf/cuckoo/CuckooLongKeyHashSet.java",
"chars": 2995,
"preview": "package org.minperf.cuckoo;\n\nimport java.util.Set;\n\n/**\n * A cuckoo hash set for long entries.\n */\npublic class CuckooLo"
},
{
"path": "src/test/java/org/minperf/hash/MixTest.java",
"chars": 8580,
"preview": "package org.minperf.hash;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.Random;\nimport java.util.UUID;"
},
{
"path": "src/test/java/org/minperf/hem/HEM.java",
"chars": 6248,
"preview": "package org.minperf.hem;\n\nimport java.io.File;\nimport java.util.HashSet;\nimport java.util.PrimitiveIterator;\n\nimport org"
},
{
"path": "src/test/java/org/minperf/hem/MetaFile.java",
"chars": 5912,
"preview": "package org.minperf.hem;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.i"
},
{
"path": "src/test/java/org/minperf/hem/RandomGenerator.java",
"chars": 2960,
"preview": "package org.minperf.hem;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.uti"
},
{
"path": "src/test/java/org/minperf/hem/recsplit/TestFast.java",
"chars": 3212,
"preview": "package org.minperf.hem.recsplit;\n\nimport java.util.BitSet;\n\nimport org.minperf.BitBuffer;\nimport org.minperf.BitCodes;\n"
},
{
"path": "src/test/java/org/minperf/hybrid/HybridTest.java",
"chars": 3243,
"preview": "package org.minperf.hybrid;\n\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimp"
},
{
"path": "src/test/java/org/minperf/medium/EstimateTimeForHugeSets.java",
"chars": 13937,
"preview": "package org.minperf.medium;\n\nimport java.math.BigInteger;\n\nimport org.minperf.Probability;\n\npublic class EstimateTimeFor"
},
{
"path": "src/test/java/org/minperf/medium/EstimateTwoBillionEntries.java",
"chars": 4963,
"preview": "package org.minperf.medium;\n\nimport java.util.BitSet;\nimport java.util.Random;\n\npublic class EstimateTwoBillionEntries {"
},
{
"path": "src/test/java/org/minperf/medium/MediumRecSplit.java",
"chars": 10509,
"preview": "package org.minperf.medium;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.LinkedHashSet;\nimpor"
},
{
"path": "src/test/java/org/minperf/medium/MediumTest.java",
"chars": 6809,
"preview": "package org.minperf.medium;\n\nimport java.util.HashSet;\nimport java.util.Random;\nimport java.util.Set;\n\nimport org.junit."
},
{
"path": "src/test/java/org/minperf/medium/PartitionIntoSimilarSizedSets.java",
"chars": 6557,
"preview": "package org.minperf.medium;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\n\nimp"
},
{
"path": "src/test/java/org/minperf/medium/RecSplitEliasFano.java",
"chars": 1711,
"preview": "package org.minperf.medium;\n\nimport org.minperf.BitCodes;\nimport org.minperf.Probability;\n\npublic class RecSplitEliasFan"
},
{
"path": "src/test/java/org/minperf/medium/SimulateProbFallIntoLarge.java",
"chars": 1144,
"preview": "package org.minperf.medium;\n\nimport java.util.Random;\n\npublic class SimulateProbFallIntoLarge {\n public static void m"
},
{
"path": "src/test/java/org/minperf/medium/TestBBHash.java",
"chars": 3109,
"preview": "package org.minperf.medium;\n\nimport java.util.ArrayList;\nimport java.util.BitSet;\nimport java.util.Collection;\nimport ja"
},
{
"path": "src/test/java/org/minperf/monotoneList/FenwickTreeMonotoneList.java",
"chars": 1411,
"preview": "package org.minperf.monotoneList;\n\n\n/**\n * A monotone list that uses a fenwick tree.\n */\npublic class FenwickTreeMonoton"
},
{
"path": "src/test/java/org/minperf/monotoneList/MonotoneListTest.java",
"chars": 8027,
"preview": "package org.minperf.monotoneList;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.Random;\n\nimport org.ju"
},
{
"path": "src/test/java/org/minperf/rank/Rank9Test.java",
"chars": 4885,
"preview": "package org.minperf.rank;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimpo"
},
{
"path": "src/test/java/org/minperf/rank/RankTest.java",
"chars": 3647,
"preview": "package org.minperf.rank;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimpo"
},
{
"path": "src/test/java/org/minperf/select/SelectTest.java",
"chars": 7897,
"preview": "package org.minperf.select;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.BitSet;\nimport java.util.Ran"
},
{
"path": "src/test/java/org/minperf/simple/LongCollection.java",
"chars": 3265,
"preview": "package org.minperf.simple;\n\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Iterator;\n\nimport or"
},
{
"path": "src/test/java/org/minperf/simple/SimpleRecSplit.java",
"chars": 7686,
"preview": "package org.minperf.simple;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.LinkedHashSet;\nimpor"
},
{
"path": "src/test/java/org/minperf/simple/SimpleTest.java",
"chars": 4187,
"preview": "package org.minperf.simple;\n\nimport java.time.Month;\nimport java.time.format.TextStyle;\nimport java.util.Arrays;\nimport "
},
{
"path": "src/test/java/org/minperf/simple/recsplit.md",
"chars": 10680,
"preview": "## Minimal Perfect Hashing with RecSplit\n\n### Use Cases\n\nThis could be a Facebook interview question:\nYour task is to fi"
},
{
"path": "src/test/java/org/minperf/tools/Dump.java",
"chars": 2761,
"preview": "package org.minperf.tools;\n\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimp"
},
{
"path": "src/test/java/org/minperf/tools/Load.java",
"chars": 2098,
"preview": "package org.minperf.tools;\n\nimport java.io.IOException;\nimport java.io.RandomAccessFile;\nimport java.util.BitSet;\n\nimpor"
},
{
"path": "src/test/java/org/minperf/utils/FastDigitFromNumberExtraction.java",
"chars": 7097,
"preview": "package org.minperf.utils;\n\nimport java.util.Random;\n\n/**\n * Utility class to quickly extract a single base-3 digit from"
},
{
"path": "src/test/java/org/minperf/utils/TextTest.java",
"chars": 496,
"preview": "package org.minperf.utils;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\n\n/**\n * Tests the text "
}
]
About this extraction
This page contains the full source code of the thomasmueller/minperf GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 103 files (983.5 KB), approximately 405.3k tokens, and a symbol index with 919 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.