// Path: src/main/java/org/jsoup/helper/Validate.java
// public final class Validate {
//     
//     private Validate() {}
// 
//     /**
//      * Validates that the object is not null
//      * @param obj object to test
//      */
//     public static void notNull(@Nullable Object obj) {
//         if (obj == null)
//             throw new IllegalArgumentException("Object must not be null");
//     }
// 
//     /**
//      * Validates that the object is not null
//      * @param obj object to test
//      * @param msg message to output if validation fails
//      */
//     public static void notNull(@Nullable Object obj, String msg) {
//         if (obj == null)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the value is true
//      * @param val object to test
//      */
//     public static void isTrue(boolean val) {
//         if (!val)
//             throw new IllegalArgumentException("Must be true");
//     }
// 
//     /**
//      * Validates that the value is true
//      * @param val object to test
//      * @param msg message to output if validation fails
//      */
//     public static void isTrue(boolean val, String msg) {
//         if (!val)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the value is false
//      * @param val object to test
//      */
//     public static void isFalse(boolean val) {
//         if (val)
//             throw new IllegalArgumentException("Must be false");
//     }
// 
//     /**
//      * Validates that the value is false
//      * @param val object to test
//      * @param msg message to output if validation fails
//      */
//     public static void isFalse(boolean val, String msg) {
//         if (val)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the array contains no null elements
//      * @param objects the array to test
//      */
//     public static void noNullElements(Object[] objects) {
//         noNullElements(objects, "Array must not contain any null objects");
//     }
// 
//     /**
//      * Validates that the array contains no null elements
//      * @param objects the array to test
//      * @param msg message to output if validation fails
//      */
//     public static void noNullElements(Object[] objects, String msg) {
//         for (Object obj : objects)
//             if (obj == null)
//                 throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the string is not null and is not empty
//      * @param string the string to test
//      */
//     public static void notEmpty(@Nullable String string) {
//         if (string == null || string.length() == 0)
//             throw new IllegalArgumentException("String must not be empty");
//     }
// 
//     /**
//      * Validates that the string is not null and is not empty
//      * @param string the string to test
//      * @param msg message to output if validation fails
//      */
//     public static void notEmpty(@Nullable String string, String msg) {
//         if (string == null || string.length() == 0)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Blow up if we reach an unexpected state.
//      * @param msg message to think about
//      */
//     public static void wtf(String msg) {
//         throw new IllegalStateException(msg);
//     }
// 
//     /**
//      Cause a failure.
//      @param msg message to output.
//      */
//     public static void fail(String msg) {
//         throw new IllegalArgumentException(msg);
//     }
// }


import org.jsoup.helper.Validate;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketTimeoutException;
import java.nio.ByteBuffer;

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        if (interrupted || capped && remaining <= 0)
            return -1;
        if (Thread.interrupted()) {
            // interrupted latches, because parse() may call twice (and we still want the thread interupt to clear)
            interrupted = true;
            return -1;
        }
        if (expired())
            throw new SocketTimeoutException("Read timeout");

        if (capped && len > remaining)
            len = remaining; // don't read more than desired, even if available

        try {
            final int read = super.read(b, off, len);
            remaining -= read;
            return read;
        } catch (SocketTimeoutException e) {
            return 0;
        }
    }

    /**
     * Reads this inputstream to a ByteBuffer. The supplied max may be less than the inputstream's max, to support
     * reading just the first bytes.
     */
    public ByteBuffer readToByteBuffer(int max) throws IOException {
// Path: src/main/java/org/jsoup/helper/Validate.java
// public final class Validate {
//     
//     private Validate() {}
// 
//     /**
//      * Validates that the object is not null
//      * @param obj object to test
//      */
//     public static void notNull(@Nullable Object obj) {
//         if (obj == null)
//             throw new IllegalArgumentException("Object must not be null");
//     }
// 
//     /**
//      * Validates that the object is not null
//      * @param obj object to test
//      * @param msg message to output if validation fails
//      */
//     public static void notNull(@Nullable Object obj, String msg) {
//         if (obj == null)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the value is true
//      * @param val object to test
//      */
//     public static void isTrue(boolean val) {
//         if (!val)
//             throw new IllegalArgumentException("Must be true");
//     }
// 
//     /**
//      * Validates that the value is true
//      * @param val object to test
//      * @param msg message to output if validation fails
//      */
//     public static void isTrue(boolean val, String msg) {
//         if (!val)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the value is false
//      * @param val object to test
//      */
//     public static void isFalse(boolean val) {
//         if (val)
//             throw new IllegalArgumentException("Must be false");
//     }
// 
//     /**
//      * Validates that the value is false
//      * @param val object to test
//      * @param msg message to output if validation fails
//      */
//     public static void isFalse(boolean val, String msg) {
//         if (val)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the array contains no null elements
//      * @param objects the array to test
//      */
//     public static void noNullElements(Object[] objects) {
//         noNullElements(objects, "Array must not contain any null objects");
//     }
// 
//     /**
//      * Validates that the array contains no null elements
//      * @param objects the array to test
//      * @param msg message to output if validation fails
//      */
//     public static void noNullElements(Object[] objects, String msg) {
//         for (Object obj : objects)
//             if (obj == null)
//                 throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the string is not null and is not empty
//      * @param string the string to test
//      */
//     public static void notEmpty(@Nullable String string) {
//         if (string == null || string.length() == 0)
//             throw new IllegalArgumentException("String must not be empty");
//     }
// 
//     /**
//      * Validates that the string is not null and is not empty
//      * @param string the string to test
//      * @param msg message to output if validation fails
//      */
//     public static void notEmpty(@Nullable String string, String msg) {
//         if (string == null || string.length() == 0)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Blow up if we reach an unexpected state.
//      * @param msg message to think about
//      */
//     public static void wtf(String msg) {
//         throw new IllegalStateException(msg);
//     }
// 
//     /**
//      Cause a failure.
//      @param msg message to output.
//      */
//     public static void fail(String msg) {
//         throw new IllegalArgumentException(msg);
//     }
// }


// Path: src/main/java/org/jsoup/internal/ConstrainableInputStream.java
import org.jsoup.helper.Validate;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketTimeoutException;
import java.nio.ByteBuffer;


    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        if (interrupted || capped && remaining <= 0)
            return -1;
        if (Thread.interrupted()) {
            // interrupted latches, because parse() may call twice (and we still want the thread interupt to clear)
            interrupted = true;
            return -1;
        }
        if (expired())
            throw new SocketTimeoutException("Read timeout");

        if (capped && len > remaining)
            len = remaining; // don't read more than desired, even if available

        try {
            final int read = super.read(b, off, len);
            remaining -= read;
            return read;
        } catch (SocketTimeoutException e) {
            return 0;
        }
    }

    /**
     * Reads this inputstream to a ByteBuffer. The supplied max may be less than the inputstream's max, to support
     * reading just the first bytes.
     */
    public ByteBuffer readToByteBuffer(int max) throws IOException {
        Validate.isTrue(max >= 0, "maxSize must be 0 (unlimited) or larger");