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

class Class extends core::Object {
  static field core::int? _#uninitializedNonFinalStaticField = null;
  static field core::int? _#uninitializedFinalStaticField = null;
  static field core::int? _#initializedNonFinalStaticField = null;
  static field core::int? _#initializedFinalStaticField = null;
  field core::int? _#Class#uninitializedNonFinalInstanceField = null;
  field core::int? _#Class#uninitializedFinalInstanceField = null;
  field core::int? _#Class#initializedNonFinalInstanceField = null;
  field core::int? _#Class#initializedFinalInstanceField = null;
  synthetic constructor •() → self::Class
    : super core::Object::•()
    ;
  static get uninitializedNonFinalStaticField() → core::int
    return let final core::int? #t1 = self::Class::_#uninitializedNonFinalStaticField in #t1 == null ?{core::int} throw new _in::LateError::fieldNI("uninitializedNonFinalStaticField") : #t1{core::int};
  static set uninitializedNonFinalStaticField(core::int uninitializedNonFinalStaticField#param) → void
    self::Class::_#uninitializedNonFinalStaticField = uninitializedNonFinalStaticField#param;
  static get uninitializedFinalStaticField() → core::int
    return let final core::int? #t2 = self::Class::_#uninitializedFinalStaticField in #t2 == null ?{core::int} throw new _in::LateError::fieldNI("uninitializedFinalStaticField") : #t2{core::int};
  static set uninitializedFinalStaticField(core::int uninitializedFinalStaticField#param) → void
    if(self::Class::_#uninitializedFinalStaticField == null)
      self::Class::_#uninitializedFinalStaticField = uninitializedFinalStaticField#param;
    else
      throw new _in::LateError::fieldAI("uninitializedFinalStaticField");
  static get initializedNonFinalStaticField() → core::int
    return let final core::int? #t3 = self::Class::_#initializedNonFinalStaticField in #t3 == null ?{core::int} self::Class::_#initializedNonFinalStaticField = 0 : #t3{core::int};
  static set initializedNonFinalStaticField(core::int initializedNonFinalStaticField#param) → void
    self::Class::_#initializedNonFinalStaticField = initializedNonFinalStaticField#param;
  static get initializedFinalStaticField() → core::int
    return let final core::int? #t4 = self::Class::_#initializedFinalStaticField in #t4 == null ?{core::int} let final core::int #t5 = 0 in self::Class::_#initializedFinalStaticField == null ?{core::int} self::Class::_#initializedFinalStaticField = #t5 : throw new _in::LateError::fieldADI("initializedFinalStaticField") : #t4{core::int};
  get uninitializedNonFinalInstanceField() → core::int
    return let final core::int? #t6 = this.{self::Class::_#Class#uninitializedNonFinalInstanceField}{core::int?} in #t6 == null ?{core::int} throw new _in::LateError::fieldNI("uninitializedNonFinalInstanceField") : #t6{core::int};
  set uninitializedNonFinalInstanceField(core::int uninitializedNonFinalInstanceField#param) → void
    this.{self::Class::_#Class#uninitializedNonFinalInstanceField} = uninitializedNonFinalInstanceField#param;
  get uninitializedFinalInstanceField() → core::int
    return let final core::int? #t7 = this.{self::Class::_#Class#uninitializedFinalInstanceField}{core::int?} in #t7 == null ?{core::int} throw new _in::LateError::fieldNI("uninitializedFinalInstanceField") : #t7{core::int};
  set uninitializedFinalInstanceField(core::int uninitializedFinalInstanceField#param) → void
    if(this.{self::Class::_#Class#uninitializedFinalInstanceField}{core::int?} == null)
      this.{self::Class::_#Class#uninitializedFinalInstanceField} = uninitializedFinalInstanceField#param;
    else
      throw new _in::LateError::fieldAI("uninitializedFinalInstanceField");
  get initializedNonFinalInstanceField() → core::int
    return let final core::int? #t8 = this.{self::Class::_#Class#initializedNonFinalInstanceField}{core::int?} in #t8 == null ?{core::int} this.{self::Class::_#Class#initializedNonFinalInstanceField} = 0 : #t8{core::int};
  set initializedNonFinalInstanceField(core::int initializedNonFinalInstanceField#param) → void
    this.{self::Class::_#Class#initializedNonFinalInstanceField} = initializedNonFinalInstanceField#param;
  get initializedFinalInstanceField() → core::int
    return let final core::int? #t9 = this.{self::Class::_#Class#initializedFinalInstanceField}{core::int?} in #t9 == null ?{core::int} let final core::int #t10 = 0 in this.{self::Class::_#Class#initializedFinalInstanceField}{core::int?} == null ?{core::int} this.{self::Class::_#Class#initializedFinalInstanceField} = #t10 : throw new _in::LateError::fieldADI("initializedFinalInstanceField") : #t9{core::int};
}
static field core::int? _#uninitializedNonFinalTopLevelField = null;
static field core::int? _#uninitializedFinalTopLevelField = null;
static field core::int? _#initializedNonFinalTopLevelField = null;
static field core::int? _#initializedFinalTopLevelField = null;
static method main() → dynamic {}
static method method() → dynamic {
  lowered core::int? #nullableUninitializedNonFinalLocal;
  lowered core::bool #nullableUninitializedNonFinalLocal#isSet = false;
  function #nullableUninitializedNonFinalLocal#get() → core::int?
    return #nullableUninitializedNonFinalLocal#isSet ?{core::int?} #nullableUninitializedNonFinalLocal : throw new _in::LateError::localNI("nullableUninitializedNonFinalLocal");
  function #nullableUninitializedNonFinalLocal#set(core::int? nullableUninitializedNonFinalLocal#param) → dynamic {
    #nullableUninitializedNonFinalLocal#isSet = true;
    return #nullableUninitializedNonFinalLocal = nullableUninitializedNonFinalLocal#param;
  }
  lowered core::int? #nonNullableUninitializedNonFinalLocal;
  function #nonNullableUninitializedNonFinalLocal#get() → core::int
    return let final core::int? #t11 = #nonNullableUninitializedNonFinalLocal in #t11 == null ?{core::int} throw new _in::LateError::localNI("nonNullableUninitializedNonFinalLocal") : #t11{core::int};
  function #nonNullableUninitializedNonFinalLocal#set(core::int nonNullableUninitializedNonFinalLocal#param) → dynamic
    return #nonNullableUninitializedNonFinalLocal = nonNullableUninitializedNonFinalLocal#param;
  lowered final core::int? #nullableUninitializedFinalLocal;
  lowered core::bool #nullableUninitializedFinalLocal#isSet = false;
  function #nullableUninitializedFinalLocal#get() → core::int?
    return #nullableUninitializedFinalLocal#isSet ?{core::int?} #nullableUninitializedFinalLocal : throw new _in::LateError::localNI("nullableUninitializedFinalLocal");
  function #nullableUninitializedFinalLocal#set(core::int? nullableUninitializedFinalLocal#param) → dynamic
    if(#nullableUninitializedFinalLocal#isSet)
      throw new _in::LateError::localAI("nullableUninitializedFinalLocal");
    else {
      #nullableUninitializedFinalLocal#isSet = true;
      return #nullableUninitializedFinalLocal = nullableUninitializedFinalLocal#param;
    }
  lowered final core::int? #nonNullableUninitializedFinalLocal;
  function #nonNullableUninitializedFinalLocal#get() → core::int
    return let final core::int? #t12 = #nonNullableUninitializedFinalLocal in #t12 == null ?{core::int} throw new _in::LateError::localNI("nonNullableUninitializedFinalLocal") : #t12{core::int};
  function #nonNullableUninitializedFinalLocal#set(core::int nonNullableUninitializedFinalLocal#param) → dynamic
    if(#nonNullableUninitializedFinalLocal == null)
      return #nonNullableUninitializedFinalLocal = nonNullableUninitializedFinalLocal#param;
    else
      throw new _in::LateError::localAI("nonNullableUninitializedFinalLocal");
  lowered has-declared-initializer core::int? #nullableInitializedNonFinalLocal;
  lowered core::bool #nullableInitializedNonFinalLocal#isSet = false;
  function #nullableInitializedNonFinalLocal#get() → core::int? {
    if(!#nullableInitializedNonFinalLocal#isSet) {
      #nullableInitializedNonFinalLocal = 0;
      #nullableInitializedNonFinalLocal#isSet = true;
    }
    return #nullableInitializedNonFinalLocal;
  }
  function #nullableInitializedNonFinalLocal#set(core::int? nullableInitializedNonFinalLocal#param) → dynamic {
    #nullableInitializedNonFinalLocal#isSet = true;
    return #nullableInitializedNonFinalLocal = nullableInitializedNonFinalLocal#param;
  }
  lowered has-declared-initializer core::int? #nonNullableInitializedNonFinalLocal;
  function #nonNullableInitializedNonFinalLocal#get() → core::int
    return let final core::int? #t13 = #nonNullableInitializedNonFinalLocal in #t13 == null ?{core::int} #nonNullableInitializedNonFinalLocal = 0 : #t13{core::int};
  function #nonNullableInitializedNonFinalLocal#set(core::int nonNullableInitializedNonFinalLocal#param) → dynamic
    return #nonNullableInitializedNonFinalLocal = nonNullableInitializedNonFinalLocal#param;
  lowered final has-declared-initializer core::int? #nullableInitializedFinalLocal;
  lowered core::bool #nullableInitializedFinalLocal#isSet = false;
  function #nullableInitializedFinalLocal#get() → core::int? {
    if(!#nullableInitializedFinalLocal#isSet) {
      final core::int? #t14 = 0;
      if(#nullableInitializedFinalLocal#isSet)
        throw new _in::LateError::localADI("nullableInitializedFinalLocal");
      #nullableInitializedFinalLocal = #t14;
      #nullableInitializedFinalLocal#isSet = true;
    }
    return #nullableInitializedFinalLocal;
  }
  lowered final has-declared-initializer core::int? #nonNullableInitializedFinalLocal;
  function #nonNullableInitializedFinalLocal#get() → core::int
    return let final core::int? #t15 = #nonNullableInitializedFinalLocal in #t15 == null ?{core::int} let final core::int #t16 = 0 in #nonNullableInitializedFinalLocal == null ?{core::int} #nonNullableInitializedFinalLocal = #t16 : throw new _in::LateError::localADI("nonNullableInitializedFinalLocal") : #t15{core::int};
}
static get uninitializedNonFinalTopLevelField() → core::int
  return let final core::int? #t17 = self::_#uninitializedNonFinalTopLevelField in #t17 == null ?{core::int} throw new _in::LateError::fieldNI("uninitializedNonFinalTopLevelField") : #t17{core::int};
static set uninitializedNonFinalTopLevelField(core::int uninitializedNonFinalTopLevelField#param) → void
  self::_#uninitializedNonFinalTopLevelField = uninitializedNonFinalTopLevelField#param;
static get uninitializedFinalTopLevelField() → core::int
  return let final core::int? #t18 = self::_#uninitializedFinalTopLevelField in #t18 == null ?{core::int} throw new _in::LateError::fieldNI("uninitializedFinalTopLevelField") : #t18{core::int};
static set uninitializedFinalTopLevelField(core::int uninitializedFinalTopLevelField#param) → void
  if(self::_#uninitializedFinalTopLevelField == null)
    self::_#uninitializedFinalTopLevelField = uninitializedFinalTopLevelField#param;
  else
    throw new _in::LateError::fieldAI("uninitializedFinalTopLevelField");
static get initializedNonFinalTopLevelField() → core::int
  return let final core::int? #t19 = self::_#initializedNonFinalTopLevelField in #t19 == null ?{core::int} self::_#initializedNonFinalTopLevelField = 0 : #t19{core::int};
static set initializedNonFinalTopLevelField(core::int initializedNonFinalTopLevelField#param) → void
  self::_#initializedNonFinalTopLevelField = initializedNonFinalTopLevelField#param;
static get initializedFinalTopLevelField() → core::int
  return let final core::int? #t20 = self::_#initializedFinalTopLevelField in #t20 == null ?{core::int} let final core::int #t21 = 0 in self::_#initializedFinalTopLevelField == null ?{core::int} self::_#initializedFinalTopLevelField = #t21 : throw new _in::LateError::fieldADI("initializedFinalTopLevelField") : #t20{core::int};
