From 9ac7378863b374114d13c20970602fc35d0e0453 Mon Sep 17 00:00:00 2001 From: Scott Edlin Date: Thu, 10 May 2018 03:09:58 -0600 Subject: [PATCH] implement Num sqrt(int) and Num sqrt() for: (#266) * added trailing stop loss rule * added trade-awareness, fixed Trade#equals if the TrailingStopLossRule is used in the context of other rules ( e.g. using OrRule/AndRule ), this rule might not notice that the current trade has changed; thus, the extremum is wrong. This commit fixes this issue. * added test-cases for Trade#equals * implement Num sqrt(int) and Num sqrt() for: BigDecimalNum, DoubleNum, NaN, PrecisionNum Num: add Num sqrt(int) and Num sqrt() NumTest: add sqrt(int) and sqrt() tests * changelog * numTest.properties: changed property names NumTest: moved into num/ and changed property names --- CHANGELOG.md | 1 + .../java/org/ta4j/core/num/BigDecimalNum.java | 518 ++++++++++++++++++ .../java/org/ta4j/core/num/DoubleNum.java | 13 + .../src/main/java/org/ta4j/core/num/NaN.java | 10 + .../src/main/java/org/ta4j/core/num/Num.java | 13 + .../java/org/ta4j/core/num/PrecisionNum.java | 83 ++- .../java/org/ta4j/core/{ => num}/NumTest.java | 79 ++- .../org/ta4j/core/num/numTest.properties | 2 + 8 files changed, 710 insertions(+), 9 deletions(-) create mode 100644 ta4j-core/src/main/java/org/ta4j/core/num/BigDecimalNum.java rename ta4j-core/src/test/java/org/ta4j/core/{ => num}/NumTest.java (73%) create mode 100644 ta4j-core/src/test/resources/org/ta4j/core/num/numTest.properties diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fc97c8e8..f81076b9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ Changelog for `ta4j`, roughly following [keepachangelog.com](http://keepachangel - **BollingerBandsMiddleIndicator**: added missing constructor documentation. - **PrecisionNum**: `Num` implementation to support arbitrary precision - **TrailingStopLossRule**: new rule that is satisfied if trailing stop loss is reached +- **Num**: added Num sqrt(int) and Num sqrt() ### Removed/Deprecated - **Decimal**: _removed_. Replaced by `Num` interface diff --git a/ta4j-core/src/main/java/org/ta4j/core/num/BigDecimalNum.java b/ta4j-core/src/main/java/org/ta4j/core/num/BigDecimalNum.java new file mode 100644 index 000000000..1657deed4 --- /dev/null +++ b/ta4j-core/src/main/java/org/ta4j/core/num/BigDecimalNum.java @@ -0,0 +1,518 @@ +/******************************************************************************* + * The MIT License (MIT) + * + * Copyright (c) 2014-2017 Marc de Verdelhan, 2017-2018 Ta4j Organization + * & respective authors (see AUTHORS) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *******************************************************************************/ +package org.ta4j.core.num; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; +import java.util.Objects; +import java.util.function.Function; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.ta4j.core.num.NaN.NaN; +/** + * Representation of BigDecimal. High precision, low performance. + * A {@code Num} consists of a {@code BigDecimal} with arbitrary {@link MathContext} (precision and rounding mode). + * + * @see BigDecimal + * @see MathContext + * @see RoundingMode + * @see Num + * + */ +public final class BigDecimalNum implements Num { + + private static final long serialVersionUID = 785564782721079992L; + + private static int PRECISION = 32; + + private static final MathContext MATH_CONTEXT = new MathContext(32, RoundingMode.HALF_UP); + + private final BigDecimal delegate; + + /** The logger */ + protected final static Logger log = LoggerFactory.getLogger(BigDecimalNum.class); + + @Override + public Function function() { + return BigDecimalNum::valueOf; + } + + /** + * Constructor. + * @param val the string representation of the Num value + */ + private BigDecimalNum(String val) { + delegate = new BigDecimal(val, MATH_CONTEXT); + } + + private BigDecimalNum(short val) { + delegate = new BigDecimal(val, MATH_CONTEXT); + } + + private BigDecimalNum(int val) { + delegate = BigDecimal.valueOf(val); + } + + private BigDecimalNum(long val) { + delegate = BigDecimal.valueOf(val); + } + + private BigDecimalNum(float val) { + delegate = new BigDecimal(val, MATH_CONTEXT); + } + + private BigDecimalNum(double val) { + delegate = BigDecimal.valueOf(val); + } + + private BigDecimalNum(BigDecimal val) { + delegate = new BigDecimal(val.toString(), MATH_CONTEXT); + } + + /** + * Returns the underlying {@link BigDecimal} delegate + * @return BigDecimal delegate instance of this instance + */ + public Number getDelegate(){ + return delegate; + } + + @Override + public String getName() { + return "BigDecimalNum"; + } + + + public Num plus(Num augend) { + return augend.isNaN() ? NaN : new BigDecimalNum(delegate.add(((BigDecimalNum)augend).delegate, MATH_CONTEXT)); + } + + /** + * Returns a {@code Num} whose value is {@code (this - augend)}, + * with rounding according to the context settings. + * @param subtrahend value to be subtracted from this {@code Num}. + * @return {@code this - subtrahend}, rounded as necessary + * @see BigDecimal#subtract(java.math.BigDecimal, java.math.MathContext) + */ + public Num minus(Num subtrahend) { + return subtrahend.isNaN() ? NaN : new BigDecimalNum(delegate.subtract(((BigDecimalNum)subtrahend).delegate, MATH_CONTEXT)); + } + + /** + * Returns a {@code Num} whose value is {@code this * multiplicand}, + * with rounding according to the context settings. + * @param multiplicand value to be multiplied by this {@code Num}. + * @return {@code this * multiplicand}, rounded as necessary + * @see BigDecimal#multiply(java.math.BigDecimal, java.math.MathContext) + */ + public Num multipliedBy(Num multiplicand) { + return multiplicand.isNaN() ? NaN : new BigDecimalNum(delegate.multiply(((BigDecimalNum)multiplicand).delegate, MATH_CONTEXT)); + } + + /** + * Returns a {@code Num} whose value is {@code (this / divisor)}, + * with rounding according to the context settings. + * @param divisor value by which this {@code Num} is to be divided. + * @return {@code this / divisor}, rounded as necessary + * @see BigDecimal#divide(java.math.BigDecimal, java.math.MathContext) + */ + public Num dividedBy(Num divisor) { + if (divisor.isNaN() || divisor.isZero()) { + return NaN; + } + BigDecimal bigDecimal = ((BigDecimalNum)divisor).delegate; + return new BigDecimalNum(delegate.divide(bigDecimal, MATH_CONTEXT)); + } + + /** + * Returns a {@code Num} whose value is {@code (this % divisor)}, + * with rounding according to the context settings. + * @param divisor value by which this {@code Num} is to be divided. + * @return {@code this % divisor}, rounded as necessary. + * @see BigDecimal#remainder(java.math.BigDecimal, java.math.MathContext) + */ + @Override + public Num remainder(Num divisor) { + if ( divisor.isNaN() || divisor.isZero()) { + return NaN; + } + return new BigDecimalNum(delegate.remainder(((BigDecimalNum)divisor).delegate, MATH_CONTEXT)); + } + + /** + * Returns a {@code Num} whose value is rounded down to the nearest whole number. + * @return thisn + */ + public Num floor() { + return new BigDecimalNum(delegate.setScale(0, RoundingMode.FLOOR)); + } + + /** + * Returns a {@code Num} whose value is rounded up to the nearest whole number. + * @return thisn + */ + public Num ceil() { + return new BigDecimalNum(delegate.setScale(0, RoundingMode.CEILING)); + } + + /** + * Returns a {@code Num} whose value is (thisn). + * @param n power to raise this {@code Num} to. + * @return thisn + * @see BigDecimal#pow(int, java.math.MathContext) + */ + public Num pow(int n) { + return new BigDecimalNum(delegate.pow(n, MATH_CONTEXT)); + } + + /** + * Returns a {@code Num} whose value is (thisn). + * @param n power to raise this {@code Num} to. + * @return thisn + * @see BigDecimal#pow(int, java.math.MathContext) + */ + public Num pow(Num n) { + // Because BigDecimal.pow(BigDecimal) is not supported we need to find another way, we could do: + // Math.pow(a.doubleValue(), b.doubleValue()), but there is a better way: + // Perform X^(A+B)=X^A*X^B (B = remainder) + // As suggested: https://stackoverflow.com/a/3590314 + BigDecimal result; + BigDecimal power = ((BigDecimalNum)n).delegate; + int signOfPower = power.signum(); + power = power.multiply(new BigDecimal(signOfPower)); + + BigDecimal remainderOf2 = power.remainder(BigDecimal.ONE); + BigDecimal n2IntPart = power.subtract(remainderOf2); + + BigDecimal intPow = delegate.pow(n2IntPart.intValueExact(), MATH_CONTEXT); + BigDecimal doublePow = new BigDecimal(Math.pow(delegate.doubleValue(), remainderOf2.doubleValue())); + result = intPow.multiply(doublePow); + + if (signOfPower == -1) { + result = BigDecimal.ONE.divide(result, MATH_CONTEXT); + } + + return new BigDecimalNum(result); + } + /** + * Returns a {@code num} whose value is √(this). + * @return thisn + */ + @Override + public Num sqrt() { + // We can't use delegate.getPrecision(), because if the BigDecimal is '2' the precision is 1, + // which will result in very low accuracy + return sqrt(PRECISION); + } + + /** + * Returns a {@code num} whose value is √(this). + * @param precision to calculate. + * @return thisn + */ + @Override + public Num sqrt(int precision) { + log.trace("delegate {}", delegate); + int comparedToZero = delegate.compareTo(BigDecimal.ZERO); + switch (comparedToZero) { + case -1: + return NaN; + + case 0: + return BigDecimalNum.valueOf(0); + } + + // Direct implementation of the example in: + // https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method + MathContext precisionContext = new MathContext(precision, RoundingMode.HALF_UP); + BigDecimal estimate = new BigDecimal(delegate.toString(), precisionContext); + String string = String.format("%1.1e", estimate); + log.trace("scientific notation {}", string); + if (string.contains("e")) { + String[] parts = string.split("e"); + BigDecimal mantissa = new BigDecimal(parts[0]); + BigDecimal exponent = new BigDecimal(parts[1]); + if (exponent.remainder(new BigDecimal(2)).compareTo(BigDecimal.ZERO) > 0) { + exponent = exponent.subtract(BigDecimal.ONE); + mantissa = mantissa.multiply(BigDecimal.TEN); + log.trace("modified notatation {}e{}", mantissa, exponent); + } + BigDecimal estimatedMantissa = mantissa.compareTo(BigDecimal.TEN) < 0 ? new BigDecimal(2) : new BigDecimal(6); + BigDecimal estimatedExponent = exponent.divide(new BigDecimal(2)); + String estimateString = String.format("%sE%s", estimatedMantissa, estimatedExponent); + log.trace("x[0] =~ sqrt({}...*10^{}) =~ {}", mantissa, exponent, estimateString); + estimate = new BigDecimal(estimateString); + } + BigDecimal delta = null; + BigDecimal test = null; + BigDecimal sum = null; + BigDecimal newEstimate = null; + BigDecimal two = new BigDecimal(2); + String estimateString = null; + int endIndex; + int frontEndIndex; + int backStartIndex; + int i = 1; + do { + test = delegate.divide(estimate, precisionContext); + sum = estimate.add(test); + newEstimate = sum.divide(two, precisionContext); + delta = newEstimate.subtract(estimate).abs(); + estimate = newEstimate; + if (log.isTraceEnabled()) { + estimateString = String.format("%1." + precision + "e", estimate); + endIndex = estimateString.length(); + frontEndIndex = 20 > endIndex ? endIndex : 20; + backStartIndex = 20 > endIndex ? 0 : endIndex - 20; + log.trace("x[{}] = {}..{}, delta = {}", + i, + estimateString.substring(0, frontEndIndex), + estimateString.substring(backStartIndex, endIndex), + String.format("%1.1e", delta)); + i++; + } + } while (delta.compareTo(BigDecimal.ZERO) > 0); + return BigDecimalNum.valueOf(estimate); + } + + /** + * Returns a {@code Num} whose value is the absolute value + * of this {@code Num}. + * @return {@code abs(this)} + */ + public Num abs() { + return new BigDecimalNum(delegate.abs()); + } + + /** + * Checks if the value is zero. + * @return true if the value is zero, false otherwise + */ + public boolean isZero() { + return compareTo(BigDecimalNum.valueOf(0)) == 0; + } + + /** + * Checks if the value is greater than zero. + * @return true if the value is greater than zero, false otherwise + */ + public boolean isPositive() { + return compareTo(BigDecimalNum.valueOf(0)) > 0; + } + + /** + * Checks if the value is zero or greater. + * @return true if the value is zero or greater, false otherwise + */ + public boolean isPositiveOrZero() { + return compareTo(BigDecimalNum.valueOf(0)) >= 0; + } + + /** + * Checks if the value is less than zero. + * @return true if the value is less than zero, false otherwise + */ + public boolean isNegative() { + return compareTo(function().apply(0)) < 0; + } + + /** + * Checks if the value is zero or less. + * @return true if the value is zero or less, false otherwise + */ + public boolean isNegativeOrZero() { + return compareTo(BigDecimalNum.valueOf(0)) <= 0; + } + + /** + * Checks if this value is equal to another. + * @param other the other value, not null + * @return true is this is greater than the specified value, false otherwise + */ + public boolean isEqual(Num other) { + return !other.isNaN() && compareTo(other) == 0; + } + + /** + * Checks if this value is greater than another. + * @param other the other value, not null + * @return true is this is greater than the specified value, false otherwise + */ + public boolean isGreaterThan(Num other) { + return !other.isNaN() && compareTo(other) > 0; + } + + /** + * Checks if this value is greater than or equal to another. + * @param other the other value, not null + * @return true is this is greater than or equal to the specified value, false otherwise + */ + public boolean isGreaterThanOrEqual(Num other) { + return !other.isNaN() && compareTo(other) > -1; + } + + /** + * Checks if this value is less than another. + * @param other the other value, not null + * @return true is this is less than the specified value, false otherwise + */ + public boolean isLessThan(Num other) { + return !other.isNaN() && compareTo(other) < 0; + } + + @Override + public boolean isLessThanOrEqual(Num other) { + return !other.isNaN() && delegate.compareTo(((BigDecimalNum) other).delegate) < 1; + } + + public int compareTo(Num other) { + return other.isNaN() ? 0 : delegate.compareTo(((BigDecimalNum) other).delegate); + } + + /** + * Returns the minimum of this {@code Num} and {@code other}. + * @param other value with which the minimum is to be computed + * @return the {@code Num} whose value is the lesser of this + * {@code Num} and {@code other}. If they are equal, + * as defined by the {@link #compareTo(Num) compareTo} + * method, {@code this} is returned. + */ + public Num min(Num other) { + return other.isNaN() ? NaN : (compareTo(other) <= 0 ? this : other); + } + + /** + * Returns the maximum of this {@code Num} and {@code other}. + * @param other value with which the maximum is to be computed + * @return the {@code Num} whose value is the greater of this + * {@code Num} and {@code other}. If they are equal, + * as defined by the {@link #compareTo(Num) compareTo} + * method, {@code this} is returned. + */ + public Num max(Num other) { + return other.isNaN() ? NaN : (compareTo(other) >= 0 ? this : other); + } + + @Override + public int hashCode() { + return Objects.hash(delegate); + } + + /** + * {@inheritDoc} + * Warning: This method returns true if `this` and `obj` are both NaN.NaN. + */ + @Override + public boolean equals(Object obj) { + if (!(obj instanceof Num)) { + return false; + } + return !((Num) obj).isNaN() && this.delegate.compareTo(((BigDecimalNum) obj).delegate) == 0; + } + + /** + * Returns a {@code Num} version of the given {@code String}. + * @param val the number + * @return the {@code Num} + */ + public static Num valueOf(String val) { + return val.toUpperCase().equals("NAN") ? NaN : new BigDecimalNum(val); + } + + /** + * Returns a {@code Num} version of the given {@code short}. + * @param val the number + * @return the {@code Num} + */ + public static Num valueOf(short val) { + return new BigDecimalNum(val); + } + + /** + * Returns a {@code Num} version of the given {@code int}. + * @param val the number + * @return the {@code Num} + */ + public static Num valueOf(int val) { + return new BigDecimalNum(val); + } + + /** + * Returns a {@code Num} version of the given {@code long}. + * @param val the number + * @return the {@code Num} + */ + public static Num valueOf(long val) { + return new BigDecimalNum(val); + } + + /** + * Returns a {@code Num} version of the given {@code float}. + * @param val the number + * @return the {@code Num} + */ + public static Num valueOf(float val) { + return val == Float.NaN ? NaN : new BigDecimalNum(val); + } + + public static BigDecimalNum valueOf(BigDecimal val){ + return new BigDecimalNum(val); + } + + /** + * Returns a {@code Num} version of the given {@code double}. + * @param val the number + * @return the {@code Num} + */ + public static Num valueOf(double val) { + return val == Double.NaN ? NaN :new BigDecimalNum(val); + } + + /** + * Returns a {@code Num} version of the given {@code Num}. + * @param val the number + * @return the {@code Num} + */ + public static BigDecimalNum valueOf(BigDecimalNum val) { + return val; + } + + /** + * Returns a {@code Num} version of the given {@code Number}. + * Warning: This method turns the number into a string first + * @param val the number + * @return the {@code Num} + */ + public static BigDecimalNum valueOf(Number val) { + return new BigDecimalNum(val.toString()); + } + + @Override + public String toString(){ + return delegate.toString(); + } +} \ No newline at end of file diff --git a/ta4j-core/src/main/java/org/ta4j/core/num/DoubleNum.java b/ta4j-core/src/main/java/org/ta4j/core/num/DoubleNum.java index 9e9fd8e7e..603e86307 100644 --- a/ta4j-core/src/main/java/org/ta4j/core/num/DoubleNum.java +++ b/ta4j-core/src/main/java/org/ta4j/core/num/DoubleNum.java @@ -97,6 +97,19 @@ public Num pow(Num n) { return new DoubleNum(Math.pow(delegate,n.doubleValue())); } + @Override + public Num sqrt() { + if (delegate < 0) { + return NaN; + } + return new DoubleNum(Math.sqrt(delegate)); + } + + @Override + public Num sqrt(int precision) { + return sqrt(); + } + @Override public Num abs() { return new DoubleNum(Math.abs(delegate)); diff --git a/ta4j-core/src/main/java/org/ta4j/core/num/NaN.java b/ta4j-core/src/main/java/org/ta4j/core/num/NaN.java index 889a3f314..31aff4381 100644 --- a/ta4j-core/src/main/java/org/ta4j/core/num/NaN.java +++ b/ta4j-core/src/main/java/org/ta4j/core/num/NaN.java @@ -113,6 +113,16 @@ public Num pow(Num n) { return this; } + @Override + public Num sqrt() { + return this; + } + + @Override + public Num sqrt(int precision) { + return this; + } + @Override public Num abs() { return this; diff --git a/ta4j-core/src/main/java/org/ta4j/core/num/Num.java b/ta4j-core/src/main/java/org/ta4j/core/num/Num.java index c942debc1..175187010 100644 --- a/ta4j-core/src/main/java/org/ta4j/core/num/Num.java +++ b/ta4j-core/src/main/java/org/ta4j/core/num/Num.java @@ -101,6 +101,19 @@ public interface Num extends Comparable, Serializable { */ Num pow(Num n); + /** + * Returns a {@code num} whose value is √(this). + * @return thisn + */ + Num sqrt(); + + /** + * Returns a {@code num} whose value is √(this). + * @param precision to calculate. + * @return thisn + */ + Num sqrt(int precision); + /** * Returns a {@code num} whose value is the absolute value * of this {@code num}. diff --git a/ta4j-core/src/main/java/org/ta4j/core/num/PrecisionNum.java b/ta4j-core/src/main/java/org/ta4j/core/num/PrecisionNum.java index 0dabea4d1..a7d6426aa 100644 --- a/ta4j-core/src/main/java/org/ta4j/core/num/PrecisionNum.java +++ b/ta4j-core/src/main/java/org/ta4j/core/num/PrecisionNum.java @@ -245,15 +245,83 @@ public Num pow(int n) { } /** - * Returns the correctly rounded positive square root of the double value of this {@code Num}. - * /!\ Warning! Uses the {@code StrictMath#sqrt(double)} method under the hood. + * Returns the correctly rounded positive square root of this {@code Num}. + * /!\ Warning! Uses DEFAULT_PRECISION. * @return the positive square root of {@code this} - * @see StrictMath#sqrt(double) + * @see PrecisionNum#sqrt(int) */ public Num sqrt() { - // TODO: fix this - double doubleValue = delegate.doubleValue(); - return new PrecisionNum(StrictMath.sqrt(doubleValue)); + return sqrt(DEFAULT_PRECISION); + } + + /** + * Returns a {@code num} whose value is √(this). + * @param precision to calculate. + * @return thisn + */ + @Override + public Num sqrt(int precision) { + log.trace("delegate {}", delegate); + int comparedToZero = delegate.compareTo(BigDecimal.ZERO); + switch (comparedToZero) { + case -1: + return NaN; + + case 0: + return BigDecimalNum.valueOf(0); + } + + // Direct implementation of the example in: + // https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method + MathContext precisionContext = new MathContext(precision, RoundingMode.HALF_UP); + BigDecimal estimate = new BigDecimal(delegate.toString(), precisionContext); + String string = String.format("%1.1e", estimate); + log.trace("scientific notation {}", string); + if (string.contains("e")) { + String[] parts = string.split("e"); + BigDecimal mantissa = new BigDecimal(parts[0]); + BigDecimal exponent = new BigDecimal(parts[1]); + if (exponent.remainder(new BigDecimal(2)).compareTo(BigDecimal.ZERO) > 0) { + exponent = exponent.subtract(BigDecimal.ONE); + mantissa = mantissa.multiply(BigDecimal.TEN); + log.trace("modified notatation {}e{}", mantissa, exponent); + } + BigDecimal estimatedMantissa = mantissa.compareTo(BigDecimal.TEN) < 0 ? new BigDecimal(2) : new BigDecimal(6); + BigDecimal estimatedExponent = exponent.divide(new BigDecimal(2)); + String estimateString = String.format("%sE%s", estimatedMantissa, estimatedExponent); + log.trace("x[0] =~ sqrt({}...*10^{}) =~ {}", mantissa, exponent, estimateString); + estimate = new BigDecimal(estimateString); + } + BigDecimal delta = null; + BigDecimal test = null; + BigDecimal sum = null; + BigDecimal newEstimate = null; + BigDecimal two = new BigDecimal(2); + String estimateString = null; + int endIndex; + int frontEndIndex; + int backStartIndex; + int i = 1; + do { + test = delegate.divide(estimate, precisionContext); + sum = estimate.add(test); + newEstimate = sum.divide(two, precisionContext); + delta = newEstimate.subtract(estimate).abs(); + estimate = newEstimate; + if (log.isTraceEnabled()) { + estimateString = String.format("%1." + precision + "e", estimate); + endIndex = estimateString.length(); + frontEndIndex = 20 > endIndex ? endIndex : 20; + backStartIndex = 20 > endIndex ? 0 : endIndex - 20; + log.trace("x[{}] = {}..{}, delta = {}", + i, + estimateString.substring(0, frontEndIndex), + estimateString.substring(backStartIndex, endIndex), + String.format("%1.1e", delta)); + i++; + } + } while (delta.compareTo(BigDecimal.ZERO) > 0); + return PrecisionNum.valueOf(estimate, precision); } /** @@ -569,4 +637,5 @@ public Num pow(Num n) { BigDecimal result = xpowa.multiply(new BigDecimal(xpowb)); return new PrecisionNum(result.toString()); } -} \ No newline at end of file + +} diff --git a/ta4j-core/src/test/java/org/ta4j/core/NumTest.java b/ta4j-core/src/test/java/org/ta4j/core/num/NumTest.java similarity index 73% rename from ta4j-core/src/test/java/org/ta4j/core/NumTest.java rename to ta4j-core/src/test/java/org/ta4j/core/num/NumTest.java index d8da470c4..3db71649c 100644 --- a/ta4j-core/src/test/java/org/ta4j/core/NumTest.java +++ b/ta4j-core/src/test/java/org/ta4j/core/num/NumTest.java @@ -21,21 +21,29 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *******************************************************************************/ -package org.ta4j.core; +package org.ta4j.core.num; import org.junit.Test; import org.ta4j.core.indicators.AbstractIndicatorTest; import org.ta4j.core.num.DoubleNum; import org.ta4j.core.num.Num; import org.ta4j.core.num.PrecisionNum; +import org.ta4j.core.num.BigDecimalNum; +import java.io.InputStream; +import java.io.IOException; import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; +import java.net.URL; import java.util.function.Function; +import java.util.Properties; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertFalse; import static org.junit.Assert.assertTrue; import static org.ta4j.core.TestUtils.assertNumEquals; +import static org.ta4j.core.TestUtils.assertNumNotEquals; import static org.ta4j.core.num.NaN.NaN; @@ -227,5 +235,72 @@ public void testArithmetic(){ assertFalse(five.equals(five.function().apply((short)45))); } - //TODO: add precision tests for BigDecimalNum + @Test + public void sqrtOfBigInteger() { + String sqrtOfTwo = "1.4142135623730950488016887242096980785696718753769480731" + + "766797379907324784621070388503875343276415727350138462309122970249248360" + + "558507372126441214970999358314132226659275055927557999505011527820605715"; + + int precision = 200; + assertNumEquals(sqrtOfTwo, numOf(2).sqrt(precision)); + } + + @Test + public void sqrtOfBigDouble() { + String sqrtOfOnePointTwo = "1.095445115010332226913939565601604267905489389995966508453788899464986554245445467601716872327741252"; + + int precision = 100; + assertNumEquals(sqrtOfOnePointTwo, numOf(1.2).sqrt(precision)); + } + + @Test + public void sqrtOfNegativeDouble() { + assertTrue(numOf(-1.2).sqrt(12).isNaN()); + assertTrue(numOf(-1.2).sqrt().isNaN()); + } + + @Test + public void sqrtOfZero() { + assertNumEquals(0, numOf(0).sqrt(12)); + assertNumEquals(0, numOf(0).sqrt()); + } + + @Test + public void sqrtLudicrousPrecision() { + BigDecimal numBD = BigDecimal.valueOf(Double.MAX_VALUE).multiply(BigDecimal.valueOf(Double.MAX_VALUE).add(BigDecimal.ONE)); + Num sqrt = numOf(numBD).sqrt(100000); + if (numOf(0).getClass().equals(DoubleNum.class)) { + assertEquals("Infinity", sqrt.toString()); + } else if (numOf(0).getClass().equals(BigDecimalNum.class)) { + assertNumEquals("1.7976931348623157000000000000000E+308", sqrt); + assertNumNotEquals("1.7976931348623157000000000000001E+308", sqrt); + assertNumEquals(Double.MAX_VALUE, sqrt); + assertNumEquals(numOf(Double.MAX_VALUE), sqrt); + BigDecimal sqrtBD = new BigDecimal(sqrt.toString()); + assertNumEquals(numOf(numBD), numOf(sqrtBD.multiply(sqrtBD, new MathContext(99999, RoundingMode.HALF_UP)))); + assertNumEquals(numOf(numBD), sqrt.multipliedBy(sqrt)); + } else if (numOf(0).getClass().equals(PrecisionNum.class)) { + Properties props = new Properties(); + try (InputStream is = getClass().getResourceAsStream("numTest.properties")) { + props.load(is); + assertNumEquals(props.getProperty("sqrtCorrect100000"), sqrt); + assertNumNotEquals(props.getProperty("sqrtCorrect99999"), sqrt); + assertNumEquals(Double.MAX_VALUE, sqrt); + assertNumNotEquals(numOf(Double.MAX_VALUE), sqrt); + BigDecimal sqrtBD = new BigDecimal(sqrt.toString()); + assertNumEquals(numOf(numBD), numOf(sqrtBD.multiply(sqrtBD, new MathContext(99999, RoundingMode.HALF_UP)))); + assertNumNotEquals(numOf(numBD), sqrt.multipliedBy(sqrt)); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + } + + @Test + public void sqrtOddExponent() { + BigDecimal numBD = BigDecimal.valueOf(Double.valueOf("3E11")); + Num sqrt = numOf(numBD).sqrt(); + assertNumEquals("547722.55750516611345696978280080", sqrt); + } + } diff --git a/ta4j-core/src/test/resources/org/ta4j/core/num/numTest.properties b/ta4j-core/src/test/resources/org/ta4j/core/num/numTest.properties new file mode 100644 index 000000000..3fc49cd25 --- /dev/null +++ b/ta4j-core/src/test/resources/org/ta4j/core/num/numTest.properties @@ -0,0 +1,2 @@ +sqrtCorrect100000=179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.4999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999993046644192164994874360079705026995901684215093710228790647813901720323810208371063052355942804787698839333461082224380890058472813704702603998074668477638766794910055246453635992535119935298080344345066146984484863653471040992056524068142813526823306014611441519638203489953429844283070603542814095409765181526041434887028687663990954393782145835261669190985019969024507220093234604470816775962467901510182228678995916406492575832745827162656997781115207706017193395124709526323078974138958984633687366674109633713679219631028389377747787556223785456350016052008050477152932447985178709505785806972830985587504358668684154827857419582281000823797300150480793089364112065818887286747142024166712503096017985408463730367417363022247386389492612388759531951679705139077655660470770500376018422260655432519232106226621259007746818578461687865570718921412222590546239453373198770527391321984504914727732311928168617120934241814475034133612344834002845687973504699458502994818730121138935724932471622012895524425858028618437009857370725256671943368764880258033602793110214502217741906827623196189401439654729855373365399105408313679673399259064305953878039096187122886320827427267378985717505543638984951968376374233110900433300077185340592467620418673422824828264195023050736054261829145686829948147358020918311130169283009442003668013191443083591336383475664960804806062544580840265244819978679046151967711353648152637274096292235700724768879461856208916866683565759949031501856730287497894039442433513405233150383633622154302505421734497610730122530710351714664857241082464603153234802322214504431664879848724474613254078517424986502820466954109765500527588019958004461976733542167517615547899329427737064910432480668708048511829079599085619115491693019474012545981494982047206652830643128982773624970398293738316050545949973311998573467783123473101558382230803803356611568224562000375163080700673264906715539037461150978924177382350505196339802006259332397890424128986449685640750914611613387069883394486692986087398178967713857359660008724758297572598650076382991979395520970879188691158425891707443474447104687502241991882755440768310082747876411610822768462030784490267897928522842848408313577573806964247541655686772676591074664582518598271392997779448779964037727535661932457817544566094211779051516655473046325976872956222313089390066503414874725733596244701308850047048004489645054802809912470623062885490376996943309126835943818668002558269740946518343149760850794924369637824294956815668628451938489613742625007298162721525032587242774744411319794201222091325902276212380952943085597372055490873550550665621639847243497910095380230678022875821206838241962153455794965215531901992324189784535818503187531948671049635483105018232334672877055777886970818459035525157685819687831775572163691717709874763783845879884794156345751107056457515301950338743233694980865811728860235776895351649272960076267898594823118877380018068961699296277907105613593975268765531297291152922602413667452305029344255878943089360225393446530808104904038320927178437806668801552139800428813756848281859072390998944675160632310876615022664955289280223885987400745611157300719750375749552471459723448644348646132938111954150464754009066760779328483528333351899540920771015536028052138260140642056100946272365060738158963117541047155899827131368706005665874672341868343211295616592546546183272627263831302774518236248697754569521471681044260194749595202475168649510931086860187406541031795399572158961044562062683717583737486255750175084865666890172997579398781945693330969791865121976155513638009939139029341646917643343356989408629454979338636960297090148144165228605834564760759014644378484950237606128690771415120453063429328834034338853091755379435063508791425737198878767674982487944791173228595230145270199016281312943666010191224628316971277507890895589406537352855445253549265191491361504083199739195699122946646186100898433085344536923525838971248765327705376355902145165845629514253883390896328129921527565724136137674836878155693822060239809577073391384246257701131695609083641512160619085737765525695530567591618580711455314300018898982477691163929174830774370031590511205874011411972792051996209106986665354624616458412681741140732174629725924522844404199316790432557080522496026058212398585658005189735543714257681200191388870007795098746241030046937747763984894427186882374101321834016180807297063559551706631736218717640449688038068839981662753505477761211293795034095529146199712010026574429331827232504629915514915762713408260534093880306461073046432022401725790569103919930545741504389465748480771271789288206425276619038867957446675714900473697588014908547204529820573667205109142299391305086106723405652007216942979671863060896245121486505820207001981114307595079465133202814452768483931637506668344159227409145652962403057378595140941172758701096318246988210609046020634135405489128046645172764395809703667589579279374257702455919871753147212623630136216025033554965243834063215029167871708463908843823380726803128124651299649986768577203233844609949082552732848912376775072516922755026810052668952328604944363632467261785665598460826455023484596229818418703967911357140775650078440519812323166351151633108169248760473442514930235206612002338637430186852025486059219702779361761499208686522324557063763543978571014427646556704270554362851512660904940032071006365649729528482167733359896550509483527370178088774577194461592134194694066754644413129803973894473738036773113622967652369048406908536345157864712214359433611883426436105128450437884877868675496038436736630663747203417090171831324308419396822254675451490953753148465672244912868627428857600530860551906986965497395084753481013426143567482916324510347766144606135723567798582577594923928499240415298065738622644166306616790949956066818985292554062154766496748011731106980049416062184364567282369965830448897221284152983873220651923464921653975229090654366474349614912344197952475220286841602601585898366526321040897085617664627222443890466106051052993616621817103576115779722615348029839434011055019579552668893974726796595477005815637366819827309927156432287809500693126918442758463367104387845758106343333458514690583702886104936698574379007435436635452982531033102293825831632494352895577155424186417685411780072628486261851049626583336696917589038230743063120202281472530100309098351469209252968026838541878250588461075854916726291943292506712861395447114522100469458447479117018452567857795705921129366204507568410357654616098110500579642689526543045384109798393718654560727736448082088372114485576341991260378537578815509810305566846980249833811530186380660851081711007631370075821291558156474004991597456187079984465533790166164182436089744560413054303369657127989545088626271601619862292958565089282020858529150021986242785501737137447585923677548152092310281418102788670098610558311603030862227137403025663456637503321138942570217558610976032948068587122279987080656483026601632325986017095274424881732844286180471706700226718625443621277727944478317108182053789643788038679052587715364319685435142014754782622133685276641095313678895139771759686207233944822840628526247268112769516531594379005762229619307694212701553725783061822718515428058551640234614704530549388424713118213621549978117071088537174422329045043423897686784736283002081324187164126887464689155269913267574272283936043543955037402198504076674354313925381953817953751462949583586863296095089561463003356042936061608289773423704333320732955412577579039389525790343275544287263177413962080541180967408004060085448001321624760342257565352569302918839859536057016333333499690682437183475901687941281477786562030826981406158635961990936448276936633203845798101917574116545766467619246267079217578382722647738047681023453973577013127459346077663101913934387366969454039809021701622080173086848396884977817672155100712931026157588547533137495957624268412042140600141037180385766668182772663966001478201086975429164526552782330835127152890299202173857832182882753548039365150156421617863643292548449421139216647039477923464051700435783484976892953453834423650028962935533842522799413924236432037128382585405608175228239020265223265678094736021305474245831311562923349077282957773767433457693666678321063377848397796154473127552058999322489057276200468427221619186902897649677176897788713424484431374151122394018295424355272017788647327602340363945213723953206726651979859962906622528319125165430679507779273640194744505106999116884283209847203629946114466365633086053304088986074718424205741418269998868804312171244483694516395946349687935563234118435461484354281961196133193074704789340919158532236425138587236623636169389519614693420866131946784288982161775625135929149073798331772078894229423555943112015164905425037388350721135534893720612057683938107454912642836526521172907564286505381349952887635916723843573782814861657614285251973191939345169103791549121671420845859502365008479564213703767952148407808553587529449432330532040860476490012812017200299002717478698321759297881287442464855845274140481288767921211408947874231149103621721064982013663887869166027383555094505101096652668442777005756740437478582449718270764188328714630990150904381437001305624978647136853273212461298859045978873822520665578249283863687144810061569160827375350930904908227277608534761444182974621047965707354602319481166714898227303393802371298520874471991899378594019241251317610801583682705204839851645128247331391941188115040006409044966630381595649573236190100117200813251099813838719538601862411158778604596908930158176275974075560159008309023157962009057279614029838088410106307593932089745716221042486960297078966881671682981709310084686475097006967878889639299129002206537180799292191065826165443525351156247991291383073041837012667712487801105171699684573464359923830753165830430444135466102256349263471861705115545923407707823634301183385693690407760622806819174830382709264236396837512606737802380055319100414305610979171803526211783474372178560613097413794581893469116977939350749492029691189318860378128825166814217921805481296895765697737539188415008683520626270442798355078761324513212567944533917149123328262894340853623242564852403434608140272786817205260035459110014844491972678237352114790316895187730909573044369924465468456316439738187411642615945101653403381265802602745406648600134793944365655526523014165676225373842856423516025402777566351840178510923673830025802162113303670666036186943299461219183716501267080110502679427745408824151212273526870570831315643127770011997675126211541586057542671966837912582833642551410833815564517773668132992724822921518565718202841629468082613966107166968522497746376464747044084371917400724004182383629295347173646462144295909727789572666325082279228292948901887128523693598917886508448293882940516444184140406374934256354878370396172009101968736510316363979660141561539617319036596232324475712988339425638480081048400927425577652845288157301962599819022471793491466905903971554433322452451187465696663554220060362841974126154444650746014704712712427570242989370762227302425713820811449622498652800384271646967907696411751536529598994611076668708798197725525797617438273451638556182279814939860732062743956351532843063528445815756608577528761621122970305708984422153329709261137845620738057957840020664370454419930954943465065361305968046435073951829724102800642957872186934434916530932430501830233821024176086891402990193401443794966921462477210135255948935436577818966256282173739092232675105027485571160182740547231527058655089408463604549834028055172271944796349580902871155787178584286221974387388592153314356293658826822240890447341826497840011250383298945882413166479358358235231016605568413344334528694497276161882263596087280023249324543629258568912986890684315295368805873828837816170220180812029477112788638612476138217137168528347694155590834991626941500567230749175477567791581908952298168379797035433942190912877156637086285390123977565952771953970960610643019099426550081373990464997215475888290140113987684454549598074497838792184829991713777772817675224434009363408255988645922358685766028758056046769843397352415256279444639439650244003847793516284882892052541206920224312210640505446357272622205462810861690300536069596635283764242567565547411298960077370513894211346447003113655216582156768726914084050364437205682511839991495148838289069390430571202349198599561193408876739651458434100864283694652609978037928773998209296409210541648014193308090948796711259158491603272881681449220850042368175752075168452252996855948090266932869992158459275790660736172921894908366035288067350213019223166282538475906203406600839875030908543890197196667603778022726604622074957527254150316546013961454247172977238374214855996307208925828323552519520704184309671411887482746208388716004371373118652831322215585401705443950634305792732569758880721684055049353478784732491205193881918701639152230009286308922233707336899060070692590123299682869827472833655519614632005714714335612122952094984079475081712745364865306503354230938596124551568033337822388570546988221585810995260911231583916749839354679667607912076949723172889744259857362519270833991614917537092832450609991204310882299381160142434419729957132902586357212131887537843367340262888538247452642461902424744317033954781003168522438481967123038892532418532409043870686182478851970931077337432478161841996202459428094006177982364712364631055337948287783954881010050452916580722884078187023100524748984959073747980360860616710369166326142039498799449630912594778129305809063637237240279774133769259199576534626965486582698852529958856174363988636873658470924624497402598632399707514319806691364739146321962447250539832795731954598916853001263806118136979210178298444329293246875109569613892317109389652082297300906379342887620979917770175189510326482692450294039396947648753370543823619475184694192491180419832910205934323137271104737168856487143323310717368864798291609135983377752100881826472614318619008101310455381353470900018226728424440219804161124660781781773587324830764234336669627713203423180878629991865344563432289916168178739959497433146536522316092428718281648845129289693038462980718798897402661825662761504275052472207460285721418219505800815180735598761898054085177527066536415447493157470145674430268566926756282212161282992384448843034857541714236122691237187524217003261194566900731733883475400938917228473961416340971261604748639405741311279680441158782508557039918475424203869059015116366291420181583216042157015196230080931027287401111472465412003672294152099625923454668264910555703818331253299688754605761591143985592492750586386905963745202884462132701479720107308159310408312024935278624328017226532472458200101983497657404367927240944177730477574895325046605623260329709938312456146322564698379719840847796819229196515714560900945050623066972596402498715808857330158784908051546619126155421269673058067167409366675654813659929712830672407272484819934938449641164063994640810878697755131353675445565508991494622680232252411316268393535057502569687476229926874040035990619503980185829640494575860878527990004083082024818973992534577007685068208235516225410076684411599620445811071644744543654934035799356193879510411774525138593207996653911535202201752158116041023429916417787101538431131894453992723498674529990176127405558602995586345796926750992857025809477289030375658071445489740571013194900798152374562030380441904904172152674875470869806811118435594753795375991384601821534517977644999104653297541619875524979870552594384318950512690540475965947300866812679476449460167113265721600642727258198989696072007219332534116802077499349118412674428373452478500599508056658125255577292257145713274884649051240699155401623986927773244629440756372941805003992238982674319813300148884141636902172093841446066301571223167383271814440448915155680635538632658610040071209481832765345876352741495539688544537343802291653359670736202686006729912243352392307042284292490716426232585137827297961603998152021822571858110743251349601542193096478734914760619531237401811951688656829492076891637839268743008334092591547007032818240358534143725355886901796011090702797284008524768787454595456078786387621822115043966081735585303150545321353662147763271675429898828808423552219530631703669784056002008368520482779985673340306410524980158114376271010229278130617017186294998754473609379188297770984824182428642704181405112811639694207137217500917845559276198322430314114446219801937103139251201385963378965720024129799844327852371632138991238187039912388671703874679745031259461176391476725935282527494698912118526026078215747057333450369688743993149314002406810945504359266328196596610642725659696223405438467323628065508230854621494910125839968738114193989150420571129040350154230480340716934271518277907859007187356152493214154045210225061591755097430878005570331371638218119777921966367292125679702482494819944832972113187945264878042181134802362346672272415835764069921240585020333543793976724882873266831973400167082532909619691638121092314207049058742992154091370782902903719396368261604434494523968036096507371659441613191214429125941670302753691372820074568168185738413322926667083753504986814344312038862182739979526735507234016733870996827305968829606825648309918371808709134068350829578116489940566285281125411051999828132248594317953438707455832484125633832117340002216649170677473480009507753795409889393916911946617161659370205927957007658716768843604176231541644459917290309719451552354121235851776460393177831610318583273774198316021484210984133592422561149218615068827618518153085973642490120810724195924392883828345532911160284558901589438366366822532045100939014244538145699938652398768209809258371724983828732825812904317181200537970068485249699719344187971981430036171835979512435459630115034751317460058187645626181005494949498226638442808478212496879204228746191235679026524097721439571204584502216652717303285013620236824838280286310099729359314634329279450212859427324437596258321690832086524410725910043883448727077334429138345772054141552287801966552499649453059735953837628927647062869155215363637882436901608398492456074108191614760055338136215892340960543935388991759537178085807765297521947690117981857470343918380785232078109587383074018237601726716810702626699299310356016606730621488905665718093468667778404325661609480478438448252468431381823103869764982512173592198664979844739483084332760652500067873202962192917206554850443941425342650052031132028411472344400814244196853432525695466866242725826644451930892511020683372881259800921822151914672806918415893703328227241244937775050124904419485656343280107704753809534729888260520895766594848153637675866685602806527076028399635255816563559829518884058515598907379911730850274754213754789814670529257997556313450218620838310885062224391748488279756615498011064627609748977149819417347669380204111841977238755540185207900501084187133490327596052113371612579534046402591760506460246623887560567968907952079196822923095984743633127048818527379400049853051287064579476908749793381668054341307931518460085227606930617123321284354879783745584476365880922386505747374646384641332693897942703065903741370330226458056173255963829278771044701182836266481403238308082516522383365598186181802099207808725035287039496540160337020790330037788762736088506020682343910227152411814364451189122593002699734420549506023802479188729275575342474573261143662316828806024170502730741378621079655267303346775879168387121017854068219317394525306932546354588847211377345563718409201764564359463113250057220176259281654654676616012051442431551706316664684083479034758110361476685005692864684717930519446276562178121587957909017753034183985303868816312342382718591216811623471036812395861677928207114638039288662166849810762373838371037467038706588265371698166870652841366268661676304416205494683318088440118908566618998148680057438442368802802963629308171407120587191626024411683872744466044915969630062395281999242896968228163329870668249198433727424264269703606260330517161796060200470693275032237069927488024621351394074513641881131043526698688128965717388975378307425577458463247664457247351566319873854057855023180133590673514999364341885807512985693010206449703116194518944034770965642458831903624554702519748333417727118740368487205693639409571680988093413629875697455585989003284487550890222045579982606262061355048495057282735261161889204763237390458550162564443494361335049656754643368370559221282102788627133826397146400460397317544743614130458182396745234914043860994402688557272131806517436405865800575052009316474016890544124903224664063499355801146911303274725272917918915076079739609790369534783948190849506263958928216708058849921769108849373380809338404268367229334982115981126895622984624210895306091629722129817106439403637228650753988696394864328977530144981935056360138094162494511050202620242806987589763225395589839176599420402973619575358640981127226500501013427578425772260890383655320043460629868904381010044823213127070376207351171353660966340425810983753241393421477809799073827926935288482676449533457849406689592410134102966167997549564125993203412608329121778944352714047365221966489540486893534702530613151885677217718878767008588441084756444221879975136202607773176185415050744132153842042101649753784312169676079750687562071321482247185423333951640985533757237482436656558438598860013845298197713770481117099602597002695052084080751531585637696855492188091870051482179836406104989888431048670900137286146310192542729616950496142009028696292725010979201882431839801650870244336643262236263617215203840143564166835082059944230815694145716655260755596020730655386877513253634183268694881727791386321795518638961462470807896041119178036382029765125335754440531546824387297999272306716243402514780694402320184564458487159286109638010013510582523596215669323714033523923160558390453057883079863635652046599837893405863029119921298920372744158116451809368582191330606287625403902937029674684500244058876308360272054756414210138773107489571929956395597326813066167708885784914688145780025095336826184900822850787287954845838875585095722838935476096302326343840366180232719195985391486855624269080193613073940373739754839062521442874941593882602073050310953432797158890156969258321510982838841680152673707351920007766289178562656222446338036897584632087997377357650784917592319895318350443902745985989068479243038889283230953044698393641693873817457100166203868214226148617438854737741134200738090246877944341555998181734145176905995418956104294915978912027301988761291778785353185062489478395119165268604485815119573732524125065528395271924032326940530177131225251371374082203020073775403840892638311653043007047249709697785604855556771499081305673370688972454761365300569129344149964990930978332917569939252824687956684516194021504963837223514308385768357357608403769690415295737209055949263120663498362698479817116145696279376895720324806740158148459096572431913153227535599319969876223833030666075785143353680737957924050573987734202985921025884828259262085619383918398581928415879200147593743456322546312178121358299628310501165335540066185318371807337053132849856955933641464001600521637314801109887486326776519784815479370289998321111184162111495533442542412748892320643627573610999597395753644075879837735215996558119722440073622654481767672099334804832198786773932035613862496995828035714173808531983131257131866019805366908636038242312881794312019856708451177284228762863908198803720807357966926829584119448034836281031460000038055921564329946390639639358200577177847011067644585937229134857979178044448470793649717257882854582020011623354262859229470881985299293260905654166858056789833011706108232326398482060375861336392686968997504762144973585875281370203507944630844950306685312514927706657285728283955783984060266641635769643600246079112294131437428570396674404684037325991886283426738909105734371166331162277821549328685291157305560562188541801361859208853758290229742937541524015820979256489367870649071567231661053268228598659119791357269116076778670763092990691804329424497067050228144373799059076548617153313885250751792658186944206455668930599702931878956246811059653415712278592558492553744451976366470264369476527370685053062460129844931319502836297454146660730126342594559120734582433055835169400131328990674724067466174720199774548432961672065409964025276717650490748646596735345222524960092179245059038046199445402328988548448581641989873423621149539428410748571540376316323316443637895998476000574392479506138239908975316890939890357652106630386595643099142207273313144688145904354524977163813157401988503386422401623211974770577938624457538378166719184889425507588775649596781957982202428025369213031488897469977846132990965235838538697053536121333257075415991759542130381736370744524403119911084654257851105078029541417854170959100966967782353946024274484643469410885564872970854138168284264032779714649447563478418820799928155644067751427835019106751369148867292098344995359659064820164898407044062009715175712781574655502746982319707270180927053113040954373604597763250558864870166630604582418959248882211305742956646515338724688202701037307298414536806543784073550229543079565210811997393153520430003076850733786231243082767937329551928012129343221959712243745103887274821811115497657490401581836993397561704573700287477140017626660137512025087894294755334600540960398224447345035083775559278728773997169185843843041966850056121355487869004158924465154702958267973154632280751030784373902451977716646794235038239241936877919389988936150743770059275886651679921998524159926712458340437373781260086841069090569684749113226955986407082297596274688984320692382658440135199162588319024288388005619757221790134117703243650935519221522439149376660623271384875840903181966361730971342262328459808269558270378605250811521997523090163807781510963950365686822251082064891638339356999923787909490074008703779953219191057884798193308482332354545391458443945533441157100152126533618050477345376762081384189834054442459071864926712064841125678286118427432212734476036596726661526919843761984849435408841719417368828562298981144052999408124384517792691567123638094178331219132088451952265397834654242306578950176550161509511888162359775650134254054516313336630337625965872625438172202831792545441439573522844522436755686747599187756607003017632335305076867002086560911392228236754221694832229086632151499011747120497043096268358470592129101755258288938044954824805047418125664874020487352669142829574768357060650749181534153592469837644889089685800189363529244162839078764411659894624303388362382845752738282146607812951438091812148585187530599454940198696809619925697903853419624954165848974489240404296129841906381464357737533781988529647669863937126105761285685753874694474042841602770775051948712133800338950429797458977891275602585093813461524289055267571584312368372709972725008102755267286632051684595409719206703055022293989999394282170659761906232515608543520683152062159774266739077652484461974279501284201010713846025538599528456368798042384513239387007788861228076581055380017895678757871363840372577706249369881693732099564162199501651555300476050723390697381543509348034494445574357270443807354414177334329417339433646799179677389136491093469470064340729782318829141964527859890608049770745007134044880671970712244146295221719027587533831148661970407322485953252479308808097420068846519347562002990826274966424213135762629176676775761085870048388573685383198546616823921054394960318402548084898945419754789845735146724948221427749260444617400633377978993102342501755796910188153649112332643920082699456796194180522581901830257801054784782698723292626428886089251950258898489112653428597010337293839349100480235970135958093887947313086998098161543421088795664677986252043349882410442278858485886961569403626107869088391240588841004722876545200582705086585151280827669069749235727498244664580777845736126978651911511314972456220797397853746324261104990560179255623631650748537503547145748953331661049582303271581635030271471679646950824135684306023331035963357919712215646159591765084594758067190787728856021826765330809641350197457999451777245219220174449288705085552087307223145142225797651332703620394769551738938177568546605592136689484820109631863126991141250345502775931762271223930961305713254741160507760171077477487028851869733592042897724464571944337199334099944875919099733610017233969262719181685402275838113592291999144367744929113095976570026279284259215637794012393507421218449098015619823646213109305101488985293483650964579016115051919653514100214825457126506612802093085468877862689446430990355187249754070767130755221425901476891402685663287585177699314437089071703698773876116556377538783955724996756785885493890761783637297921481155514919194205804987876423547079197058726645937009360517283468421185167004228680458479234865098061107470299405183949466700494864996125350775964438110766505582675196957858275294794486861283030007917220917532151340501751568877591518594043035017590901372670725709755580496786990926345554566365363898479256103878283338132899336111465280531762147692318961832283305450059008308568278341361231089403831189266560789693335459107925344785562946658640636279302206844414459114317453283912612844415601144471959826997612793670720489281287679653893424210285643571517812830890877777799787005365572243027093177872275168748079253210992783652244608101241552011461477911413792161868523412894697983143482177286861038321151657359257141818422413348034963825463876155074993471135534396788498934305585928396514222196309027503567329475784018546979787162428374842611627268012633107149032480795921935564685236742229093514801040610061483673999029649046512992375366476531130134880994259447147817784817270764967864369540618688580571152732003522325846104512645574694228769921495649404219940386133307162326412118958985143155981244702569612429615172938280071015506913575573215651639823859149964193733256279934543027334024914361779217917358758343949534688427212837409207953733789836640228329030959764891505857374971223166090692250387571963348240093111763215648215219846604057400988657138333988846719295315255544217180549521535146785411921555704283195296141345089014358257995866032199321634247144585199282300588335852555504406993344941973213519963647741235617452664337901885751284983142078370460344475497518599976435032498890092255338994761112937048652882798710905271222492451182578804033758667890228084031320701337652434980443150009567367507560307535737341856801887088543795760543603556707982355166789417617414846446215478990314010518543738428762081896017744493731367989375437863445039598750811315443514790547948034180247912387276003245129740848156890352890553167914624798484527427604323624950628697068190596805640463183589588178100817087918766490392721698534442047528965154860491298869706403692790450335370087589434069560248585694322372327267906017837159956677173460728286176688605482997483277050133884754180839400506824602720480675426594397815791501826975751778575813555433629161096158556186691490687490501510273311353063533795569975482206991305472355337534357650558096800040172230601975206413004427223506976309125928695778380600118564403865885807367936423680398625595454171335708729290710229613567246572242024402092691040297621693145627411800631219607007713049301826268022123301789841059849817560644724610794724062355634643089460063965920951170638837319793187199378721827235134311689424087754712521911842420542901946757686488472355467564814690019240842067966344465423232956915490140325070876288516653461312991153073548648652581099751635103265716223735352316304229433545519708562907335784504349309156042582620674052376270837119512702079929867985680702792569211327422436874411338275430562123522088083520388549521749343149567624728018195202439947620063754212385620731098548426928751781417877973975368143884956037055490687301805012277255209461116468933703112742361571143011521105284070788502439474055969230714764038550004677283863609021409346436721301359784102836457895585767380421832814523334402550605402233755907065720522480303642907162648852274713753174719401201142785054539026965015462979723803665335602971896855682292026029385389393724925823961998698165519448854122500924158646328415083948684402985068923405991136540022036201330251777054162011349921304558680614770855416276142044618658862006569385490141290992280936028166322717024378048242642104858230240072048373584598488851251838314095279735464506666714199194596710012634765375418200687743974984713423651870773182497557188749103725181845330101900661121536335246503380420025297605412034928719149198931620558708405215794966224616016222592266571291525908021065712062479318797130732804477258681952383089595245952121584572450349717470855072288306277094354978871805061049358261809255304490820611697759267670787079988007213125545002772764179242698884586590709751400887000183669105018143117452830939651065811090484981626218645720571034840996858878147447652695580745401056795966127384143469350636301686657836016714592307408708184654786626032357396695050584665724535658304601011880414219083971775341747469038344927288177501961776257424027377822652400218898969745225618752426472731822665600725590489653611459883728594419832414793367591340459309689232326579384183501235664533607934597961887942563137432918080901176920640695443411748725205245918798950433313988034971101514408597040016864645616917776841242363083904539117535771352899939355293961969746752906348484424734878375416973432928647068877510948783716400374778425846660084425610842799819818710157145514663066425114197151300185582572195186130276948222871654260495694801443150899683381802097624809979564965328893424016481028755249845478599163529648859662459354652994078629467261885934904224547179011011816052535540819318259448361619283595631378269892927284370815980584831075001270174561555888720485786329577720053928880911848853518753031628091022569680569820416104615399772979658364160692307840376453080655090636335141147409957272790906497318129382141762336634809047757824388603798292856579232918411045166820713720486528319783051002197397688991594612704139963268075995459390457864938466943585543736982646843296164390957782860836691305977261297721929929571641388651578583923632711484932516532452242200022736532596636118908960069336538192889997497550234811809044952823676602964506893673412431137561965424507504368733000777491947350648959961906655832779617098489292749776580055477849504872195434706120804844719806343462796336909972508569896419356214912254721442542632903547847048842328883676563850419825237478465043581187650833011093225376453420636922384570347775852003911488501894364322751065417558966945351467310661537612765969700751155245379976809019966915111821477178172272167342617924685378830804295875012927377557883022997157277017363071060826400910873872325692167831700907108055470532196617572069820599313606395271077492372416632295703834007314747210755613416579310367537479368613982257999936414477364467973484794432451976565536322763108266414281260464175169897189535775421142572391485335792477346949844393034638684507236470111171544047859931694239919905567575019745117981766406315928738433275601498143886138119848763831801436914101016394539147251520082517356978785082755925336743363364671924090687573701777719795387771073566873540264380420093217985273051190063349759922753903950514740881625186757879878030306083147357902465430608399209010922314283344034704394818909162596938321186233987214436727403427897392597492628661275959842962800271917067882957717258023257294542860101001807375076079743303730869816660609127360393099566858729033588386204315338826929917521100519005962196005277403139532020789832779954019924675612718043033943196389287975995819199752095531454488716780966404735564762178677029342824164788164400154877051241749023558118801064135518478820786685667863949584854275531254409225342163690060259790519800612567589841196264474957854873658799941897779987868613319015276003680592686082395940690362299494948098012408049034828682178371416610298519885407146400425038178985045531652093402811607215178055716367879471591542618984811312288224983259829817478373735502156291878554160365638495428714596674098794729217052257422166752232378685599733812217837625189942091632132540806817021024388686184200440265153073467713338598134617332841481293467411843459960413660578204729863662893136918094904618401227733850063409546656873341532615179978829580806157450795740217255266628570779007198665403002239368418072108216615632428664925937689758410855254102092425647915718684059590222170243076803002954436884378616507751386898874891453712655523188702061030950647782495626987754908931304743828036386355639810384324716731466263398849929042168071747269813194467647993700806282460880739224628290914422445775096499778093709981327439178594321902427591719408969428621239416398334987073400356968853165100699238535747502676831987322853976437911402753725159296983374213100002250542229538584071133507070784853650426288157129068249339610633637323356989485577319240733285176502559039270335452549881878511490642548044148661263770891549088243938038691413521937144428314655620191857713679283311625025292955693153273132347641706221683388650003382943432363703021693832145399067459600715682849297420058642721303932293430205379313995487879373342634701290137129876568245378058761483166273996423367574340780874809718728720202416773465635320993523777322540564413705435757915106896817258239631519403724073688266852880537446649583239452818440405430625726039678216338085910758272348607678019896306042690352296702649844125463762326665650120619278616297403088131858441168037318067210559450558379446618106989385845225259335818757727895555920302003146042353593347295925577371145218999767750379630308703060139622410453703819946588168092905434944486949049542104645774711517855745351730144676810468464406824973655136447918090981789812529052573151050868213368730305317644569942581631139797516598335303733900364439334389137231882156412805624813915407590544924036338848689602514551745406317975873568800134805320483819130034875840511110142056336977502089392654352209543622797635739419422418261744680502297705174946198617609013612260022380272780052180426362390975612430446103593417252552288194833277022313428865483033381333769069681097056731432911155967501952891612832198561008664668260700821070319529589223165916223675179862287764231277807360316522277990888850096309780373997115937257630419242070325371822754091613469295774539624610228533598919178677702824182476098295681998806924804917327198690652112530352043061828476271081254182914702823477307745628035401957065851299886994158657397597879484794139038352991444935138287180311775317456204267194480291704453616144235281053206741156525503829487278062090470134689928706633888105229783528748494792988083182115158510647031496975789640565846192811584240633722892263719986729715274650751930170778110976819875377202896055642344853166591268050671728000137815365974597077865220381453678536643238656533901114606118489646209497109168949408260763995736638201774302381231616050076422556788200996420027637549606358908856444811595434522073909121150081279854413679549656548667593350749395876892190925292838258273312793714252472016633110262903620778148469658716965060349142354490829607462227444384917733803675522383836037881942312692898699697663179704479122924693421980532279814694146097108248222116815596089762710469307445101780620616628088653443975700169122525840309713367843779641813693449712732212715593307796005803304778522381712667675869526743003287200870687046820690544593701762212427307194602554779943488547018652035869894677799710011505944829802056241388889914039836506410881321408777342900516804953858974553574541713268291163289118983082165309439850751145492830568084506352711967049932005465729119028791793472414349267695374112503158829824704085098007519995814671218060919927861016111698099150964621145152234292822668245821352642455598901742450468590056742634480966805373236655364406185582421660698350140620343277170382656900281210807956902400505662480929931121121659065599104797762191873236034603466812174673966664077359735771206689260337116458191530539309137303500760261825501424210248739532723677891167864536177492028383012481257136190268454016962528400814503802036630607687743464802100230650673124636950255519217223989766380612928541358504988600498508492527310003491387009848799514817761245741642134941342389269492265593130221286356681590850898839588111310617042398093382056441035301191465842393558180599629625471473497190156333766786405846628354208220023068560964994837467392041192649301977824958274574429409764611254360898376269637759056936717734119572009621917291635885293378905131372811863373107871801885486749786537220276746040705239204447932787321699512252894349258730849256005433507943940280655350478233231800463754909302712887354702820827460428806457711971912259015816688478903705293669686182395229738089025473099539398067883238649383518260816034150982947174508607199639581319112233307736120959023179397348726764898423383724572736080565917924294764166871375884797221216882132579974565298820617136594065143978636142096478788116434086128505890467743479981072932833043670777240396862915308340001597602218646459549867564992956287116430034505213648660200262439205494845578698593491028282656723345457093225069590085938888927962689478586188709608872436069172280163714281173827506430689200624306136259140581600483967558538768779051110058943176368440315199990281334321476688600038712684441972847844862709090561106328907156415628261084113615325715294742772616803924510103260281326276539354316429159263689236037402554460775820912142724548564915325294488547764805678077651851828309437968076075843206562406381915981018990481879879789100142268966092403636008723168841805121032231534231130868167206200234122970860862915241479318259326045454190605714116081764118956236498278514565931257318837201005916929427743265679337869557675617351036837774683198412934136028641073578634143127787244280688948144834486644299447893223438593274196118950399738847979826738782149890237641550600913214210097227145615539178720673415085548504563474186216350390623284061402759174507109328503031920163052480966868179394233252275573045352017225920404884903248553426169774340238294586399485958715116687452549882206701311857710255191676596924952862652057189118494813651531936972687320586777461076317088712817437673772777763250072510150499034760896577094209543652283689802725814170433886867559854641966550418725310456746644539825915735702527634952256650023626175275169400434295148602964632925763530876384995419330083746336839794478486426803293661605897514846659940359473708494239197437577483195333077256444952576157757830793395498702126858490143357251081654057141967939453901817895821552943475527201005987208093265710094508033813077731524833145535567889460629752184565614668982326581402525208258439125707941889593157652355608775732611253794407998969683141292260784561147206094518935288336277377792105030767069555672784776693096646052943915722692623597289825751606313199237450120090152099268236578241900682058561921852201405409261124795808005157572644386415505968787442013060168568930582234693289666164392054343511858499375905701267620809099307871322932814541146018300252602148025356785020927765772191310197046274710300098173955571062790203114955577477332080153149522860385461541745139214757363409241399947940354564482276515403450139452466055768611391099743216118122897791198507954519333283238470349498935281883355567723118950605866648950027626559991469376845003796442415764877905945268934334050971633049506600103810998519832727508903979666022535496535571797376633605622652759785332435611415325619648377628338507429891380575182618790500293659201972326357419705096222855269272180848283593050547581703227204235297783696340571356199560321713878307296243502724189032100570028441100673383450395483589170599056435908961539397467384285394633647353464495994947310551434588775331221725338636320821434330304109879442823842920518083093014962271807123187567760286699013099094620413070059107205939138150057383850407635510809090323972393890749327579836310114618817471935942214436481749274571050589758895016718497974058339439549988921028054318542883680059416237806153352802898111268863189852862275039456365429427107693010591366186367392522443107704919854598639266806507534404335940367642926080138411145831034746702825614378034294728997454493618868468937842459538175095006491537467417503992463918484786031949342645453107912896216053043331296186082896457842033854129348255022893654957132383200288107604188144522994072018259830059718491718737608391392463989980160062395091926285852760112260521572788840153407419989316306985745585159911334386610837229107713783542023224166740998129751585813098835220193847140580464802530965057339288162191457474861853094217338845609667733440065798623737689820769127614472910089957297999191503996839405246507366035062692432915537042234146871877642206694797887988920720734092513080673712462411501494039036560521501963643393091557635702877483151997779166491263261170975549835686398353222959456792524709721308165201609265485299357663671830658475787982660587718542387558296091813186451143010607653208473500241316783076423109988978355637356614541132212767894034239236486222035103715053997381249595395365903285036767927487270528008188798608770299952654799510310274891050335540019888120700528322555802544612439775318904334078204114737188473691792953686027880716153567352557822775045922534547751889356108023345653151990208494000309558194399037725250831665753398724451473427835673568113775394948985266338121163656481122349100236209972703985855571983365268685443843226524494412467616604915939720539842147185465126494963752096540490837758164452779517818174338939956413404352877051248128997712857648174059007381942113634696509335747139649589133001005021383007469941570448754454799434636192608865464953689105400110032128998423593391577032229437468166316813812633110095959104833450432319574494670130131570309846623294212009737577353733715588236309000261067493550658447961412016840646485397405000668725511586067182755766000726024325575862142833798704184247428584476443133892583273711519915929597133724377412578573176847970459800930297719827824549019074482744445488791270942346567433010649041621262917797481288717651524483883771315883011384486280210959540856988458722195825229382870033861213695225997177418533697246049557952033806202851141470451574551287948272387301996307414677586986255539821593102264395024594796281086548009664326222522793337567015427684812558290471523868073613280465604253219312686304772351254937006179736011929320270894889334327780036022744518236053521597640690655663630371302516179234598243962782536670154533017435475675203692696059091708844516981818764972082873852299348283230348756111556707416476316817055108859923997025773391729737937205966870877734047601230881202239764424114632932591851651249259492120081411525069936386832099810051676285565920051061351590923468741959199258378786251103685034740193562499053212111168073707314025221568869958716884581659324592989924900041426045051782147809961341652119196779504043191043648539809195810180020961370154049524207041464091950204908798189997870363423794803118513352436564107364700358956707749980504244193371530778136143380498113570258264881228530695845834511030491608513335859948316236944261175826997855944729174631800566774882838356734247267730512177708687491710852933281156957189933494394728353383231461195174488269158729245043716887311682763373022570864574795062368344539749798337999282169166617210718238752749148914921542721305192646105598289439707288030631915969858440265674656611306264796249643483883632861465467554104437338022584014545480980091706736273227753263772851931093521723286091840350394120943031053530146438973184211246015125801143679519072944799922606643527073590117057285169862779348214119354919899544267019651710675675262837220671106565047688297311453537711666584475035593745047360953462926612343197312743241357989869940931872645974977757059698036822603964261314393443649125550658675391280234310704264139473107998564356952578159815637786440184955677432057640850614449716051124430596097866675484369403202218602641155745715736924149186025364506662420516994914371599704149686879257742294645566813420852679607305732057548685597346217211339449356981764910075224612311271271393455532784569648079688294805678411449013520795171924518365895236584315672406253822810234803116930132702317984666541862845055876217142432378169048562495881819040849108257617191402959277151591881361082055843800340196621985042559127562482223944541527165409131757789620121637451960544563861684389484116545027468528306760399620971379018330906122832398062066339120285926326477906208728198711405186547384402210079738215126564815198648723511988534806081159882701806700121742599277759199098167538796410415749392810231587756422868223091192541655287896961217893771893457527395201131715971270718352877755288745394590945063661193740984996187151282094859842548529994729332242027604613106441513283077326701028730960640944782966804102111241194389882130883954533671309260952013556269047197894923227297965665583569423854489021269596885134224928389836247141168324935223089315619235583055074706458750314113790236199595655540189432371582549451049712347076555357216625225187786166647742038058510328161641313071463093746868870681240313275872307132269571515929751035155375143361879711391928359741076239205641751851867245633068834009207674015984025323603927170001084858323407520662445417670679688825382236709248448333890950618628230939720475262911441686183993074818084626408506231807150297949016921488154049799394784285700080421776737474567800982403608476216646083230223474014190588757994148374901815719555319444583661951770159534287979190161069822156400342539413522419084130395739672010784951171138208279006956322302454754992088274617796797449268834307126223009768240800433869697362287904126059115535072781088354027426095437902332736701198998566085391833190950443709963209455931370279281640995398272205736755171370153296418793244478091611052626127901695806645614710027000071370936575953317327742941859157204812005221403208652799784642549631039227200544797116103135454385715280750959152176705900030488358699477987875776856015422483513627333792212778379908314605892580469159542363330148523718990453334125711226343149412352509049616157404892614994274660631114580730361880195651333140289964412626677147505713893445131762780777035393258766181324781308802608463743130580106515586221146918195891248009003395618907336290664416086529700341051090229726909274516662749492304162934690300971028456793729087254860704212405091546888940864622997654555495091073375150484010679482685200502137615322781500218838876013448868336844286402798793930904115931012586957172763449116154378445685747731079258515875493559645419149581269519188143972311740905498890319397182724661755030242573902840032809703994789717170757650481494045839414772838905475968872615915031033607954860969694887731991043670204219669907328072344977640861201292666456140443959114558719886295726867217898317954162477900558689036592852764121507878073050078367729211614115118205540426658187449219307193509961100731899082917932253384567194617992029174250171406518909181255032405132379853603953847566964637839873029525951398544302968454033239722998879897186345258922351704755526170146114832953178489188751963483646750737266913902949229395553095197723586842539662700896789405304375772456632291324083568630798048246653799054347133721661647776945052818882143765835545171804155856270691335190319287765164428832567749454516471643533878027685631046951960211601193710449285649074145131597142691537443007602535769841750807513420264834318089213896565061063914953746776227250217007190132497650708193694212399011441930898756532759459001582938719466906842311348893803205863768693995562633623553620745585435178496040394578358558931271917560555747950320674923989427679790047539255903747749056227058824922300696088268641875236730978274325824315035207539092917438479195841532140080742802844024002132938424733006095544198099917402863088758836308891668326993572406722866382330180264814822310603368335260471968433346754299340815271192475355126129818058037737171679268622839085457196239862627076893549414758271703607663106764402353749051290324744286531047905476166887430988389411113620450664650806853883881126702597691243854678280036562239719583644986094714687566263108320126787836174840781869513515085388888406503623248929519990089132169747969137151188208574649228415417104554978906260121887627212741176651435426138763568904516349401267783603143866445040209872858906551151379481133990879408747543141117224957907322415606292169260590266667251235027357851954698066657111664970827323762281340590759601407911029408469533088483525077739256206687181273833615845952876103607134704306951383847914036842367221822489972440394186141647278593252432382257875627796632693951695975555608249982718278975582588917159769889172022536095172431083739242015999059922387549712141579462905601254941593889225866013716390117997475274063993476610517610150948781672296316958567339966520332499030015696634601821572021149569593847093964165601288208761554659917987022667391420895051637545574560982082836463203496350043768621930114382934600787511711453732760779144543313046001206086419734177449266852300186669592073882896266995165773875158337180683185083684000374791002011255603664399708647494787985392895936545703261265004478409996241995434075895307725899078930181725436704803103139959123323848103594946150393006989041046997261358371149742343636876187948273177481023604318804816820779965891648277806441102466966609244827678008027921264024797956674158404937364236152812158743225315399911655554529969655127849007871064166468987141423989933445867825551239092386567062818873297727853181908177152458120049171481809742708452542569004766810614114489645343267104578154103261019060915996704386335233689738589432992965567731287804203300523843694413367654885636273110797867951894951929454896492992248221897140876326044240474594923343709228444016530271447087790294639735017913808456672753063394463016815962393916607344319925807087348013341108897421844064175171123422133802995698692664820339606086801855931553694498358112867359697840468736433086078188451664396037078332010073997885748792817054129103274638022167921513797660066949950754633222782690873574311173760790064144344350580442549301899797526226787507401364572568224331725469086860617914873803299711258241868010332671502358981876015745270077405566380570243201651719636805059981208609517879242116885271265030130022313254664147074886064806627513332320554582997894767258392489041285922553640739164696706770809007958543106388201216383085900672787523709157582107109919352541760980021884558406418943954605563747846520404376868581308535637330337658407605085097725447882203285788825215276241101720128911316479947249132132417157858610616004959972249334625522506156776137171527768943992962418976364448338284134646348090587147782821102894444682721725931960187281735127604103158757244169427079176784506790104953625916430456453552498797492946247198705717999889527869145913539042336802523124864453111768951279481849851698834497901080921954104471406352223268091921927579676838279207746579716718722954642810933412570654052080731861459761639195501660702624412662965174578975462257296005589269237763761435151092441888572234818412597893800200454246914027258390476409680637861529866409309782357392738102722600157921476185387642290117238628120328332296511602059235251048502652496402998697430573130280706326748642235046726737881939095169229308395131880256390108580546010834924995721994409399151359286552260520244551473991462299891599681823726203442212370800663294467359294356811494312793392842645371157855423770809010499844620579583873678593438313831186041776999773398257062734457322511285960645804688740430979104255960633840760167332754750456641889184001553441446032009609902986662214838395321551759414982540974894441465545297841357974176545336315467782420100386942375787445575712555555636502457560101287044093839336741840109479235740003669613339690171767762639662486822903718809767709318451843963269344051789596474631601532927943521027911838067745088630123316638959015450013112363610962776392413732854706029689746849033938634011129659539733430202902335740847231955030303173175104408067678098829834746150570345075239625747951364695402096637064711827239702658481682324918681014429609990756145239043908271653316862048399548737398606738665741855020383620189801438283200820623151929081337656821845092105116375476312379139803347300514661931740792014055673019529849695157928134190495978820747730491393044253212867667391760814244767067077710800688777829161464580447203262037147524143519037234643415251616409083937965406796522263013441316100367558727538044119103308301529197983646479151128837939952485210158875943318672163608804990747270664315378259486048190804003308729709850795014935833584959980843320328656797283814569917862469783053615230681198898937757566927741468463704358380274646835556290080662961608971335463174742842391091699855738428507412498832167360371445252334969217260505767792702606309194328417493095781620129697766264898447219777726769801037894568357563637764951670548265443762524819019466865999508268530922365400114101343064717871513833323334481647626406906324174037762621421389758363429909863031193780971595747806350309216827112242636002768515478570828817397079789259343462007689367365039787917953342965390962288344067821739153815110285619105490699432810161733345670637812414526376017933078792206213850832779560228535224247829804800582995587775204236453191179916165202666348774557637790513046580860424316128184697708448198484557634676753808286087355975257128208318866022976516617406629083039368596733734731000446953744687616517024890774303159872609873801262530711679600039218756049547150589374415064891981356457349356976961891653529739546807723678351514916629060397779673537049657945643993562128315596738414743170143764376392945203607142568103955401070118133022702375381977676786411107411351146685929495668875044273545505523131145841237661997380519559214269342262531908109697339293357279777110473606118998690678406469659278896808763350339753790651375136334546684046364730615463996765232640444446227859154313565333102297028710463962142509685858339974708210540395382431079559055255783132761208897677883080212024568803855348258078989210057056475516332615577099219518503831969679689848306016710437536740762928625417701715253686421548064637797598189111957129850412134941990933023375888381435957142839101283147099384718563284086977180886998395432384359734332804606277998824057664732090264968497446305314920429578349131055846360083025793230781557461423057596624684531913213760286449331543237297259558027368143874177015466471525287196251754819358373075510507483582108884694968910300332060702664929760247331124931114328035175919857863218272215278615081564446305162328841061645107655495071655295056203931774652423216311131802986732004778753346279914762653082713786959095419504269344954272702248599967055321398559122105870777576717196039141589083943116846081823116076631430969338473603999152536877591208243018606355174049915822078589674219875599260515304829569632876466436363787804139765135417646817974600131068533083325028920724568108408024023631498042928560258635105740118202839984231522357870036099541857445010160696423371016216660764295001215812311420707078531442518017918709938473767659223910687702581401041804922651964872550365081677386753688807598373266860524266892672643042694650010109751181443552146473272359119222797206588801535123890080380782891155297494564293789606593576748639615016626040508020278725665210758615566375932872044448032206423090451903122956731017751967365976355677750028646219194565206775262238209176040490606940119239581372723636245138112453239899388200892709717636656867813738242372616368887668958699271757700250263867485037144940146220549381564305604830042679880676797436867244111431044670663711207899903047902022176840708395673889823061470253672046560771821643565505529577518040692549714295079815555172524138084692798983388997136373970874540084025845722581258541555370668786519478099967900498841017485669218611204847684939907057580203841177448360625689868530040159727791801185076645075927656643116732542041597183229408776152509708941270727411157458594681410219384745548368378524208783213143454928570936612066558487938347469920704576465274460917363576159431749629546554444132314702947187573075996462576948181506640136327637018886439149701653047318399791362144519951768079033894612447648220223152785012301993854096468351731152564447913002474328042052648093205405590702249040843986052157994775021292839985583648160553006542575084383436657012369466448936726167100349802888028891786090535735499079712413131713343509185035485741462602928658355651974154805111153866014915492844423280051597972408084924386088098148501707653451294838884949750571732488687344859023063040303882380759657706290759538609686249358370085304295766412365577986691950951291516274685256406625728793083161611270865179459392267087573349253984151309025923431975953744014332212116113462732458762741492689678056290340558937602265413175494864592747748065553187909443056414010549174510017547214512288285936484990005819635756819220277829714621467814436328525504359788556397470463847463331542872277936043749214889309862000963396075916757501262152231301657223111205255710503966468367086782897341029670542602134292878461448409971782044630601240188351568065603317562513275114883856779228931236462000309116059043579597847603212787070612388973899398353230526525623359470378034212333980744598612986479087975556821985234477750835999862936692106680353170011919091923124694273324263006843058177087388393186229111748180457753182080861888190615437044199967605615335512203148373345284013712063823716909002600143368320826236434172341185922297660569172598574704242900665490617119445134939262902869439077511661166814172390226155531639577281291903621345720076118979668365290590256629736580269057577821549834205631728679148225644209327697421079694663992452306611782563884244256016663795257632169287549765685300902756807728674963057155379057544158770938035474464381968130727758957872745818623912106588410222861757258534212961693900397308272066963128764719948697711486942322852762910529716969068097708273535771293604943392939060479732906606860243853333599538434942811615964739679818816988891411017458628215264759378068804892406694826756377357775253421642263386360182084669205156807269856425636592255032054500107451207313829714944074139158895410172478463459967889642127293094776489836914663545517049527890037113507947884276093518895974240471030054214790702745045577211269841248197952450617981324689664790154608043170781596641014770466362601805080068119283658977371362780499612743943048885588585514719037042680267448182580710326184187282739586972143951655323652091685221745918851736543557831593518367746750941708886214210260777275090962020470984408768498104299029538511480985563577301621020380033428895145972519690117111950529850688397382919335839130942530208565848791279786286510008042960185080952615430673678439626037995808474335218628484098999365724354910730691281644772189832303060812264285932833655980863495334592470733311694437392909328134291316224066738245452430121281929982458599737012350760995546919729731602752181785626552916937826571506484140824724773889847312183046245942519690784638578203202604003455268500119269358395221256364021544674297924307269679642135124151180779372973066134675309080154708622870243521112058175102393355956130606941013210394467534541591117534482969727733877666307468236443286127487045688294254448520361709930721969749591362382091673422162327160013581789226031743816180029537097491631333387213791775853894889882209264312632795731283093477632574421924793737273235324799980326680941531758147857434324203131902455902581069861170761786658325474192708447854204373655894071494497950696607223014003564897691567882576953276303345554389383508939216263116352334343057747507912553945358513545827867242419741016742102176004919691883913584747494313799422628042735971363185553817571266583023182719503371591937376258643250885001977695546224847974754285195511112931292737626724079732216482949125934191933109690855098416704028222842875766705524079049595554922230478581813722770708729389002323206160248843940278278101471341027143593671879188808056172980658679158134031411874301855109838465380408908957988407547862452045862650742158892450307662547066475401825337617249446084378331138827893343615628863731629281058291189510571901185093940765619080586424919870222882129506814306105064362230996044121415344424350101426443871594387633480709656065086868084681024579883036508833727639586497197627151658443417972239076716256562695208612884440361672407636538086999973268901928096596345657820038924646404821723848956353756186408862561108869727079616389736047806084814984910345173502044033859100284028079435734915374939178758326288163112003565579417997073184099636515999125296424089885999667576845453575381100943885735897163858450659731226452588121280965518562131002131547894980624496882079347333780099798586883698330073945617293223339260037240504738084012914996217617473243469077445700196883172359570861508640275870449950419282820759766170143002853159606041874891606764054664590864638378949812944351505460704908239883378834580567798407660779706860227789612334412897688710593581981004113769568977748975330726676502675906172545068140335870190948924633457329870622623184016978083649060023885307392488715637451694034893266507054935240290297426785974980846771924907497381991936819088925925721807221395014167748324104769184324679173699485266107654182718144984616205748230076032630814087155909318644227738882847101347754170219306413561730761303914737257881867770744696088522609125903498720367490699240208105051202227606676867738363191908907760512204277330225762018863177017571362190868200881033875761626170527681715909387637349980533359453126393481047533482444693337234587100301208083337789431435181903743657999472514979223462738371782672373454602866662383715142867936935965792829500641041661193640297635771262373367497334809773203533414475547482063917431845095016697027396121181562919773070205906955642407757289597974359293251936465646642609099671691896661203887719449862056973908581800475313404280845935452019047216845210047538157985638294072995024827421652265965446700040966612680562151920918417504360689485099595327852581751400998482282137398188641335261103543187896669459533843517781808197718955581835361839748308594805602857431064527522123339919938942013650492215151859184982281012285593322055275847557873743791980580712558566627562927443797734818358968429677916684191215870401699676148727617903193678265038893558975316753686945171879363544943499721176746439179014039534299984898878090576666690635925977892393886449939098582447117776483791114461133314899207775085212276533923058000496344403967342712534457394477280094352594306891709381415265043282894717024411068099843352904612487464546127350108745173501217186539422533752198952615142153692448025110803753132560183072475791641772745500459664471669387793315447210272938505904189079399780443599009553484808524907682800319833613399991128648831164152866536095973977386336019758087060370448167739259628776855655898403301653853984276269220462228562775765681785179416239618145729114531045881554392099070098159656319903815639111488946568640006937748142685367240147738973590145312327164210450176344155144181883854086589283466872074159460112369794730377011671816547480008209487906504275386831673365219575300441643589130178480738141373029218986019119673771364300612090083064385449880987897760668461928158064591357751481351440275649389466167120812578694199631752156892225222671647633802228988086914014316299209776109327845079193345032002900574138121147712042771193408428601837471109034131970970956892328527781020779046022133088499735599521060367866073907798873251374932935252220913754230825064082496404758436288060606190209739980879911296604216981764579360999469491171320123659315672399443005546774207575038802641564679738457774985971907741277021935195534790160466364757050572432035653691898650872084460079227782266000932676527231295180014473940632770384817163536356256196825802608797566253293143075559958566648634031945842974075561650722955823001586904309124057586256795169894753834283412453966352246091457858810665731394256267685170059671064869496269763728612613491758910210703077873454980791960115720814612490383679081338085240889541694800014651525565319333095068375472594505495481847929855727103242883597548104412658915027935203633717638040997117249883719470250994407020371373128551296010793490619437129988606695683807036160883032476078945113801492086198022923786675939168892246943042729696753035493500063923737651392359892501873959096301490922381079943933403905273750274660968464685006146943830100345116951426615518791367836477317427796444593007984054465281743670444373165022494310260617500245004937958779180841502220142769070323004642297506226835534745764174619870799428647374967791916499930771956829291891800922899790714521612946408590055617455743917387157065694456302075768614266643327607695351206167249037982807278269377511089919810770415633235478408778229165634134548334828187864327044372034709994416051450112168464930280561095001774306038444144967974744027319725720899766897902915885945641346516062849336692158968446896370648553118382800110124477611214619317136931285155126876310263535336301611751587430712178174122702530237378654280329827665033548192890716918000153263834554279557428478923525421500837738295982100175476526518089585091298931456253680783365399089412439619752140519462103888569055036040462702104090218778903474843266023373676009733918741047751814925181879736930898211955051183388421123453675555802960298112508616501905976745735190679541840154040488351517872636338184917461284464515809878579630007564620418300793125914493746438011160089161271351727174150693052414279523235378613158763858689718019224108976260218765591965654275569451914206785965396421632826168950778574971084485677688945524128983863008331765636831800629368913653442725043464889456937668313109306680199145737815130990261246069577583698767346167183021681332544691409917009085342273060339289482585042401235096179070653951754444787272827260716897957560239730734670265865883459522935682659021241036161416833391906569023704222201982631374564112158233161976979484652371213525318138785184327847865130891285319544633893057753058949203445581927139186693872535329742391359879641144229970579145904367212511531836556837802954535066525480611193312581682661141834071310034429595842471537643230908718113174753674166435105158943332713776801614581854528905295858796532103260885199693976787591548315989700257665756953302499633488074896310377610013959807347802162619814280880178333263736808120455518454458695692023584320534517754328110812361795251762271319581012856160630464597476955859809151315464659333963829948668410017867653930442997964271659226936465196391105716463222781497121446332547543866363682848159958689209576905850551325112920085058163952144165170046516356012933440379512567504080951725910237024951400560197572450463777805471280861620148174567892257343166543338697980163248389422662394269514906884556092762618405981904606963055448000324590211927658317076525312838006342795222825214768849803242357296335690966623816523827534263907542164043998371981513940354367568443040273489024647624962185983469709800596789050203315279686297261390728826698942039372228923633762790495370439802472303194464345995321023970687158860384119661456462058053465841275226664006667620717291724924253012722967259108570820318660147663088910365131307186035761930282089209615065979230129221940690540002507242815348120112921045135738451455927906959422899035604261206178767305315866742753788768725253283015611008949173948781642058975563734927298663744574864289356647906851676032137289845344722276175672015850928654227937208724680518066470276212682295598747522379886442500174230448430719665885196629442639969483343383315839445978760301982389960103791498391471501621540321028783743990214210944660783103376672650273391977464450258485859743966661731338506410834601591809178018106859494005351464170113449465471169708730444769122445524931311216377690066586386846747734726405527018369009682674546729735576151949326233475229268671679688989004390297024497328032936856843360718599526057443518785418225964714616465843985412150872539804353725266033171318374511277104584206531662090621723451371754917080685343125836024261003458221740770321671877078795933885836171000161775340141432016451701480292799853063443742432673390425431802695218961197553545075933603803344281021966394577200155655200090958025137250290095218977120892839583920017767525611242944179375754168168075695793115513963204081615600742565584074477203765854926728518133192149280854707299226419290817753323035815120012258240053684120876039729093417112313143508492514682047897136154515297781802911457986612911859478066646089495607006083949516624004759315422846596923852249256936519559109482430196418946653318203384541180904096018686493565536216382531208970398991836789410149549293935820510378477942832779776097366375365042519852059074462399824356414176955448824191957015085116061256727950513583805942655858884261730614490526893039140260029474942122313457271134902487267742680780402366436260044301412212103672482557259715879592988072228445867708309705610857619230830886876404801501308303146969161617880527800000186254762526364039269495311891302161823467325149856649702498829548143477098064802149014303262673323459794336471713541657396084463489481173672311992913912957257539007058505856046643200405080243933978513688179093538382602802675075048054417157128950492559379430174986009298945108143447368750841876398387872671068217569039984405567921410982310517942051285115198294677286699102703390268594733177101677560065223708646894969614008864362488315076523368600146134123513094659715112378390008819487600974584059237809561023873255991819175097664187196466376727340247771586840796980649802548267690456512835185803541987935045556359486166537306530634542176242059498840406396145404608782915215142811101097532152075341218057134441259659863177708975997707695884628994316996644601600637471088146323468445375954974826669803157709800355576047064529718735937422382393086281629428037074065493685362509369933496264717004823838182817746978565577840729509709872674605598603974907156518488885806660446542952440782617065495372173211679685655136967468780334147568110309302770375999586480993257681275565950925998688445879666958338980307812105876004209235980438489360423929326797900782604635708932707738442805126028554635888799277646218529201997000249957457803494842320309943655312629257587152225693386297436442155706963171689962243487764335921121003856958157215984653224024649022220995439459351269634354158441432918802079126099171462716392009797704781104468951674217173744079222283394500380677554807452036355560856368988734125451132089554451517724652070769585436171602843128992165940083695437709028594151784214258132603066691142273666671179396760603005203568867913569208293039611667761605629335922123103195068842346854923135005732192916439913454737021844312477312128215598041516734684475218041922441905101285864518791310379876386198185752121844503084966494323118272383451824246310756463540013500378807990115218935716773449328278644305933396613352417316062554592018093423341225154193966603681743052941466777965216361508486494319760867553763246475388958290089296413472941734346005784455373692981449928753650691735536664803448359176202908933780989491647297226502781787008197176471443719395552274925782108816001912000364741435250162854638593939752996659616567511916415286699536986631395783268299037797259489899009541820942108397261715276509540293877558406925698592177155655741606147806812891376425837780359547534736430011605127216057834861126378862492655633832511245107727816472771760608002081134483790690895449974681688726224990171461601804965595748447913514871426758897218822876782640350375922671079783667865413966078236831113448814931273747869346349683336403697537588655242486388403163930489487253113743792834666997203751802071511577943261696034852187293891011687333291705153056423592192547393997277412878649971448182182874051670420478932987582398318926990966644858125353908193014943626021833876028594187203779196991331825022045896469294207615950280653593635851458632299371503020644264224665998673610696587632103874914592161274439137689688475382616919135494479859265156828285267870578069626377864011173838267064822027822998709186054470599474284794726340070043308239093914118817560901072486121095449906401047370379629915562088897308330994774498805644046728366764026899041136386747497099559484570746028733488321281162704972056183880157213595017712623791345434890369574953911696782704672633481964944126855193272169186735896695809925213620740413855715287201278751331729469016637958865490226118827209818307709198798862690651108692958420416240111266499629333789280630003053065714896749542156320643969630258590330916237618429886823273607505694956071802088083059601062571602974708905813409433249646051837549160976624262063086955372633462298383689976107066509685612892300625487557862684102997959012124497124571155264449324693112299231808855549091228038867757591829415641604621724326387276889878805472386603755286698421262054461023660735055515526015046010206962191371194750867464909822384284110831089602975807395222241082238799313262474405941208840123519295197053795756428457314420055313957025353868538749401117250182980421498726152133105229741023642332105143974437325086371006260883429330271773100493698749883778063623822120460174994956251579542169565799463450845463259204660309171034859761938958698394757277973824948833465781956208138988868095395754566013663819254897806784651157927418651503185566291496841172535922830104814076826120275318720006941318186445067795886830879072241272403866205864046889090134805074428771852446804489827170136270026482585310766372546875127042292981595690662191187366251991654858087858355969727045107153326016150607991832305550787089609111542421641784927371950839646891664378263883308935327055756399587539306931161059899215905455296099784290095397151006196164395823198941273364064816289061349276572796221521156416643613064895513146911554984988336938885429385994869516641739286287804059489742752006284806221653888175264862408806397699247846999387302021195069431240043733569182882533304529107012007849367972150097242002473849198690599974468162792707294342280513385095834735588957418596300794148267734942268050928024399456065962775933233399205809884515673075969467737911734163730369833536363991946698054280467944752271829960638422555234686432528020785096221579426880525215543147036365820248816309240688593021668157918922307084273933332364596110594354613546864655362430107886747441387523919239238862087068263159188594322759189126293324652547897117393450341158378956009543912429445084809042185825528988844091724384003083440161808170737288729355048371973804717186655775536877357251742783301284941361536628502162251450303645310749822692975358241526268080056594700054218380654188950434249355267229010261113900139619417821257118985800354183932219365148996064923617669617333694926519447847561620470860893674856179531459560671323297116651709322649012573879066760787183361182505876510381207869563416054576168974128145996901900808232814672795641895512300761739958380895603512332456568646798563853754123138929383095343210721289068576124223317692126475899309609406745428958594662048940710542320177234835628487640784513582158170936907095386284268401276292376160688603338184870628138839410171071978458837206168295963484164559299470465579517304854382194676006989152637020214951193366425890859802430633447225610065997671531084616978087124199481398126101682783808169173253163067111601923856743006675180425127386949145196283078710028173272321177067978494256926594226939296683641299410162711003446805275851761651410018704658892043623241431466750219043111011728940051033504405534793582539523033798708091145500532264106435100194757515318624288646390400683964723336169243628371793524321580274229766721477687951760046275488389593783044510191254768757861980154667426978432137287088290166764829238392239786678423346606819742097686238836387541374657700424074730357187462315207687214944694823404548057949283594303568625444966963300530273076630975019116215325453704247950743608380490653698974808953100655628020102744143058327871960096552249848324820320522241639552506109703042544791090960995880522533039012668033722220407210118949582844806079757850464372015346471346140147869590661962617452332498229728196878883163105956771176502042611275188993319825857467974454287833286050511032741397156886238503171651983186484560584978240837530546717685427206283932511077233163770562897485089146867646040356144631162912956382870914064160479392208521784691894037121949015035039130272018463153444773883902702643980853769417565423022759774305949460702560846424522442394307496682930711678550702367797465101643766848991917925014332538088649669151116561797641509032317160501764825462003434809230131981725602169068427296176365552468561506903631877793408956858906722704043096811054027109369075974651258161396284530424211690013578244680628667684803327257347868876610395136958332818712310198199373427400840147759706625935985442555559858585551026268696646982654296167845710118746488897543893591338133893702780626645657387081151878391978921688941142235572825819772207541975958164738372846253086658337028921705657489141213727342822973081583526180687546731482227642915012990239155946983927306133097096484621958214262059850602037726786324230862167414116431904985876656031627237510292766468875648082951443394920368801886586884749357914768515167234551102410211873549845065938482154249877335474593438498926324349686926417205519777368789052618274083556326439800193587339777271832784033308177922073087837098631926528536741612903348737529398305137467598576083941872114983434471004039091511855517774907056520112819860757993076465961159713060677479635857064362749266260598894015836360191489457317450367270992610795011399360615437411991214118968887993617158586014646723081142974233147763445725446492938981219880979695662134670169430439852272644662629623017019993827265408778737195947999362586277511195503358786348025429514006027858538159966155809208216587954211232693241063608975661219953125182976979938249190971331561759440097059342939748576406674011603820536857779161738962351972463470388082325975502943941329731741296414766484349702736549275558442347937309520881867060100354938069497101394985802201909321919921536140053023290448257911044859696823404962686599765765820695710610900521319135578086436482271224310857758326004533047359210450540300706593831609982759662458009454289132422886137221627601266800313432373237597539878317872200450694829042771695217706449632061008629464492044753539618512709841983153907453974631647330423767434649402928671841917364035240231557641836511290169154338806136657327291411578113671276361928559993632462180468006626824807432169069164759093738584409777857287116803722786249826994301519878825520755859035736337467487958060189200560136553023737268979135023134302242551850251468259112044430652600273692954913224753994881474287259874413032513565301681564923072090842408570476306464248216362595188615150491308450291913592054921963988097765031049827303759298306136029524320774003938705127395746677518919995572287139674058460287895136428380589542141620039376305956946605248040055539170808725973087777951823152182202159072796127593583783594223526008471706100207916550423172917464604038592378469541316081803953059313121873311348415622960186565380159791907726762875782595688756128889792884263526724782516153762007553517949532086426973645698204792046857148358925265446384564176969193232778760534348049608058288772877784684233351064546923738663515606139368813062320491381854591976518291002124767419565588339795107476850507509213295800647624620007388601074600010678646104532696796139592070803301716729117040849839530425703287955624412045189487458018462049243445865356046555034313099071831391718900789173603627588230664547905372638194130190827016828364712331227249845043852795375412716125354175082628036214297673022551670727237334924299286346333550411935212213478880064295456040890558609538856023828103873648370995297538861091766855257648920296986063945018502522671020269384427168841027348059671292542738296401216019357507039859579324953183017553537433674131476245592013968712731773307438395210609354792067468706649635395922455828384856260517434024088339374861622607128411835348172078254766971360641544324197349352416718989251831271733381606074336413088065335285822113940262069489296791974257966440715233601900005729547879962934274178845044876670774788978947697830672514812634683908871719691401646230970444891825592168143708016573034015856983666763091146244329389611609855053977816551764218139858217142668132877004206457851590470062084051814310720445406832069191179065913829593944433859051004104644288201567642821603747408578647037866362878772153176795206883102787056873571623732839718201423984427863658839923404457755931633939850747901488911542602801460028715580777017149961088442368876981952552026651464733431225102144386220601237853597724514046729173409001215012760489586175970275280198919984134818934423079935429341729440064922608757903778573131318724844443350337570893256873152921333930806729501539641168125373146823301114035359197858368587778449262022227284021549781781507959335446186602769876588348174991854164506944162096911746442447050281218053471490286973318776072943284514306567459488345314050393607128928937796807890659376448064883502806041492482761825770206990194846767253760586723083383711023026363534036224420228044555569769583715460568186351261517569880842693101807403834299134567066581497216694754090615461340407844019164142927860170071339618677049321039949788143815861921391083533942359602511664653351224128552004345643169965170231359986347453623433748309567443134349245452982903495938609412410232153722426103596764233701428128349676465498984603241819484814221728419082501671213666414007161161386076227185604855759262279961572381552587626401923594703572311770542507408727292399447369043852765496932750940093193558811285946584157271088916708618884772477147703808167887674650837592070998087330522887559931736298941476502080146176936766400478774503505174513970958774109866375744711756245776018270574566997311248058517469625410587754492346652044864109404827961594669014667040541039460062182760784729699835040071175644776204130117760064191385664891640953478296894534256639785882981383472645768189501006501684562672070615492484880549116799546397443120244136732608772728901400482789864637363589158126909407618226872077417669295270966770330467210318856131795983458682137122496989731068787064541730050560644762841301662769110925374628606874860616743506892135075622193302614872808878798539549201253144479290708990463530115439725089496278628031433898520503340499738186121962333217171282421760728484552837024963976763324002875123190470740008697331821273085094676021476476340086297067529743417043702572358360347732873078385772455887530024330103608502428765809415127717464225868600107231586402258802423284638765260330207789048330976910690737084043307979088782790684736494865751108393072521485367523013032829407292723154537238475889020801094678191762567005529726688382779223651860849078184310267954563596874246572133417172609586221378780389418190664445386873936933690410210552781603037226473156658810942656971019561078387219408507122753864873357175776281135282708946188493152132868784813503818435626021003674466593477204659861882923477579596065256491611759111832165076965760577810372179452889631163293408945976293389680036248695196526138783125043467383213775856205174808776858545713434856198924892314571190204071969980755627277695343161606023067987136404385525345282246730959919192107191893442985435416806005912012288193164601035407631446850458997087902277439180395749231399974928338359820864811343466077648986608427246874894063965638794240281540913046056348003032482229004902842903324532411072157905989025052326935032691495830705128996325052675992570415788926960068473312146883530245791803481971934473473082928722220175895906875762423620600589113487530266804570940538906185067447106087538857085905462702397646391268726406767041559471524980262835476216607440493406457091309132977059332269906872841614176911240987993502681952725447523932104280763815333318189551249454220877292605968617395364943391639489736017247519026592754615224810305230238926151455099379738200905344104946353549680792590927772090224389046249562292792570655966190463952579043980853842006083312889124125711377025332541797142276551909110317260343804578432940734676440924351791244149221884038109568803728388383698574193388884960323590255009233983548412666067288550087693263568879296162813476881258852460695473338714072639202673076654683566535651600563178377284688343325395874939877504618328764078150261153717806474346047939251051258724044446866061062869228284078321523387156647570761923899522264155339644062662425170054514605995546085563671697554482383626109385528286766887632788477101930605871101066231859486584972926433004811683940879110019924408064859231954936006140085850905663657881440147526007931145711781381595736796224709020363092029825575928913256273745440692481691047677639497776718540741597132279343851960073666448916519959255404596723619470238900602713598009784325083797712472466186108012171952872797321463932933149975961487180171685031085383971955051841185052654970206940607461386704002159886986037555271710089203067244022448422144908150064417494179812931448502168102636800153830278690584340453238597418406447909188886729285801885376405669307125987952119821509831585815606042975734635086818165585335389954486419594945878623128003069935112194291719591145770149731594757016039010196534322880937765639514619051903993890719372002059157572555794059780076258310627492943394081693958658778525121180376815846025032357396206641253911713866285308412867229355255674076512701745716703048621247308761795637122683277289953231489917889736961831725524992997637386836242753599872336050993196293370180358710446639150516047191740601707532589894069072256605355997158158080346762155245695896728367444001799961621805755789189515509733320177451743885241958371582263674222658373829349102217136986221306533576490295436354963033027056557033348209317888109475277157872286813909132994441561957749776896259105758653231623009401883237501585386459555349804416864069950560446350495038358840018608703932780866192505464070053166578116087301404111943203518147504820832937046989113511310626468647951589624279473044396631770450191147172500739808885947163959806535826133152835052646359715368452425704494781889054674389639071499563016770289920922559364023414136612976985533714084871905366444117609650945150832900512651278952012284848545054239733510194763303378914433190814936937170149732701753468176860889617773934108867249046996998853346828361339950367679609705123280990129518134404289713328839190831015420671881682129007411529033498082205662312815125066702496567083896864883164147036404939732185934940254590792390971095913636543706310894624044363956989061049665314226254225876849927200790087916032094036956440353420223038879469729866170515791360320699942905327186772101296673995814751562606613386158198129329181195872225283533873172937197641319857504364504953741034968980541883156533178388562209975443114632981749297597042047606764528961075553383039341946251163787034494775435740243238167608586700094736495647593744917302778175374406486690340279072061977267857477439243903878625341852146307836699457844632850486637653256286018616793284637970166963196066361376437516961847373609423858425755023532836265612331401739074514417627255749111644599623567376142498645470114316897825832032606962491299278005166447460200435642633595515501298875314796551163605529851683107322013139966669869173266619819260425075492227143597650428119381531078300686201469903199024606554081574623220528425856398071906429935573728808533737173649291963561198221372430467061220607072532872243864349340536744794203536426773128996876018391523676788244195346613154854019305129536114903557275356758573496238372896294923210709855374502302348465729715855961340140753192774304242690007550520272191843039112605614039466297670643898155543840622998705617794948746824742996513408519045573249848444657218434288014270581957514065890150329992662661231436219139670592783308107711994856140967838319132167361025068046913281728947061813059544343308899939424725969456690020355470148707117619377122492559703216038915198484775613951952004943347626632665488174469532156940189582499552823277999220036772510249835678792480504965468761156876083857559093332951765276257339813319703519144230479126567787098885556742724194089777492680000558293530095609801491601699004795830257095216167349701703570950903303128074656609664215723543187779436315506936702984865834642821219861440902278378939409507767136649644616098728350902176821352640764105711829262699436525112558505417712464565593817314936569460578658727325915716439733393468688445897725747783287184585406082345270304953430782613944138060343672873959794954626381463104322479917568540801362654947770950127365903387698053108787117297809772849931360927503011618677188528402591458493588118353567644724161743998438618547305717038375775008529225708262212841994621505779998082936524368139717238460644252220637881334774644480863588839920339944735479776638434586367128922908781201557309230517507369071245305096354694859241380471648769306515409753232201202981929139048287697896249505019601620325592081203628350406729367975615999753959260419718160684228117247246373483520939867006086240487488902923923011436294417664541403251393226832226812468891547152987694371583484619683150102694798357968096833889796899220307244746807221295839423757204102292677936630006195748510630381957404880059893580626459670083283456195558587628194738504485251301288411211261835918002273446779702864955838744458411933876030353767888433151410505108869888080305577023599804058453121565470259351113960690811676949385557911136621905115689114949921924367564896307741093002672099321111512989752098369805581381907397721907416427793568917950879743520461482174121381363157104950214127009213834951784944716265134012167515141893326265863886393030994098167388026690035630557599515791024969294695835510151304800999082041436950231374369848201173785785565878402908233433977901770977044675351042320779821741649635559162922645098245563268192866360406162051510097326329232499981229412056081206607292026126206437137963236587837054590670334270544033243879427176804887724527645405806694414667451411597958327115457528548931482371140781967007917890480837390717783068959945436228618703906442402193306002638962910214399396344875115549727922913847918195019873865098013184627273894216349412493340629256761236501123129576038193996380690146620041465508104263443926194597449752435126226841980806971453418262118064447574968092756837672806256844941548342437366667008975095726457349679584866957245681618278990066644812974804337066669647988568648346301554112075371448632685974859845100706710337609358193922264879794028875371265988744444106276866108897783646891321209404154190974324522150718377017651354093918697703995644761524811623971364644652111686383162797313364950926105928183643906881951553991252630963607382840091714571080163722086450821054045875956400965505482869068596750608603879464483565303491439015203317466378205547472963786982380505656963353572355283771663381469330953390901210278321150519329307401820973302863355109399853392685022769320865946535687169315492964422509572654505365717538104877847241075744931235380031399103937139607276420533113094806033042675122693970312750753340640102815111258605588306298353880302337823272411725024394134834226278205448407001388970505545159529935880141089439242263222704834782848658143112390063925444975614566206953671826952831375130744270204453634792565995793695311343354035572866810166360890783052673504175863285156591543715934513139666493772274577607074242432418534426688596678164666901558200180076264288111582466522961442297015384574607249193532011574863981264231110342427083410473820892552359855175176631353172944874026484903221623155346359143610304088593594939850444651569448831508807656803969838793301788509809112423776889240825337932699391346107147320058941743134100469630194440371340912364436529975969793908513312765107520180304680348447167273262048913040156164043554723734931613808009754922073917674920007912238997867172032880724046775720461071019331486652179092529257657853840109325849068687324781016424834713345984601643966518484898833001313713381276742342783192748941252890619089044684144413853056286392991013549494184463463448884901482819775463585920475407501908152391756635194412686604371967864054355310915551047164190765163408753057220290558587063610894791126695606618120687771256301899694909890633057844080095456899168436110440631616840892745488462023555139892576741444399037421763526718653182793914111580061039559064386412880362076069067619587563776430059525838125471440515956293372186355996908746861231403548059483306915615649470132337606392220641438459582429000063220645697604336221593477547683281888774734319504834409712958509810164086184981326922405152068022385250036648863926678809331632299128410379688491630862182310157510679771058674997930974900176217337268947123726645795139146579573603636529157582757090869845196283825124269540295988380138303082151302153018413728001027892952145270797254581748240197339987093882609210979765711897244517006695582466725801938987425205922427180366901990546913488786616344424590147481176154589458793168443108503140693469117544471943847285708467271519443701002147194427369529003668080994571839421937908101044755594160660850390350337384910858230699132523658595634380621695123382346737763745119789542994389798404711503680747487622623512780627330141995094185284641909945330021753434685815426548273383890075054895926127690946435287894362762126480847190537332961140341734317621058926170920985258450674830660516252053665746877527563022699781796186061923270381034633280227141943308052125913148205224898258568101383174683857597540006028639966940182459652607814161672864051618948826761616457088767123246876387947492563200377432923253927202984410599621722037342739672992563917138064695366201339726120489966082593133139253621190988513372700471412109053242231396962350214568984471947585095785788914182524705083341835348054374309842087184338700644893218180852058260372652165412205106819290120958409097171386249544723726117554894249537174534884267113730323932150383853524821824021306156925210322202703135149608123114934604715794572360305485143368793692205970749670672886566846616780063172902440350858931245767923314932405482961292238984021761535927305727101229820665800039784707109819933333338953192727440878707395536934611498272633704237252681773673443163509817753309954521704788834520894255973497614115530403404761172345971733396364814909765153247319396366446238020430511793015922300010772112575658722585855880386734999258665633613641479538001423258232112204009357079058666723259642276246434417682172794150402100792885715735886562712843786345591469005849465873796985814679290468968706158364401612551375607000068539017389658881877597465137281388456022388429016298066051140638174839371749597527417693882679467535777445974425994777917101873792008974604971355011151293599346798389468355042798735590572768689504911825930564709342530850330957240431584082480556759062941527374257056009282981824663924629995 +sqrtCorrect99999=179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.4999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999993046644192164994874360079705026995901684215093710228790647813901720323810208371063052355942804787698839333461082224380890058472813704702603998074668477638766794910055246453635992535119935298080344345066146984484863653471040992056524068142813526823306014611441519638203489953429844283070603542814095409765181526041434887028687663990954393782145835261669190985019969024507220093234604470816775962467901510182228678995916406492575832745827162656997781115207706017193395124709526323078974138958984633687366674109633713679219631028389377747787556223785456350016052008050477152932447985178709505785806972830985587504358668684154827857419582281000823797300150480793089364112065818887286747142024166712503096017985408463730367417363022247386389492612388759531951679705139077655660470770500376018422260655432519232106226621259007746818578461687865570718921412222590546239453373198770527391321984504914727732311928168617120934241814475034133612344834002845687973504699458502994818730121138935724932471622012895524425858028618437009857370725256671943368764880258033602793110214502217741906827623196189401439654729855373365399105408313679673399259064305953878039096187122886320827427267378985717505543638984951968376374233110900433300077185340592467620418673422824828264195023050736054261829145686829948147358020918311130169283009442003668013191443083591336383475664960804806062544580840265244819978679046151967711353648152637274096292235700724768879461856208916866683565759949031501856730287497894039442433513405233150383633622154302505421734497610730122530710351714664857241082464603153234802322214504431664879848724474613254078517424986502820466954109765500527588019958004461976733542167517615547899329427737064910432480668708048511829079599085619115491693019474012545981494982047206652830643128982773624970398293738316050545949973311998573467783123473101558382230803803356611568224562000375163080700673264906715539037461150978924177382350505196339802006259332397890424128986449685640750914611613387069883394486692986087398178967713857359660008724758297572598650076382991979395520970879188691158425891707443474447104687502241991882755440768310082747876411610822768462030784490267897928522842848408313577573806964247541655686772676591074664582518598271392997779448779964037727535661932457817544566094211779051516655473046325976872956222313089390066503414874725733596244701308850047048004489645054802809912470623062885490376996943309126835943818668002558269740946518343149760850794924369637824294956815668628451938489613742625007298162721525032587242774744411319794201222091325902276212380952943085597372055490873550550665621639847243497910095380230678022875821206838241962153455794965215531901992324189784535818503187531948671049635483105018232334672877055777886970818459035525157685819687831775572163691717709874763783845879884794156345751107056457515301950338743233694980865811728860235776895351649272960076267898594823118877380018068961699296277907105613593975268765531297291152922602413667452305029344255878943089360225393446530808104904038320927178437806668801552139800428813756848281859072390998944675160632310876615022664955289280223885987400745611157300719750375749552471459723448644348646132938111954150464754009066760779328483528333351899540920771015536028052138260140642056100946272365060738158963117541047155899827131368706005665874672341868343211295616592546546183272627263831302774518236248697754569521471681044260194749595202475168649510931086860187406541031795399572158961044562062683717583737486255750175084865666890172997579398781945693330969791865121976155513638009939139029341646917643343356989408629454979338636960297090148144165228605834564760759014644378484950237606128690771415120453063429328834034338853091755379435063508791425737198878767674982487944791173228595230145270199016281312943666010191224628316971277507890895589406537352855445253549265191491361504083199739195699122946646186100898433085344536923525838971248765327705376355902145165845629514253883390896328129921527565724136137674836878155693822060239809577073391384246257701131695609083641512160619085737765525695530567591618580711455314300018898982477691163929174830774370031590511205874011411972792051996209106986665354624616458412681741140732174629725924522844404199316790432557080522496026058212398585658005189735543714257681200191388870007795098746241030046937747763984894427186882374101321834016180807297063559551706631736218717640449688038068839981662753505477761211293795034095529146199712010026574429331827232504629915514915762713408260534093880306461073046432022401725790569103919930545741504389465748480771271789288206425276619038867957446675714900473697588014908547204529820573667205109142299391305086106723405652007216942979671863060896245121486505820207001981114307595079465133202814452768483931637506668344159227409145652962403057378595140941172758701096318246988210609046020634135405489128046645172764395809703667589579279374257702455919871753147212623630136216025033554965243834063215029167871708463908843823380726803128124651299649986768577203233844609949082552732848912376775072516922755026810052668952328604944363632467261785665598460826455023484596229818418703967911357140775650078440519812323166351151633108169248760473442514930235206612002338637430186852025486059219702779361761499208686522324557063763543978571014427646556704270554362851512660904940032071006365649729528482167733359896550509483527370178088774577194461592134194694066754644413129803973894473738036773113622967652369048406908536345157864712214359433611883426436105128450437884877868675496038436736630663747203417090171831324308419396822254675451490953753148465672244912868627428857600530860551906986965497395084753481013426143567482916324510347766144606135723567798582577594923928499240415298065738622644166306616790949956066818985292554062154766496748011731106980049416062184364567282369965830448897221284152983873220651923464921653975229090654366474349614912344197952475220286841602601585898366526321040897085617664627222443890466106051052993616621817103576115779722615348029839434011055019579552668893974726796595477005815637366819827309927156432287809500693126918442758463367104387845758106343333458514690583702886104936698574379007435436635452982531033102293825831632494352895577155424186417685411780072628486261851049626583336696917589038230743063120202281472530100309098351469209252968026838541878250588461075854916726291943292506712861395447114522100469458447479117018452567857795705921129366204507568410357654616098110500579642689526543045384109798393718654560727736448082088372114485576341991260378537578815509810305566846980249833811530186380660851081711007631370075821291558156474004991597456187079984465533790166164182436089744560413054303369657127989545088626271601619862292958565089282020858529150021986242785501737137447585923677548152092310281418102788670098610558311603030862227137403025663456637503321138942570217558610976032948068587122279987080656483026601632325986017095274424881732844286180471706700226718625443621277727944478317108182053789643788038679052587715364319685435142014754782622133685276641095313678895139771759686207233944822840628526247268112769516531594379005762229619307694212701553725783061822718515428058551640234614704530549388424713118213621549978117071088537174422329045043423897686784736283002081324187164126887464689155269913267574272283936043543955037402198504076674354313925381953817953751462949583586863296095089561463003356042936061608289773423704333320732955412577579039389525790343275544287263177413962080541180967408004060085448001321624760342257565352569302918839859536057016333333499690682437183475901687941281477786562030826981406158635961990936448276936633203845798101917574116545766467619246267079217578382722647738047681023453973577013127459346077663101913934387366969454039809021701622080173086848396884977817672155100712931026157588547533137495957624268412042140600141037180385766668182772663966001478201086975429164526552782330835127152890299202173857832182882753548039365150156421617863643292548449421139216647039477923464051700435783484976892953453834423650028962935533842522799413924236432037128382585405608175228239020265223265678094736021305474245831311562923349077282957773767433457693666678321063377848397796154473127552058999322489057276200468427221619186902897649677176897788713424484431374151122394018295424355272017788647327602340363945213723953206726651979859962906622528319125165430679507779273640194744505106999116884283209847203629946114466365633086053304088986074718424205741418269998868804312171244483694516395946349687935563234118435461484354281961196133193074704789340919158532236425138587236623636169389519614693420866131946784288982161775625135929149073798331772078894229423555943112015164905425037388350721135534893720612057683938107454912642836526521172907564286505381349952887635916723843573782814861657614285251973191939345169103791549121671420845859502365008479564213703767952148407808553587529449432330532040860476490012812017200299002717478698321759297881287442464855845274140481288767921211408947874231149103621721064982013663887869166027383555094505101096652668442777005756740437478582449718270764188328714630990150904381437001305624978647136853273212461298859045978873822520665578249283863687144810061569160827375350930904908227277608534761444182974621047965707354602319481166714898227303393802371298520874471991899378594019241251317610801583682705204839851645128247331391941188115040006409044966630381595649573236190100117200813251099813838719538601862411158778604596908930158176275974075560159008309023157962009057279614029838088410106307593932089745716221042486960297078966881671682981709310084686475097006967878889639299129002206537180799292191065826165443525351156247991291383073041837012667712487801105171699684573464359923830753165830430444135466102256349263471861705115545923407707823634301183385693690407760622806819174830382709264236396837512606737802380055319100414305610979171803526211783474372178560613097413794581893469116977939350749492029691189318860378128825166814217921805481296895765697737539188415008683520626270442798355078761324513212567944533917149123328262894340853623242564852403434608140272786817205260035459110014844491972678237352114790316895187730909573044369924465468456316439738187411642615945101653403381265802602745406648600134793944365655526523014165676225373842856423516025402777566351840178510923673830025802162113303670666036186943299461219183716501267080110502679427745408824151212273526870570831315643127770011997675126211541586057542671966837912582833642551410833815564517773668132992724822921518565718202841629468082613966107166968522497746376464747044084371917400724004182383629295347173646462144295909727789572666325082279228292948901887128523693598917886508448293882940516444184140406374934256354878370396172009101968736510316363979660141561539617319036596232324475712988339425638480081048400927425577652845288157301962599819022471793491466905903971554433322452451187465696663554220060362841974126154444650746014704712712427570242989370762227302425713820811449622498652800384271646967907696411751536529598994611076668708798197725525797617438273451638556182279814939860732062743956351532843063528445815756608577528761621122970305708984422153329709261137845620738057957840020664370454419930954943465065361305968046435073951829724102800642957872186934434916530932430501830233821024176086891402990193401443794966921462477210135255948935436577818966256282173739092232675105027485571160182740547231527058655089408463604549834028055172271944796349580902871155787178584286221974387388592153314356293658826822240890447341826497840011250383298945882413166479358358235231016605568413344334528694497276161882263596087280023249324543629258568912986890684315295368805873828837816170220180812029477112788638612476138217137168528347694155590834991626941500567230749175477567791581908952298168379797035433942190912877156637086285390123977565952771953970960610643019099426550081373990464997215475888290140113987684454549598074497838792184829991713777772817675224434009363408255988645922358685766028758056046769843397352415256279444639439650244003847793516284882892052541206920224312210640505446357272622205462810861690300536069596635283764242567565547411298960077370513894211346447003113655216582156768726914084050364437205682511839991495148838289069390430571202349198599561193408876739651458434100864283694652609978037928773998209296409210541648014193308090948796711259158491603272881681449220850042368175752075168452252996855948090266932869992158459275790660736172921894908366035288067350213019223166282538475906203406600839875030908543890197196667603778022726604622074957527254150316546013961454247172977238374214855996307208925828323552519520704184309671411887482746208388716004371373118652831322215585401705443950634305792732569758880721684055049353478784732491205193881918701639152230009286308922233707336899060070692590123299682869827472833655519614632005714714335612122952094984079475081712745364865306503354230938596124551568033337822388570546988221585810995260911231583916749839354679667607912076949723172889744259857362519270833991614917537092832450609991204310882299381160142434419729957132902586357212131887537843367340262888538247452642461902424744317033954781003168522438481967123038892532418532409043870686182478851970931077337432478161841996202459428094006177982364712364631055337948287783954881010050452916580722884078187023100524748984959073747980360860616710369166326142039498799449630912594778129305809063637237240279774133769259199576534626965486582698852529958856174363988636873658470924624497402598632399707514319806691364739146321962447250539832795731954598916853001263806118136979210178298444329293246875109569613892317109389652082297300906379342887620979917770175189510326482692450294039396947648753370543823619475184694192491180419832910205934323137271104737168856487143323310717368864798291609135983377752100881826472614318619008101310455381353470900018226728424440219804161124660781781773587324830764234336669627713203423180878629991865344563432289916168178739959497433146536522316092428718281648845129289693038462980718798897402661825662761504275052472207460285721418219505800815180735598761898054085177527066536415447493157470145674430268566926756282212161282992384448843034857541714236122691237187524217003261194566900731733883475400938917228473961416340971261604748639405741311279680441158782508557039918475424203869059015116366291420181583216042157015196230080931027287401111472465412003672294152099625923454668264910555703818331253299688754605761591143985592492750586386905963745202884462132701479720107308159310408312024935278624328017226532472458200101983497657404367927240944177730477574895325046605623260329709938312456146322564698379719840847796819229196515714560900945050623066972596402498715808857330158784908051546619126155421269673058067167409366675654813659929712830672407272484819934938449641164063994640810878697755131353675445565508991494622680232252411316268393535057502569687476229926874040035990619503980185829640494575860878527990004083082024818973992534577007685068208235516225410076684411599620445811071644744543654934035799356193879510411774525138593207996653911535202201752158116041023429916417787101538431131894453992723498674529990176127405558602995586345796926750992857025809477289030375658071445489740571013194900798152374562030380441904904172152674875470869806811118435594753795375991384601821534517977644999104653297541619875524979870552594384318950512690540475965947300866812679476449460167113265721600642727258198989696072007219332534116802077499349118412674428373452478500599508056658125255577292257145713274884649051240699155401623986927773244629440756372941805003992238982674319813300148884141636902172093841446066301571223167383271814440448915155680635538632658610040071209481832765345876352741495539688544537343802291653359670736202686006729912243352392307042284292490716426232585137827297961603998152021822571858110743251349601542193096478734914760619531237401811951688656829492076891637839268743008334092591547007032818240358534143725355886901796011090702797284008524768787454595456078786387621822115043966081735585303150545321353662147763271675429898828808423552219530631703669784056002008368520482779985673340306410524980158114376271010229278130617017186294998754473609379188297770984824182428642704181405112811639694207137217500917845559276198322430314114446219801937103139251201385963378965720024129799844327852371632138991238187039912388671703874679745031259461176391476725935282527494698912118526026078215747057333450369688743993149314002406810945504359266328196596610642725659696223405438467323628065508230854621494910125839968738114193989150420571129040350154230480340716934271518277907859007187356152493214154045210225061591755097430878005570331371638218119777921966367292125679702482494819944832972113187945264878042181134802362346672272415835764069921240585020333543793976724882873266831973400167082532909619691638121092314207049058742992154091370782902903719396368261604434494523968036096507371659441613191214429125941670302753691372820074568168185738413322926667083753504986814344312038862182739979526735507234016733870996827305968829606825648309918371808709134068350829578116489940566285281125411051999828132248594317953438707455832484125633832117340002216649170677473480009507753795409889393916911946617161659370205927957007658716768843604176231541644459917290309719451552354121235851776460393177831610318583273774198316021484210984133592422561149218615068827618518153085973642490120810724195924392883828345532911160284558901589438366366822532045100939014244538145699938652398768209809258371724983828732825812904317181200537970068485249699719344187971981430036171835979512435459630115034751317460058187645626181005494949498226638442808478212496879204228746191235679026524097721439571204584502216652717303285013620236824838280286310099729359314634329279450212859427324437596258321690832086524410725910043883448727077334429138345772054141552287801966552499649453059735953837628927647062869155215363637882436901608398492456074108191614760055338136215892340960543935388991759537178085807765297521947690117981857470343918380785232078109587383074018237601726716810702626699299310356016606730621488905665718093468667778404325661609480478438448252468431381823103869764982512173592198664979844739483084332760652500067873202962192917206554850443941425342650052031132028411472344400814244196853432525695466866242725826644451930892511020683372881259800921822151914672806918415893703328227241244937775050124904419485656343280107704753809534729888260520895766594848153637675866685602806527076028399635255816563559829518884058515598907379911730850274754213754789814670529257997556313450218620838310885062224391748488279756615498011064627609748977149819417347669380204111841977238755540185207900501084187133490327596052113371612579534046402591760506460246623887560567968907952079196822923095984743633127048818527379400049853051287064579476908749793381668054341307931518460085227606930617123321284354879783745584476365880922386505747374646384641332693897942703065903741370330226458056173255963829278771044701182836266481403238308082516522383365598186181802099207808725035287039496540160337020790330037788762736088506020682343910227152411814364451189122593002699734420549506023802479188729275575342474573261143662316828806024170502730741378621079655267303346775879168387121017854068219317394525306932546354588847211377345563718409201764564359463113250057220176259281654654676616012051442431551706316664684083479034758110361476685005692864684717930519446276562178121587957909017753034183985303868816312342382718591216811623471036812395861677928207114638039288662166849810762373838371037467038706588265371698166870652841366268661676304416205494683318088440118908566618998148680057438442368802802963629308171407120587191626024411683872744466044915969630062395281999242896968228163329870668249198433727424264269703606260330517161796060200470693275032237069927488024621351394074513641881131043526698688128965717388975378307425577458463247664457247351566319873854057855023180133590673514999364341885807512985693010206449703116194518944034770965642458831903624554702519748333417727118740368487205693639409571680988093413629875697455585989003284487550890222045579982606262061355048495057282735261161889204763237390458550162564443494361335049656754643368370559221282102788627133826397146400460397317544743614130458182396745234914043860994402688557272131806517436405865800575052009316474016890544124903224664063499355801146911303274725272917918915076079739609790369534783948190849506263958928216708058849921769108849373380809338404268367229334982115981126895622984624210895306091629722129817106439403637228650753988696394864328977530144981935056360138094162494511050202620242806987589763225395589839176599420402973619575358640981127226500501013427578425772260890383655320043460629868904381010044823213127070376207351171353660966340425810983753241393421477809799073827926935288482676449533457849406689592410134102966167997549564125993203412608329121778944352714047365221966489540486893534702530613151885677217718878767008588441084756444221879975136202607773176185415050744132153842042101649753784312169676079750687562071321482247185423333951640985533757237482436656558438598860013845298197713770481117099602597002695052084080751531585637696855492188091870051482179836406104989888431048670900137286146310192542729616950496142009028696292725010979201882431839801650870244336643262236263617215203840143564166835082059944230815694145716655260755596020730655386877513253634183268694881727791386321795518638961462470807896041119178036382029765125335754440531546824387297999272306716243402514780694402320184564458487159286109638010013510582523596215669323714033523923160558390453057883079863635652046599837893405863029119921298920372744158116451809368582191330606287625403902937029674684500244058876308360272054756414210138773107489571929956395597326813066167708885784914688145780025095336826184900822850787287954845838875585095722838935476096302326343840366180232719195985391486855624269080193613073940373739754839062521442874941593882602073050310953432797158890156969258321510982838841680152673707351920007766289178562656222446338036897584632087997377357650784917592319895318350443902745985989068479243038889283230953044698393641693873817457100166203868214226148617438854737741134200738090246877944341555998181734145176905995418956104294915978912027301988761291778785353185062489478395119165268604485815119573732524125065528395271924032326940530177131225251371374082203020073775403840892638311653043007047249709697785604855556771499081305673370688972454761365300569129344149964990930978332917569939252824687956684516194021504963837223514308385768357357608403769690415295737209055949263120663498362698479817116145696279376895720324806740158148459096572431913153227535599319969876223833030666075785143353680737957924050573987734202985921025884828259262085619383918398581928415879200147593743456322546312178121358299628310501165335540066185318371807337053132849856955933641464001600521637314801109887486326776519784815479370289998321111184162111495533442542412748892320643627573610999597395753644075879837735215996558119722440073622654481767672099334804832198786773932035613862496995828035714173808531983131257131866019805366908636038242312881794312019856708451177284228762863908198803720807357966926829584119448034836281031460000038055921564329946390639639358200577177847011067644585937229134857979178044448470793649717257882854582020011623354262859229470881985299293260905654166858056789833011706108232326398482060375861336392686968997504762144973585875281370203507944630844950306685312514927706657285728283955783984060266641635769643600246079112294131437428570396674404684037325991886283426738909105734371166331162277821549328685291157305560562188541801361859208853758290229742937541524015820979256489367870649071567231661053268228598659119791357269116076778670763092990691804329424497067050228144373799059076548617153313885250751792658186944206455668930599702931878956246811059653415712278592558492553744451976366470264369476527370685053062460129844931319502836297454146660730126342594559120734582433055835169400131328990674724067466174720199774548432961672065409964025276717650490748646596735345222524960092179245059038046199445402328988548448581641989873423621149539428410748571540376316323316443637895998476000574392479506138239908975316890939890357652106630386595643099142207273313144688145904354524977163813157401988503386422401623211974770577938624457538378166719184889425507588775649596781957982202428025369213031488897469977846132990965235838538697053536121333257075415991759542130381736370744524403119911084654257851105078029541417854170959100966967782353946024274484643469410885564872970854138168284264032779714649447563478418820799928155644067751427835019106751369148867292098344995359659064820164898407044062009715175712781574655502746982319707270180927053113040954373604597763250558864870166630604582418959248882211305742956646515338724688202701037307298414536806543784073550229543079565210811997393153520430003076850733786231243082767937329551928012129343221959712243745103887274821811115497657490401581836993397561704573700287477140017626660137512025087894294755334600540960398224447345035083775559278728773997169185843843041966850056121355487869004158924465154702958267973154632280751030784373902451977716646794235038239241936877919389988936150743770059275886651679921998524159926712458340437373781260086841069090569684749113226955986407082297596274688984320692382658440135199162588319024288388005619757221790134117703243650935519221522439149376660623271384875840903181966361730971342262328459808269558270378605250811521997523090163807781510963950365686822251082064891638339356999923787909490074008703779953219191057884798193308482332354545391458443945533441157100152126533618050477345376762081384189834054442459071864926712064841125678286118427432212734476036596726661526919843761984849435408841719417368828562298981144052999408124384517792691567123638094178331219132088451952265397834654242306578950176550161509511888162359775650134254054516313336630337625965872625438172202831792545441439573522844522436755686747599187756607003017632335305076867002086560911392228236754221694832229086632151499011747120497043096268358470592129101755258288938044954824805047418125664874020487352669142829574768357060650749181534153592469837644889089685800189363529244162839078764411659894624303388362382845752738282146607812951438091812148585187530599454940198696809619925697903853419624954165848974489240404296129841906381464357737533781988529647669863937126105761285685753874694474042841602770775051948712133800338950429797458977891275602585093813461524289055267571584312368372709972725008102755267286632051684595409719206703055022293989999394282170659761906232515608543520683152062159774266739077652484461974279501284201010713846025538599528456368798042384513239387007788861228076581055380017895678757871363840372577706249369881693732099564162199501651555300476050723390697381543509348034494445574357270443807354414177334329417339433646799179677389136491093469470064340729782318829141964527859890608049770745007134044880671970712244146295221719027587533831148661970407322485953252479308808097420068846519347562002990826274966424213135762629176676775761085870048388573685383198546616823921054394960318402548084898945419754789845735146724948221427749260444617400633377978993102342501755796910188153649112332643920082699456796194180522581901830257801054784782698723292626428886089251950258898489112653428597010337293839349100480235970135958093887947313086998098161543421088795664677986252043349882410442278858485886961569403626107869088391240588841004722876545200582705086585151280827669069749235727498244664580777845736126978651911511314972456220797397853746324261104990560179255623631650748537503547145748953331661049582303271581635030271471679646950824135684306023331035963357919712215646159591765084594758067190787728856021826765330809641350197457999451777245219220174449288705085552087307223145142225797651332703620394769551738938177568546605592136689484820109631863126991141250345502775931762271223930961305713254741160507760171077477487028851869733592042897724464571944337199334099944875919099733610017233969262719181685402275838113592291999144367744929113095976570026279284259215637794012393507421218449098015619823646213109305101488985293483650964579016115051919653514100214825457126506612802093085468877862689446430990355187249754070767130755221425901476891402685663287585177699314437089071703698773876116556377538783955724996756785885493890761783637297921481155514919194205804987876423547079197058726645937009360517283468421185167004228680458479234865098061107470299405183949466700494864996125350775964438110766505582675196957858275294794486861283030007917220917532151340501751568877591518594043035017590901372670725709755580496786990926345554566365363898479256103878283338132899336111465280531762147692318961832283305450059008308568278341361231089403831189266560789693335459107925344785562946658640636279302206844414459114317453283912612844415601144471959826997612793670720489281287679653893424210285643571517812830890877777799787005365572243027093177872275168748079253210992783652244608101241552011461477911413792161868523412894697983143482177286861038321151657359257141818422413348034963825463876155074993471135534396788498934305585928396514222196309027503567329475784018546979787162428374842611627268012633107149032480795921935564685236742229093514801040610061483673999029649046512992375366476531130134880994259447147817784817270764967864369540618688580571152732003522325846104512645574694228769921495649404219940386133307162326412118958985143155981244702569612429615172938280071015506913575573215651639823859149964193733256279934543027334024914361779217917358758343949534688427212837409207953733789836640228329030959764891505857374971223166090692250387571963348240093111763215648215219846604057400988657138333988846719295315255544217180549521535146785411921555704283195296141345089014358257995866032199321634247144585199282300588335852555504406993344941973213519963647741235617452664337901885751284983142078370460344475497518599976435032498890092255338994761112937048652882798710905271222492451182578804033758667890228084031320701337652434980443150009567367507560307535737341856801887088543795760543603556707982355166789417617414846446215478990314010518543738428762081896017744493731367989375437863445039598750811315443514790547948034180247912387276003245129740848156890352890553167914624798484527427604323624950628697068190596805640463183589588178100817087918766490392721698534442047528965154860491298869706403692790450335370087589434069560248585694322372327267906017837159956677173460728286176688605482997483277050133884754180839400506824602720480675426594397815791501826975751778575813555433629161096158556186691490687490501510273311353063533795569975482206991305472355337534357650558096800040172230601975206413004427223506976309125928695778380600118564403865885807367936423680398625595454171335708729290710229613567246572242024402092691040297621693145627411800631219607007713049301826268022123301789841059849817560644724610794724062355634643089460063965920951170638837319793187199378721827235134311689424087754712521911842420542901946757686488472355467564814690019240842067966344465423232956915490140325070876288516653461312991153073548648652581099751635103265716223735352316304229433545519708562907335784504349309156042582620674052376270837119512702079929867985680702792569211327422436874411338275430562123522088083520388549521749343149567624728018195202439947620063754212385620731098548426928751781417877973975368143884956037055490687301805012277255209461116468933703112742361571143011521105284070788502439474055969230714764038550004677283863609021409346436721301359784102836457895585767380421832814523334402550605402233755907065720522480303642907162648852274713753174719401201142785054539026965015462979723803665335602971896855682292026029385389393724925823961998698165519448854122500924158646328415083948684402985068923405991136540022036201330251777054162011349921304558680614770855416276142044618658862006569385490141290992280936028166322717024378048242642104858230240072048373584598488851251838314095279735464506666714199194596710012634765375418200687743974984713423651870773182497557188749103725181845330101900661121536335246503380420025297605412034928719149198931620558708405215794966224616016222592266571291525908021065712062479318797130732804477258681952383089595245952121584572450349717470855072288306277094354978871805061049358261809255304490820611697759267670787079988007213125545002772764179242698884586590709751400887000183669105018143117452830939651065811090484981626218645720571034840996858878147447652695580745401056795966127384143469350636301686657836016714592307408708184654786626032357396695050584665724535658304601011880414219083971775341747469038344927288177501961776257424027377822652400218898969745225618752426472731822665600725590489653611459883728594419832414793367591340459309689232326579384183501235664533607934597961887942563137432918080901176920640695443411748725205245918798950433313988034971101514408597040016864645616917776841242363083904539117535771352899939355293961969746752906348484424734878375416973432928647068877510948783716400374778425846660084425610842799819818710157145514663066425114197151300185582572195186130276948222871654260495694801443150899683381802097624809979564965328893424016481028755249845478599163529648859662459354652994078629467261885934904224547179011011816052535540819318259448361619283595631378269892927284370815980584831075001270174561555888720485786329577720053928880911848853518753031628091022569680569820416104615399772979658364160692307840376453080655090636335141147409957272790906497318129382141762336634809047757824388603798292856579232918411045166820713720486528319783051002197397688991594612704139963268075995459390457864938466943585543736982646843296164390957782860836691305977261297721929929571641388651578583923632711484932516532452242200022736532596636118908960069336538192889997497550234811809044952823676602964506893673412431137561965424507504368733000777491947350648959961906655832779617098489292749776580055477849504872195434706120804844719806343462796336909972508569896419356214912254721442542632903547847048842328883676563850419825237478465043581187650833011093225376453420636922384570347775852003911488501894364322751065417558966945351467310661537612765969700751155245379976809019966915111821477178172272167342617924685378830804295875012927377557883022997157277017363071060826400910873872325692167831700907108055470532196617572069820599313606395271077492372416632295703834007314747210755613416579310367537479368613982257999936414477364467973484794432451976565536322763108266414281260464175169897189535775421142572391485335792477346949844393034638684507236470111171544047859931694239919905567575019745117981766406315928738433275601498143886138119848763831801436914101016394539147251520082517356978785082755925336743363364671924090687573701777719795387771073566873540264380420093217985273051190063349759922753903950514740881625186757879878030306083147357902465430608399209010922314283344034704394818909162596938321186233987214436727403427897392597492628661275959842962800271917067882957717258023257294542860101001807375076079743303730869816660609127360393099566858729033588386204315338826929917521100519005962196005277403139532020789832779954019924675612718043033943196389287975995819199752095531454488716780966404735564762178677029342824164788164400154877051241749023558118801064135518478820786685667863949584854275531254409225342163690060259790519800612567589841196264474957854873658799941897779987868613319015276003680592686082395940690362299494948098012408049034828682178371416610298519885407146400425038178985045531652093402811607215178055716367879471591542618984811312288224983259829817478373735502156291878554160365638495428714596674098794729217052257422166752232378685599733812217837625189942091632132540806817021024388686184200440265153073467713338598134617332841481293467411843459960413660578204729863662893136918094904618401227733850063409546656873341532615179978829580806157450795740217255266628570779007198665403002239368418072108216615632428664925937689758410855254102092425647915718684059590222170243076803002954436884378616507751386898874891453712655523188702061030950647782495626987754908931304743828036386355639810384324716731466263398849929042168071747269813194467647993700806282460880739224628290914422445775096499778093709981327439178594321902427591719408969428621239416398334987073400356968853165100699238535747502676831987322853976437911402753725159296983374213100002250542229538584071133507070784853650426288157129068249339610633637323356989485577319240733285176502559039270335452549881878511490642548044148661263770891549088243938038691413521937144428314655620191857713679283311625025292955693153273132347641706221683388650003382943432363703021693832145399067459600715682849297420058642721303932293430205379313995487879373342634701290137129876568245378058761483166273996423367574340780874809718728720202416773465635320993523777322540564413705435757915106896817258239631519403724073688266852880537446649583239452818440405430625726039678216338085910758272348607678019896306042690352296702649844125463762326665650120619278616297403088131858441168037318067210559450558379446618106989385845225259335818757727895555920302003146042353593347295925577371145218999767750379630308703060139622410453703819946588168092905434944486949049542104645774711517855745351730144676810468464406824973655136447918090981789812529052573151050868213368730305317644569942581631139797516598335303733900364439334389137231882156412805624813915407590544924036338848689602514551745406317975873568800134805320483819130034875840511110142056336977502089392654352209543622797635739419422418261744680502297705174946198617609013612260022380272780052180426362390975612430446103593417252552288194833277022313428865483033381333769069681097056731432911155967501952891612832198561008664668260700821070319529589223165916223675179862287764231277807360316522277990888850096309780373997115937257630419242070325371822754091613469295774539624610228533598919178677702824182476098295681998806924804917327198690652112530352043061828476271081254182914702823477307745628035401957065851299886994158657397597879484794139038352991444935138287180311775317456204267194480291704453616144235281053206741156525503829487278062090470134689928706633888105229783528748494792988083182115158510647031496975789640565846192811584240633722892263719986729715274650751930170778110976819875377202896055642344853166591268050671728000137815365974597077865220381453678536643238656533901114606118489646209497109168949408260763995736638201774302381231616050076422556788200996420027637549606358908856444811595434522073909121150081279854413679549656548667593350749395876892190925292838258273312793714252472016633110262903620778148469658716965060349142354490829607462227444384917733803675522383836037881942312692898699697663179704479122924693421980532279814694146097108248222116815596089762710469307445101780620616628088653443975700169122525840309713367843779641813693449712732212715593307796005803304778522381712667675869526743003287200870687046820690544593701762212427307194602554779943488547018652035869894677799710011505944829802056241388889914039836506410881321408777342900516804953858974553574541713268291163289118983082165309439850751145492830568084506352711967049932005465729119028791793472414349267695374112503158829824704085098007519995814671218060919927861016111698099150964621145152234292822668245821352642455598901742450468590056742634480966805373236655364406185582421660698350140620343277170382656900281210807956902400505662480929931121121659065599104797762191873236034603466812174673966664077359735771206689260337116458191530539309137303500760261825501424210248739532723677891167864536177492028383012481257136190268454016962528400814503802036630607687743464802100230650673124636950255519217223989766380612928541358504988600498508492527310003491387009848799514817761245741642134941342389269492265593130221286356681590850898839588111310617042398093382056441035301191465842393558180599629625471473497190156333766786405846628354208220023068560964994837467392041192649301977824958274574429409764611254360898376269637759056936717734119572009621917291635885293378905131372811863373107871801885486749786537220276746040705239204447932787321699512252894349258730849256005433507943940280655350478233231800463754909302712887354702820827460428806457711971912259015816688478903705293669686182395229738089025473099539398067883238649383518260816034150982947174508607199639581319112233307736120959023179397348726764898423383724572736080565917924294764166871375884797221216882132579974565298820617136594065143978636142096478788116434086128505890467743479981072932833043670777240396862915308340001597602218646459549867564992956287116430034505213648660200262439205494845578698593491028282656723345457093225069590085938888927962689478586188709608872436069172280163714281173827506430689200624306136259140581600483967558538768779051110058943176368440315199990281334321476688600038712684441972847844862709090561106328907156415628261084113615325715294742772616803924510103260281326276539354316429159263689236037402554460775820912142724548564915325294488547764805678077651851828309437968076075843206562406381915981018990481879879789100142268966092403636008723168841805121032231534231130868167206200234122970860862915241479318259326045454190605714116081764118956236498278514565931257318837201005916929427743265679337869557675617351036837774683198412934136028641073578634143127787244280688948144834486644299447893223438593274196118950399738847979826738782149890237641550600913214210097227145615539178720673415085548504563474186216350390623284061402759174507109328503031920163052480966868179394233252275573045352017225920404884903248553426169774340238294586399485958715116687452549882206701311857710255191676596924952862652057189118494813651531936972687320586777461076317088712817437673772777763250072510150499034760896577094209543652283689802725814170433886867559854641966550418725310456746644539825915735702527634952256650023626175275169400434295148602964632925763530876384995419330083746336839794478486426803293661605897514846659940359473708494239197437577483195333077256444952576157757830793395498702126858490143357251081654057141967939453901817895821552943475527201005987208093265710094508033813077731524833145535567889460629752184565614668982326581402525208258439125707941889593157652355608775732611253794407998969683141292260784561147206094518935288336277377792105030767069555672784776693096646052943915722692623597289825751606313199237450120090152099268236578241900682058561921852201405409261124795808005157572644386415505968787442013060168568930582234693289666164392054343511858499375905701267620809099307871322932814541146018300252602148025356785020927765772191310197046274710300098173955571062790203114955577477332080153149522860385461541745139214757363409241399947940354564482276515403450139452466055768611391099743216118122897791198507954519333283238470349498935281883355567723118950605866648950027626559991469376845003796442415764877905945268934334050971633049506600103810998519832727508903979666022535496535571797376633605622652759785332435611415325619648377628338507429891380575182618790500293659201972326357419705096222855269272180848283593050547581703227204235297783696340571356199560321713878307296243502724189032100570028441100673383450395483589170599056435908961539397467384285394633647353464495994947310551434588775331221725338636320821434330304109879442823842920518083093014962271807123187567760286699013099094620413070059107205939138150057383850407635510809090323972393890749327579836310114618817471935942214436481749274571050589758895016718497974058339439549988921028054318542883680059416237806153352802898111268863189852862275039456365429427107693010591366186367392522443107704919854598639266806507534404335940367642926080138411145831034746702825614378034294728997454493618868468937842459538175095006491537467417503992463918484786031949342645453107912896216053043331296186082896457842033854129348255022893654957132383200288107604188144522994072018259830059718491718737608391392463989980160062395091926285852760112260521572788840153407419989316306985745585159911334386610837229107713783542023224166740998129751585813098835220193847140580464802530965057339288162191457474861853094217338845609667733440065798623737689820769127614472910089957297999191503996839405246507366035062692432915537042234146871877642206694797887988920720734092513080673712462411501494039036560521501963643393091557635702877483151997779166491263261170975549835686398353222959456792524709721308165201609265485299357663671830658475787982660587718542387558296091813186451143010607653208473500241316783076423109988978355637356614541132212767894034239236486222035103715053997381249595395365903285036767927487270528008188798608770299952654799510310274891050335540019888120700528322555802544612439775318904334078204114737188473691792953686027880716153567352557822775045922534547751889356108023345653151990208494000309558194399037725250831665753398724451473427835673568113775394948985266338121163656481122349100236209972703985855571983365268685443843226524494412467616604915939720539842147185465126494963752096540490837758164452779517818174338939956413404352877051248128997712857648174059007381942113634696509335747139649589133001005021383007469941570448754454799434636192608865464953689105400110032128998423593391577032229437468166316813812633110095959104833450432319574494670130131570309846623294212009737577353733715588236309000261067493550658447961412016840646485397405000668725511586067182755766000726024325575862142833798704184247428584476443133892583273711519915929597133724377412578573176847970459800930297719827824549019074482744445488791270942346567433010649041621262917797481288717651524483883771315883011384486280210959540856988458722195825229382870033861213695225997177418533697246049557952033806202851141470451574551287948272387301996307414677586986255539821593102264395024594796281086548009664326222522793337567015427684812558290471523868073613280465604253219312686304772351254937006179736011929320270894889334327780036022744518236053521597640690655663630371302516179234598243962782536670154533017435475675203692696059091708844516981818764972082873852299348283230348756111556707416476316817055108859923997025773391729737937205966870877734047601230881202239764424114632932591851651249259492120081411525069936386832099810051676285565920051061351590923468741959199258378786251103685034740193562499053212111168073707314025221568869958716884581659324592989924900041426045051782147809961341652119196779504043191043648539809195810180020961370154049524207041464091950204908798189997870363423794803118513352436564107364700358956707749980504244193371530778136143380498113570258264881228530695845834511030491608513335859948316236944261175826997855944729174631800566774882838356734247267730512177708687491710852933281156957189933494394728353383231461195174488269158729245043716887311682763373022570864574795062368344539749798337999282169166617210718238752749148914921542721305192646105598289439707288030631915969858440265674656611306264796249643483883632861465467554104437338022584014545480980091706736273227753263772851931093521723286091840350394120943031053530146438973184211246015125801143679519072944799922606643527073590117057285169862779348214119354919899544267019651710675675262837220671106565047688297311453537711666584475035593745047360953462926612343197312743241357989869940931872645974977757059698036822603964261314393443649125550658675391280234310704264139473107998564356952578159815637786440184955677432057640850614449716051124430596097866675484369403202218602641155745715736924149186025364506662420516994914371599704149686879257742294645566813420852679607305732057548685597346217211339449356981764910075224612311271271393455532784569648079688294805678411449013520795171924518365895236584315672406253822810234803116930132702317984666541862845055876217142432378169048562495881819040849108257617191402959277151591881361082055843800340196621985042559127562482223944541527165409131757789620121637451960544563861684389484116545027468528306760399620971379018330906122832398062066339120285926326477906208728198711405186547384402210079738215126564815198648723511988534806081159882701806700121742599277759199098167538796410415749392810231587756422868223091192541655287896961217893771893457527395201131715971270718352877755288745394590945063661193740984996187151282094859842548529994729332242027604613106441513283077326701028730960640944782966804102111241194389882130883954533671309260952013556269047197894923227297965665583569423854489021269596885134224928389836247141168324935223089315619235583055074706458750314113790236199595655540189432371582549451049712347076555357216625225187786166647742038058510328161641313071463093746868870681240313275872307132269571515929751035155375143361879711391928359741076239205641751851867245633068834009207674015984025323603927170001084858323407520662445417670679688825382236709248448333890950618628230939720475262911441686183993074818084626408506231807150297949016921488154049799394784285700080421776737474567800982403608476216646083230223474014190588757994148374901815719555319444583661951770159534287979190161069822156400342539413522419084130395739672010784951171138208279006956322302454754992088274617796797449268834307126223009768240800433869697362287904126059115535072781088354027426095437902332736701198998566085391833190950443709963209455931370279281640995398272205736755171370153296418793244478091611052626127901695806645614710027000071370936575953317327742941859157204812005221403208652799784642549631039227200544797116103135454385715280750959152176705900030488358699477987875776856015422483513627333792212778379908314605892580469159542363330148523718990453334125711226343149412352509049616157404892614994274660631114580730361880195651333140289964412626677147505713893445131762780777035393258766181324781308802608463743130580106515586221146918195891248009003395618907336290664416086529700341051090229726909274516662749492304162934690300971028456793729087254860704212405091546888940864622997654555495091073375150484010679482685200502137615322781500218838876013448868336844286402798793930904115931012586957172763449116154378445685747731079258515875493559645419149581269519188143972311740905498890319397182724661755030242573902840032809703994789717170757650481494045839414772838905475968872615915031033607954860969694887731991043670204219669907328072344977640861201292666456140443959114558719886295726867217898317954162477900558689036592852764121507878073050078367729211614115118205540426658187449219307193509961100731899082917932253384567194617992029174250171406518909181255032405132379853603953847566964637839873029525951398544302968454033239722998879897186345258922351704755526170146114832953178489188751963483646750737266913902949229395553095197723586842539662700896789405304375772456632291324083568630798048246653799054347133721661647776945052818882143765835545171804155856270691335190319287765164428832567749454516471643533878027685631046951960211601193710449285649074145131597142691537443007602535769841750807513420264834318089213896565061063914953746776227250217007190132497650708193694212399011441930898756532759459001582938719466906842311348893803205863768693995562633623553620745585435178496040394578358558931271917560555747950320674923989427679790047539255903747749056227058824922300696088268641875236730978274325824315035207539092917438479195841532140080742802844024002132938424733006095544198099917402863088758836308891668326993572406722866382330180264814822310603368335260471968433346754299340815271192475355126129818058037737171679268622839085457196239862627076893549414758271703607663106764402353749051290324744286531047905476166887430988389411113620450664650806853883881126702597691243854678280036562239719583644986094714687566263108320126787836174840781869513515085388888406503623248929519990089132169747969137151188208574649228415417104554978906260121887627212741176651435426138763568904516349401267783603143866445040209872858906551151379481133990879408747543141117224957907322415606292169260590266667251235027357851954698066657111664970827323762281340590759601407911029408469533088483525077739256206687181273833615845952876103607134704306951383847914036842367221822489972440394186141647278593252432382257875627796632693951695975555608249982718278975582588917159769889172022536095172431083739242015999059922387549712141579462905601254941593889225866013716390117997475274063993476610517610150948781672296316958567339966520332499030015696634601821572021149569593847093964165601288208761554659917987022667391420895051637545574560982082836463203496350043768621930114382934600787511711453732760779144543313046001206086419734177449266852300186669592073882896266995165773875158337180683185083684000374791002011255603664399708647494787985392895936545703261265004478409996241995434075895307725899078930181725436704803103139959123323848103594946150393006989041046997261358371149742343636876187948273177481023604318804816820779965891648277806441102466966609244827678008027921264024797956674158404937364236152812158743225315399911655554529969655127849007871064166468987141423989933445867825551239092386567062818873297727853181908177152458120049171481809742708452542569004766810614114489645343267104578154103261019060915996704386335233689738589432992965567731287804203300523843694413367654885636273110797867951894951929454896492992248221897140876326044240474594923343709228444016530271447087790294639735017913808456672753063394463016815962393916607344319925807087348013341108897421844064175171123422133802995698692664820339606086801855931553694498358112867359697840468736433086078188451664396037078332010073997885748792817054129103274638022167921513797660066949950754633222782690873574311173760790064144344350580442549301899797526226787507401364572568224331725469086860617914873803299711258241868010332671502358981876015745270077405566380570243201651719636805059981208609517879242116885271265030130022313254664147074886064806627513332320554582997894767258392489041285922553640739164696706770809007958543106388201216383085900672787523709157582107109919352541760980021884558406418943954605563747846520404376868581308535637330337658407605085097725447882203285788825215276241101720128911316479947249132132417157858610616004959972249334625522506156776137171527768943992962418976364448338284134646348090587147782821102894444682721725931960187281735127604103158757244169427079176784506790104953625916430456453552498797492946247198705717999889527869145913539042336802523124864453111768951279481849851698834497901080921954104471406352223268091921927579676838279207746579716718722954642810933412570654052080731861459761639195501660702624412662965174578975462257296005589269237763761435151092441888572234818412597893800200454246914027258390476409680637861529866409309782357392738102722600157921476185387642290117238628120328332296511602059235251048502652496402998697430573130280706326748642235046726737881939095169229308395131880256390108580546010834924995721994409399151359286552260520244551473991462299891599681823726203442212370800663294467359294356811494312793392842645371157855423770809010499844620579583873678593438313831186041776999773398257062734457322511285960645804688740430979104255960633840760167332754750456641889184001553441446032009609902986662214838395321551759414982540974894441465545297841357974176545336315467782420100386942375787445575712555555636502457560101287044093839336741840109479235740003669613339690171767762639662486822903718809767709318451843963269344051789596474631601532927943521027911838067745088630123316638959015450013112363610962776392413732854706029689746849033938634011129659539733430202902335740847231955030303173175104408067678098829834746150570345075239625747951364695402096637064711827239702658481682324918681014429609990756145239043908271653316862048399548737398606738665741855020383620189801438283200820623151929081337656821845092105116375476312379139803347300514661931740792014055673019529849695157928134190495978820747730491393044253212867667391760814244767067077710800688777829161464580447203262037147524143519037234643415251616409083937965406796522263013441316100367558727538044119103308301529197983646479151128837939952485210158875943318672163608804990747270664315378259486048190804003308729709850795014935833584959980843320328656797283814569917862469783053615230681198898937757566927741468463704358380274646835556290080662961608971335463174742842391091699855738428507412498832167360371445252334969217260505767792702606309194328417493095781620129697766264898447219777726769801037894568357563637764951670548265443762524819019466865999508268530922365400114101343064717871513833323334481647626406906324174037762621421389758363429909863031193780971595747806350309216827112242636002768515478570828817397079789259343462007689367365039787917953342965390962288344067821739153815110285619105490699432810161733345670637812414526376017933078792206213850832779560228535224247829804800582995587775204236453191179916165202666348774557637790513046580860424316128184697708448198484557634676753808286087355975257128208318866022976516617406629083039368596733734731000446953744687616517024890774303159872609873801262530711679600039218756049547150589374415064891981356457349356976961891653529739546807723678351514916629060397779673537049657945643993562128315596738414743170143764376392945203607142568103955401070118133022702375381977676786411107411351146685929495668875044273545505523131145841237661997380519559214269342262531908109697339293357279777110473606118998690678406469659278896808763350339753790651375136334546684046364730615463996765232640444446227859154313565333102297028710463962142509685858339974708210540395382431079559055255783132761208897677883080212024568803855348258078989210057056475516332615577099219518503831969679689848306016710437536740762928625417701715253686421548064637797598189111957129850412134941990933023375888381435957142839101283147099384718563284086977180886998395432384359734332804606277998824057664732090264968497446305314920429578349131055846360083025793230781557461423057596624684531913213760286449331543237297259558027368143874177015466471525287196251754819358373075510507483582108884694968910300332060702664929760247331124931114328035175919857863218272215278615081564446305162328841061645107655495071655295056203931774652423216311131802986732004778753346279914762653082713786959095419504269344954272702248599967055321398559122105870777576717196039141589083943116846081823116076631430969338473603999152536877591208243018606355174049915822078589674219875599260515304829569632876466436363787804139765135417646817974600131068533083325028920724568108408024023631498042928560258635105740118202839984231522357870036099541857445010160696423371016216660764295001215812311420707078531442518017918709938473767659223910687702581401041804922651964872550365081677386753688807598373266860524266892672643042694650010109751181443552146473272359119222797206588801535123890080380782891155297494564293789606593576748639615016626040508020278725665210758615566375932872044448032206423090451903122956731017751967365976355677750028646219194565206775262238209176040490606940119239581372723636245138112453239899388200892709717636656867813738242372616368887668958699271757700250263867485037144940146220549381564305604830042679880676797436867244111431044670663711207899903047902022176840708395673889823061470253672046560771821643565505529577518040692549714295079815555172524138084692798983388997136373970874540084025845722581258541555370668786519478099967900498841017485669218611204847684939907057580203841177448360625689868530040159727791801185076645075927656643116732542041597183229408776152509708941270727411157458594681410219384745548368378524208783213143454928570936612066558487938347469920704576465274460917363576159431749629546554444132314702947187573075996462576948181506640136327637018886439149701653047318399791362144519951768079033894612447648220223152785012301993854096468351731152564447913002474328042052648093205405590702249040843986052157994775021292839985583648160553006542575084383436657012369466448936726167100349802888028891786090535735499079712413131713343509185035485741462602928658355651974154805111153866014915492844423280051597972408084924386088098148501707653451294838884949750571732488687344859023063040303882380759657706290759538609686249358370085304295766412365577986691950951291516274685256406625728793083161611270865179459392267087573349253984151309025923431975953744014332212116113462732458762741492689678056290340558937602265413175494864592747748065553187909443056414010549174510017547214512288285936484990005819635756819220277829714621467814436328525504359788556397470463847463331542872277936043749214889309862000963396075916757501262152231301657223111205255710503966468367086782897341029670542602134292878461448409971782044630601240188351568065603317562513275114883856779228931236462000309116059043579597847603212787070612388973899398353230526525623359470378034212333980744598612986479087975556821985234477750835999862936692106680353170011919091923124694273324263006843058177087388393186229111748180457753182080861888190615437044199967605615335512203148373345284013712063823716909002600143368320826236434172341185922297660569172598574704242900665490617119445134939262902869439077511661166814172390226155531639577281291903621345720076118979668365290590256629736580269057577821549834205631728679148225644209327697421079694663992452306611782563884244256016663795257632169287549765685300902756807728674963057155379057544158770938035474464381968130727758957872745818623912106588410222861757258534212961693900397308272066963128764719948697711486942322852762910529716969068097708273535771293604943392939060479732906606860243853333599538434942811615964739679818816988891411017458628215264759378068804892406694826756377357775253421642263386360182084669205156807269856425636592255032054500107451207313829714944074139158895410172478463459967889642127293094776489836914663545517049527890037113507947884276093518895974240471030054214790702745045577211269841248197952450617981324689664790154608043170781596641014770466362601805080068119283658977371362780499612743943048885588585514719037042680267448182580710326184187282739586972143951655323652091685221745918851736543557831593518367746750941708886214210260777275090962020470984408768498104299029538511480985563577301621020380033428895145972519690117111950529850688397382919335839130942530208565848791279786286510008042960185080952615430673678439626037995808474335218628484098999365724354910730691281644772189832303060812264285932833655980863495334592470733311694437392909328134291316224066738245452430121281929982458599737012350760995546919729731602752181785626552916937826571506484140824724773889847312183046245942519690784638578203202604003455268500119269358395221256364021544674297924307269679642135124151180779372973066134675309080154708622870243521112058175102393355956130606941013210394467534541591117534482969727733877666307468236443286127487045688294254448520361709930721969749591362382091673422162327160013581789226031743816180029537097491631333387213791775853894889882209264312632795731283093477632574421924793737273235324799980326680941531758147857434324203131902455902581069861170761786658325474192708447854204373655894071494497950696607223014003564897691567882576953276303345554389383508939216263116352334343057747507912553945358513545827867242419741016742102176004919691883913584747494313799422628042735971363185553817571266583023182719503371591937376258643250885001977695546224847974754285195511112931292737626724079732216482949125934191933109690855098416704028222842875766705524079049595554922230478581813722770708729389002323206160248843940278278101471341027143593671879188808056172980658679158134031411874301855109838465380408908957988407547862452045862650742158892450307662547066475401825337617249446084378331138827893343615628863731629281058291189510571901185093940765619080586424919870222882129506814306105064362230996044121415344424350101426443871594387633480709656065086868084681024579883036508833727639586497197627151658443417972239076716256562695208612884440361672407636538086999973268901928096596345657820038924646404821723848956353756186408862561108869727079616389736047806084814984910345173502044033859100284028079435734915374939178758326288163112003565579417997073184099636515999125296424089885999667576845453575381100943885735897163858450659731226452588121280965518562131002131547894980624496882079347333780099798586883698330073945617293223339260037240504738084012914996217617473243469077445700196883172359570861508640275870449950419282820759766170143002853159606041874891606764054664590864638378949812944351505460704908239883378834580567798407660779706860227789612334412897688710593581981004113769568977748975330726676502675906172545068140335870190948924633457329870622623184016978083649060023885307392488715637451694034893266507054935240290297426785974980846771924907497381991936819088925925721807221395014167748324104769184324679173699485266107654182718144984616205748230076032630814087155909318644227738882847101347754170219306413561730761303914737257881867770744696088522609125903498720367490699240208105051202227606676867738363191908907760512204277330225762018863177017571362190868200881033875761626170527681715909387637349980533359453126393481047533482444693337234587100301208083337789431435181903743657999472514979223462738371782672373454602866662383715142867936935965792829500641041661193640297635771262373367497334809773203533414475547482063917431845095016697027396121181562919773070205906955642407757289597974359293251936465646642609099671691896661203887719449862056973908581800475313404280845935452019047216845210047538157985638294072995024827421652265965446700040966612680562151920918417504360689485099595327852581751400998482282137398188641335261103543187896669459533843517781808197718955581835361839748308594805602857431064527522123339919938942013650492215151859184982281012285593322055275847557873743791980580712558566627562927443797734818358968429677916684191215870401699676148727617903193678265038893558975316753686945171879363544943499721176746439179014039534299984898878090576666690635925977892393886449939098582447117776483791114461133314899207775085212276533923058000496344403967342712534457394477280094352594306891709381415265043282894717024411068099843352904612487464546127350108745173501217186539422533752198952615142153692448025110803753132560183072475791641772745500459664471669387793315447210272938505904189079399780443599009553484808524907682800319833613399991128648831164152866536095973977386336019758087060370448167739259628776855655898403301653853984276269220462228562775765681785179416239618145729114531045881554392099070098159656319903815639111488946568640006937748142685367240147738973590145312327164210450176344155144181883854086589283466872074159460112369794730377011671816547480008209487906504275386831673365219575300441643589130178480738141373029218986019119673771364300612090083064385449880987897760668461928158064591357751481351440275649389466167120812578694199631752156892225222671647633802228988086914014316299209776109327845079193345032002900574138121147712042771193408428601837471109034131970970956892328527781020779046022133088499735599521060367866073907798873251374932935252220913754230825064082496404758436288060606190209739980879911296604216981764579360999469491171320123659315672399443005546774207575038802641564679738457774985971907741277021935195534790160466364757050572432035653691898650872084460079227782266000932676527231295180014473940632770384817163536356256196825802608797566253293143075559958566648634031945842974075561650722955823001586904309124057586256795169894753834283412453966352246091457858810665731394256267685170059671064869496269763728612613491758910210703077873454980791960115720814612490383679081338085240889541694800014651525565319333095068375472594505495481847929855727103242883597548104412658915027935203633717638040997117249883719470250994407020371373128551296010793490619437129988606695683807036160883032476078945113801492086198022923786675939168892246943042729696753035493500063923737651392359892501873959096301490922381079943933403905273750274660968464685006146943830100345116951426615518791367836477317427796444593007984054465281743670444373165022494310260617500245004937958779180841502220142769070323004642297506226835534745764174619870799428647374967791916499930771956829291891800922899790714521612946408590055617455743917387157065694456302075768614266643327607695351206167249037982807278269377511089919810770415633235478408778229165634134548334828187864327044372034709994416051450112168464930280561095001774306038444144967974744027319725720899766897902915885945641346516062849336692158968446896370648553118382800110124477611214619317136931285155126876310263535336301611751587430712178174122702530237378654280329827665033548192890716918000153263834554279557428478923525421500837738295982100175476526518089585091298931456253680783365399089412439619752140519462103888569055036040462702104090218778903474843266023373676009733918741047751814925181879736930898211955051183388421123453675555802960298112508616501905976745735190679541840154040488351517872636338184917461284464515809878579630007564620418300793125914493746438011160089161271351727174150693052414279523235378613158763858689718019224108976260218765591965654275569451914206785965396421632826168950778574971084485677688945524128983863008331765636831800629368913653442725043464889456937668313109306680199145737815130990261246069577583698767346167183021681332544691409917009085342273060339289482585042401235096179070653951754444787272827260716897957560239730734670265865883459522935682659021241036161416833391906569023704222201982631374564112158233161976979484652371213525318138785184327847865130891285319544633893057753058949203445581927139186693872535329742391359879641144229970579145904367212511531836556837802954535066525480611193312581682661141834071310034429595842471537643230908718113174753674166435105158943332713776801614581854528905295858796532103260885199693976787591548315989700257665756953302499633488074896310377610013959807347802162619814280880178333263736808120455518454458695692023584320534517754328110812361795251762271319581012856160630464597476955859809151315464659333963829948668410017867653930442997964271659226936465196391105716463222781497121446332547543866363682848159958689209576905850551325112920085058163952144165170046516356012933440379512567504080951725910237024951400560197572450463777805471280861620148174567892257343166543338697980163248389422662394269514906884556092762618405981904606963055448000324590211927658317076525312838006342795222825214768849803242357296335690966623816523827534263907542164043998371981513940354367568443040273489024647624962185983469709800596789050203315279686297261390728826698942039372228923633762790495370439802472303194464345995321023970687158860384119661456462058053465841275226664006667620717291724924253012722967259108570820318660147663088910365131307186035761930282089209615065979230129221940690540002507242815348120112921045135738451455927906959422899035604261206178767305315866742753788768725253283015611008949173948781642058975563734927298663744574864289356647906851676032137289845344722276175672015850928654227937208724680518066470276212682295598747522379886442500174230448430719665885196629442639969483343383315839445978760301982389960103791498391471501621540321028783743990214210944660783103376672650273391977464450258485859743966661731338506410834601591809178018106859494005351464170113449465471169708730444769122445524931311216377690066586386846747734726405527018369009682674546729735576151949326233475229268671679688989004390297024497328032936856843360718599526057443518785418225964714616465843985412150872539804353725266033171318374511277104584206531662090621723451371754917080685343125836024261003458221740770321671877078795933885836171000161775340141432016451701480292799853063443742432673390425431802695218961197553545075933603803344281021966394577200155655200090958025137250290095218977120892839583920017767525611242944179375754168168075695793115513963204081615600742565584074477203765854926728518133192149280854707299226419290817753323035815120012258240053684120876039729093417112313143508492514682047897136154515297781802911457986612911859478066646089495607006083949516624004759315422846596923852249256936519559109482430196418946653318203384541180904096018686493565536216382531208970398991836789410149549293935820510378477942832779776097366375365042519852059074462399824356414176955448824191957015085116061256727950513583805942655858884261730614490526893039140260029474942122313457271134902487267742680780402366436260044301412212103672482557259715879592988072228445867708309705610857619230830886876404801501308303146969161617880527800000186254762526364039269495311891302161823467325149856649702498829548143477098064802149014303262673323459794336471713541657396084463489481173672311992913912957257539007058505856046643200405080243933978513688179093538382602802675075048054417157128950492559379430174986009298945108143447368750841876398387872671068217569039984405567921410982310517942051285115198294677286699102703390268594733177101677560065223708646894969614008864362488315076523368600146134123513094659715112378390008819487600974584059237809561023873255991819175097664187196466376727340247771586840796980649802548267690456512835185803541987935045556359486166537306530634542176242059498840406396145404608782915215142811101097532152075341218057134441259659863177708975997707695884628994316996644601600637471088146323468445375954974826669803157709800355576047064529718735937422382393086281629428037074065493685362509369933496264717004823838182817746978565577840729509709872674605598603974907156518488885806660446542952440782617065495372173211679685655136967468780334147568110309302770375999586480993257681275565950925998688445879666958338980307812105876004209235980438489360423929326797900782604635708932707738442805126028554635888799277646218529201997000249957457803494842320309943655312629257587152225693386297436442155706963171689962243487764335921121003856958157215984653224024649022220995439459351269634354158441432918802079126099171462716392009797704781104468951674217173744079222283394500380677554807452036355560856368988734125451132089554451517724652070769585436171602843128992165940083695437709028594151784214258132603066691142273666671179396760603005203568867913569208293039611667761605629335922123103195068842346854923135005732192916439913454737021844312477312128215598041516734684475218041922441905101285864518791310379876386198185752121844503084966494323118272383451824246310756463540013500378807990115218935716773449328278644305933396613352417316062554592018093423341225154193966603681743052941466777965216361508486494319760867553763246475388958290089296413472941734346005784455373692981449928753650691735536664803448359176202908933780989491647297226502781787008197176471443719395552274925782108816001912000364741435250162854638593939752996659616567511916415286699536986631395783268299037797259489899009541820942108397261715276509540293877558406925698592177155655741606147806812891376425837780359547534736430011605127216057834861126378862492655633832511245107727816472771760608002081134483790690895449974681688726224990171461601804965595748447913514871426758897218822876782640350375922671079783667865413966078236831113448814931273747869346349683336403697537588655242486388403163930489487253113743792834666997203751802071511577943261696034852187293891011687333291705153056423592192547393997277412878649971448182182874051670420478932987582398318926990966644858125353908193014943626021833876028594187203779196991331825022045896469294207615950280653593635851458632299371503020644264224665998673610696587632103874914592161274439137689688475382616919135494479859265156828285267870578069626377864011173838267064822027822998709186054470599474284794726340070043308239093914118817560901072486121095449906401047370379629915562088897308330994774498805644046728366764026899041136386747497099559484570746028733488321281162704972056183880157213595017712623791345434890369574953911696782704672633481964944126855193272169186735896695809925213620740413855715287201278751331729469016637958865490226118827209818307709198798862690651108692958420416240111266499629333789280630003053065714896749542156320643969630258590330916237618429886823273607505694956071802088083059601062571602974708905813409433249646051837549160976624262063086955372633462298383689976107066509685612892300625487557862684102997959012124497124571155264449324693112299231808855549091228038867757591829415641604621724326387276889878805472386603755286698421262054461023660735055515526015046010206962191371194750867464909822384284110831089602975807395222241082238799313262474405941208840123519295197053795756428457314420055313957025353868538749401117250182980421498726152133105229741023642332105143974437325086371006260883429330271773100493698749883778063623822120460174994956251579542169565799463450845463259204660309171034859761938958698394757277973824948833465781956208138988868095395754566013663819254897806784651157927418651503185566291496841172535922830104814076826120275318720006941318186445067795886830879072241272403866205864046889090134805074428771852446804489827170136270026482585310766372546875127042292981595690662191187366251991654858087858355969727045107153326016150607991832305550787089609111542421641784927371950839646891664378263883308935327055756399587539306931161059899215905455296099784290095397151006196164395823198941273364064816289061349276572796221521156416643613064895513146911554984988336938885429385994869516641739286287804059489742752006284806221653888175264862408806397699247846999387302021195069431240043733569182882533304529107012007849367972150097242002473849198690599974468162792707294342280513385095834735588957418596300794148267734942268050928024399456065962775933233399205809884515673075969467737911734163730369833536363991946698054280467944752271829960638422555234686432528020785096221579426880525215543147036365820248816309240688593021668157918922307084273933332364596110594354613546864655362430107886747441387523919239238862087068263159188594322759189126293324652547897117393450341158378956009543912429445084809042185825528988844091724384003083440161808170737288729355048371973804717186655775536877357251742783301284941361536628502162251450303645310749822692975358241526268080056594700054218380654188950434249355267229010261113900139619417821257118985800354183932219365148996064923617669617333694926519447847561620470860893674856179531459560671323297116651709322649012573879066760787183361182505876510381207869563416054576168974128145996901900808232814672795641895512300761739958380895603512332456568646798563853754123138929383095343210721289068576124223317692126475899309609406745428958594662048940710542320177234835628487640784513582158170936907095386284268401276292376160688603338184870628138839410171071978458837206168295963484164559299470465579517304854382194676006989152637020214951193366425890859802430633447225610065997671531084616978087124199481398126101682783808169173253163067111601923856743006675180425127386949145196283078710028173272321177067978494256926594226939296683641299410162711003446805275851761651410018704658892043623241431466750219043111011728940051033504405534793582539523033798708091145500532264106435100194757515318624288646390400683964723336169243628371793524321580274229766721477687951760046275488389593783044510191254768757861980154667426978432137287088290166764829238392239786678423346606819742097686238836387541374657700424074730357187462315207687214944694823404548057949283594303568625444966963300530273076630975019116215325453704247950743608380490653698974808953100655628020102744143058327871960096552249848324820320522241639552506109703042544791090960995880522533039012668033722220407210118949582844806079757850464372015346471346140147869590661962617452332498229728196878883163105956771176502042611275188993319825857467974454287833286050511032741397156886238503171651983186484560584978240837530546717685427206283932511077233163770562897485089146867646040356144631162912956382870914064160479392208521784691894037121949015035039130272018463153444773883902702643980853769417565423022759774305949460702560846424522442394307496682930711678550702367797465101643766848991917925014332538088649669151116561797641509032317160501764825462003434809230131981725602169068427296176365552468561506903631877793408956858906722704043096811054027109369075974651258161396284530424211690013578244680628667684803327257347868876610395136958332818712310198199373427400840147759706625935985442555559858585551026268696646982654296167845710118746488897543893591338133893702780626645657387081151878391978921688941142235572825819772207541975958164738372846253086658337028921705657489141213727342822973081583526180687546731482227642915012990239155946983927306133097096484621958214262059850602037726786324230862167414116431904985876656031627237510292766468875648082951443394920368801886586884749357914768515167234551102410211873549845065938482154249877335474593438498926324349686926417205519777368789052618274083556326439800193587339777271832784033308177922073087837098631926528536741612903348737529398305137467598576083941872114983434471004039091511855517774907056520112819860757993076465961159713060677479635857064362749266260598894015836360191489457317450367270992610795011399360615437411991214118968887993617158586014646723081142974233147763445725446492938981219880979695662134670169430439852272644662629623017019993827265408778737195947999362586277511195503358786348025429514006027858538159966155809208216587954211232693241063608975661219953125182976979938249190971331561759440097059342939748576406674011603820536857779161738962351972463470388082325975502943941329731741296414766484349702736549275558442347937309520881867060100354938069497101394985802201909321919921536140053023290448257911044859696823404962686599765765820695710610900521319135578086436482271224310857758326004533047359210450540300706593831609982759662458009454289132422886137221627601266800313432373237597539878317872200450694829042771695217706449632061008629464492044753539618512709841983153907453974631647330423767434649402928671841917364035240231557641836511290169154338806136657327291411578113671276361928559993632462180468006626824807432169069164759093738584409777857287116803722786249826994301519878825520755859035736337467487958060189200560136553023737268979135023134302242551850251468259112044430652600273692954913224753994881474287259874413032513565301681564923072090842408570476306464248216362595188615150491308450291913592054921963988097765031049827303759298306136029524320774003938705127395746677518919995572287139674058460287895136428380589542141620039376305956946605248040055539170808725973087777951823152182202159072796127593583783594223526008471706100207916550423172917464604038592378469541316081803953059313121873311348415622960186565380159791907726762875782595688756128889792884263526724782516153762007553517949532086426973645698204792046857148358925265446384564176969193232778760534348049608058288772877784684233351064546923738663515606139368813062320491381854591976518291002124767419565588339795107476850507509213295800647624620007388601074600010678646104532696796139592070803301716729117040849839530425703287955624412045189487458018462049243445865356046555034313099071831391718900789173603627588230664547905372638194130190827016828364712331227249845043852795375412716125354175082628036214297673022551670727237334924299286346333550411935212213478880064295456040890558609538856023828103873648370995297538861091766855257648920296986063945018502522671020269384427168841027348059671292542738296401216019357507039859579324953183017553537433674131476245592013968712731773307438395210609354792067468706649635395922455828384856260517434024088339374861622607128411835348172078254766971360641544324197349352416718989251831271733381606074336413088065335285822113940262069489296791974257966440715233601900005729547879962934274178845044876670774788978947697830672514812634683908871719691401646230970444891825592168143708016573034015856983666763091146244329389611609855053977816551764218139858217142668132877004206457851590470062084051814310720445406832069191179065913829593944433859051004104644288201567642821603747408578647037866362878772153176795206883102787056873571623732839718201423984427863658839923404457755931633939850747901488911542602801460028715580777017149961088442368876981952552026651464733431225102144386220601237853597724514046729173409001215012760489586175970275280198919984134818934423079935429341729440064922608757903778573131318724844443350337570893256873152921333930806729501539641168125373146823301114035359197858368587778449262022227284021549781781507959335446186602769876588348174991854164506944162096911746442447050281218053471490286973318776072943284514306567459488345314050393607128928937796807890659376448064883502806041492482761825770206990194846767253760586723083383711023026363534036224420228044555569769583715460568186351261517569880842693101807403834299134567066581497216694754090615461340407844019164142927860170071339618677049321039949788143815861921391083533942359602511664653351224128552004345643169965170231359986347453623433748309567443134349245452982903495938609412410232153722426103596764233701428128349676465498984603241819484814221728419082501671213666414007161161386076227185604855759262279961572381552587626401923594703572311770542507408727292399447369043852765496932750940093193558811285946584157271088916708618884772477147703808167887674650837592070998087330522887559931736298941476502080146176936766400478774503505174513970958774109866375744711756245776018270574566997311248058517469625410587754492346652044864109404827961594669014667040541039460062182760784729699835040071175644776204130117760064191385664891640953478296894534256639785882981383472645768189501006501684562672070615492484880549116799546397443120244136732608772728901400482789864637363589158126909407618226872077417669295270966770330467210318856131795983458682137122496989731068787064541730050560644762841301662769110925374628606874860616743506892135075622193302614872808878798539549201253144479290708990463530115439725089496278628031433898520503340499738186121962333217171282421760728484552837024963976763324002875123190470740008697331821273085094676021476476340086297067529743417043702572358360347732873078385772455887530024330103608502428765809415127717464225868600107231586402258802423284638765260330207789048330976910690737084043307979088782790684736494865751108393072521485367523013032829407292723154537238475889020801094678191762567005529726688382779223651860849078184310267954563596874246572133417172609586221378780389418190664445386873936933690410210552781603037226473156658810942656971019561078387219408507122753864873357175776281135282708946188493152132868784813503818435626021003674466593477204659861882923477579596065256491611759111832165076965760577810372179452889631163293408945976293389680036248695196526138783125043467383213775856205174808776858545713434856198924892314571190204071969980755627277695343161606023067987136404385525345282246730959919192107191893442985435416806005912012288193164601035407631446850458997087902277439180395749231399974928338359820864811343466077648986608427246874894063965638794240281540913046056348003032482229004902842903324532411072157905989025052326935032691495830705128996325052675992570415788926960068473312146883530245791803481971934473473082928722220175895906875762423620600589113487530266804570940538906185067447106087538857085905462702397646391268726406767041559471524980262835476216607440493406457091309132977059332269906872841614176911240987993502681952725447523932104280763815333318189551249454220877292605968617395364943391639489736017247519026592754615224810305230238926151455099379738200905344104946353549680792590927772090224389046249562292792570655966190463952579043980853842006083312889124125711377025332541797142276551909110317260343804578432940734676440924351791244149221884038109568803728388383698574193388884960323590255009233983548412666067288550087693263568879296162813476881258852460695473338714072639202673076654683566535651600563178377284688343325395874939877504618328764078150261153717806474346047939251051258724044446866061062869228284078321523387156647570761923899522264155339644062662425170054514605995546085563671697554482383626109385528286766887632788477101930605871101066231859486584972926433004811683940879110019924408064859231954936006140085850905663657881440147526007931145711781381595736796224709020363092029825575928913256273745440692481691047677639497776718540741597132279343851960073666448916519959255404596723619470238900602713598009784325083797712472466186108012171952872797321463932933149975961487180171685031085383971955051841185052654970206940607461386704002159886986037555271710089203067244022448422144908150064417494179812931448502168102636800153830278690584340453238597418406447909188886729285801885376405669307125987952119821509831585815606042975734635086818165585335389954486419594945878623128003069935112194291719591145770149731594757016039010196534322880937765639514619051903993890719372002059157572555794059780076258310627492943394081693958658778525121180376815846025032357396206641253911713866285308412867229355255674076512701745716703048621247308761795637122683277289953231489917889736961831725524992997637386836242753599872336050993196293370180358710446639150516047191740601707532589894069072256605355997158158080346762155245695896728367444001799961621805755789189515509733320177451743885241958371582263674222658373829349102217136986221306533576490295436354963033027056557033348209317888109475277157872286813909132994441561957749776896259105758653231623009401883237501585386459555349804416864069950560446350495038358840018608703932780866192505464070053166578116087301404111943203518147504820832937046989113511310626468647951589624279473044396631770450191147172500739808885947163959806535826133152835052646359715368452425704494781889054674389639071499563016770289920922559364023414136612976985533714084871905366444117609650945150832900512651278952012284848545054239733510194763303378914433190814936937170149732701753468176860889617773934108867249046996998853346828361339950367679609705123280990129518134404289713328839190831015420671881682129007411529033498082205662312815125066702496567083896864883164147036404939732185934940254590792390971095913636543706310894624044363956989061049665314226254225876849927200790087916032094036956440353420223038879469729866170515791360320699942905327186772101296673995814751562606613386158198129329181195872225283533873172937197641319857504364504953741034968980541883156533178388562209975443114632981749297597042047606764528961075553383039341946251163787034494775435740243238167608586700094736495647593744917302778175374406486690340279072061977267857477439243903878625341852146307836699457844632850486637653256286018616793284637970166963196066361376437516961847373609423858425755023532836265612331401739074514417627255749111644599623567376142498645470114316897825832032606962491299278005166447460200435642633595515501298875314796551163605529851683107322013139966669869173266619819260425075492227143597650428119381531078300686201469903199024606554081574623220528425856398071906429935573728808533737173649291963561198221372430467061220607072532872243864349340536744794203536426773128996876018391523676788244195346613154854019305129536114903557275356758573496238372896294923210709855374502302348465729715855961340140753192774304242690007550520272191843039112605614039466297670643898155543840622998705617794948746824742996513408519045573249848444657218434288014270581957514065890150329992662661231436219139670592783308107711994856140967838319132167361025068046913281728947061813059544343308899939424725969456690020355470148707117619377122492559703216038915198484775613951952004943347626632665488174469532156940189582499552823277999220036772510249835678792480504965468761156876083857559093332951765276257339813319703519144230479126567787098885556742724194089777492680000558293530095609801491601699004795830257095216167349701703570950903303128074656609664215723543187779436315506936702984865834642821219861440902278378939409507767136649644616098728350902176821352640764105711829262699436525112558505417712464565593817314936569460578658727325915716439733393468688445897725747783287184585406082345270304953430782613944138060343672873959794954626381463104322479917568540801362654947770950127365903387698053108787117297809772849931360927503011618677188528402591458493588118353567644724161743998438618547305717038375775008529225708262212841994621505779998082936524368139717238460644252220637881334774644480863588839920339944735479776638434586367128922908781201557309230517507369071245305096354694859241380471648769306515409753232201202981929139048287697896249505019601620325592081203628350406729367975615999753959260419718160684228117247246373483520939867006086240487488902923923011436294417664541403251393226832226812468891547152987694371583484619683150102694798357968096833889796899220307244746807221295839423757204102292677936630006195748510630381957404880059893580626459670083283456195558587628194738504485251301288411211261835918002273446779702864955838744458411933876030353767888433151410505108869888080305577023599804058453121565470259351113960690811676949385557911136621905115689114949921924367564896307741093002672099321111512989752098369805581381907397721907416427793568917950879743520461482174121381363157104950214127009213834951784944716265134012167515141893326265863886393030994098167388026690035630557599515791024969294695835510151304800999082041436950231374369848201173785785565878402908233433977901770977044675351042320779821741649635559162922645098245563268192866360406162051510097326329232499981229412056081206607292026126206437137963236587837054590670334270544033243879427176804887724527645405806694414667451411597958327115457528548931482371140781967007917890480837390717783068959945436228618703906442402193306002638962910214399396344875115549727922913847918195019873865098013184627273894216349412493340629256761236501123129576038193996380690146620041465508104263443926194597449752435126226841980806971453418262118064447574968092756837672806256844941548342437366667008975095726457349679584866957245681618278990066644812974804337066669647988568648346301554112075371448632685974859845100706710337609358193922264879794028875371265988744444106276866108897783646891321209404154190974324522150718377017651354093918697703995644761524811623971364644652111686383162797313364950926105928183643906881951553991252630963607382840091714571080163722086450821054045875956400965505482869068596750608603879464483565303491439015203317466378205547472963786982380505656963353572355283771663381469330953390901210278321150519329307401820973302863355109399853392685022769320865946535687169315492964422509572654505365717538104877847241075744931235380031399103937139607276420533113094806033042675122693970312750753340640102815111258605588306298353880302337823272411725024394134834226278205448407001388970505545159529935880141089439242263222704834782848658143112390063925444975614566206953671826952831375130744270204453634792565995793695311343354035572866810166360890783052673504175863285156591543715934513139666493772274577607074242432418534426688596678164666901558200180076264288111582466522961442297015384574607249193532011574863981264231110342427083410473820892552359855175176631353172944874026484903221623155346359143610304088593594939850444651569448831508807656803969838793301788509809112423776889240825337932699391346107147320058941743134100469630194440371340912364436529975969793908513312765107520180304680348447167273262048913040156164043554723734931613808009754922073917674920007912238997867172032880724046775720461071019331486652179092529257657853840109325849068687324781016424834713345984601643966518484898833001313713381276742342783192748941252890619089044684144413853056286392991013549494184463463448884901482819775463585920475407501908152391756635194412686604371967864054355310915551047164190765163408753057220290558587063610894791126695606618120687771256301899694909890633057844080095456899168436110440631616840892745488462023555139892576741444399037421763526718653182793914111580061039559064386412880362076069067619587563776430059525838125471440515956293372186355996908746861231403548059483306915615649470132337606392220641438459582429000063220645697604336221593477547683281888774734319504834409712958509810164086184981326922405152068022385250036648863926678809331632299128410379688491630862182310157510679771058674997930974900176217337268947123726645795139146579573603636529157582757090869845196283825124269540295988380138303082151302153018413728001027892952145270797254581748240197339987093882609210979765711897244517006695582466725801938987425205922427180366901990546913488786616344424590147481176154589458793168443108503140693469117544471943847285708467271519443701002147194427369529003668080994571839421937908101044755594160660850390350337384910858230699132523658595634380621695123382346737763745119789542994389798404711503680747487622623512780627330141995094185284641909945330021753434685815426548273383890075054895926127690946435287894362762126480847190537332961140341734317621058926170920985258450674830660516252053665746877527563022699781796186061923270381034633280227141943308052125913148205224898258568101383174683857597540006028639966940182459652607814161672864051618948826761616457088767123246876387947492563200377432923253927202984410599621722037342739672992563917138064695366201339726120489966082593133139253621190988513372700471412109053242231396962350214568984471947585095785788914182524705083341835348054374309842087184338700644893218180852058260372652165412205106819290120958409097171386249544723726117554894249537174534884267113730323932150383853524821824021306156925210322202703135149608123114934604715794572360305485143368793692205970749670672886566846616780063172902440350858931245767923314932405482961292238984021761535927305727101229820665800039784707109819933333338953192727440878707395536934611498272633704237252681773673443163509817753309954521704788834520894255973497614115530403404761172345971733396364814909765153247319396366446238020430511793015922300010772112575658722585855880386734999258665633613641479538001423258232112204009357079058666723259642276246434417682172794150402100792885715735886562712843786345591469005849465873796985814679290468968706158364401612551375607000068539017389658881877597465137281388456022388429016298066051140638174839371749597527417693882679467535777445974425994777917101873792008974604971355011151293599346798389468355042798735590572768689504911825930564709342530850330957240431584082480556759062941527374257056009282981824663924629996 \ No newline at end of file