// Path: plugin/src/main/java/com/android/apksigner/core/util/DataSink.java
// public interface DataSink {
// 
//     /**
//      * Consumes the provided chunk of data.
//      *
//      * <p>This data sink guarantees to not hold references to the provided buffer after this method
//      * terminates.
//      */
//     void consume(byte[] buf, int offset, int length) throws IOException;
// 
//     /**
//      * Consumes all remaining data in the provided buffer and advances the buffer's position
//      * to the buffer's limit.
//      *
//      * <p>This data sink guarantees to not hold references to the provided buffer after this method
//      * terminates.
//      */
//     void consume(ByteBuffer buf) throws IOException;
// }
// 
// Path: plugin/src/main/java/com/android/apksigner/core/util/DataSource.java
// public interface DataSource {
// 
//     /**
//      * Returns the amount of data (in bytes) contained in this data source.
//      */
//     long size();
// 
//     /**
//      * Feeds the specified chunk from this data source into the provided sink.
//      *
//      * @param offset index (in bytes) at which the chunk starts inside data source
//      * @param size size (in bytes) of the chunk
//      */
//     void feed(long offset, long size, DataSink sink) throws IOException;
// 
//     /**
//      * Returns a buffer holding the contents of the specified chunk of data from this data source.
//      * Changes to the data source are not guaranteed to be reflected in the returned buffer.
//      * Similarly, changes in the buffer are not guaranteed to be reflected in the data source.
//      *
//      * <p>The returned buffer's position is {@code 0}, and the buffer's limit and capacity is
//      * {@code size}.
//      *
//      * @param offset index (in bytes) at which the chunk starts inside data source
//      * @param size size (in bytes) of the chunk
//      */
//     ByteBuffer getByteBuffer(long offset, int size) throws IOException;
// 
//     /**
//      * Copies the specified chunk from this data source into the provided destination buffer,
//      * advancing the destination buffer's position by {@code size}.
//      *
//      * @param offset index (in bytes) at which the chunk starts inside data source
//      * @param size size (in bytes) of the chunk
//      */
//     void copyTo(long offset, int size, ByteBuffer dest) throws IOException;
// 
//     /**
//      * Returns a data source representing the specified region of data of this data source. Changes
//      * to data represented by this data source will also be visible in the returned data source.
//      *
//      * @param offset index (in bytes) at which the region starts inside data source
//      * @param size size (in bytes) of the region
//      */
//     DataSource slice(long offset, long size);
// }


import java.io.Closeable;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.SignatureException;
import java.util.List;
import com.android.apksigner.core.util.DataSink;
import com.android.apksigner.core.util.DataSource;
            return mInspectJarEntryRequest;
        }

        /**
         * Output policy for an input APK's JAR entry.
         */
        public static enum OutputPolicy {
            /** Entry must not be output. */
            SKIP,

            /** Entry should be output. */
            OUTPUT,

            /** Entry will be output by the engine. The client can thus ignore this input entry. */
            OUTPUT_BY_ENGINE,
        }
    }

    /**
     * Request to inspect the specified JAR entry.
     *
     * <p>The entry's uncompressed data must be provided to the data sink returned by
     * {@link #getDataSink()}. Once the entry's data has been provided to the sink, {@link #done()}
     * must be invoked.
     */
    interface InspectJarEntryRequest {

        /**
         * Returns the data sink into which the entry's uncompressed data should be sent.
         */
// Path: plugin/src/main/java/com/android/apksigner/core/util/DataSink.java
// public interface DataSink {
// 
//     /**
//      * Consumes the provided chunk of data.
//      *
//      * <p>This data sink guarantees to not hold references to the provided buffer after this method
//      * terminates.
//      */
//     void consume(byte[] buf, int offset, int length) throws IOException;
// 
//     /**
//      * Consumes all remaining data in the provided buffer and advances the buffer's position
//      * to the buffer's limit.
//      *
//      * <p>This data sink guarantees to not hold references to the provided buffer after this method
//      * terminates.
//      */
//     void consume(ByteBuffer buf) throws IOException;
// }
// 
// Path: plugin/src/main/java/com/android/apksigner/core/util/DataSource.java
// public interface DataSource {
// 
//     /**
//      * Returns the amount of data (in bytes) contained in this data source.
//      */
//     long size();
// 
//     /**
//      * Feeds the specified chunk from this data source into the provided sink.
//      *
//      * @param offset index (in bytes) at which the chunk starts inside data source
//      * @param size size (in bytes) of the chunk
//      */
//     void feed(long offset, long size, DataSink sink) throws IOException;
// 
//     /**
//      * Returns a buffer holding the contents of the specified chunk of data from this data source.
//      * Changes to the data source are not guaranteed to be reflected in the returned buffer.
//      * Similarly, changes in the buffer are not guaranteed to be reflected in the data source.
//      *
//      * <p>The returned buffer's position is {@code 0}, and the buffer's limit and capacity is
//      * {@code size}.
//      *
//      * @param offset index (in bytes) at which the chunk starts inside data source
//      * @param size size (in bytes) of the chunk
//      */
//     ByteBuffer getByteBuffer(long offset, int size) throws IOException;
// 
//     /**
//      * Copies the specified chunk from this data source into the provided destination buffer,
//      * advancing the destination buffer's position by {@code size}.
//      *
//      * @param offset index (in bytes) at which the chunk starts inside data source
//      * @param size size (in bytes) of the chunk
//      */
//     void copyTo(long offset, int size, ByteBuffer dest) throws IOException;
// 
//     /**
//      * Returns a data source representing the specified region of data of this data source. Changes
//      * to data represented by this data source will also be visible in the returned data source.
//      *
//      * @param offset index (in bytes) at which the region starts inside data source
//      * @param size size (in bytes) of the region
//      */
//     DataSource slice(long offset, long size);
// }


// Path: plugin/src/main/java/com/android/apksigner/core/ApkSignerEngine.java
import java.io.Closeable;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.SignatureException;
import java.util.List;
import com.android.apksigner.core.util.DataSink;
import com.android.apksigner.core.util.DataSource;

            return mInspectJarEntryRequest;
        }

        /**
         * Output policy for an input APK's JAR entry.
         */
        public static enum OutputPolicy {
            /** Entry must not be output. */
            SKIP,

            /** Entry should be output. */
            OUTPUT,

            /** Entry will be output by the engine. The client can thus ignore this input entry. */
            OUTPUT_BY_ENGINE,
        }
    }

    /**
     * Request to inspect the specified JAR entry.
     *
     * <p>The entry's uncompressed data must be provided to the data sink returned by
     * {@link #getDataSink()}. Once the entry's data has been provided to the sink, {@link #done()}
     * must be invoked.
     */
    interface InspectJarEntryRequest {

        /**
         * Returns the data sink into which the entry's uncompressed data should be sent.
         */
        DataSink getDataSink();