library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

typedef DA1 = self::A;
typedef DA2<unrelated X extends core::num> = self::A;
typedef DB1 = self::B<core::String>;
typedef DB2<X extends core::num> = self::B<X>;
typedef DB3<X extends core::num, unrelated Y extends core::String> = self::B<X>;
class A extends core::Object {
  synthetic constructor •() → self::A
    ;
  static method _#new#tearOff() → self::A
    return new self::A::•();
}
class B<X extends core::Object? = dynamic> extends core::Object {
  field core::int field1;
  field core::String field2;
  constructor _(core::int field1, core::String field2) → self::B<self::B::X%>
    ;
  constructor •() → self::B<self::B::X%>
    ;
  constructor foo(core::int field1) → self::B<self::B::X%>
    ;
  static method _#_#tearOff<X extends core::Object? = dynamic>(core::int field1, core::String field2) → self::B<self::B::_#_#tearOff::X%>
    return new self::B::_<self::B::_#_#tearOff::X%>(field1, field2);
  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::B<self::B::_#new#tearOff::X%>
    return new self::B::•<self::B::_#new#tearOff::X%>();
  static method _#foo#tearOff<X extends core::Object? = dynamic>(core::int field1) → self::B<self::B::_#foo#tearOff::X%>
    return new self::B::foo<self::B::_#foo#tearOff::X%>(field1);
  static factory bar<X extends core::Object? = dynamic>(core::int i, core::String j) → self::B<self::B::bar::X%>
    ;
  static method _#bar#tearOff<X extends core::Object? = dynamic>(core::int i, core::String j) → self::B<self::B::_#bar#tearOff::X%>
    return self::B::bar<self::B::_#bar#tearOff::X%>(i, j);
}
static final field core::bool inSoundMode;
static method main() → dynamic
  ;
static method expect(dynamic expected, dynamic actual) → dynamic
  ;
static method throws(() → dynamic f, {core::bool inSoundModeOnly}) → dynamic
  ;
