library;
import self as self;
import "dart:core" as core;
import "main_lib.dart" as mai;

import "org-dartlang-testcase:///main_lib.dart";

abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/  {
  field core::int? _#Mixin1#field1;
  field core::int? _#Mixin1#field2;
  get field1() → core::int;
  set field1(core::int field1#param) → void;
  get field2() → core::int;
  set field2(core::int field2#param) → void;
  method method1() → void
    ;
  method method2() → void
    ;
  get property1() → core::int
    ;
  set property1(core::int value) → void
    ;
  get property2() → core::int
    ;
  set property2(core::int value) → void
    ;
}
abstract class Class1a extends mai::Super1 implements mai::Super2 {
  synthetic constructor •() → self::Class1a
    ;
}
class Class1b extends self::_Class1b&Class1a&Mixin1 {
  synthetic constructor •() → self::Class1b
    ;
  static synthetic method _#new#tearOff() → self::Class1b
    return new self::Class1b::•();
}
abstract class Class2a extends mai::Super2 implements mai::Super1 {
  synthetic constructor •() → self::Class2a
    ;
}
class Class2b extends self::_Class2b&Class2a&Mixin1 {
  synthetic constructor •() → self::Class2b
    ;
  static synthetic method _#new#tearOff() → self::Class2b
    return new self::Class2b::•();
}
abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
  synthetic constructor •() → self::Class3a
    ;
}
class Class3b extends self::_Class3b&Class3a&Mixin1 {
  synthetic constructor •() → self::Class3b
    ;
  static synthetic method _#new#tearOff() → self::Class3b
    return new self::Class3b::•();
}
abstract class Class4a extends mai::Super1 implements mai::Super2 {
  synthetic constructor •() → self::Class4a
    ;
}
class Class4b extends self::_Class4b&Class4a&Mixin2 {
  synthetic constructor •() → self::Class4b
    ;
  static synthetic method _#new#tearOff() → self::Class4b
    return new self::Class4b::•();
}
abstract class Class5a extends mai::Super2 implements mai::Super1 {
  synthetic constructor •() → self::Class5a
    ;
}
class Class5b extends self::_Class5b&Class5a&Mixin2 {
  synthetic constructor •() → self::Class5b
    ;
  static synthetic method _#new#tearOff() → self::Class5b
    return new self::Class5b::•();
}
abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
  synthetic constructor •() → self::Class6a
    ;
}
class Class6b extends self::_Class6b&Class6a&Mixin2 {
  synthetic constructor •() → self::Class6b
    ;
  static synthetic method _#new#tearOff() → self::Class6b
    return new self::Class6b::•();
}
abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Mixin1&Super1&Super2
    ;
}
abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class1b&Class1a&Mixin1
    : super self::Class1a::•()
    ;
  synthetic mixin-super-stub get field1() → core::int
    return super.{self::Mixin1::field1};
  synthetic mixin-super-stub set field1(core::int field1#param) → void
    return super.{self::Mixin1::field1} = field1#param;
  synthetic mixin-super-stub get field2() → core::int
    return super.{self::Mixin1::field2};
  synthetic mixin-super-stub set field2(core::int field2#param) → void
    return super.{self::Mixin1::field2} = field2#param;
  synthetic mixin-super-stub method method1() → void
    return super.{self::Mixin1::method1}();
  synthetic mixin-super-stub method method2() → void
    return super.{self::Mixin1::method2}();
  synthetic mixin-super-stub get property1() → core::int
    return super.{self::Mixin1::property1};
  synthetic mixin-super-stub set property1(core::int value) → void
    return super.{self::Mixin1::property1} = value;
  synthetic mixin-super-stub get property2() → core::int
    return super.{self::Mixin1::property2};
  synthetic mixin-super-stub set property2(core::int value) → void
    return super.{self::Mixin1::property2} = value;
}
abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class2b&Class2a&Mixin1
    : super self::Class2a::•()
    ;
  synthetic mixin-super-stub get field1() → core::int
    return super.{self::Mixin1::field1};
  synthetic mixin-super-stub set field1(core::int field1#param) → void
    return super.{self::Mixin1::field1} = field1#param;
  synthetic mixin-super-stub get field2() → core::int
    return super.{self::Mixin1::field2};
  synthetic mixin-super-stub set field2(core::int field2#param) → void
    return super.{self::Mixin1::field2} = field2#param;
  synthetic mixin-super-stub method method1() → void
    return super.{self::Mixin1::method1}();
  synthetic mixin-super-stub method method2() → void
    return super.{self::Mixin1::method2}();
  synthetic mixin-super-stub get property1() → core::int
    return super.{self::Mixin1::property1};
  synthetic mixin-super-stub set property1(core::int value) → void
    return super.{self::Mixin1::property1} = value;
  synthetic mixin-super-stub get property2() → core::int
    return super.{self::Mixin1::property2};
  synthetic mixin-super-stub set property2(core::int value) → void
    return super.{self::Mixin1::property2} = value;
}
abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class3b&Class3a&Mixin1
    : super self::Class3a::•()
    ;
  synthetic mixin-super-stub get field1() → core::int
    return super.{self::Mixin1::field1};
  synthetic mixin-super-stub set field1(core::int field1#param) → void
    return super.{self::Mixin1::field1} = field1#param;
  synthetic mixin-super-stub get field2() → core::int
    return super.{self::Mixin1::field2};
  synthetic mixin-super-stub set field2(core::int field2#param) → void
    return super.{self::Mixin1::field2} = field2#param;
  synthetic mixin-super-stub method method1() → void
    return super.{self::Mixin1::method1}();
  synthetic mixin-super-stub method method2() → void
    return super.{self::Mixin1::method2}();
  synthetic mixin-super-stub get property1() → core::int
    return super.{self::Mixin1::property1};
  synthetic mixin-super-stub set property1(core::int value) → void
    return super.{self::Mixin1::property1} = value;
  synthetic mixin-super-stub get property2() → core::int
    return super.{self::Mixin1::property2};
  synthetic mixin-super-stub set property2(core::int value) → void
    return super.{self::Mixin1::property2} = value;
}
abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class4b&Class4a&Mixin2
    : super self::Class4a::•()
    ;
  synthetic mixin-super-stub get field1() → core::int
    return super.{mai::Mixin2::field1};
  synthetic mixin-super-stub set field1(core::int field1#param) → void
    return super.{mai::Mixin2::field1} = field1#param;
  synthetic mixin-super-stub get field2() → core::int
    return super.{mai::Mixin2::field2};
  synthetic mixin-super-stub set field2(core::int field2#param) → void
    return super.{mai::Mixin2::field2} = field2#param;
  synthetic mixin-super-stub method method1() → void
    return super.{mai::Mixin2::method1}();
  synthetic mixin-super-stub method method2() → void
    return super.{mai::Mixin2::method2}();
  synthetic mixin-super-stub get property1() → core::int
    return super.{mai::Mixin2::property1};
  synthetic mixin-super-stub set property1(core::int value) → void
    return super.{mai::Mixin2::property1} = value;
  synthetic mixin-super-stub get property2() → core::int
    return super.{mai::Mixin2::property2};
  synthetic mixin-super-stub set property2(core::int value) → void
    return super.{mai::Mixin2::property2} = value;
}
abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class5b&Class5a&Mixin2
    : super self::Class5a::•()
    ;
  synthetic mixin-super-stub get field1() → core::int
    return super.{mai::Mixin2::field1};
  synthetic mixin-super-stub set field1(core::int field1#param) → void
    return super.{mai::Mixin2::field1} = field1#param;
  synthetic mixin-super-stub get field2() → core::int
    return super.{mai::Mixin2::field2};
  synthetic mixin-super-stub set field2(core::int field2#param) → void
    return super.{mai::Mixin2::field2} = field2#param;
  synthetic mixin-super-stub method method1() → void
    return super.{mai::Mixin2::method1}();
  synthetic mixin-super-stub method method2() → void
    return super.{mai::Mixin2::method2}();
  synthetic mixin-super-stub get property1() → core::int
    return super.{mai::Mixin2::property1};
  synthetic mixin-super-stub set property1(core::int value) → void
    return super.{mai::Mixin2::property1} = value;
  synthetic mixin-super-stub get property2() → core::int
    return super.{mai::Mixin2::property2};
  synthetic mixin-super-stub set property2(core::int value) → void
    return super.{mai::Mixin2::property2} = value;
}
abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class6b&Class6a&Mixin2
    : super self::Class6a::•()
    ;
  synthetic mixin-super-stub get field1() → core::int
    return super.{mai::Mixin2::field1};
  synthetic mixin-super-stub set field1(core::int field1#param) → void
    return super.{mai::Mixin2::field1} = field1#param;
  synthetic mixin-super-stub get field2() → core::int
    return super.{mai::Mixin2::field2};
  synthetic mixin-super-stub set field2(core::int field2#param) → void
    return super.{mai::Mixin2::field2} = field2#param;
  synthetic mixin-super-stub method method1() → void
    return super.{mai::Mixin2::method1}();
  synthetic mixin-super-stub method method2() → void
    return super.{mai::Mixin2::method2}();
  synthetic mixin-super-stub get property1() → core::int
    return super.{mai::Mixin2::property1};
  synthetic mixin-super-stub set property1(core::int value) → void
    return super.{mai::Mixin2::property1} = value;
  synthetic mixin-super-stub get property2() → core::int
    return super.{mai::Mixin2::property2};
  synthetic mixin-super-stub set property2(core::int value) → void
    return super.{mai::Mixin2::property2} = value;
}

library;
import self as mai;
import "dart:core" as core;

class Super1 extends core::Object {
  field core::int field1;
  field core::int property1;
  synthetic constructor •() → mai::Super1
    ;
  method method1() → void
    ;
  static synthetic method _#new#tearOff() → mai::Super1
    return new mai::Super1::•();
}
class Super2 extends core::Object {
  field core::int field2;
  field core::int property2;
  synthetic constructor •() → mai::Super2
    ;
  method method2() → void
    ;
  static synthetic method _#new#tearOff() → mai::Super2
    return new mai::Super2::•();
}
abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/  {
  field core::int? _#Mixin2#field1;
  field core::int? _#Mixin2#field2;
  get field1() → core::int;
  set field1(core::int field1#param) → void;
  get field2() → core::int;
  set field2(core::int field2#param) → void;
  method method1() → void
    ;
  method method2() → void
    ;
  get property1() → core::int
    ;
  set property1(core::int value) → void
    ;
  get property2() → core::int
    ;
  set property2(core::int value) → void
    ;
}
abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/  {
  synthetic constructor •() → mai::_Mixin2&Super1&Super2
    ;
}
