var result = ""

interface D1 {
    fun foo(): D1 {
        result += "D1"
        return this
    }
}

interface F2 : D1

interface D3 : F2 {
    override fun foo(): D3 {
        result += "D3"
        return this
    }
}

class D4 : D3

fun box(): String {
    val x = D4()
    x.foo()
    val d3: D3 = x
    val f2: F2 = x
    val d1: D1 = x
    d3.foo()
    f2.foo()
    d1.foo()
    return if (result == "D3D3D3D3") "OK" else "Fail: $result"
}
