class JSONReaderUTF8Vector
        extends JSONReaderUTF8 {
    JSONReaderUTF8Vector(Context ctx, String str, byte[] bytes, int offset, int length) {
        super(ctx, str, bytes, offset, length);
    }

    @Override
    public String readString() {<FILL_FUNCTION_BODY>}

    public static class Factory
            implements JSONFactory.JSONReaderUTF8Creator {
        @Override
        public JSONReader create(Context ctx, String str, byte[] bytes, int offset, int length) {
            return new JSONReaderUTF8Vector(ctx, str, bytes, offset, length);
        }
    }
}

        if (ch == '"' || ch == '\'') {
            final byte[] bytes = this.bytes;
            char quote = this.ch;
            int valueLength;
            int offset = this.offset;
            final int start = offset, end = this.end;
            boolean ascii = true;
            valueEscape = false;

            {
                int i = 0;
                Vector<Byte> v_quote = quote == '"' ? V_BYTE_64_DOUBLE_QUOTE : V_BYTE_64_SINGLE_QUOTE;
                for (; offset + 8 < end; offset += 8, i += 8) {
                    ByteVector v = (ByteVector) ByteVector.SPECIES_64.fromArray(bytes, offset);
                    if (v.eq(V_BYTE_64_SLASH).or(v.eq(v_quote).or(v.lt(V_BYTE_64_ZERO))).anyTrue()) {
                        break;
                    }
                }

                for (; ; ++i) {
                    if (offset >= end) {
                        throw new JSONException("invalid escape character EOI");
                    }

                    int c = bytes[offset];
                    if (c == '\\') {
                        valueEscape = true;
                        c = bytes[offset + 1];
                        offset += (c == 'u' ? 6 : (c == 'x' ? 4 : 2));
                        continue;
                    }

                    if (c >= 0) {
                        if (c == quote) {
                            valueLength = i;
                            break;
                        }
                        offset++;
                    } else {
                        ascii = false;
                        switch ((c & 0xFF) >> 4) {
                            case 12:
                            case 13: {
                                /* 110x xxxx   10xx xxxx*/
                                offset += 2;
                                break;
                            }
                            case 14: {
                                offset += 3;
                                break;
                            }
                            default: {
                                /* 10xx xxxx,  1111 xxxx */
                                if ((c >> 3) == -2) {
                                    offset += 4;
                                    i++;
                                    break;
                                }

                                throw new JSONException("malformed input around byte " + offset);
                            }
                        }
                    }
                }
            }

            String str;
            if (valueEscape) {
                char[] chars = new char[valueLength];
                offset = start;
                for (int i = 0; ; ++i) {
                    int ch = bytes[offset];
                    if (ch == '\\') {
                        ch = bytes[++offset];
                        switch (ch) {
                            case 'u': {
                                ch = char4(bytes[offset + 1], bytes[offset + 2], bytes[offset + 3], bytes[offset + 4]);
                                offset += 4;
                                break;
                            }
                            case 'x': {
                                ch = char2(bytes[offset + 1], bytes[offset + 2]);
                                offset += 2;
                                break;
                            }
                            case '\\':
                            case '"':
                                break;
                            default:
                                ch = char1(ch);
                                break;
                        }
                        chars[i] = (char) ch;
                        offset++;
                    } else if (ch == '"') {
                        break;
                    } else {
                        if (ch >= 0) {
                            chars[i] = (char) ch;
                            offset++;
                        } else {
                            switch ((ch & 0xFF) >> 4) {
                                case 12:
                                case 13: {
                                    /* 110x xxxx   10xx xxxx*/
                                    chars[i] = (char) (((ch & 0x1F) << 6) | (bytes[offset + 1] & 0x3F));
                                    offset += 2;
                                    break;
                                }
                                case 14: {
                                    chars[i] = (char)
                                            (((ch & 0x0F) << 12) |
                                                    ((bytes[offset + 1] & 0x3F) << 6) |
                                                    ((bytes[offset + 2] & 0x3F) << 0));
                                    offset += 3;
                                    break;
                                }
                                default: {
                                    /* 10xx xxxx,  1111 xxxx */
                                    char2_utf8(bytes, offset, ch, chars, i);
                                    offset += 4;
                                    i++;
                                }
                            }
                        }
                    }
                }

                str = new String(chars);
            } else if (ascii) {
                int strlen = offset - start;
                if (strlen == 1) {
                    str = TypeUtils.toString((char) (bytes[start] & 0xff));
                } else if (strlen == 2) {
                    str = TypeUtils.toString(
                            (char) (bytes[start] & 0xff),
                            (char) (bytes[start + 1] & 0xff)
                    );
                } else if (STRING_CREATOR_JDK11 != null) {
                    str = STRING_CREATOR_JDK11.apply(
                            Arrays.copyOfRange(this.bytes, this.offset, offset),
                            LATIN1);
                } else {
                    str = new String(bytes, start, offset - start, StandardCharsets.US_ASCII);
                }
            } else {
                str = new String(bytes, start, offset - start, StandardCharsets.UTF_8);
            }

            if ((context.features & Feature.TrimString.mask) != 0) {
                str = str.trim();
            }

            int ch = ++offset == end ? EOI : bytes[offset++];
            while (ch <= ' ' && (1L << ch & SPACE) != 0) {
                ch = offset == end ? EOI : bytes[offset++];
            }

            if (comma = ch == ',') {
                ch = offset == end ? EOI : bytes[offset++];
                while (ch <= ' ' && (1L << ch & SPACE) != 0) {
                    ch = offset == end ? EOI : bytes[offset++];
                }
            }

            this.ch = (char) ch;
            this.offset = offset;
            return str;
        }

        switch (ch) {
            case '[':
                return toString(
                        readArray());
            case '{':
                return toString(
                        readObject());
            case '-':
            case '+':
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                readNumber0();
                Number number = getNumber();
                return number.toString();
            case 't':
            case 'f':
                boolValue = readBoolValue();
                return boolValue ? "true" : "false";
            case 'n': {
                readNull();
                return null;
            }
            default:
                throw new JSONException("TODO : " + ch);
        }
    
