main = main::main;
library from "org-dartlang-test:///lib1.dart" as lib1 {

  extension NumberParsing on dart.core::String {
    method parseInt = lib1::NumberParsing|parseInt;
    tearoff parseInt = lib1::NumberParsing|get#parseInt;
  }
  static method NumberParsing|parseInt(lowered final dart.core::String #this) → dart.core::int {
    return dart.core::int::parse(#this);
  }
  static method NumberParsing|get#parseInt(lowered final dart.core::String #this) → () → dart.core::int
    return () → dart.core::int => lib1::NumberParsing|parseInt(#this);
}
library from "org-dartlang-test:///lib2.dart" as lib2 {

  extension DuplicateName on dart.core::String {
    method fooMe1 = lib2::DuplicateName|fooMe1;
    tearoff fooMe1 = lib2::DuplicateName|get#fooMe1;
  }
  static method DuplicateName|fooMe1(lowered final dart.core::String #this) → dart.core::String {
    return "Foo1";
  }
  static method DuplicateName|get#fooMe1(lowered final dart.core::String #this) → () → dart.core::String
    return () → dart.core::String => lib2::DuplicateName|fooMe1(#this);
}
library from "org-dartlang-test:///lib3.dart" as lib3 {

  extension DuplicateName on dart.core::String {
    method fooMe2 = lib3::DuplicateName|fooMe2;
    tearoff fooMe2 = lib3::DuplicateName|get#fooMe2;
  }
  static method DuplicateName|fooMe2(lowered final dart.core::String #this) → dart.core::String {
    return "Foo2";
  }
  static method DuplicateName|get#fooMe2(lowered final dart.core::String #this) → () → dart.core::String
    return () → dart.core::String => lib3::DuplicateName|fooMe2(#this);
}
library from "org-dartlang-test:///main.dart" as main {

  import "org-dartlang-test:///lib1.dart";
  import "org-dartlang-test:///lib2.dart";
  import "org-dartlang-test:///lib3.dart";

  static method main() → dynamic {
    lib1::NumberParsing|parseInt("42");
    lib2::DuplicateName|fooMe1("42");
    lib3::DuplicateName|fooMe2("42");
  }
}
