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

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 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 method _#new#tearOff() → mai::Super2
    return new mai::Super2::•();
}
abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/  {
  synthetic constructor •() → mai::_Mixin2&Super1&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
    ;
}