<methods>public final void close() ,public java.lang.String getFieldName() ,public long getNameHashCodeLCase() ,public final int getRawInt() ,public final long getRawLong() ,public final java.lang.String getString() ,public final int getStringLength() ,public final java.lang.String info(java.lang.String) ,public final boolean isNull() ,public boolean isReference() ,public void next() ,public final boolean nextIfArrayEnd() ,public final boolean nextIfArrayStart() ,public final boolean nextIfComma() ,public final boolean nextIfInfinity() ,public final boolean nextIfMatch(char) ,public final boolean nextIfMatchIdent(char, char, char) ,public final boolean nextIfMatchIdent(char, char, char, char) ,public final boolean nextIfMatchIdent(char, char, char, char, char) ,public final boolean nextIfMatchIdent(char, char, char, char, char, char) ,public final boolean nextIfName4Match10(long) ,public final boolean nextIfName4Match11(long) ,public final boolean nextIfName4Match12(long, byte) ,public final boolean nextIfName4Match13(long, int) ,public final boolean nextIfName4Match14(long, int) ,public final boolean nextIfName4Match15(long, int) ,public final boolean nextIfName4Match16(long, int, byte) ,public final boolean nextIfName4Match17(long, long) ,public final boolean nextIfName4Match18(long, long) ,public final boolean nextIfName4Match19(long, long) ,public final boolean nextIfName4Match2() ,public final boolean nextIfName4Match20(long, long, byte) ,public final boolean nextIfName4Match21(long, long, int) ,public final boolean nextIfName4Match22(long, long, int) ,public final boolean nextIfName4Match23(long, long, int) ,public final boolean nextIfName4Match24(long, long, int, byte) ,public final boolean nextIfName4Match25(long, long, long) ,public final boolean nextIfName4Match26(long, long, long) ,public final boolean nextIfName4Match27(long, long, long) ,public final boolean nextIfName4Match28(long, long, long, byte) ,public final boolean nextIfName4Match29(long, long, long, int) ,public final boolean nextIfName4Match3() ,public final boolean nextIfName4Match30(long, long, long, int) ,public final boolean nextIfName4Match31(long, long, long, int) ,public final boolean nextIfName4Match32(long, long, long, int, byte) ,public final boolean nextIfName4Match33(long, long, long, long) ,public final boolean nextIfName4Match34(long, long, long, long) ,public final boolean nextIfName4Match35(long, long, long, long) ,public final boolean nextIfName4Match36(long, long, long, long, byte) ,public final boolean nextIfName4Match37(long, long, long, long, int) ,public final boolean nextIfName4Match38(long, long, long, long, int) ,public final boolean nextIfName4Match39(long, long, long, long, int) ,public final boolean nextIfName4Match4(byte) ,public final boolean nextIfName4Match40(long, long, long, long, int, byte) ,public final boolean nextIfName4Match41(long, long, long, long, long) ,public final boolean nextIfName4Match42(long, long, long, long, long) ,public final boolean nextIfName4Match43(long, long, long, long, long) ,public final boolean nextIfName4Match5(int) ,public final boolean nextIfName4Match6(int) ,public final boolean nextIfName4Match7(int) ,public final boolean nextIfName4Match8(int, byte) ,public final boolean nextIfName4Match9(long) ,public final boolean nextIfName8Match0() ,public final boolean nextIfName8Match1() ,public final boolean nextIfName8Match2() ,public final boolean nextIfNull() ,public boolean nextIfNullOrEmptyString() ,public final boolean nextIfObjectEnd() ,public boolean nextIfObjectStart() ,public final boolean nextIfSet() ,public final boolean nextIfValue4Match10(long) ,public final boolean nextIfValue4Match11(long) ,public final boolean nextIfValue4Match2() ,public final boolean nextIfValue4Match3() ,public final boolean nextIfValue4Match4(byte) ,public final boolean nextIfValue4Match5(byte, byte) ,public final boolean nextIfValue4Match6(int) ,public final boolean nextIfValue4Match7(int) ,public final boolean nextIfValue4Match8(int, byte) ,public final boolean nextIfValue4Match9(int, byte, byte) ,public final java.math.BigDecimal readBigDecimal() ,public final boolean readBoolValue() ,public final double readDoubleValue() ,public java.lang.String readFieldName() ,public long readFieldNameHashCode() ,public long readFieldNameHashCodeUnquote() ,public final float readFloatValue() ,public final byte[] readHex() ,public final boolean readIfNull() ,public final java.lang.Integer readInt32() ,public final int readInt32Value() ,public final java.lang.Long readInt64() ,public final long readInt64Value() ,public final java.time.LocalDate readLocalDate() ,public final java.time.LocalDate readLocalDate10() ,public final java.time.LocalDate readLocalDate8() ,public final java.time.LocalDate readLocalDate9() ,public final long readMillis19() ,public final void readNull() ,public final java.util.Date readNullOrNewDate() ,public final void readNumber(com.alibaba.fastjson2.reader.ValueConsumer, boolean) ,public final void readNumber0() ,public final java.time.OffsetDateTime readOffsetDateTime() ,public final java.time.OffsetTime readOffsetTime() ,public final java.lang.String readPattern() ,public final java.lang.String readReference() ,public final void readString(com.alibaba.fastjson2.reader.ValueConsumer, boolean) ,public java.lang.String readString() ,public final java.util.UUID readUUID() ,public long readValueHashCode() ,public final void skipComment() ,public final boolean skipName() ,public final void skipValue() <variables>protected final non-sealed byte[] bytes,protected com.alibaba.fastjson2.JSONFactory.CacheItem cacheItem,protected char[] charBuf,protected final non-sealed int end,protected final non-sealed java.io.InputStream in,protected final non-sealed int length,protected boolean nameAscii,protected int nameBegin,protected int nameEnd,protected int nameLength,protected int referenceBegin,protected final non-sealed int start