interface IBase {
  abstract fun foo(x: Int, s: String)
  abstract fun bar(): Int
  abstract fun String.qux()

}

object BaseImpl : IBase {
  private constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  override fun foo(x: Int, s: String) {
  }

  override fun bar(): Int {
    return 42
  }

  override fun String.qux() {
  }

}

interface IOther {
  abstract val x: String
    abstract get

  abstract var y: Int
    abstract get
    abstract set

  abstract val Byte.z1: Int
    abstract get

  abstract var Byte.z2: Int
    abstract get
    abstract set

}

fun otherImpl(x0: String, y0: Int): IOther {
  return { // BLOCK
    local class <no name provided> : IOther {
      private constructor() /* primary */ {
        super/*Any*/()
        /* <init>() */

      }

      override val x: String
        field = x0
        override get

      override var y: Int
        field = y0
        override get
        override set

      override val Byte.z1: Int
        override get(): Int {
          return 1
        }

      override var Byte.z2: Int
        override get(): Int {
          return 2
        }
        override set(value: Int) {
        }

    }

    <no name provided>()
  }
}

class Test1 : IBase {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  override fun foo(x: Int, s: String) {
    <this>.#<$$delegate_0>.foo(x = x, s = s)
  }

  override fun bar(): Int {
    return <this>.#<$$delegate_0>.bar()
  }

  override fun String.qux() {
    (<this>.#<$$delegate_0>, <this>).qux()
  }

  local /* final field */ val <$$delegate_0>: BaseImpl = BaseImpl

}

class Test2 : IBase, IOther {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  override fun foo(x: Int, s: String) {
    <this>.#<$$delegate_0>.foo(x = x, s = s)
  }

  override fun bar(): Int {
    return <this>.#<$$delegate_0>.bar()
  }

  override fun String.qux() {
    (<this>.#<$$delegate_0>, <this>).qux()
  }

  local /* final field */ val <$$delegate_0>: BaseImpl = BaseImpl
  override val x: String
    override get(): String {
      return <this>.#<$$delegate_1>.<get-x>()
    }

  override var y: Int
    override get(): Int {
      return <this>.#<$$delegate_1>.<get-y>()
    }
    override set(<set-?>: Int) {
      <this>.#<$$delegate_1>.<set-y>(<set-?> = <set-?>)
    }

  override val Byte.z1: Int
    override get(): Int {
      return (<this>.#<$$delegate_1>, <this>).<get-z1>()
    }

  override var Byte.z2: Int
    override get(): Int {
      return (<this>.#<$$delegate_1>, <this>).<get-z2>()
    }
    override set(<set-?>: Int) {
      (<this>.#<$$delegate_1>, <this>).<set-z2>(<set-?> = <set-?>)
    }

  local /* final field */ val <$$delegate_1>: IOther = otherImpl(x0 = "", y0 = 42)

}
