class NonBlockingJsonParser
    extends NonBlockingUtf8JsonParserBase
    implements ByteArrayFeeder
{
    private byte[] _inputBuffer = NO_BYTES;

    public NonBlockingJsonParser(IOContext ctxt, int parserFeatures,
                                 ByteQuadsCanonicalizer sym) {
        super(ctxt, parserFeatures, sym);
    }

    @Override
    public ByteArrayFeeder getNonBlockingInputFeeder() {
        return this;
    }

    @Override
    public void feedInput(final byte[] buf, final int start, final int end) throws IOException {<FILL_FUNCTION_BODY>}

    @Override
    public int releaseBuffered(final OutputStream out) throws IOException {
        final int avail = _inputEnd - _inputPtr;
        if (avail > 0) {
            out.write(_inputBuffer, _inputPtr, avail);
        }
        return avail;
    }

    @Override
    protected byte getNextSignedByteFromBuffer() {
        return _inputBuffer[_inputPtr++];
    }

    @Override
    protected int getNextUnsignedByteFromBuffer() {
        return _inputBuffer[_inputPtr++] & 0xFF;
    }

    @Override
    protected byte getByteFromBuffer(final int ptr) {
        return _inputBuffer[ptr];
    }
}

        // Must not have remaining input
        if (_inputPtr < _inputEnd) {
            _reportError("Still have %d undecoded bytes, should not call 'feedInput'", _inputEnd - _inputPtr);
        }
        if (end < start) {
            _reportError("Input end (%d) may not be before start (%d)", end, start);
        }
        // and shouldn't have been marked as end-of-input
        if (_endOfInput) {
            _reportError("Already closed, can not feed more input");
        }
        // Time to update pointers first
        _currInputProcessed += _origBufferLen;

        // 06-Sep-2023, tatu: [core#1046] Enforce max doc length limit
        streamReadConstraints().validateDocumentLength(_currInputProcessed);

        // Also need to adjust row start, to work as if it extended into the past wrt new buffer
        _currInputRowStart = start - (_inputEnd - _currInputRowStart);

        // And then update buffer settings
        _currBufferStart = start;
        _inputBuffer = buf;
        _inputPtr = start;
        _inputEnd = end;
        _origBufferLen = end - start;
    
<methods>public void endOfInput() ,public final boolean needMoreInput() ,public com.fasterxml.jackson.core.JsonToken nextToken() throws java.io.IOException<variables>private static final int FEAT_MASK_ALLOW_JAVA_COMMENTS,private static final int FEAT_MASK_ALLOW_MISSING,private static final int FEAT_MASK_ALLOW_SINGLE_QUOTES,private static final int FEAT_MASK_ALLOW_UNQUOTED_NAMES,private static final int FEAT_MASK_ALLOW_YAML_COMMENTS,private static final int FEAT_MASK_LEADING_ZEROS,private static final int FEAT_MASK_TRAILING_COMMA,protected static final int[] _icLatin1,private static final int[] _icUTF8,protected int _origBufferLen