library /*isLegacy*/;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;

static method main() → dynamic {
  core::List<core::int*>* list1 = <core::int*>[0];
  core::List<core::num*>* list2 = <core::num*>[0];
  dynamic list3 = <core::int*>[0];
  core::List<core::int*>* list = block {
    final core::List<core::int*>* #t1 = <core::int*>[0];
    #t1.{core::List::addAll}{Invariant}(list1){(core::Iterable<core::int*>*) →* void};
    for (final has-declared-initializer dynamic #t2 in list2) {
      final core::int* #t3 = #t2 as{TypeError,ForLegacy} core::int*;
      #t1.{core::List::add}{Invariant}(#t3){(core::int*) →* void};
    }
    for (final has-declared-initializer dynamic #t4 in list3 as{TypeError,ForDynamic,ForLegacy} core::Iterable<dynamic>*) {
      final core::int* #t5 = #t4 as{TypeError,ForLegacy} core::int*;
      #t1.{core::List::add}{Invariant}(#t5){(core::int*) →* void};
    }
    if(true)
      #t1.{core::List::add}{Invariant}(2){(core::int*) →* void};
  } =>#t1;
  core::Set<core::int*>* set1 = block {
    final core::Set<core::int*>* #t6 = col::LinkedHashSet::•<core::int*>();
    #t6.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
  } =>#t6;
  core::Set<core::num*>* set2 = block {
    final core::Set<core::num*>* #t7 = col::LinkedHashSet::•<core::num*>();
    #t7.{core::Set::add}{Invariant}(0){(core::num*) →* core::bool*};
  } =>#t7;
  dynamic set3 = block {
    final core::Set<core::int*>* #t8 = col::LinkedHashSet::•<core::int*>();
    #t8.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
  } =>#t8;
  core::Set<core::int*>* set = block {
    final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
    #t9.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
    #t9.{core::Set::addAll}{Invariant}(set1){(core::Iterable<core::int*>*) →* void};
    for (final has-declared-initializer dynamic #t10 in set2) {
      final core::int* #t11 = #t10 as{TypeError,ForLegacy} core::int*;
      #t9.{core::Set::add}{Invariant}(#t11){(core::int*) →* core::bool*};
    }
    for (final has-declared-initializer dynamic #t12 in set3 as{TypeError,ForDynamic,ForLegacy} core::Iterable<dynamic>*) {
      final core::int* #t13 = #t12 as{TypeError,ForLegacy} core::int*;
      #t9.{core::Set::add}{Invariant}(#t13){(core::int*) →* core::bool*};
    }
    if(true)
      #t9.{core::Set::add}{Invariant}(2){(core::int*) →* core::bool*};
  } =>#t9;
  core::Map<core::int*, core::String*>* map1 = <core::int*, core::String*>{0: "foo"};
  core::Map<core::num*, core::Object*>* map2 = <core::num*, core::Object*>{0: "bar"};
  dynamic map3 = <core::int*, core::String*>{0: "baz"};
  core::Map<core::int*, core::String*>* map = block {
    final core::Map<core::int*, core::String*>* #t14 = <core::int*, core::String*>{};
    #t14.{core::Map::[]=}{Invariant}(0, "foo"){(core::int*, core::String*) →* void};
    #t14.{core::Map::addAll}{Invariant}(map1){(core::Map<core::int*, core::String*>*) →* void};
    for (final has-declared-initializer core::MapEntry<dynamic, dynamic>* #t15 in map2.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::String*>>}) {
      final core::int* #t16 = #t15.{core::MapEntry::key}{dynamic} as{TypeError,ForLegacy} core::int*;
      final core::String* #t17 = #t15.{core::MapEntry::value}{dynamic} as{TypeError,ForLegacy} core::String*;
      #t14.{core::Map::[]=}{Invariant}(#t16, #t17){(core::int*, core::String*) →* void};
    }
    for (final has-declared-initializer core::MapEntry<dynamic, dynamic>* #t18 in (map3 as{TypeError,ForDynamic,ForLegacy} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::String*>>}) {
      final core::int* #t19 = #t18.{core::MapEntry::key}{dynamic} as{TypeError,ForLegacy} core::int*;
      final core::String* #t20 = #t18.{core::MapEntry::value}{dynamic} as{TypeError,ForLegacy} core::String*;
      #t14.{core::Map::[]=}{Invariant}(#t19, #t20){(core::int*, core::String*) →* void};
    }
    if(true)
      #t14.{core::Map::[]=}{Invariant}(2, "baz"){(core::int*, core::String*) →* void};
  } =>#t14;
}
