main = <No Member>;
library from "org-dartlang-test:///lib.dart" as lib {

  class B extends dart.core::Object {
    synthetic constructor •() → lib::B
      : super dart.core::Object::•()
      ;
    method a() → dart.core::int {
      return 42;
    }
    method b() → dart.core::int {
      return 2;
    }
  }
  class C extends dart.core::Object {
    synthetic constructor •() → lib::C
      : super dart.core::Object::•()
      ;
    method a() → dart.core::int {
      return 42;
    }
    method b() → dart.core::int {
      return 2;
    }
  }
}
library from "org-dartlang-test:///main.dart" as main {

  import "org-dartlang-test:///lib.dart";

  class A extends dart.core::Object {
    synthetic constructor •() → main::A
      : super dart.core::Object::•()
      ;
    method a() → dart.core::int {
      return 42;
    }
    method b() → dart.core::int {
      return 2;
    }
  }
}
