library /*isNonNullableByDefault*/;
import self as self;

import "org-dartlang-testcase:///main_lib1.dart";

static method main() → dynamic
  ;

library /*isNonNullableByDefault*/;
import self as self2;
import "main_lib2.dart" as mai;
additionalExports = (mai::Extension)

export "org-dartlang-testcase:///main_lib2.dart";


library /*isNonNullableByDefault*/;
import self as mai;
import "dart:core" as core;

extension Extension on core::int {
  get instanceProperty = mai::Extension|get#instanceProperty;
  method instanceMethod = mai::Extension|instanceMethod;
  tearoff instanceMethod = mai::Extension|get#instanceMethod;
  static field staticField = mai::Extension|staticField;
  static field staticFinalField = mai::Extension|staticFinalField;
  static field staticConstField = mai::Extension|staticConstField;
  static get staticProperty = get mai::Extension|staticProperty;
  static method staticMethod = mai::Extension|staticMethod;
  set instanceProperty = mai::Extension|set#instanceProperty;
  static set staticProperty = set mai::Extension|staticProperty;
}
static field core::int Extension|staticField;
static final field core::int Extension|staticFinalField;
static const field core::int Extension|staticConstField = #C1;
static method Extension|get#instanceProperty(lowered final core::int #this) → core::int
  ;
static method Extension|set#instanceProperty(lowered final core::int #this, core::int value) → void
  ;
static method Extension|instanceMethod(lowered final core::int #this) → void
  ;
static method Extension|get#instanceMethod(lowered final core::int #this) → () → void
  return () → void => mai::Extension|instanceMethod(#this);
static get Extension|staticProperty() → core::int
  ;
static set Extension|staticProperty(core::int value) → void
  ;
static method Extension|staticMethod() → void
  ;

constants  {
  #C1 = 42
}
