main = <No Member>;
library from "org-dartlang-test:///lib.dart" as lib {

  import "org-dartlang-test:///lib2.dart";

  @#C7
  class Y extends dart.ffi::Struct {
    synthetic constructor •() → lib::Y
      : super dart.ffi::Struct::•()
      ;
    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
      ;
    @#C8
    get y1() → dart.core::int
      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C10.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C8
    set y1(dart.core::int #externalFieldValue) → void
      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C10.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue);
    @#C8
    get y2() → dart.core::int
      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C8
    set y2(dart.core::int #externalFieldValue) → void
      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue);
    @#C13
    get y3() → dart.core::int
      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C16.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C13
    set y3(dart.core::int #externalFieldValue) → void
      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C16.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue);
    @#C18
    static get #sizeOf() → dart.core::int*
      return #C21.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
  }
}
library from "org-dartlang-test:///lib2.dart" as lib2 {
additionalExports = (ffi::nullptr,
  ffi::unsized,
  ffi::sizeOf,
  ffi::Dart_NativeMessageHandler,
  ffi::NativeFinalizerFunction,
  ffi::Abi,
  ffi::AbiSpecificInteger,
  ffi::AbiSpecificIntegerArray,
  ffi::AbiSpecificIntegerMapping,
  ffi::AbiSpecificIntegerPointer,
  ffi::Allocator,
  ffi::AllocatorAlloc,
  ffi::Array,
  ffi::ArrayArray,
  ffi::Bool,
  ffi::BoolArray,
  ffi::BoolPointer,
  ffi::Char,
  ffi::DartRepresentationOf,
  ffi::Dart_CObject,
  ffi::Double,
  ffi::DoubleArray,
  ffi::DoublePointer,
  ffi::DynamicLibrary,
  ffi::DynamicLibraryExtension,
  ffi::FfiNative,
  ffi::Finalizable,
  ffi::Float,
  ffi::FloatArray,
  ffi::FloatPointer,
  ffi::Handle,
  ffi::Int,
  ffi::Int16,
  ffi::Int16Array,
  ffi::Int16Pointer,
  ffi::Int32,
  ffi::Int32Array,
  ffi::Int32Pointer,
  ffi::Int64,
  ffi::Int64Array,
  ffi::Int64Pointer,
  ffi::Int8,
  ffi::Int8Array,
  ffi::Int8Pointer,
  ffi::IntPtr,
  ffi::Long,
  ffi::LongLong,
  ffi::NativeApi,
  ffi::NativeFinalizer,
  ffi::NativeFunction,
  ffi::NativeFunctionPointer,
  ffi::NativePort,
  ffi::NativeType,
  ffi::Opaque,
  ffi::Packed,
  ffi::Pointer,
  ffi::PointerArray,
  ffi::PointerPointer,
  ffi::Short,
  ffi::SignedChar,
  ffi::Size,
  ffi::Struct,
  ffi::StructArray,
  ffi::StructPointer,
  ffi::Uint16,
  ffi::Uint16Array,
  ffi::Uint16Pointer,
  ffi::Uint32,
  ffi::Uint32Array,
  ffi::Uint32Pointer,
  ffi::Uint64,
  ffi::Uint64Array,
  ffi::Uint64Pointer,
  ffi::Uint8,
  ffi::Uint8Array,
  ffi::Uint8Pointer,
  ffi::UintPtr,
  ffi::Union,
  ffi::UnionArray,
  ffi::UnionPointer,
  ffi::UnsignedChar,
  ffi::UnsignedInt,
  ffi::UnsignedLong,
  ffi::UnsignedLongLong,
  ffi::UnsignedShort,
  ffi::Unsized,
  ffi::Void,
  ffi::WChar)

  export "org-dartlang-test:///lib3.dart";

}
library from "org-dartlang-test:///lib3.dart" as lib3 {
additionalExports = (ffi::nullptr,
  ffi::unsized,
  ffi::sizeOf,
  ffi::Dart_NativeMessageHandler,
  ffi::NativeFinalizerFunction,
  ffi::Abi,
  ffi::AbiSpecificInteger,
  ffi::AbiSpecificIntegerArray,
  ffi::AbiSpecificIntegerMapping,
  ffi::AbiSpecificIntegerPointer,
  ffi::Allocator,
  ffi::AllocatorAlloc,
  ffi::Array,
  ffi::ArrayArray,
  ffi::Bool,
  ffi::BoolArray,
  ffi::BoolPointer,
  ffi::Char,
  ffi::DartRepresentationOf,
  ffi::Dart_CObject,
  ffi::Double,
  ffi::DoubleArray,
  ffi::DoublePointer,
  ffi::DynamicLibrary,
  ffi::DynamicLibraryExtension,
  ffi::FfiNative,
  ffi::Finalizable,
  ffi::Float,
  ffi::FloatArray,
  ffi::FloatPointer,
  ffi::Handle,
  ffi::Int,
  ffi::Int16,
  ffi::Int16Array,
  ffi::Int16Pointer,
  ffi::Int32,
  ffi::Int32Array,
  ffi::Int32Pointer,
  ffi::Int64,
  ffi::Int64Array,
  ffi::Int64Pointer,
  ffi::Int8,
  ffi::Int8Array,
  ffi::Int8Pointer,
  ffi::IntPtr,
  ffi::Long,
  ffi::LongLong,
  ffi::NativeApi,
  ffi::NativeFinalizer,
  ffi::NativeFunction,
  ffi::NativeFunctionPointer,
  ffi::NativePort,
  ffi::NativeType,
  ffi::Opaque,
  ffi::Packed,
  ffi::Pointer,
  ffi::PointerArray,
  ffi::PointerPointer,
  ffi::Short,
  ffi::SignedChar,
  ffi::Size,
  ffi::Struct,
  ffi::StructArray,
  ffi::StructPointer,
  ffi::Uint16,
  ffi::Uint16Array,
  ffi::Uint16Pointer,
  ffi::Uint32,
  ffi::Uint32Array,
  ffi::Uint32Pointer,
  ffi::Uint64,
  ffi::Uint64Array,
  ffi::Uint64Pointer,
  ffi::Uint8,
  ffi::Uint8Array,
  ffi::Uint8Pointer,
  ffi::UintPtr,
  ffi::Union,
  ffi::UnionArray,
  ffi::UnionPointer,
  ffi::UnsignedChar,
  ffi::UnsignedInt,
  ffi::UnsignedLong,
  ffi::UnsignedLongLong,
  ffi::UnsignedShort,
  ffi::Unsized,
  ffi::Void,
  ffi::WChar)

  export "dart:ffi";

}
library from "org-dartlang-test:///main.dart" as main {

  import "dart:ffi";
  import "org-dartlang-test:///lib.dart";

  @#C25
  class X extends dart.ffi::Struct {
    synthetic constructor •() → main::X
      : super dart.ffi::Struct::•()
      ;
    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
      ;
    get x1() → lib::Y
      return new lib::Y::#fromTypedDataBase( block {
        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object};
        dart.core::int #offset = #C10.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}{dart.typed_data::ByteBuffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}, #C21.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}){([dart.core::int, dart.core::int?]) → dart.typed_data::Uint8List});
    set x1(lib::Y #externalFieldValue) → void
      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C10.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9, #C21.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    get x2() → lib::Y
      return new lib::Y::#fromTypedDataBase( block {
        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object};
        dart.core::int #offset = #C21.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}{dart.typed_data::ByteBuffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}, #C21.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}){([dart.core::int, dart.core::int?]) → dart.typed_data::Uint8List});
    set x2(lib::Y #externalFieldValue) → void
      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C21.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9, #C21.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C8
    get x3() → dart.core::int
      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C28.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C8
    set x3(dart.core::int #externalFieldValue) → void
      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C28.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue);
    @#C18
    static get #sizeOf() → dart.core::int*
      return #C31.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
  }
}
constants  {
  #C1 = "vm:ffi:struct-fields"
  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
  #C4 = <dart.core::Type>[#C2, #C2, #C3]
  #C5 = null
  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
  #C7 = dart.core::pragma {name:#C1, options:#C6}
  #C8 = dart.ffi::Uint8 {}
  #C9 = 0
  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
  #C11 = 1
  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
  #C13 = dart.ffi::Uint64 {}
  #C14 = 8
  #C15 = 4
  #C16 = <dart.core::int*>[#C14, #C14, #C15, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C14, #C14, #C14, #C14]
  #C17 = "vm:prefer-inline"
  #C18 = dart.core::pragma {name:#C17, options:#C5}
  #C19 = 16
  #C20 = 12
  #C21 = <dart.core::int*>[#C19, #C19, #C20, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C19, #C19, #C19, #C19]
  #C22 = TypeLiteralConstant(lib::Y)
  #C23 = <dart.core::Type>[#C22, #C22, #C2]
  #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
  #C25 = dart.core::pragma {name:#C1, options:#C24}
  #C26 = 32
  #C27 = 24
  #C28 = <dart.core::int*>[#C26, #C26, #C27, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C26, #C26, #C26, #C26]
  #C29 = 40
  #C30 = 28
  #C31 = <dart.core::int*>[#C29, #C29, #C30, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C29, #C29, #C29, #C29]
}
