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

import "dart:async";

class C<T extends core::Object? = dynamic> extends core::Object {
  field FutureOr<dynamic>? _#C#field1 = null;
  field core::bool _#C#field1#isSet = false;
  field FutureOr<dynamic>? _#C#field2 = null;
  field core::bool _#C#field2#isSet = false;
  generic-covariant-impl field FutureOr<self::C::T%>? _#C#field3 = null;
  field core::bool _#C#field3#isSet = false;
  generic-covariant-impl field FutureOr<self::C::T?>? _#C#field4 = null;
  field core::bool _#C#field4#isSet = false;
  generic-covariant-impl field FutureOr<self::C::T?>? _#C#field5 = null;
  field core::bool _#C#field5#isSet = false;
  synthetic constructor •() → self::C<self::C::T%>
    : super core::Object::•()
    ;
  get field1() → FutureOr<dynamic>
    return this.{self::C::_#C#field1#isSet} ?{FutureOr<dynamic>} this.{self::C::_#C#field1} : throw new _in::LateError::fieldNI("field1");
  set field1(FutureOr<dynamic>#t1) → void {
    this.{self::C::_#C#field1#isSet} = true;
    this.{self::C::_#C#field1} = #t1;
  }
  get field2() → FutureOr<dynamic>?
    return this.{self::C::_#C#field2#isSet} ?{FutureOr<dynamic>?} this.{self::C::_#C#field2} : throw new _in::LateError::fieldNI("field2");
  set field2(FutureOr<dynamic>? #t2) → void {
    this.{self::C::_#C#field2#isSet} = true;
    this.{self::C::_#C#field2} = #t2;
  }
  get field3() → FutureOr<self::C::T%>
    return this.{self::C::_#C#field3#isSet} ?{FutureOr<self::C::T%>} let final FutureOr<self::C::T%>? #t3 = this.{self::C::_#C#field3} in #t3{FutureOr<self::C::T%>} : throw new _in::LateError::fieldNI("field3");
  set field3(generic-covariant-impl FutureOr<self::C::T%>#t4) → void {
    this.{self::C::_#C#field3#isSet} = true;
    this.{self::C::_#C#field3} = #t4;
  }
  get field4() → FutureOr<self::C::T?>
    return this.{self::C::_#C#field4#isSet} ?{FutureOr<self::C::T?>} this.{self::C::_#C#field4} : throw new _in::LateError::fieldNI("field4");
  set field4(generic-covariant-impl FutureOr<self::C::T?>#t5) → void {
    this.{self::C::_#C#field4#isSet} = true;
    this.{self::C::_#C#field4} = #t5;
  }
  get field5() → FutureOr<self::C::T?>?
    return this.{self::C::_#C#field5#isSet} ?{FutureOr<self::C::T?>?} this.{self::C::_#C#field5} : throw new _in::LateError::fieldNI("field5");
  set field5(generic-covariant-impl FutureOr<self::C::T?>? #t6) → void {
    this.{self::C::_#C#field5#isSet} = true;
    this.{self::C::_#C#field5} = #t6;
  }
  method method() → dynamic {
    FutureOr<dynamic>? local1;
    core::bool #local1#isSet = false;
    function #local1#get() → FutureOr<dynamic>
      return #local1#isSet ?{FutureOr<dynamic>} local1 : throw new _in::LateError::localNI("local1");
    function #local1#set(FutureOr<dynamic>#t7) → dynamic {
      #local1#isSet = true;
      return local1 = #t7;
    }
    FutureOr<dynamic>? local2;
    core::bool #local2#isSet = false;
    function #local2#get() → FutureOr<dynamic>?
      return #local2#isSet ?{FutureOr<dynamic>?} local2 : throw new _in::LateError::localNI("local2");
    function #local2#set(FutureOr<dynamic>? #t8) → dynamic {
      #local2#isSet = true;
      return local2 = #t8;
    }
    FutureOr<self::C::T%>? local3;
    core::bool #local3#isSet = false;
    function #local3#get() → FutureOr<self::C::T%>
      return #local3#isSet ?{FutureOr<self::C::T%>} local3{FutureOr<self::C::T%>} : throw new _in::LateError::localNI("local3");
    function #local3#set(FutureOr<self::C::T%>#t9) → dynamic {
      #local3#isSet = true;
      return local3 = #t9;
    }
    FutureOr<self::C::T?>? local4;
    core::bool #local4#isSet = false;
    function #local4#get() → FutureOr<self::C::T?>
      return #local4#isSet ?{FutureOr<self::C::T?>} local4 : throw new _in::LateError::localNI("local4");
    function #local4#set(FutureOr<self::C::T?>#t10) → dynamic {
      #local4#isSet = true;
      return local4 = #t10;
    }
    FutureOr<self::C::T?>? local5;
    core::bool #local5#isSet = false;
    function #local5#get() → FutureOr<self::C::T?>?
      return #local5#isSet ?{FutureOr<self::C::T?>?} local5 : throw new _in::LateError::localNI("local5");
    function #local5#set(FutureOr<self::C::T?>? #t11) → dynamic {
      #local5#isSet = true;
      return local5 = #t11;
    }
  }
}
static field FutureOr<dynamic>? _#field1 = null;
static field core::bool _#field1#isSet = false;
static field FutureOr<dynamic>? _#field2 = null;
static field core::bool _#field2#isSet = false;
static field FutureOr<dynamic>? _#field3 = null;
static field core::bool _#field3#isSet = false;
static field FutureOr<core::int>? _#field4 = null;
static field core::bool _#field4#isSet = false;
static field FutureOr<core::int?>? _#field5 = null;
static field core::bool _#field5#isSet = false;
static field FutureOr<core::int?>? _#field6 = null;
static field core::bool _#field6#isSet = false;
static method method1() → FutureOr<dynamic>
  return null;
static method method2() → FutureOr<dynamic>?
  return null;
static method method3() → FutureOr<dynamic>
  return null;
static method method4() → FutureOr<core::int>
  return 0;
static method method5() → FutureOr<core::int?>
  return null;
static method method6() → FutureOr<core::int?>?
  return null;
static get field1() → FutureOr<dynamic> {
  if(!self::_#field1#isSet) {
    self::_#field1 = self::method1();
    self::_#field1#isSet = true;
  }
  return self::_#field1;
}
static set field1(FutureOr<dynamic>#t12) → void {
  self::_#field1#isSet = true;
  self::_#field1 = #t12;
}
static get field2() → FutureOr<dynamic>? {
  if(!self::_#field2#isSet) {
    self::_#field2 = self::method2();
    self::_#field2#isSet = true;
  }
  return self::_#field2;
}
static set field2(FutureOr<dynamic>? #t13) → void {
  self::_#field2#isSet = true;
  self::_#field2 = #t13;
}
static get field3() → FutureOr<dynamic> {
  if(!self::_#field3#isSet) {
    self::_#field3 = self::method3();
    self::_#field3#isSet = true;
  }
  return self::_#field3;
}
static set field3(FutureOr<dynamic>#t14) → void {
  self::_#field3#isSet = true;
  self::_#field3 = #t14;
}
static get field4() → FutureOr<core::int> {
  if(!self::_#field4#isSet) {
    self::_#field4 = self::method4();
    self::_#field4#isSet = true;
  }
  return let final FutureOr<core::int>? #t15 = self::_#field4 in #t15{FutureOr<core::int>};
}
static set field4(FutureOr<core::int>#t16) → void {
  self::_#field4#isSet = true;
  self::_#field4 = #t16;
}
static get field5() → FutureOr<core::int?> {
  if(!self::_#field5#isSet) {
    self::_#field5 = self::method5();
    self::_#field5#isSet = true;
  }
  return self::_#field5;
}
static set field5(FutureOr<core::int?>#t17) → void {
  self::_#field5#isSet = true;
  self::_#field5 = #t17;
}
static get field6() → FutureOr<core::int?>? {
  if(!self::_#field6#isSet) {
    self::_#field6 = self::method6();
    self::_#field6#isSet = true;
  }
  return self::_#field6;
}
static set field6(FutureOr<core::int?>? #t18) → void {
  self::_#field6#isSet = true;
  self::_#field6 = #t18;
}
static method main() → dynamic {}
