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

class Annotation extends core::Object /*hasConstConstructor*/  {
  const constructor •() → self::Annotation
    : super core::Object::•()
    ;
}
class A extends core::Object {
  field core::int? _#A#instanceField = null;
  field core::bool _#A#instanceField#isSet = false;
  field core::int? _#A#finalInstanceField = null;
  field core::bool _#A#finalInstanceField#isSet = false;
  field core::int? _#A#finalInstanceFieldWithInitializer = null;
  field core::bool _#A#finalInstanceFieldWithInitializer#isSet = false;
  field core::num? _#A#covariantInstanceField = null;
  field core::bool _#A#covariantInstanceField#isSet = false;
  static field core::int? _#staticField = null;
  static field core::bool _#staticField#isSet = false;
  static field core::int? _#finalStaticField = null;
  static field core::bool _#finalStaticField#isSet = false;
  static field core::int? _#finalStaticFieldWithInitializer = null;
  static field core::bool _#finalStaticFieldWithInitializer#isSet = false;
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  @#C1
  get instanceField() → core::int
    return this.{self::A::_#A#instanceField#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#instanceField} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.");
  @#C1
  set instanceField(core::int #t2) → void {
    this.{self::A::_#A#instanceField#isSet} = true;
    this.{self::A::_#A#instanceField} = #t2;
  }
  @#C1
  get finalInstanceField() → core::int
    return this.{self::A::_#A#finalInstanceField#isSet} ?{core::int} let final core::int? #t3 = this.{self::A::_#A#finalInstanceField} in #t3{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.");
  @#C1
  set finalInstanceField(core::int #t4) → void
    if(this.{self::A::_#A#finalInstanceField#isSet})
      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
    else {
      this.{self::A::_#A#finalInstanceField#isSet} = true;
      this.{self::A::_#A#finalInstanceField} = #t4;
    }
  @#C1
  get finalInstanceFieldWithInitializer() → core::int {
    if(!this.{self::A::_#A#finalInstanceFieldWithInitializer#isSet}) {
      final core::int #t5 = 0;
      if(this.{self::A::_#A#finalInstanceFieldWithInitializer#isSet})
        throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceFieldWithInitializer' has been assigned during initialization.");
      this.{self::A::_#A#finalInstanceFieldWithInitializer} = #t5;
      this.{self::A::_#A#finalInstanceFieldWithInitializer#isSet} = true;
    }
    return let final core::int? #t6 = this.{self::A::_#A#finalInstanceFieldWithInitializer} in #t6{core::int};
  }
  @#C1
  get covariantInstanceField() → core::num
    return this.{self::A::_#A#covariantInstanceField#isSet} ?{core::num} let final core::num? #t7 = this.{self::A::_#A#covariantInstanceField} in #t7{core::num} : throw new _in::LateInitializationErrorImpl::•("Field 'covariantInstanceField' has not been initialized.");
  @#C1
  set covariantInstanceField(covariant core::num #t8) → void {
    this.{self::A::_#A#covariantInstanceField#isSet} = true;
    this.{self::A::_#A#covariantInstanceField} = #t8;
  }
  @#C1
  static get staticField() → core::int
    return self::A::_#staticField#isSet ?{core::int} let final core::int? #t9 = self::A::_#staticField in #t9{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.");
  @#C1
  static set staticField(core::int #t10) → void {
    self::A::_#staticField#isSet = true;
    self::A::_#staticField = #t10;
  }
  @#C1
  static get finalStaticField() → core::int
    return self::A::_#finalStaticField#isSet ?{core::int} let final core::int? #t11 = self::A::_#finalStaticField in #t11{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has not been initialized.");
  @#C1
  static set finalStaticField(core::int #t12) → void
    if(self::A::_#finalStaticField#isSet)
      throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has already been initialized.");
    else {
      self::A::_#finalStaticField#isSet = true;
      self::A::_#finalStaticField = #t12;
    }
  @#C1
  static get finalStaticFieldWithInitializer() → core::int {
    if(!self::A::_#finalStaticFieldWithInitializer#isSet) {
      final core::int #t13 = 0;
      if(self::A::_#finalStaticFieldWithInitializer#isSet)
        throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticFieldWithInitializer' has been assigned during initialization.");
      self::A::_#finalStaticFieldWithInitializer = #t13;
      self::A::_#finalStaticFieldWithInitializer#isSet = true;
    }
    return let final core::int? #t14 = self::A::_#finalStaticFieldWithInitializer in #t14{core::int};
  }
}
abstract class B extends core::Object /*isMixinDeclaration*/  {
  field core::int? _#B#instanceField = null;
  field core::bool _#B#instanceField#isSet = false;
  field core::int? _#B#finalInstanceField = null;
  field core::bool _#B#finalInstanceField#isSet = false;
  field core::int? _#B#finalInstanceFieldWithInitializer = null;
  field core::bool _#B#finalInstanceFieldWithInitializer#isSet = false;
  field core::num? _#B#covariantInstanceField = null;
  field core::bool _#B#covariantInstanceField#isSet = false;
  static field core::int? _#staticField = null;
  static field core::bool _#staticField#isSet = false;
  static field core::int? _#finalStaticField = null;
  static field core::bool _#finalStaticField#isSet = false;
  static field core::int? _#finalStaticFieldWithInitializer = null;
  static field core::bool _#finalStaticFieldWithInitializer#isSet = false;
  @#C1
  get instanceField() → core::int
    return this.{self::B::_#B#instanceField#isSet} ?{core::int} let final core::int? #t15 = this.{self::B::_#B#instanceField} in #t15{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.");
  @#C1
  set instanceField(core::int #t16) → void {
    this.{self::B::_#B#instanceField#isSet} = true;
    this.{self::B::_#B#instanceField} = #t16;
  }
  @#C1
  get finalInstanceField() → core::int
    return this.{self::B::_#B#finalInstanceField#isSet} ?{core::int} let final core::int? #t17 = this.{self::B::_#B#finalInstanceField} in #t17{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.");
  @#C1
  set finalInstanceField(core::int #t18) → void
    if(this.{self::B::_#B#finalInstanceField#isSet})
      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
    else {
      this.{self::B::_#B#finalInstanceField#isSet} = true;
      this.{self::B::_#B#finalInstanceField} = #t18;
    }
  @#C1
  get finalInstanceFieldWithInitializer() → core::int {
    if(!this.{self::B::_#B#finalInstanceFieldWithInitializer#isSet}) {
      final core::int #t19 = 0;
      if(this.{self::B::_#B#finalInstanceFieldWithInitializer#isSet})
        throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceFieldWithInitializer' has been assigned during initialization.");
      this.{self::B::_#B#finalInstanceFieldWithInitializer} = #t19;
      this.{self::B::_#B#finalInstanceFieldWithInitializer#isSet} = true;
    }
    return let final core::int? #t20 = this.{self::B::_#B#finalInstanceFieldWithInitializer} in #t20{core::int};
  }
  @#C1
  get covariantInstanceField() → core::num
    return this.{self::B::_#B#covariantInstanceField#isSet} ?{core::num} let final core::num? #t21 = this.{self::B::_#B#covariantInstanceField} in #t21{core::num} : throw new _in::LateInitializationErrorImpl::•("Field 'covariantInstanceField' has not been initialized.");
  @#C1
  set covariantInstanceField(covariant core::num #t22) → void {
    this.{self::B::_#B#covariantInstanceField#isSet} = true;
    this.{self::B::_#B#covariantInstanceField} = #t22;
  }
  @#C1
  static get staticField() → core::int
    return self::B::_#staticField#isSet ?{core::int} let final core::int? #t23 = self::B::_#staticField in #t23{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.");
  @#C1
  static set staticField(core::int #t24) → void {
    self::B::_#staticField#isSet = true;
    self::B::_#staticField = #t24;
  }
  @#C1
  static get finalStaticField() → core::int
    return self::B::_#finalStaticField#isSet ?{core::int} let final core::int? #t25 = self::B::_#finalStaticField in #t25{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has not been initialized.");
  @#C1
  static set finalStaticField(core::int #t26) → void
    if(self::B::_#finalStaticField#isSet)
      throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has already been initialized.");
    else {
      self::B::_#finalStaticField#isSet = true;
      self::B::_#finalStaticField = #t26;
    }
  @#C1
  static get finalStaticFieldWithInitializer() → core::int {
    if(!self::B::_#finalStaticFieldWithInitializer#isSet) {
      final core::int #t27 = 0;
      if(self::B::_#finalStaticFieldWithInitializer#isSet)
        throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticFieldWithInitializer' has been assigned during initialization.");
      self::B::_#finalStaticFieldWithInitializer = #t27;
      self::B::_#finalStaticFieldWithInitializer#isSet = true;
    }
    return let final core::int? #t28 = self::B::_#finalStaticFieldWithInitializer in #t28{core::int};
  }
}
extension Extension on self::A {
  static field extensionStaticField = self::_#Extension|extensionStaticField;
  static field extensionStaticField = self::_#Extension|extensionStaticField#isSet;
  static get extensionStaticField = get self::Extension|extensionStaticField;
  static set extensionStaticField = set self::Extension|extensionStaticField;
  static field finalExtensionStaticField = self::_#Extension|finalExtensionStaticField;
  static field finalExtensionStaticField = self::_#Extension|finalExtensionStaticField#isSet;
  static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
  static set finalExtensionStaticField = set self::Extension|finalExtensionStaticField;
  static field finalExtensionStaticFieldWithInitializer = self::_#Extension|finalExtensionStaticFieldWithInitializer;
  static field finalExtensionStaticFieldWithInitializer = self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet;
  static get finalExtensionStaticFieldWithInitializer = get self::Extension|finalExtensionStaticFieldWithInitializer;
}
static field core::int? _#topLevelField = null;
static field core::bool _#topLevelField#isSet = false;
static field core::int? _#finalTopLevelField = null;
static field core::bool _#finalTopLevelField#isSet = false;
static field core::int? _#finalTopLevelFieldWithInitializer = null;
static field core::bool _#finalTopLevelFieldWithInitializer#isSet = false;
static field core::int? _#Extension|extensionStaticField = null;
static field core::bool _#Extension|extensionStaticField#isSet = false;
static field core::int? _#Extension|finalExtensionStaticField = null;
static field core::bool _#Extension|finalExtensionStaticField#isSet = false;
static field core::int? _#Extension|finalExtensionStaticFieldWithInitializer = null;
static field core::bool _#Extension|finalExtensionStaticFieldWithInitializer#isSet = false;
@#C1
static get topLevelField() → core::int
  return self::_#topLevelField#isSet ?{core::int} let final core::int? #t29 = self::_#topLevelField in #t29{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'topLevelField' has not been initialized.");
@#C1
static set topLevelField(core::int #t30) → void {
  self::_#topLevelField#isSet = true;
  self::_#topLevelField = #t30;
}
@#C1
static get finalTopLevelField() → core::int
  return self::_#finalTopLevelField#isSet ?{core::int} let final core::int? #t31 = self::_#finalTopLevelField in #t31{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has not been initialized.");
@#C1
static set finalTopLevelField(core::int #t32) → void
  if(self::_#finalTopLevelField#isSet)
    throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has already been initialized.");
  else {
    self::_#finalTopLevelField#isSet = true;
    self::_#finalTopLevelField = #t32;
  }
@#C1
static get finalTopLevelFieldWithInitializer() → core::int {
  if(!self::_#finalTopLevelFieldWithInitializer#isSet) {
    final core::int #t33 = 0;
    if(self::_#finalTopLevelFieldWithInitializer#isSet)
      throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelFieldWithInitializer' has been assigned during initialization.");
    self::_#finalTopLevelFieldWithInitializer = #t33;
    self::_#finalTopLevelFieldWithInitializer#isSet = true;
  }
  return let final core::int? #t34 = self::_#finalTopLevelFieldWithInitializer in #t34{core::int};
}
@#C1
static get Extension|extensionStaticField() → core::int
  return self::_#Extension|extensionStaticField#isSet ?{core::int} let final core::int? #t35 = self::_#Extension|extensionStaticField in #t35{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'extensionStaticField' has not been initialized.");
@#C1
static set Extension|extensionStaticField(core::int #t36) → void {
  self::_#Extension|extensionStaticField#isSet = true;
  self::_#Extension|extensionStaticField = #t36;
}
@#C1
static get Extension|finalExtensionStaticField() → core::int
  return self::_#Extension|finalExtensionStaticField#isSet ?{core::int} let final core::int? #t37 = self::_#Extension|finalExtensionStaticField in #t37{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticField' has not been initialized.");
@#C1
static set Extension|finalExtensionStaticField(core::int #t38) → void
  if(self::_#Extension|finalExtensionStaticField#isSet)
    throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticField' has already been initialized.");
  else {
    self::_#Extension|finalExtensionStaticField#isSet = true;
    self::_#Extension|finalExtensionStaticField = #t38;
  }
@#C1
static get Extension|finalExtensionStaticFieldWithInitializer() → core::int {
  if(!self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet) {
    final core::int #t39 = 0;
    if(self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet)
      throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticFieldWithInitializer' has been assigned during initialization.");
    self::_#Extension|finalExtensionStaticFieldWithInitializer = #t39;
    self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet = true;
  }
  return let final core::int? #t40 = self::_#Extension|finalExtensionStaticFieldWithInitializer in #t40{core::int};
}
static method main() → dynamic {}

constants  {
  #C1 = self::Annotation {}
}
