You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2021/01/24 23:22:30 UTC
[commons-io] branch master updated: Improved performance of
IOUtils.contentEquals(InputStream, InputStream).
This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git
The following commit(s) were added to refs/heads/master by this push:
new 5bed26f Improved performance of IOUtils.contentEquals(InputStream, InputStream).
5bed26f is described below
commit 5bed26f67efa370f55065e98206a4358e47c7df1
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun Jan 24 18:22:25 2021 -0500
Improved performance of IOUtils.contentEquals(InputStream, InputStream).
This is based on the PR https://github.com/apache/commons-io/pull/118 by
XenoAmess but only for this one method.
---
src/changes/changes.xml | 3 +
src/main/java/org/apache/commons/io/IOUtils.java | 49 ++--
.../org/apache/commons/io/IOUtilsTestCase.java | 8 +
.../IOUtilsContentEqualsInputStreamsBenchmark.java | 238 ++++++++++++++++++++
.../org/apache/commons/io/abitmorethan16k.txt | 248 +++++++++++++++++++++
.../org/apache/commons/io/abitmorethan16kcopy.txt | 248 +++++++++++++++++++++
6 files changed, 781 insertions(+), 13 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 0f839f9..022bb3f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -194,6 +194,9 @@ The <action> type attribute can be add,update,fix,remove.
<action dev="ggregory" type="update" due-to="Dependabot">
Bump jimfs from 1.1 to 1.2 #183.
</action>
+ <action dev="ggregory" type="update" due-to="XenoAmess, Gary Gregory">
+ Improved performance of IOUtils.contentEquals(InputStream, InputStream).
+ </action>
</release>
<!-- The release date is the date RC is cut -->
<release version="2.8.0" date="2020-09-05" description="Java 8 required.">
diff --git a/src/main/java/org/apache/commons/io/IOUtils.java b/src/main/java/org/apache/commons/io/IOUtils.java
index 2e737ef..2e68824 100644
--- a/src/main/java/org/apache/commons/io/IOUtils.java
+++ b/src/main/java/org/apache/commons/io/IOUtils.java
@@ -744,26 +744,49 @@ public class IOUtils {
* @throws NullPointerException if either input is null
* @throws IOException if an I/O error occurs
*/
- @SuppressWarnings("resource")
- public static boolean contentEquals(final InputStream input1, final InputStream input2)
- throws IOException {
+ public static boolean contentEquals(final InputStream input1, final InputStream input2) throws IOException {
+ // Before making any changes, please test with
+ // org.apache.commons.io.jmh.IOUtilsContentEqualsInputStreamsBenchmark
if (input1 == input2) {
return true;
}
- if (input1 == null ^ input2 == null) {
+ if (input1 == null || input2 == null) {
return false;
}
- final BufferedInputStream bufferedInput1 = buffer(input1);
- final BufferedInputStream bufferedInput2 = buffer(input2);
- int ch = bufferedInput1.read();
- while (EOF != ch) {
- final int ch2 = bufferedInput2.read();
- if (ch != ch2) {
- return false;
+
+ final byte[] array1 = new byte[DEFAULT_BUFFER_SIZE];
+ final byte[] array2 = new byte[DEFAULT_BUFFER_SIZE];
+ int pos1;
+ int pos2;
+ int count1;
+ int count2;
+ while (true) {
+ pos1 = 0;
+ pos2 = 0;
+ for (int index = 0; index < DEFAULT_BUFFER_SIZE; index++) {
+ if (pos1 == index) {
+ do {
+ count1 = input1.read(array1, pos1, DEFAULT_BUFFER_SIZE - pos1);
+ } while (count1 == 0);
+ if (count1 == EOF) {
+ return pos2 == index && input2.read() == EOF;
+ }
+ pos1 += count1;
+ }
+ if (pos2 == index) {
+ do {
+ count2 = input2.read(array2, pos2, DEFAULT_BUFFER_SIZE - pos2);
+ } while (count2 == 0);
+ if (count2 == EOF) {
+ return pos1 == index && input1.read() == EOF;
+ }
+ pos2 += count2;
+ }
+ if (array1[index] != array2[index]) {
+ return false;
+ }
}
- ch = bufferedInput1.read();
}
- return bufferedInput2.read() == EOF;
}
/**
diff --git a/src/test/java/org/apache/commons/io/IOUtilsTestCase.java b/src/test/java/org/apache/commons/io/IOUtilsTestCase.java
index b662d26..9b4d41e 100644
--- a/src/test/java/org/apache/commons/io/IOUtilsTestCase.java
+++ b/src/test/java/org/apache/commons/io/IOUtilsTestCase.java
@@ -548,6 +548,14 @@ public class IOUtilsTestCase {
new ByteArrayInputStream(bytes2XDefaultA2)));
assertTrue(IOUtils.contentEquals(new ByteArrayInputStream(bytes2XDefaultA),
new ByteArrayInputStream(bytes2XDefaultA)));
+ // FileInputStream a bit more than 16 k.
+ try (
+ final FileInputStream input1 = new FileInputStream(
+ "src/test/resources/org/apache/commons/io/abitmorethan16k.txt");
+ final FileInputStream input2 = new FileInputStream(
+ "src/test/resources/org/apache/commons/io/abitmorethan16kcopy.txt")) {
+ assertTrue(IOUtils.contentEquals(input1, input1));
+ }
}
@Test
diff --git a/src/test/java/org/apache/commons/io/jmh/IOUtilsContentEqualsInputStreamsBenchmark.java b/src/test/java/org/apache/commons/io/jmh/IOUtilsContentEqualsInputStreamsBenchmark.java
new file mode 100644
index 0000000..b33bd81
--- /dev/null
+++ b/src/test/java/org/apache/commons/io/jmh/IOUtilsContentEqualsInputStreamsBenchmark.java
@@ -0,0 +1,238 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.commons.io.jmh;
+
+import static org.apache.commons.io.IOUtils.DEFAULT_BUFFER_SIZE;
+import static org.apache.commons.io.IOUtils.EOF;
+import static org.apache.commons.io.IOUtils.buffer;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.infra.Blackhole;
+
+/**
+ * Test different implementations of {@link IOUtils#contentEquals(InputStream, InputStream)}.
+ *
+ * <pre>
+ * Benchmark Mode Cnt Score Error Units
+ * IOUtilsContentEqualsInputStreamsBenchmark.testFileCurrent avgt 5 1518342.821 ▒ 201890.705 ns/op
+ * IOUtilsContentEqualsInputStreamsBenchmark.testFilePr118 avgt 5 1578606.938 ▒ 66980.718 ns/op
+ * IOUtilsContentEqualsInputStreamsBenchmark.testFileRelease_2_8_0 avgt 5 2439163.068 ▒ 265765.294 ns/op
+ * IOUtilsContentEqualsInputStreamsBenchmark.testStringCurrent avgt 5 10389834700.000 ▒ 330301175.219 ns/op
+ * IOUtilsContentEqualsInputStreamsBenchmark.testStringPr118 avgt 5 10890915400.000 ▒ 3251289634.067 ns/op
+ * IOUtilsContentEqualsInputStreamsBenchmark.testStringRelease_2_8_0 avgt 5 12522802960.000 ▒ 111147669.527 ns/op
+ * </pre>
+ */
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+@State(Scope.Thread)
+@Warmup(iterations = 5, time = 10, timeUnit = TimeUnit.SECONDS)
+@Measurement(iterations = 5, time = 10, timeUnit = TimeUnit.SECONDS)
+@Fork(value = 1, jvmArgs = {"-server"})
+public class IOUtilsContentEqualsInputStreamsBenchmark {
+
+ private static final String TEST_PATH_A = "/org/apache/commons/io/testfileBOM.xml";
+ private static final String TEST_PATH_16K_A = "/org/apache/commons/io/abitmorethan16k.txt";
+ private static final String TEST_PATH_16K_A_COPY = "/org/apache/commons/io/abitmorethan16kcopy.txt";
+ private static final String TEST_PATH_B = "/org/apache/commons/io/testfileNoBOM.xml";
+ private static final Charset DEFAULT_CHARSET = Charset.defaultCharset();
+ static String[] STRINGS = new String[5];
+
+ static {
+ STRINGS[0] = StringUtils.repeat("ab", 1 << 24);
+ STRINGS[1] = STRINGS[0] + 'c';
+ STRINGS[2] = STRINGS[0] + 'd';
+ STRINGS[3] = StringUtils.repeat("ab\rab\n", 1 << 24);
+ STRINGS[4] = StringUtils.repeat("ab\r\nab\r", 1 << 24);
+ }
+
+ static String SPECIAL_CASE_STRING_0 = StringUtils.repeat(StringUtils.repeat("ab", 1 << 24) + '\n', 2);
+ static String SPECIAL_CASE_STRING_1 = StringUtils.repeat(StringUtils.repeat("cd", 1 << 24) + '\n', 2);
+
+ @SuppressWarnings("resource")
+ public static boolean contentEquals_release_2_8_0(final InputStream input1, final InputStream input2)
+ throws IOException {
+ if (input1 == input2) {
+ return true;
+ }
+ if (input1 == null ^ input2 == null) {
+ return false;
+ }
+ final BufferedInputStream bufferedInput1 = buffer(input1);
+ final BufferedInputStream bufferedInput2 = buffer(input2);
+ int ch = bufferedInput1.read();
+ while (EOF != ch) {
+ final int ch2 = bufferedInput2.read();
+ if (ch != ch2) {
+ return false;
+ }
+ ch = bufferedInput1.read();
+ }
+ return bufferedInput2.read() == EOF;
+
+ }
+
+ public static boolean contentEqualsPr118(final InputStream input1, final InputStream input2) throws IOException {
+ if (input1 == input2) {
+ return true;
+ }
+ if (input1 == null || input2 == null) {
+ return false;
+ }
+
+ final byte[] array1 = new byte[DEFAULT_BUFFER_SIZE];
+ final byte[] array2 = new byte[DEFAULT_BUFFER_SIZE];
+ int pos1;
+ int pos2;
+ int count1;
+ int count2;
+ while (true) {
+ pos1 = 0;
+ pos2 = 0;
+ for (int index = 0; index < DEFAULT_BUFFER_SIZE; index++) {
+ if (pos1 == index) {
+ do {
+ count1 = input1.read(array1, pos1, DEFAULT_BUFFER_SIZE - pos1);
+ } while (count1 == 0);
+ if (count1 == EOF) {
+ return pos2 == index && input2.read() == EOF;
+ }
+ pos1 += count1;
+ }
+ if (pos2 == index) {
+ do {
+ count2 = input2.read(array2, pos2, DEFAULT_BUFFER_SIZE - pos2);
+ } while (count2 == 0);
+ if (count2 == EOF) {
+ return pos1 == index && input1.read() == EOF;
+ }
+ pos2 += count2;
+ }
+ if (array1[index] != array2[index]) {
+ return false;
+ }
+ }
+ }
+ }
+
+ @Benchmark
+ public boolean[] testFileCurrent() throws IOException {
+ final boolean[] res = new boolean[3];
+ try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_A);
+ InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_B)) {
+ res[0] = IOUtils.contentEquals(inputStream1, inputStream1);
+ }
+ try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_A);
+ InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_A);) {
+ res[1] = IOUtils.contentEquals(inputStream1, inputStream2);
+ }
+ try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_16K_A);
+ InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_16K_A_COPY);) {
+ res[2] = IOUtils.contentEquals(inputStream1, inputStream2);
+ }
+ return res;
+ }
+
+ @Benchmark
+ public boolean[] testFilePr118() throws IOException {
+ final boolean[] res = new boolean[3];
+ try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_A);
+ InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_B)) {
+ res[0] = contentEqualsPr118(inputStream1, inputStream1);
+ }
+ try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_A);
+ InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_A);) {
+ res[1] = contentEqualsPr118(inputStream1, inputStream2);
+ }
+ try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_16K_A);
+ InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_16K_A_COPY);) {
+ res[2] = contentEqualsPr118(inputStream1, inputStream2);
+ }
+ return res;
+ }
+
+ @Benchmark
+ public boolean[] testFileRelease_2_8_0() throws IOException {
+ final boolean[] res = new boolean[3];
+ try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_A);
+ InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_B)) {
+ res[0] = contentEquals_release_2_8_0(inputStream1, inputStream1);
+ }
+ try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_A);
+ InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_A);) {
+ res[1] = contentEquals_release_2_8_0(inputStream1, inputStream2);
+ }
+ try (InputStream inputStream1 = this.getClass().getResourceAsStream(TEST_PATH_16K_A);
+ InputStream inputStream2 = this.getClass().getResourceAsStream(TEST_PATH_16K_A_COPY);) {
+ res[2] = contentEquals_release_2_8_0(inputStream1, inputStream2);
+ }
+ return res;
+ }
+
+ @Benchmark
+ public void testStringCurrent(final Blackhole blackhole) throws IOException {
+ for (int i = 0; i < 5; i++) {
+ for (int j = 0; j < 5; j++) {
+ try (InputStream inputReader1 = IOUtils.toInputStream(STRINGS[i], DEFAULT_CHARSET);
+ InputStream inputReader2 = IOUtils.toInputStream(STRINGS[j], DEFAULT_CHARSET)) {
+ blackhole.consume(IOUtils.contentEquals(inputReader1, inputReader2));
+ }
+ }
+ }
+ }
+
+ @Benchmark
+ public void testStringPr118(final Blackhole blackhole) throws IOException {
+ for (int i = 0; i < 5; i++) {
+ for (int j = 0; j < 5; j++) {
+ try (InputStream inputReader1 = IOUtils.toInputStream(STRINGS[i], DEFAULT_CHARSET);
+ InputStream inputReader2 = IOUtils.toInputStream(STRINGS[j], DEFAULT_CHARSET)) {
+ blackhole.consume(contentEqualsPr118(inputReader1, inputReader2));
+ }
+ }
+ }
+ }
+
+ @Benchmark
+ public void testStringRelease_2_8_0(final Blackhole blackhole) throws IOException {
+ for (int i = 0; i < 5; i++) {
+ for (int j = 0; j < 5; j++) {
+ try (InputStream inputReader1 = IOUtils.toInputStream(STRINGS[i], DEFAULT_CHARSET);
+ InputStream inputReader2 = IOUtils.toInputStream(STRINGS[j], DEFAULT_CHARSET)) {
+ blackhole.consume(contentEquals_release_2_8_0(inputReader1, inputReader2));
+ }
+ }
+ }
+ }
+
+}
diff --git a/src/test/resources/org/apache/commons/io/abitmorethan16k.txt b/src/test/resources/org/apache/commons/io/abitmorethan16k.txt
new file mode 100644
index 0000000..57f6249
--- /dev/null
+++ b/src/test/resources/org/apache/commons/io/abitmorethan16k.txt
@@ -0,0 +1,248 @@
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements. See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership. The ASF licenses this file
+## to you 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.
+
+a bit more than 16 K
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
diff --git a/src/test/resources/org/apache/commons/io/abitmorethan16kcopy.txt b/src/test/resources/org/apache/commons/io/abitmorethan16kcopy.txt
new file mode 100644
index 0000000..57f6249
--- /dev/null
+++ b/src/test/resources/org/apache/commons/io/abitmorethan16kcopy.txt
@@ -0,0 +1,248 @@
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements. See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership. The ASF licenses this file
+## to you 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.
+
+a bit more than 16 K
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679
+012345679 012345679 012345679 012345679 012345679 012345679 012345679