package test

public abstract class Mine : java.util.List<kotlin.String> {
    public constructor Mine()
    public abstract /*fake_override*/ val size: kotlin.Int
    public abstract /*fake_override*/ fun add(/*0*/ kotlin.Int, /*1*/ kotlin.String!): kotlin.Unit
    public abstract /*fake_override*/ fun add(/*0*/ kotlin.String!): kotlin.Boolean
    public abstract /*fake_override*/ fun addAll(/*0*/ kotlin.Int, /*1*/ (kotlin.collections.MutableCollection<out kotlin.String!>..kotlin.collections.Collection<kotlin.String!>?)): kotlin.Boolean
    public abstract /*fake_override*/ fun addAll(/*0*/ kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
    public abstract /*fake_override*/ fun clear(): kotlin.Unit
    public abstract /*fake_override*/ fun contains(/*0*/ kotlin.String!): kotlin.Boolean
    public abstract /*fake_override*/ fun containsAll(/*0*/ kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
    public open /*fake_override*/ fun forEach(/*0*/ java.util.function.Consumer<in kotlin.String!>!): kotlin.Unit
    public abstract /*fake_override*/ fun get(/*0*/ kotlin.Int): kotlin.String!
    public abstract /*fake_override*/ fun indexOf(/*0*/ kotlin.Any!): kotlin.Int
    public abstract /*fake_override*/ fun isEmpty(): kotlin.Boolean
    public abstract /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<kotlin.String!>
    public abstract /*fake_override*/ fun lastIndexOf(/*0*/ kotlin.Any!): kotlin.Int
    public abstract /*fake_override*/ fun listIterator(): kotlin.collections.(Mutable)ListIterator<kotlin.String!>!
    public abstract /*fake_override*/ fun listIterator(/*0*/ kotlin.Int): kotlin.collections.(Mutable)ListIterator<kotlin.String!>!
    public open /*fake_override*/ fun parallelStream(): java.util.stream.Stream<kotlin.String!>
    public abstract /*fake_override*/ fun remove(/*0*/ kotlin.Int): kotlin.String!
    public abstract /*fake_override*/ fun remove(/*0*/ kotlin.String!): kotlin.Boolean
    public abstract /*fake_override*/ fun removeAll(/*0*/ kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
    public open /*fake_override*/ fun removeIf(/*0*/ java.util.function.Predicate<in kotlin.String!>): kotlin.Boolean
    public open /*fake_override*/ fun replaceAll(/*0*/ java.util.function.UnaryOperator<kotlin.String>): kotlin.Unit
    public abstract /*fake_override*/ fun retainAll(/*0*/ kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
    public abstract /*fake_override*/ fun set(/*0*/ kotlin.Int, /*1*/ kotlin.String!): kotlin.String!
    public open /*fake_override*/ fun sort(/*0*/ java.util.Comparator<in kotlin.String!>!): kotlin.Unit
    public open /*fake_override*/ fun spliterator(): java.util.Spliterator<kotlin.String!>
    public open /*fake_override*/ fun stream(): java.util.stream.Stream<kotlin.String!>
    public abstract /*fake_override*/ fun subList(/*0*/ kotlin.Int, /*1*/ kotlin.Int): kotlin.collections.(Mutable)List<kotlin.String!>!
    public abstract /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
    public abstract /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
}

public/*package*/ open class PlainExtendsListString {
    public/*package*/ constructor PlainExtendsListString()
}
