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;
  late field core::int uninitializedNonFinalInstanceField;
  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 uninitializedFinalInstanceField() → core::int
    return let final core::int? #t6 = this.{self::Class::_#Class#uninitializedFinalInstanceField}{core::int?} in #t6 == null ?{core::int} throw new _in::LateError::fieldNI("uninitializedFinalInstanceField") : #t6{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? #t7 = this.{self::Class::_#Class#initializedNonFinalInstanceField}{core::int?} in #t7 == null ?{core::int} this.{self::Class::_#Class#initializedNonFinalInstanceField} = 0 : #t7{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? #t8 = this.{self::Class::_#Class#initializedFinalInstanceField}{core::int?} in #t8 == null ?{core::int} let final core::int #t9 = 0 in this.{self::Class::_#Class#initializedFinalInstanceField}{core::int?} == null ?{core::int} this.{self::Class::_#Class#initializedFinalInstanceField} = #t9 : throw new _in::LateError::fieldADI("initializedFinalInstanceField") : #t8{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? #t10 = #nonNullableUninitializedNonFinalLocal in #t10 == null ?{core::int} throw new _in::LateError::localNI("nonNullableUninitializedNonFinalLocal") : #t10{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? #t11 = #nonNullableUninitializedFinalLocal in #t11 == null ?{core::int} throw new _in::LateError::localNI("nonNullableUninitializedFinalLocal") : #t11{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 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 core::int? #nonNullableInitializedNonFinalLocal;
  function #nonNullableInitializedNonFinalLocal#get() → core::int
    return let final core::int? #t12 = #nonNullableInitializedNonFinalLocal in #t12 == null ?{core::int} #nonNullableInitializedNonFinalLocal = 0 : #t12{core::int};
  function #nonNullableInitializedNonFinalLocal#set(core::int nonNullableInitializedNonFinalLocal#param) → dynamic
    return #nonNullableInitializedNonFinalLocal = nonNullableInitializedNonFinalLocal#param;
  lowered final core::int? #nullableInitializedFinalLocal;
  lowered core::bool #nullableInitializedFinalLocal#isSet = false;
  function #nullableInitializedFinalLocal#get() → core::int? {
    if(!#nullableInitializedFinalLocal#isSet) {
      final core::int? #t13 = 0;
      if(#nullableInitializedFinalLocal#isSet)
        throw new _in::LateError::localADI("nullableInitializedFinalLocal");
      #nullableInitializedFinalLocal = #t13;
      #nullableInitializedFinalLocal#isSet = true;
    }
    return #nullableInitializedFinalLocal;
  }
  lowered final core::int? #nonNullableInitializedFinalLocal;
  function #nonNullableInitializedFinalLocal#get() → core::int
    return let final core::int? #t14 = #nonNullableInitializedFinalLocal in #t14 == null ?{core::int} let final core::int #t15 = 0 in #nonNullableInitializedFinalLocal == null ?{core::int} #nonNullableInitializedFinalLocal = #t15 : throw new _in::LateError::localADI("nonNullableInitializedFinalLocal") : #t14{core::int};
}
static get uninitializedNonFinalTopLevelField() → core::int
  return let final core::int? #t16 = self::_#uninitializedNonFinalTopLevelField in #t16 == null ?{core::int} throw new _in::LateError::fieldNI("uninitializedNonFinalTopLevelField") : #t16{core::int};
static set uninitializedNonFinalTopLevelField(core::int uninitializedNonFinalTopLevelField#param) → void
  self::_#uninitializedNonFinalTopLevelField = uninitializedNonFinalTopLevelField#param;
static get uninitializedFinalTopLevelField() → core::int
  return let final core::int? #t17 = self::_#uninitializedFinalTopLevelField in #t17 == null ?{core::int} throw new _in::LateError::fieldNI("uninitializedFinalTopLevelField") : #t17{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? #t18 = self::_#initializedNonFinalTopLevelField in #t18 == null ?{core::int} self::_#initializedNonFinalTopLevelField = 0 : #t18{core::int};
static set initializedNonFinalTopLevelField(core::int initializedNonFinalTopLevelField#param) → void
  self::_#initializedNonFinalTopLevelField = initializedNonFinalTopLevelField#param;
static get initializedFinalTopLevelField() → core::int
  return let final core::int? #t19 = self::_#initializedFinalTopLevelField in #t19 == null ?{core::int} let final core::int #t20 = 0 in self::_#initializedFinalTopLevelField == null ?{core::int} self::_#initializedFinalTopLevelField = #t20 : throw new _in::LateError::fieldADI("initializedFinalTopLevelField") : #t19{core::int};
