class PendingToken {

    public final String str;
    public final int start;
    public final int end;

    /**
     * Initializes an instance with immutable fields for the specified
     * arguments.
     * @param str string value
     * @param start start offset
     * @param end end offset
     */
    public PendingToken(String str, int start, int end) {
        this.str = str;
        this.start = start;
        this.end = end;
    }

    /**
     * Compares this instance's immutable fields to the other.
     * @param o object
     * @return {@code true} if the objects are equal
     */
    @Override
    public boolean equals(Object o) {<FILL_FUNCTION_BODY>}

    /**
     * Calculates a hash code from the instance's immutable fields.
     * @return a hash value
     */
    @Override
    public int hashCode() {
        return Objects.hash(str, start, end);
    }

    /**
     * Gets a readable representation for debugging.
     * @return a defined instance
     */
    @Override
    public String toString() {
        return "PendingToken{" + str + "<<< start=" + start + ",end=" + end + '}';
    }
}

        if (o == this) {
            return true;
        }
        if (!(o instanceof PendingToken)) {
            return false;
        }
        PendingToken other = (PendingToken) o;
        return start == other.start && end == other.end &&
            str.equals(other.str);
    
<no_super_class>