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

class Class<T extends core::Object? = dynamic> extends core::Object {
  static field core::int? _#lateStaticField1 = null;
  static field core::bool _#lateStaticField1#isSet = false;
  static field core::int? _#lateStaticField2 = null;
  static field core::bool _#lateStaticField2#isSet = false;
  field core::int? _#Class#lateInstanceField = null;
  field core::bool _#Class#lateInstanceField#isSet = false;
  field self::Class::T? _#Class#lateGenericInstanceField = null;
  field core::bool _#Class#lateGenericInstanceField#isSet = false;
  synthetic constructor •() → self::Class<self::Class::T%>
    : super core::Object::•()
    ;
  static get lateStaticField1() → core::int?
    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateError::fieldNI("lateStaticField1");
  static set lateStaticField1(core::int? #t1) → void
    if(self::Class::_#lateStaticField1#isSet)
      throw new _in::LateError::fieldAI("lateStaticField1");
    else {
      self::Class::_#lateStaticField1#isSet = true;
      self::Class::_#lateStaticField1 = #t1;
    }
  static get lateStaticField2() → core::int?
    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateError::fieldNI("lateStaticField2");
  static set lateStaticField2(core::int? #t2) → void
    if(self::Class::_#lateStaticField2#isSet)
      throw new _in::LateError::fieldAI("lateStaticField2");
    else {
      self::Class::_#lateStaticField2#isSet = true;
      self::Class::_#lateStaticField2 = #t2;
    }
  static method staticMethod() → dynamic {
    self::throws(() → core::int? => self::Class::lateStaticField2, "Read value from uninitialized Class.lateStaticField2");
    self::Class::lateStaticField2 = 42;
    self::expect(42, self::Class::lateStaticField2);
    self::throws(() → core::int => self::Class::lateStaticField2 = 43, "Write value to initialized Class.lateStaticField2");
  }
  get lateInstanceField() → core::int?
    return this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool} ?{core::int?} this.{self::Class::_#Class#lateInstanceField}{core::int?} : throw new _in::LateError::fieldNI("lateInstanceField");
  set lateInstanceField(core::int? #t3) → void
    if(this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool})
      throw new _in::LateError::fieldAI("lateInstanceField");
    else {
      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
      this.{self::Class::_#Class#lateInstanceField} = #t3;
    }
  get lateGenericInstanceField() → self::Class::T?
    return this.{self::Class::_#Class#lateGenericInstanceField#isSet}{core::bool} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField}{self::Class::T?} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
  set lateGenericInstanceField(self::Class::T? #t4) → void
    if(this.{self::Class::_#Class#lateGenericInstanceField#isSet}{core::bool})
      throw new _in::LateError::fieldAI("lateGenericInstanceField");
    else {
      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
      this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
    }
  method instanceMethod(covariant-by-class self::Class::T% value) → dynamic {
    self::throws(() → core::int? => this.{self::Class::lateInstanceField}{core::int?}, "Read value from uninitialized Class.lateInstanceField");
    this.{self::Class::lateInstanceField} = 16;
    self::expect(16, this.{self::Class::lateInstanceField}{core::int?});
    self::throws(() → core::int => this.{self::Class::lateInstanceField} = 17, "Write value to initialized Class.lateInstanceField");
    self::throws(() → self::Class::T? => this.{self::Class::lateGenericInstanceField}{self::Class::T?}, "Read value from uninitialized Class.lateGenericInstanceField");
    this.{self::Class::lateGenericInstanceField} = value;
    self::expect(value, this.{self::Class::lateGenericInstanceField}{self::Class::T?});
    self::throws(() → self::Class::T% => this.{self::Class::lateGenericInstanceField} = value, "Write value to initialized Class.lateGenericInstanceField");
  }
}
extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
  static field lateExtensionField1 = self::_#Extension|lateExtensionField1;
  static field lateExtensionField1 = self::_#Extension|lateExtensionField1#isSet;
  static get lateExtensionField1 = get self::Extension|lateExtensionField1;
  static set lateExtensionField1 = set self::Extension|lateExtensionField1;
  static field lateExtensionField2 = self::_#Extension|lateExtensionField2;
  static field lateExtensionField2 = self::_#Extension|lateExtensionField2#isSet;
  static get lateExtensionField2 = get self::Extension|lateExtensionField2;
  static set lateExtensionField2 = set self::Extension|lateExtensionField2;
  static method staticMethod = self::Extension|staticMethod;
}
static field core::int? _#lateTopLevelField = null;
static field core::bool _#lateTopLevelField#isSet = false;
static field core::int? _#Extension|lateExtensionField1 = null;
static field core::bool _#Extension|lateExtensionField1#isSet = false;
static field core::int? _#Extension|lateExtensionField2 = null;
static field core::bool _#Extension|lateExtensionField2#isSet = false;
static get lateTopLevelField() → core::int?
  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateError::fieldNI("lateTopLevelField");
static set lateTopLevelField(core::int? #t5) → void
  if(self::_#lateTopLevelField#isSet)
    throw new _in::LateError::fieldAI("lateTopLevelField");
  else {
    self::_#lateTopLevelField#isSet = true;
    self::_#lateTopLevelField = #t5;
  }
static get Extension|lateExtensionField1() → core::int?
  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateError::fieldNI("lateExtensionField1");
static set Extension|lateExtensionField1(core::int? #t6) → void
  if(self::_#Extension|lateExtensionField1#isSet)
    throw new _in::LateError::fieldAI("lateExtensionField1");
  else {
    self::_#Extension|lateExtensionField1#isSet = true;
    self::_#Extension|lateExtensionField1 = #t6;
  }
static get Extension|lateExtensionField2() → core::int?
  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateError::fieldNI("lateExtensionField2");
static set Extension|lateExtensionField2(core::int? #t7) → void
  if(self::_#Extension|lateExtensionField2#isSet)
    throw new _in::LateError::fieldAI("lateExtensionField2");
  else {
    self::_#Extension|lateExtensionField2#isSet = true;
    self::_#Extension|lateExtensionField2 = #t7;
  }
static method Extension|staticMethod() → dynamic {
  self::throws(() → core::int? => self::Extension|lateExtensionField2, "Read value from uninitialized Class.lateExtensionField2");
  self::Extension|lateExtensionField2 = 42;
  self::expect(42, self::Extension|lateExtensionField2);
  self::throws(() → core::int => self::Extension|lateExtensionField2 = 43, "Write value to initialized Class.lateExtensionField2");
}
static method main() → dynamic {
  self::throws(() → core::int? => self::lateTopLevelField, "Read value from uninitialized lateTopLevelField");
  self::lateTopLevelField = 123;
  self::expect(123, self::lateTopLevelField);
  self::throws(() → core::int => self::lateTopLevelField = 124, "Write value to initialized lateTopLevelField");
  self::throws(() → core::int? => self::Class::lateStaticField1, "Read value from uninitialized Class.lateStaticField1");
  self::Class::lateStaticField1 = 87;
  self::expect(87, self::Class::lateStaticField1);
  self::throws(() → core::int => self::Class::lateStaticField1 = 88, "Write value to initialized Class.lateStaticField1");
  self::Class::staticMethod();
  new self::Class::•<core::int?>().{self::Class::instanceMethod}(null){(core::int?) → dynamic};
  new self::Class::•<core::int?>().{self::Class::instanceMethod}(0){(core::int?) → dynamic};
  new self::Class::•<core::int>().{self::Class::instanceMethod}(0){(core::int) → dynamic};
  self::throws(() → core::int? => self::Extension|lateExtensionField1, "Read value from uninitialized Extension.lateExtensionField1");
  self::Extension|lateExtensionField1 = 87;
  self::expect(87, self::Extension|lateExtensionField1);
  self::throws(() → core::int => self::Extension|lateExtensionField1 = 88, "Write value to initialized Extension.lateExtensionField1");
  self::Extension|staticMethod();
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method throws(() → dynamic f, core::String message) → dynamic {
  dynamic value;
  try {
    value = f(){() → dynamic};
  }
  on core::Error catch(final core::Error e) {
    core::print(e);
    return;
  }
  throw "${message}: ${value}";
}
