library;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;
import "dart:math" as math;

import "dart:collection";

abstract class _A&Object&ListMixin = core::Object with col::ListBase<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_A&Object&ListMixin
    : super core::Object::•()
    ;
  mixin-super-stub get first() → core::int
    return super.{col::ListBase::first};
  mixin-super-stub set first(covariant-by-class core::int value) → void
    return super.{col::ListBase::first} = value;
  mixin-super-stub get last() → core::int
    return super.{col::ListBase::last};
  mixin-super-stub set last(covariant-by-class core::int value) → void
    return super.{col::ListBase::last} = value;
  mixin-super-stub get iterator() → core::Iterator<core::int>
    return super.{col::ListBase::iterator};
  mixin-super-stub method elementAt(core::int index) → core::int
    return super.{col::ListBase::elementAt}(index);
  mixin-super-stub method followedBy(covariant-by-class core::Iterable<core::int> other) → core::Iterable<core::int>
    return super.{col::ListBase::followedBy}(other);
  mixin-super-stub method forEach((core::int) → void action) → void
    return super.{col::ListBase::forEach}(action);
  mixin-super-stub get isEmpty() → core::bool
    return super.{col::ListBase::isEmpty};
  mixin-super-stub get isNotEmpty() → core::bool
    return super.{col::ListBase::isNotEmpty};
  mixin-super-stub get single() → core::int
    return super.{col::ListBase::single};
  mixin-super-stub method contains(core::Object? element) → core::bool
    return super.{col::ListBase::contains}(element);
  mixin-super-stub method every((core::int) → core::bool test) → core::bool
    return super.{col::ListBase::every}(test);
  mixin-super-stub method any((core::int) → core::bool test) → core::bool
    return super.{col::ListBase::any}(test);
  mixin-super-stub method firstWhere((core::int) → core::bool test, {covariant-by-class () →? core::int orElse = #C1}) → core::int
    return super.{col::ListBase::firstWhere}(test, orElse: orElse);
  mixin-super-stub method lastWhere((core::int) → core::bool test, {covariant-by-class () →? core::int orElse = #C1}) → core::int
    return super.{col::ListBase::lastWhere}(test, orElse: orElse);
  mixin-super-stub method singleWhere((core::int) → core::bool test, {covariant-by-class () →? core::int orElse = #C1}) → core::int
    return super.{col::ListBase::singleWhere}(test, orElse: orElse);
  mixin-super-stub method join([core::String separator = #C2]) → core::String
    return super.{col::ListBase::join}(separator);
  mixin-super-stub method where((core::int) → core::bool test) → core::Iterable<core::int>
    return super.{col::ListBase::where}(test);
  mixin-super-stub method whereType<T extends core::Object? = dynamic>() → core::Iterable<self::_A&Object&ListMixin::whereType::T%>
    return super.{col::ListBase::whereType}<self::_A&Object&ListMixin::whereType::T%>();
  mixin-super-stub method map<T extends core::Object? = dynamic>((core::int) → self::_A&Object&ListMixin::map::T% f) → core::Iterable<self::_A&Object&ListMixin::map::T%>
    return super.{col::ListBase::map}<self::_A&Object&ListMixin::map::T%>(f);
  mixin-super-stub method expand<T extends core::Object? = dynamic>((core::int) → core::Iterable<self::_A&Object&ListMixin::expand::T%> f) → core::Iterable<self::_A&Object&ListMixin::expand::T%>
    return super.{col::ListBase::expand}<self::_A&Object&ListMixin::expand::T%>(f);
  mixin-super-stub method reduce(covariant-by-class (core::int, core::int) → core::int combine) → core::int
    return super.{col::ListBase::reduce}(combine);
  mixin-super-stub method fold<T extends core::Object? = dynamic>(self::_A&Object&ListMixin::fold::T% initialValue, (self::_A&Object&ListMixin::fold::T%, core::int) → self::_A&Object&ListMixin::fold::T% combine) → self::_A&Object&ListMixin::fold::T%
    return super.{col::ListBase::fold}<self::_A&Object&ListMixin::fold::T%>(initialValue, combine);
  mixin-super-stub method skip(core::int count) → core::Iterable<core::int>
    return super.{col::ListBase::skip}(count);
  mixin-super-stub method skipWhile((core::int) → core::bool test) → core::Iterable<core::int>
    return super.{col::ListBase::skipWhile}(test);
  mixin-super-stub method take(core::int count) → core::Iterable<core::int>
    return super.{col::ListBase::take}(count);
  mixin-super-stub method takeWhile((core::int) → core::bool test) → core::Iterable<core::int>
    return super.{col::ListBase::takeWhile}(test);
  mixin-super-stub method toList({core::bool growable = #C3}) → core::List<core::int>
    return super.{col::ListBase::toList}(growable: growable);
  mixin-super-stub method toSet() → core::Set<core::int>
    return super.{col::ListBase::toSet}();
  mixin-super-stub method add(covariant-by-class core::int element) → void
    return super.{col::ListBase::add}(element);
  mixin-super-stub method addAll(covariant-by-class core::Iterable<core::int> iterable) → void
    return super.{col::ListBase::addAll}(iterable);
  mixin-super-stub method remove(core::Object? element) → core::bool
    return super.{col::ListBase::remove}(element);
  mixin-super-stub method _closeGap(core::int start, core::int end) → void
    return super.{col::ListBase::_closeGap}(start, end);
  mixin-super-stub method removeWhere((core::int) → core::bool test) → void
    return super.{col::ListBase::removeWhere}(test);
  mixin-super-stub method retainWhere((core::int) → core::bool test) → void
    return super.{col::ListBase::retainWhere}(test);
  mixin-super-stub method _filter((core::int) → core::bool test, core::bool retainMatching) → void
    return super.{col::ListBase::_filter}(test, retainMatching);
  mixin-super-stub method clear() → void
    return super.{col::ListBase::clear}();
  mixin-super-stub method cast<R extends core::Object? = dynamic>() → core::List<self::_A&Object&ListMixin::cast::R%>
    return super.{col::ListBase::cast}<self::_A&Object&ListMixin::cast::R%>();
  mixin-super-stub method removeLast() → core::int
    return super.{col::ListBase::removeLast}();
  mixin-super-stub method sort([(core::int, core::int) →? core::int compare = #C1]) → void
    return super.{col::ListBase::sort}(compare);
  mixin-super-stub method shuffle([math::Random? random = #C1]) → void
    return super.{col::ListBase::shuffle}(random);
  mixin-super-stub method asMap() → core::Map<core::int, core::int>
    return super.{col::ListBase::asMap}();
  mixin-super-stub operator +(covariant-by-class core::List<core::int> other) → core::List<core::int>
    return super.{col::ListBase::+}(other);
  mixin-super-stub method sublist(core::int start, [core::int? end = #C1]) → core::List<core::int>
    return super.{col::ListBase::sublist}(start, end);
  mixin-super-stub method getRange(core::int start, core::int end) → core::Iterable<core::int>
    return super.{col::ListBase::getRange}(start, end);
  mixin-super-stub method removeRange(core::int start, core::int end) → void
    return super.{col::ListBase::removeRange}(start, end);
  mixin-super-stub method fillRange(core::int start, core::int end, [covariant-by-class core::int? fill = #C1]) → void
    return super.{col::ListBase::fillRange}(start, end, fill);
  mixin-super-stub method setRange(core::int start, core::int end, covariant-by-class core::Iterable<core::int> iterable, [core::int skipCount = #C4]) → void
    return super.{col::ListBase::setRange}(start, end, iterable, skipCount);
  mixin-super-stub method replaceRange(core::int start, core::int end, covariant-by-class core::Iterable<core::int> newContents) → void
    return super.{col::ListBase::replaceRange}(start, end, newContents);
  mixin-super-stub method indexOf(covariant-by-class core::Object? element, [core::int start = #C4]) → core::int
    return super.{col::ListBase::indexOf}(element, start);
  mixin-super-stub method indexWhere((core::int) → core::bool test, [core::int start = #C4]) → core::int
    return super.{col::ListBase::indexWhere}(test, start);
  mixin-super-stub method lastIndexOf(covariant-by-class core::Object? element, [core::int? start = #C1]) → core::int
    return super.{col::ListBase::lastIndexOf}(element, start);
  mixin-super-stub method lastIndexWhere((core::int) → core::bool test, [core::int? start = #C1]) → core::int
    return super.{col::ListBase::lastIndexWhere}(test, start);
  mixin-super-stub method insert(core::int index, covariant-by-class core::int element) → void
    return super.{col::ListBase::insert}(index, element);
  mixin-super-stub method removeAt(core::int index) → core::int
    return super.{col::ListBase::removeAt}(index);
  mixin-super-stub method insertAll(core::int index, covariant-by-class core::Iterable<core::int> iterable) → void
    return super.{col::ListBase::insertAll}(index, iterable);
  mixin-super-stub method setAll(core::int index, covariant-by-class core::Iterable<core::int> iterable) → void
    return super.{col::ListBase::setAll}(index, iterable);
  mixin-super-stub get reversed() → core::Iterable<core::int>
    return super.{col::ListBase::reversed};
  mixin-super-stub method toString() → core::String
    return super.{col::ListBase::toString}();
}
class A extends self::_A&Object&ListMixin {
  field core::int count;
  synthetic constructor •() → self::A
    ;
  operator [](core::int index) → core::int
    ;
  operator []=(core::int index, covariant-by-class core::int value) → void
    ;
  get length() → core::int
    ;
  set length(core::int value) → void
    ;
}
static method main() → dynamic
  ;
static method expectEquals(dynamic x, dynamic y) → dynamic
  ;

constants  {
  #C1 = null
  #C2 = ""
  #C3 = true
  #C4 = 0
}
