// ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field

// AUTO GENERATED FILE, DO NOT EDIT.
//
// Generated by `package:ffigen`.
import 'dart:ffi' as ffi;
import 'package:ffi/ffi.dart' as pkg_ffi;

/// Tests calling Objective-C string methods
class StringTestObjCLibrary {
  /// Holds the symbol lookup function.
  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
      _lookup;

  /// The symbols are looked up in [dynamicLibrary].
  StringTestObjCLibrary(ffi.DynamicLibrary dynamicLibrary)
      : _lookup = dynamicLibrary.lookup;

  /// The symbols are looked up with [lookup].
  StringTestObjCLibrary.fromLookup(
      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
          lookup)
      : _lookup = lookup;

  late final ffi.Pointer<ffi.Double> _NSFoundationVersionNumber =
      _lookup<ffi.Double>('NSFoundationVersionNumber');

  double get NSFoundationVersionNumber => _NSFoundationVersionNumber.value;

  set NSFoundationVersionNumber(double value) =>
      _NSFoundationVersionNumber.value = value;

  late final ffi.Pointer<NSInteger> _NSNotFound =
      _lookup<NSInteger>('NSNotFound');

  int get NSNotFound => _NSNotFound.value;

  set NSNotFound(int value) => _NSNotFound.value = value;

  late final ffi.Pointer<ffi.Double> _kCFCoreFoundationVersionNumber =
      _lookup<ffi.Double>('kCFCoreFoundationVersionNumber');

  double get kCFCoreFoundationVersionNumber =>
      _kCFCoreFoundationVersionNumber.value;

  set kCFCoreFoundationVersionNumber(double value) =>
      _kCFCoreFoundationVersionNumber.value = value;

  late final ffi.Pointer<CFIndex> _kCFNotFound =
      _lookup<CFIndex>('kCFNotFound');

  int get kCFNotFound => _kCFNotFound.value;

  set kCFNotFound(int value) => _kCFNotFound.value = value;

  late final ffi.Pointer<CFNullRef> _kCFNull = _lookup<CFNullRef>('kCFNull');

  CFNullRef get kCFNull => _kCFNull.value;

  set kCFNull(CFNullRef value) => _kCFNull.value = value;

  late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorDefault =
      _lookup<CFAllocatorRef>('kCFAllocatorDefault');

  CFAllocatorRef get kCFAllocatorDefault => _kCFAllocatorDefault.value;

  set kCFAllocatorDefault(CFAllocatorRef value) =>
      _kCFAllocatorDefault.value = value;

  late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorSystemDefault =
      _lookup<CFAllocatorRef>('kCFAllocatorSystemDefault');

  CFAllocatorRef get kCFAllocatorSystemDefault =>
      _kCFAllocatorSystemDefault.value;

  set kCFAllocatorSystemDefault(CFAllocatorRef value) =>
      _kCFAllocatorSystemDefault.value = value;

  late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorMalloc =
      _lookup<CFAllocatorRef>('kCFAllocatorMalloc');

  CFAllocatorRef get kCFAllocatorMalloc => _kCFAllocatorMalloc.value;

  set kCFAllocatorMalloc(CFAllocatorRef value) =>
      _kCFAllocatorMalloc.value = value;

  late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorMallocZone =
      _lookup<CFAllocatorRef>('kCFAllocatorMallocZone');

  CFAllocatorRef get kCFAllocatorMallocZone => _kCFAllocatorMallocZone.value;

  set kCFAllocatorMallocZone(CFAllocatorRef value) =>
      _kCFAllocatorMallocZone.value = value;

  late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorNull =
      _lookup<CFAllocatorRef>('kCFAllocatorNull');

  CFAllocatorRef get kCFAllocatorNull => _kCFAllocatorNull.value;

  set kCFAllocatorNull(CFAllocatorRef value) => _kCFAllocatorNull.value = value;

  late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorUseContext =
      _lookup<CFAllocatorRef>('kCFAllocatorUseContext');

  CFAllocatorRef get kCFAllocatorUseContext => _kCFAllocatorUseContext.value;

  set kCFAllocatorUseContext(CFAllocatorRef value) =>
      _kCFAllocatorUseContext.value = value;

  ffi.Pointer<ObjCSel> _sel_registerName(
    ffi.Pointer<pkg_ffi.Char> str,
  ) {
    return __sel_registerName(
      str,
    );
  }

  late final __sel_registerNamePtr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCSel> Function(
              ffi.Pointer<pkg_ffi.Char>)>>('sel_registerName');
  late final __sel_registerName = __sel_registerNamePtr
      .asFunction<ffi.Pointer<ObjCSel> Function(ffi.Pointer<pkg_ffi.Char>)>();

  ffi.Pointer<ObjCObject> _objc_getClass(
    ffi.Pointer<pkg_ffi.Char> str,
  ) {
    return __objc_getClass(
      str,
    );
  }

  late final __objc_getClassPtr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<pkg_ffi.Char>)>>('objc_getClass');
  late final __objc_getClass = __objc_getClassPtr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<pkg_ffi.Char>)>();

  void _objc_msgSend_0(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_0(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_0Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_0 = __objc_msgSend_0Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  instancetype _objc_msgSend_1(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_1(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_1Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_1 = __objc_msgSend_1Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  instancetype _objc_msgSend_2(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<_NSZone> zone,
  ) {
    return __objc_msgSend_2(
      obj,
      sel,
      zone,
    );
  }

  late final __objc_msgSend_2Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<_NSZone>)>>('objc_msgSend');
  late final __objc_msgSend_2 = __objc_msgSend_2Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<_NSZone>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_3(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_3(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_3Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_3 = __objc_msgSend_3Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_4(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_4(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_4Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_4 = __objc_msgSend_4Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_5(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<_NSZone> zone,
  ) {
    return __objc_msgSend_5(
      obj,
      sel,
      zone,
    );
  }

  late final __objc_msgSend_5Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Pointer<_NSZone>)>>('objc_msgSend');
  late final __objc_msgSend_5 = __objc_msgSend_5Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<_NSZone>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_6(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<_NSZone> zone,
  ) {
    return __objc_msgSend_6(
      obj,
      sel,
      zone,
    );
  }

  late final __objc_msgSend_6Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Pointer<_NSZone>)>>('objc_msgSend');
  late final __objc_msgSend_6 = __objc_msgSend_6Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<_NSZone>)>();

  bool _objc_msgSend_7(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_7(
          obj,
          sel,
          aSelector,
        ) !=
        0;
  }

  late final __objc_msgSend_7Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_7 = __objc_msgSend_7Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCSel>)>();

  bool _objc_msgSend_8(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> protocol,
  ) {
    return __objc_msgSend_8(
          obj,
          sel,
          protocol,
        ) !=
        0;
  }

  late final __objc_msgSend_8Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_8 = __objc_msgSend_8Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  IMP _objc_msgSend_9(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_9(
      obj,
      sel,
      aSelector,
    );
  }

  late final __objc_msgSend_9Ptr = _lookup<
      ffi.NativeFunction<
          IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_9 = __objc_msgSend_9Ptr.asFunction<
      IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCSel>)>();

  IMP _objc_msgSend_10(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_10(
      obj,
      sel,
      aSelector,
    );
  }

  late final __objc_msgSend_10Ptr = _lookup<
      ffi.NativeFunction<
          IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_10 = __objc_msgSend_10Ptr.asFunction<
      IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCSel>)>();

  void _objc_msgSend_11(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_11(
      obj,
      sel,
      aSelector,
    );
  }

  late final __objc_msgSend_11Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_11 = __objc_msgSend_11Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_12(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_12(
      obj,
      sel,
      aSelector,
    );
  }

  late final __objc_msgSend_12Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_12 = __objc_msgSend_12Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>();

  void _objc_msgSend_13(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> anInvocation,
  ) {
    return __objc_msgSend_13(
      obj,
      sel,
      anInvocation,
    );
  }

  late final __objc_msgSend_13Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_13 = __objc_msgSend_13Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_14(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_14(
      obj,
      sel,
      aSelector,
    );
  }

  late final __objc_msgSend_14Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_14 = __objc_msgSend_14Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_15(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_15(
      obj,
      sel,
      aSelector,
    );
  }

  late final __objc_msgSend_15Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_15 = __objc_msgSend_15Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>();

  bool _objc_msgSend_16(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_16(
          obj,
          sel,
        ) !=
        0;
  }

  late final __objc_msgSend_16Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_16 = __objc_msgSend_16Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  bool _objc_msgSend_17(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> aClass,
  ) {
    return __objc_msgSend_17(
          obj,
          sel,
          aClass,
        ) !=
        0;
  }

  late final __objc_msgSend_17Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_17 = __objc_msgSend_17Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  bool _objc_msgSend_18(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> sel1,
  ) {
    return __objc_msgSend_18(
          obj,
          sel,
          sel1,
        ) !=
        0;
  }

  late final __objc_msgSend_18Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_18 = __objc_msgSend_18Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCSel>)>();

  bool _objc_msgSend_19(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> sel1,
  ) {
    return __objc_msgSend_19(
          obj,
          sel,
          sel1,
        ) !=
        0;
  }

  late final __objc_msgSend_19Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_19 = __objc_msgSend_19Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_20(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_20(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_20Ptr = _lookup<
      ffi.NativeFunction<
          NSUInteger Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_20 = __objc_msgSend_20Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_21(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_21(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_21Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_21 = __objc_msgSend_21Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_22(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_22(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_22Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_22 = __objc_msgSend_22Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_23(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int index,
  ) {
    return __objc_msgSend_23(
      obj,
      sel,
      index,
    );
  }

  late final __objc_msgSend_23Ptr = _lookup<
      ffi.NativeFunction<
          unichar Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSUInteger)>>('objc_msgSend');
  late final __objc_msgSend_23 = __objc_msgSend_23Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  instancetype _objc_msgSend_24(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> coder,
  ) {
    return __objc_msgSend_24(
      obj,
      sel,
      coder,
    );
  }

  late final __objc_msgSend_24Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_24 = __objc_msgSend_24Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_25(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<pkg_ffi.Char> cString,
    int enc,
  ) {
    return __objc_msgSend_25(
      obj,
      sel,
      cString,
      enc,
    );
  }

  late final __objc_msgSend_25Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<pkg_ffi.Char>,
              pkg_ffi.UnsignedInt)>>('objc_msgSend');
  late final __objc_msgSend_25 = __objc_msgSend_25Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<pkg_ffi.Char>, int)>();

  ffi.Pointer<pkg_ffi.Char> _objc_msgSend_26(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_26(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_26Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<pkg_ffi.Char> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_26 = __objc_msgSend_26Ptr.asFunction<
      ffi.Pointer<pkg_ffi.Char> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_27(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_27(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_27Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_27 = __objc_msgSend_27Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  void _objc_msgSend_28(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ffi.Void> value,
    int size,
  ) {
    return __objc_msgSend_28(
      obj,
      sel,
      value,
      size,
    );
  }

  late final __objc_msgSend_28Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ffi.Void>, NSUInteger)>>('objc_msgSend');
  late final __objc_msgSend_28 = __objc_msgSend_28Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ffi.Void>, int)>();

  ffi.Pointer<pkg_ffi.Char> _objc_msgSend_29(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_29(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_29Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<pkg_ffi.Char> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_29 = __objc_msgSend_29Ptr.asFunction<
      ffi.Pointer<pkg_ffi.Char> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  instancetype _objc_msgSend_30(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ffi.Void> value,
    ffi.Pointer<pkg_ffi.Char> type,
  ) {
    return __objc_msgSend_30(
      obj,
      sel,
      value,
      type,
    );
  }

  late final __objc_msgSend_30Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ffi.Void>,
              ffi.Pointer<pkg_ffi.Char>)>>('objc_msgSend');
  late final __objc_msgSend_30 = __objc_msgSend_30Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ffi.Void>, ffi.Pointer<pkg_ffi.Char>)>();

  instancetype _objc_msgSend_31(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> coder,
  ) {
    return __objc_msgSend_31(
      obj,
      sel,
      coder,
    );
  }

  late final __objc_msgSend_31Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_31 = __objc_msgSend_31Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  instancetype _objc_msgSend_32(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> coder,
  ) {
    return __objc_msgSend_32(
      obj,
      sel,
      coder,
    );
  }

  late final __objc_msgSend_32Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_32 = __objc_msgSend_32Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_33(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_33(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_33Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, pkg_ffi.Char)>>('objc_msgSend');
  late final __objc_msgSend_33 = __objc_msgSend_33Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_34(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_34(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_34Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, pkg_ffi.UnsignedChar)>>('objc_msgSend');
  late final __objc_msgSend_34 = __objc_msgSend_34Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_35(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_35(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_35Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, pkg_ffi.Short)>>('objc_msgSend');
  late final __objc_msgSend_35 = __objc_msgSend_35Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_36(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_36(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_36Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, pkg_ffi.UnsignedShort)>>('objc_msgSend');
  late final __objc_msgSend_36 = __objc_msgSend_36Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_37(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_37(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_37Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, pkg_ffi.Int)>>('objc_msgSend');
  late final __objc_msgSend_37 = __objc_msgSend_37Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_38(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_38(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_38Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, pkg_ffi.UnsignedInt)>>('objc_msgSend');
  late final __objc_msgSend_38 = __objc_msgSend_38Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_39(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_39(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_39Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, pkg_ffi.Long)>>('objc_msgSend');
  late final __objc_msgSend_39 = __objc_msgSend_39Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_40(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_40(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_40Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, pkg_ffi.UnsignedLong)>>('objc_msgSend');
  late final __objc_msgSend_40 = __objc_msgSend_40Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_41(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_41(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_41Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, pkg_ffi.LongLong)>>('objc_msgSend');
  late final __objc_msgSend_41 = __objc_msgSend_41Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_42(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_42(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_42Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, pkg_ffi.UnsignedLongLong)>>('objc_msgSend');
  late final __objc_msgSend_42 = __objc_msgSend_42Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_43(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    double value,
  ) {
    return __objc_msgSend_43(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_43Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Float)>>('objc_msgSend');
  late final __objc_msgSend_43 = __objc_msgSend_43Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_44(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    double value,
  ) {
    return __objc_msgSend_44(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_44Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Double)>>('objc_msgSend');
  late final __objc_msgSend_44 = __objc_msgSend_44Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, double)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_45(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    bool value,
  ) {
    return __objc_msgSend_45(
      obj,
      sel,
      value ? 1 : 0,
    );
  }

  late final __objc_msgSend_45Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Uint8)>>('objc_msgSend');
  late final __objc_msgSend_45 = __objc_msgSend_45Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_46(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_46(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_46Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, NSInteger)>>('objc_msgSend');
  late final __objc_msgSend_46 = __objc_msgSend_46Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_47(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_47(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_47Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
  late final __objc_msgSend_47 = __objc_msgSend_47Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  int _objc_msgSend_48(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_48(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_48Ptr = _lookup<
      ffi.NativeFunction<
          pkg_ffi.Char Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_48 = __objc_msgSend_48Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_49(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_49(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_49Ptr = _lookup<
      ffi.NativeFunction<
          pkg_ffi.UnsignedChar Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_49 = __objc_msgSend_49Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_50(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_50(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_50Ptr = _lookup<
      ffi.NativeFunction<
          pkg_ffi.Short Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_50 = __objc_msgSend_50Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_51(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_51(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_51Ptr = _lookup<
      ffi.NativeFunction<
          pkg_ffi.UnsignedShort Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_51 = __objc_msgSend_51Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_52(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_52(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_52Ptr = _lookup<
      ffi.NativeFunction<
          pkg_ffi.Int Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_52 = __objc_msgSend_52Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_53(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_53(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_53Ptr = _lookup<
      ffi.NativeFunction<
          pkg_ffi.UnsignedInt Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_53 = __objc_msgSend_53Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_54(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_54(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_54Ptr = _lookup<
      ffi.NativeFunction<
          pkg_ffi.Long Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_54 = __objc_msgSend_54Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_55(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_55(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_55Ptr = _lookup<
      ffi.NativeFunction<
          pkg_ffi.UnsignedLong Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_55 = __objc_msgSend_55Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_56(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_56(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_56Ptr = _lookup<
      ffi.NativeFunction<
          pkg_ffi.LongLong Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_56 = __objc_msgSend_56Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_57(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_57(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_57Ptr = _lookup<
      ffi.NativeFunction<
          pkg_ffi.UnsignedLongLong Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_57 = __objc_msgSend_57Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  double _objc_msgSend_58(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_58(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_58Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Float Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_58 = __objc_msgSend_58Ptr.asFunction<
      double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  double _objc_msgSend_59(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_59(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_59Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Double Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_59 = __objc_msgSend_59Ptr.asFunction<
      double Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_60(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_60(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_60Ptr = _lookup<
      ffi.NativeFunction<
          NSInteger Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_60 = __objc_msgSend_60Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_61(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_61(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_61Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_61 = __objc_msgSend_61Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_62(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> otherNumber,
  ) {
    return __objc_msgSend_62(
      obj,
      sel,
      otherNumber,
    );
  }

  late final __objc_msgSend_62Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_62 = __objc_msgSend_62Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  bool _objc_msgSend_63(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> number,
  ) {
    return __objc_msgSend_63(
          obj,
          sel,
          number,
        ) !=
        0;
  }

  late final __objc_msgSend_63Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_63 = __objc_msgSend_63Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_64(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> locale,
  ) {
    return __objc_msgSend_64(
      obj,
      sel,
      locale,
    );
  }

  late final __objc_msgSend_64Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_64 = __objc_msgSend_64Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_65(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_65(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_65Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_65 = __objc_msgSend_65Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_66(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_66(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_66Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_66 = __objc_msgSend_66Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_67(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_67(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_67Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_67 = __objc_msgSend_67Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_68(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_68(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_68Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_68 = __objc_msgSend_68Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  instancetype _objc_msgSend_69(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> anObject,
    int type,
    int index,
  ) {
    return __objc_msgSend_69(
      obj,
      sel,
      anObject,
      type,
      index,
    );
  }

  late final __objc_msgSend_69Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>, ffi.Int32, NSUInteger)>>('objc_msgSend');
  late final __objc_msgSend_69 = __objc_msgSend_69Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>, int, int)>();

  instancetype _objc_msgSend_70(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> anObject,
    int type,
    int index,
    int associatedIndex,
  ) {
    return __objc_msgSend_70(
      obj,
      sel,
      anObject,
      type,
      index,
      associatedIndex,
    );
  }

  late final __objc_msgSend_70Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              ffi.Int32,
              NSUInteger,
              NSUInteger)>>('objc_msgSend');
  late final __objc_msgSend_70 = __objc_msgSend_70Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>, int, int, int)>();

  instancetype _objc_msgSend_71(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_71(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_71Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSUInteger)>>('objc_msgSend');
  late final __objc_msgSend_71 = __objc_msgSend_71Ptr.asFunction<
      instancetype Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  instancetype _objc_msgSend_72(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    NSRange range,
  ) {
    return __objc_msgSend_72(
      obj,
      sel,
      range,
    );
  }

  late final __objc_msgSend_72Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSRange)>>('objc_msgSend');
  late final __objc_msgSend_72 = __objc_msgSend_72Ptr.asFunction<
      instancetype Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();

  instancetype _objc_msgSend_73(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> indexSet,
  ) {
    return __objc_msgSend_73(
      obj,
      sel,
      indexSet,
    );
  }

  late final __objc_msgSend_73Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_73 = __objc_msgSend_73Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  bool _objc_msgSend_74(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> indexSet,
  ) {
    return __objc_msgSend_74(
          obj,
          sel,
          indexSet,
        ) !=
        0;
  }

  late final __objc_msgSend_74Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_74 = __objc_msgSend_74Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  int _objc_msgSend_75(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_75(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_75Ptr = _lookup<
      ffi.NativeFunction<
          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSUInteger)>>('objc_msgSend');
  late final __objc_msgSend_75 = __objc_msgSend_75Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  int _objc_msgSend_76(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<NSUInteger> indexBuffer,
    int bufferSize,
    NSRangePointer range,
  ) {
    return __objc_msgSend_76(
      obj,
      sel,
      indexBuffer,
      bufferSize,
      range,
    );
  }

  late final __objc_msgSend_76Ptr = _lookup<
      ffi.NativeFunction<
          NSUInteger Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<NSUInteger>,
              NSUInteger,
              NSRangePointer)>>('objc_msgSend');
  late final __objc_msgSend_76 = __objc_msgSend_76Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<NSUInteger>, int, NSRangePointer)>();

  int _objc_msgSend_77(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    NSRange range,
  ) {
    return __objc_msgSend_77(
      obj,
      sel,
      range,
    );
  }

  late final __objc_msgSend_77Ptr = _lookup<
      ffi.NativeFunction<
          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSRange)>>('objc_msgSend');
  late final __objc_msgSend_77 = __objc_msgSend_77Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();

  bool _objc_msgSend_78(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_78(
          obj,
          sel,
          value,
        ) !=
        0;
  }

  late final __objc_msgSend_78Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSUInteger)>>('objc_msgSend');
  late final __objc_msgSend_78 = __objc_msgSend_78Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  bool _objc_msgSend_79(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    NSRange range,
  ) {
    return __objc_msgSend_79(
          obj,
          sel,
          range,
        ) !=
        0;
  }

  late final __objc_msgSend_79Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSRange)>>('objc_msgSend');
  late final __objc_msgSend_79 = __objc_msgSend_79Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();

  bool _objc_msgSend_80(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> indexSet,
  ) {
    return __objc_msgSend_80(
          obj,
          sel,
          indexSet,
        ) !=
        0;
  }

  late final __objc_msgSend_80Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_80 = __objc_msgSend_80Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_81(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> block,
  ) {
    return __objc_msgSend_81(
      obj,
      sel,
      block,
    );
  }

  late final __objc_msgSend_81Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_81 = __objc_msgSend_81Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_82(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int opts,
    ffi.Pointer<ObjCObject> block,
  ) {
    return __objc_msgSend_82(
      obj,
      sel,
      opts,
      block,
    );
  }

  late final __objc_msgSend_82Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_82 = __objc_msgSend_82Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
          ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_83(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    NSRange range,
    int opts,
    ffi.Pointer<ObjCObject> block,
  ) {
    return __objc_msgSend_83(
      obj,
      sel,
      range,
      opts,
      block,
    );
  }

  late final __objc_msgSend_83Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSRange, ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_83 = __objc_msgSend_83Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
          ffi.Pointer<ObjCObject>)>();

  int _objc_msgSend_84(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> predicate,
  ) {
    return __objc_msgSend_84(
      obj,
      sel,
      predicate,
    );
  }

  late final __objc_msgSend_84Ptr = _lookup<
      ffi.NativeFunction<
          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_84 = __objc_msgSend_84Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  int _objc_msgSend_85(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int opts,
    ffi.Pointer<ObjCObject> predicate,
  ) {
    return __objc_msgSend_85(
      obj,
      sel,
      opts,
      predicate,
    );
  }

  late final __objc_msgSend_85Ptr = _lookup<
      ffi.NativeFunction<
          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_85 = __objc_msgSend_85Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
          ffi.Pointer<ObjCObject>)>();

  int _objc_msgSend_86(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    NSRange range,
    int opts,
    ffi.Pointer<ObjCObject> predicate,
  ) {
    return __objc_msgSend_86(
      obj,
      sel,
      range,
      opts,
      predicate,
    );
  }

  late final __objc_msgSend_86Ptr = _lookup<
      ffi.NativeFunction<
          NSUInteger Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSRange, ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_86 = __objc_msgSend_86Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
          ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_87(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> predicate,
  ) {
    return __objc_msgSend_87(
      obj,
      sel,
      predicate,
    );
  }

  late final __objc_msgSend_87Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_87 = __objc_msgSend_87Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_88(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int opts,
    ffi.Pointer<ObjCObject> predicate,
  ) {
    return __objc_msgSend_88(
      obj,
      sel,
      opts,
      predicate,
    );
  }

  late final __objc_msgSend_88Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Int32,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_88 = __objc_msgSend_88Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, int, ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_89(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    NSRange range,
    int opts,
    ffi.Pointer<ObjCObject> predicate,
  ) {
    return __objc_msgSend_89(
      obj,
      sel,
      range,
      opts,
      predicate,
    );
  }

  late final __objc_msgSend_89Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              NSRange,
              ffi.Int32,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_89 = __objc_msgSend_89Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, NSRange, int, ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_90(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> block,
  ) {
    return __objc_msgSend_90(
      obj,
      sel,
      block,
    );
  }

  late final __objc_msgSend_90Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_90 = __objc_msgSend_90Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_91(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int opts,
    ffi.Pointer<ObjCObject> block,
  ) {
    return __objc_msgSend_91(
      obj,
      sel,
      opts,
      block,
    );
  }

  late final __objc_msgSend_91Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_91 = __objc_msgSend_91Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
          ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_92(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    NSRange range,
    int opts,
    ffi.Pointer<ObjCObject> block,
  ) {
    return __objc_msgSend_92(
      obj,
      sel,
      range,
      opts,
      block,
    );
  }

  late final __objc_msgSend_92Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSRange, ffi.Int32, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_92 = __objc_msgSend_92Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange, int,
          ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_93(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> indexSet,
  ) {
    return __objc_msgSend_93(
      obj,
      sel,
      indexSet,
    );
  }

  late final __objc_msgSend_93Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_93 = __objc_msgSend_93Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_94(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> indexSet,
  ) {
    return __objc_msgSend_94(
      obj,
      sel,
      indexSet,
    );
  }

  late final __objc_msgSend_94Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_94 = __objc_msgSend_94Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_95(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int value,
  ) {
    return __objc_msgSend_95(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_95Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSUInteger)>>('objc_msgSend');
  late final __objc_msgSend_95 = __objc_msgSend_95Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  void _objc_msgSend_96(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    NSRange range,
  ) {
    return __objc_msgSend_96(
      obj,
      sel,
      range,
    );
  }

  late final __objc_msgSend_96Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSRange)>>('objc_msgSend');
  late final __objc_msgSend_96 = __objc_msgSend_96Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange)>();

  void _objc_msgSend_97(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int index,
    int delta,
  ) {
    return __objc_msgSend_97(
      obj,
      sel,
      index,
      delta,
    );
  }

  late final __objc_msgSend_97Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSUInteger, NSInteger)>>('objc_msgSend');
  late final __objc_msgSend_97 = __objc_msgSend_97Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int)>();

  instancetype _objc_msgSend_98(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> changes,
  ) {
    return __objc_msgSend_98(
      obj,
      sel,
      changes,
    );
  }

  late final __objc_msgSend_98Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_98 = __objc_msgSend_98Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  instancetype _objc_msgSend_99(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> inserts,
    ffi.Pointer<ObjCObject> insertedObjects,
    ffi.Pointer<ObjCObject> removes,
    ffi.Pointer<ObjCObject> removedObjects,
    ffi.Pointer<ObjCObject> changes,
  ) {
    return __objc_msgSend_99(
      obj,
      sel,
      inserts,
      insertedObjects,
      removes,
      removedObjects,
      changes,
    );
  }

  late final __objc_msgSend_99Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_99 = __objc_msgSend_99Ptr.asFunction<
      instancetype Function(
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>)>();

  instancetype _objc_msgSend_100(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> inserts,
    ffi.Pointer<ObjCObject> insertedObjects,
    ffi.Pointer<ObjCObject> removes,
    ffi.Pointer<ObjCObject> removedObjects,
  ) {
    return __objc_msgSend_100(
      obj,
      sel,
      inserts,
      insertedObjects,
      removes,
      removedObjects,
    );
  }

  late final __objc_msgSend_100Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_100 = __objc_msgSend_100Ptr.asFunction<
      instancetype Function(
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_101(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_101(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_101Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_101 = __objc_msgSend_101Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_102(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_102(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_102Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_102 = __objc_msgSend_102Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_103(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int index,
  ) {
    return __objc_msgSend_103(
      obj,
      sel,
      index,
    );
  }

  late final __objc_msgSend_103Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, NSUInteger)>>('objc_msgSend');
  late final __objc_msgSend_103 = __objc_msgSend_103Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  instancetype _objc_msgSend_104(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ffi.Pointer<ObjCObject>> objects,
    int cnt,
  ) {
    return __objc_msgSend_104(
      obj,
      sel,
      objects,
      cnt,
    );
  }

  late final __objc_msgSend_104Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ffi.Pointer<ObjCObject>>,
              NSUInteger)>>('objc_msgSend');
  late final __objc_msgSend_104 = __objc_msgSend_104Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ffi.Pointer<ObjCObject>>, int)>();

  instancetype _objc_msgSend_105(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> coder,
  ) {
    return __objc_msgSend_105(
      obj,
      sel,
      coder,
    );
  }

  late final __objc_msgSend_105Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_105 = __objc_msgSend_105Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_106(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> anObject,
  ) {
    return __objc_msgSend_106(
      obj,
      sel,
      anObject,
    );
  }

  late final __objc_msgSend_106Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_106 = __objc_msgSend_106Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_107(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> anObject,
    int index,
  ) {
    return __objc_msgSend_107(
      obj,
      sel,
      anObject,
      index,
    );
  }

  late final __objc_msgSend_107Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>, NSUInteger)>>('objc_msgSend');
  late final __objc_msgSend_107 = __objc_msgSend_107Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>, int)>();

  void _objc_msgSend_108(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int index,
    ffi.Pointer<ObjCObject> anObject,
  ) {
    return __objc_msgSend_108(
      obj,
      sel,
      index,
      anObject,
    );
  }

  late final __objc_msgSend_108Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSUInteger, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_108 = __objc_msgSend_108Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int,
          ffi.Pointer<ObjCObject>)>();

  instancetype _objc_msgSend_109(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> coder,
  ) {
    return __objc_msgSend_109(
      obj,
      sel,
      coder,
    );
  }

  late final __objc_msgSend_109Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_109 = __objc_msgSend_109Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_110(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> typeIdentifier,
    int visibility,
    ffi.Pointer<ObjCObject> loadHandler,
  ) {
    return __objc_msgSend_110(
      obj,
      sel,
      typeIdentifier,
      visibility,
      loadHandler,
    );
  }

  late final __objc_msgSend_110Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              ffi.Int32,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_110 = __objc_msgSend_110Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>, int, ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_111(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> typeIdentifier,
    int fileOptions,
    int visibility,
    ffi.Pointer<ObjCObject> loadHandler,
  ) {
    return __objc_msgSend_111(
      obj,
      sel,
      typeIdentifier,
      fileOptions,
      visibility,
      loadHandler,
    );
  }

  late final __objc_msgSend_111Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              ffi.Int32,
              ffi.Int32,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_111 = __objc_msgSend_111Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>, int, int, ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_112(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_112(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_112Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_112 = __objc_msgSend_112Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  bool _objc_msgSend_113(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> typeIdentifier,
  ) {
    return __objc_msgSend_113(
          obj,
          sel,
          typeIdentifier,
        ) !=
        0;
  }

  late final __objc_msgSend_113Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_113 = __objc_msgSend_113Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  bool _objc_msgSend_114(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> typeIdentifier,
    int fileOptions,
  ) {
    return __objc_msgSend_114(
          obj,
          sel,
          typeIdentifier,
          fileOptions,
        ) !=
        0;
  }

  late final __objc_msgSend_114Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
  late final __objc_msgSend_114 = __objc_msgSend_114Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>, int)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_115(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> typeIdentifier,
    ffi.Pointer<ObjCObject> completionHandler,
  ) {
    return __objc_msgSend_115(
      obj,
      sel,
      typeIdentifier,
      completionHandler,
    );
  }

  late final __objc_msgSend_115Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_115 = __objc_msgSend_115Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_116(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> typeIdentifier,
    ffi.Pointer<ObjCObject> completionHandler,
  ) {
    return __objc_msgSend_116(
      obj,
      sel,
      typeIdentifier,
      completionHandler,
    );
  }

  late final __objc_msgSend_116Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_116 = __objc_msgSend_116Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_117(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> typeIdentifier,
    ffi.Pointer<ObjCObject> completionHandler,
  ) {
    return __objc_msgSend_117(
      obj,
      sel,
      typeIdentifier,
      completionHandler,
    );
  }

  late final __objc_msgSend_117Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_117 = __objc_msgSend_117Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_118(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_118(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_118Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_118 = __objc_msgSend_118Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  void _objc_msgSend_119(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> value,
  ) {
    return __objc_msgSend_119(
      obj,
      sel,
      value,
    );
  }

  late final __objc_msgSend_119Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_119 = __objc_msgSend_119Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  instancetype _objc_msgSend_120(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> object,
  ) {
    return __objc_msgSend_120(
      obj,
      sel,
      object,
    );
  }

  late final __objc_msgSend_120Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_120 = __objc_msgSend_120Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_121(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> object,
    int visibility,
  ) {
    return __objc_msgSend_121(
      obj,
      sel,
      object,
      visibility,
    );
  }

  late final __objc_msgSend_121Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>, ffi.Int32)>>('objc_msgSend');
  late final __objc_msgSend_121 = __objc_msgSend_121Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>, int)>();

  void _objc_msgSend_122(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> aClass,
    int visibility,
    ffi.Pointer<ObjCObject> loadHandler,
  ) {
    return __objc_msgSend_122(
      obj,
      sel,
      aClass,
      visibility,
      loadHandler,
    );
  }

  late final __objc_msgSend_122Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              ffi.Int32,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_122 = __objc_msgSend_122Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>, int, ffi.Pointer<ObjCObject>)>();

  bool _objc_msgSend_123(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> aClass,
  ) {
    return __objc_msgSend_123(
          obj,
          sel,
          aClass,
        ) !=
        0;
  }

  late final __objc_msgSend_123Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_123 = __objc_msgSend_123Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_124(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> aClass,
    ffi.Pointer<ObjCObject> completionHandler,
  ) {
    return __objc_msgSend_124(
      obj,
      sel,
      aClass,
      completionHandler,
    );
  }

  late final __objc_msgSend_124Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_124 = __objc_msgSend_124Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>)>();

  instancetype _objc_msgSend_125(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> item,
    ffi.Pointer<ObjCObject> typeIdentifier,
  ) {
    return __objc_msgSend_125(
      obj,
      sel,
      item,
      typeIdentifier,
    );
  }

  late final __objc_msgSend_125Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_125 = __objc_msgSend_125Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCObject>)>();

  instancetype _objc_msgSend_126(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> fileURL,
  ) {
    return __objc_msgSend_126(
      obj,
      sel,
      fileURL,
    );
  }

  late final __objc_msgSend_126Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_126 = __objc_msgSend_126Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  void _objc_msgSend_127(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> typeIdentifier,
    NSItemProviderLoadHandler loadHandler,
  ) {
    return __objc_msgSend_127(
      obj,
      sel,
      typeIdentifier,
      loadHandler,
    );
  }

  late final __objc_msgSend_127Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              NSItemProviderLoadHandler)>>('objc_msgSend');
  late final __objc_msgSend_127 = __objc_msgSend_127Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>, NSItemProviderLoadHandler)>();

  void _objc_msgSend_128(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> typeIdentifier,
    ffi.Pointer<ObjCObject> options,
    NSItemProviderCompletionHandler completionHandler,
  ) {
    return __objc_msgSend_128(
      obj,
      sel,
      typeIdentifier,
      options,
      completionHandler,
    );
  }

  late final __objc_msgSend_128Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>,
              NSItemProviderCompletionHandler)>>('objc_msgSend');
  late final __objc_msgSend_128 = __objc_msgSend_128Ptr.asFunction<
      void Function(
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>,
          NSItemProviderCompletionHandler)>();

  late final ffi.Pointer<ffi.Pointer<ObjCObject>>
      _NSItemProviderPreferredImageSizeKey =
      _lookup<ffi.Pointer<ObjCObject>>('NSItemProviderPreferredImageSizeKey');

  ffi.Pointer<ObjCObject> get NSItemProviderPreferredImageSizeKey =>
      _NSItemProviderPreferredImageSizeKey.value;

  set NSItemProviderPreferredImageSizeKey(ffi.Pointer<ObjCObject> value) =>
      _NSItemProviderPreferredImageSizeKey.value = value;

  late final ffi.Pointer<ffi.Pointer<ObjCObject>>
      _NSExtensionJavaScriptPreprocessingResultsKey =
      _lookup<ffi.Pointer<ObjCObject>>(
          'NSExtensionJavaScriptPreprocessingResultsKey');

  ffi.Pointer<ObjCObject> get NSExtensionJavaScriptPreprocessingResultsKey =>
      _NSExtensionJavaScriptPreprocessingResultsKey.value;

  set NSExtensionJavaScriptPreprocessingResultsKey(
          ffi.Pointer<ObjCObject> value) =>
      _NSExtensionJavaScriptPreprocessingResultsKey.value = value;

  late final ffi.Pointer<ffi.Pointer<ObjCObject>>
      _NSExtensionJavaScriptFinalizeArgumentKey =
      _lookup<ffi.Pointer<ObjCObject>>(
          'NSExtensionJavaScriptFinalizeArgumentKey');

  ffi.Pointer<ObjCObject> get NSExtensionJavaScriptFinalizeArgumentKey =>
      _NSExtensionJavaScriptFinalizeArgumentKey.value;

  set NSExtensionJavaScriptFinalizeArgumentKey(ffi.Pointer<ObjCObject> value) =>
      _NSExtensionJavaScriptFinalizeArgumentKey.value = value;

  late final ffi.Pointer<ffi.Pointer<ObjCObject>> _NSItemProviderErrorDomain =
      _lookup<ffi.Pointer<ObjCObject>>('NSItemProviderErrorDomain');

  ffi.Pointer<ObjCObject> get NSItemProviderErrorDomain =>
      _NSItemProviderErrorDomain.value;

  set NSItemProviderErrorDomain(ffi.Pointer<ObjCObject> value) =>
      _NSItemProviderErrorDomain.value = value;

  late final ffi.Pointer<NSStringTransform> _NSStringTransformLatinToKatakana =
      _lookup<NSStringTransform>('NSStringTransformLatinToKatakana');

  NSStringTransform get NSStringTransformLatinToKatakana =>
      _NSStringTransformLatinToKatakana.value;

  set NSStringTransformLatinToKatakana(NSStringTransform value) =>
      _NSStringTransformLatinToKatakana.value = value;

  late final ffi.Pointer<NSStringTransform> _NSStringTransformLatinToHiragana =
      _lookup<NSStringTransform>('NSStringTransformLatinToHiragana');

  NSStringTransform get NSStringTransformLatinToHiragana =>
      _NSStringTransformLatinToHiragana.value;

  set NSStringTransformLatinToHiragana(NSStringTransform value) =>
      _NSStringTransformLatinToHiragana.value = value;

  late final ffi.Pointer<NSStringTransform> _NSStringTransformLatinToHangul =
      _lookup<NSStringTransform>('NSStringTransformLatinToHangul');

  NSStringTransform get NSStringTransformLatinToHangul =>
      _NSStringTransformLatinToHangul.value;

  set NSStringTransformLatinToHangul(NSStringTransform value) =>
      _NSStringTransformLatinToHangul.value = value;

  late final ffi.Pointer<NSStringTransform> _NSStringTransformLatinToArabic =
      _lookup<NSStringTransform>('NSStringTransformLatinToArabic');

  NSStringTransform get NSStringTransformLatinToArabic =>
      _NSStringTransformLatinToArabic.value;

  set NSStringTransformLatinToArabic(NSStringTransform value) =>
      _NSStringTransformLatinToArabic.value = value;

  late final ffi.Pointer<NSStringTransform> _NSStringTransformLatinToHebrew =
      _lookup<NSStringTransform>('NSStringTransformLatinToHebrew');

  NSStringTransform get NSStringTransformLatinToHebrew =>
      _NSStringTransformLatinToHebrew.value;

  set NSStringTransformLatinToHebrew(NSStringTransform value) =>
      _NSStringTransformLatinToHebrew.value = value;

  late final ffi.Pointer<NSStringTransform> _NSStringTransformLatinToThai =
      _lookup<NSStringTransform>('NSStringTransformLatinToThai');

  NSStringTransform get NSStringTransformLatinToThai =>
      _NSStringTransformLatinToThai.value;

  set NSStringTransformLatinToThai(NSStringTransform value) =>
      _NSStringTransformLatinToThai.value = value;

  late final ffi.Pointer<NSStringTransform> _NSStringTransformLatinToCyrillic =
      _lookup<NSStringTransform>('NSStringTransformLatinToCyrillic');

  NSStringTransform get NSStringTransformLatinToCyrillic =>
      _NSStringTransformLatinToCyrillic.value;

  set NSStringTransformLatinToCyrillic(NSStringTransform value) =>
      _NSStringTransformLatinToCyrillic.value = value;

  late final ffi.Pointer<NSStringTransform> _NSStringTransformLatinToGreek =
      _lookup<NSStringTransform>('NSStringTransformLatinToGreek');

  NSStringTransform get NSStringTransformLatinToGreek =>
      _NSStringTransformLatinToGreek.value;

  set NSStringTransformLatinToGreek(NSStringTransform value) =>
      _NSStringTransformLatinToGreek.value = value;

  late final ffi.Pointer<NSStringTransform> _NSStringTransformToLatin =
      _lookup<NSStringTransform>('NSStringTransformToLatin');

  NSStringTransform get NSStringTransformToLatin =>
      _NSStringTransformToLatin.value;

  set NSStringTransformToLatin(NSStringTransform value) =>
      _NSStringTransformToLatin.value = value;

  late final ffi.Pointer<NSStringTransform> _NSStringTransformMandarinToLatin =
      _lookup<NSStringTransform>('NSStringTransformMandarinToLatin');

  NSStringTransform get NSStringTransformMandarinToLatin =>
      _NSStringTransformMandarinToLatin.value;

  set NSStringTransformMandarinToLatin(NSStringTransform value) =>
      _NSStringTransformMandarinToLatin.value = value;

  late final ffi.Pointer<NSStringTransform>
      _NSStringTransformHiraganaToKatakana =
      _lookup<NSStringTransform>('NSStringTransformHiraganaToKatakana');

  NSStringTransform get NSStringTransformHiraganaToKatakana =>
      _NSStringTransformHiraganaToKatakana.value;

  set NSStringTransformHiraganaToKatakana(NSStringTransform value) =>
      _NSStringTransformHiraganaToKatakana.value = value;

  late final ffi.Pointer<NSStringTransform>
      _NSStringTransformFullwidthToHalfwidth =
      _lookup<NSStringTransform>('NSStringTransformFullwidthToHalfwidth');

  NSStringTransform get NSStringTransformFullwidthToHalfwidth =>
      _NSStringTransformFullwidthToHalfwidth.value;

  set NSStringTransformFullwidthToHalfwidth(NSStringTransform value) =>
      _NSStringTransformFullwidthToHalfwidth.value = value;

  late final ffi.Pointer<NSStringTransform> _NSStringTransformToXMLHex =
      _lookup<NSStringTransform>('NSStringTransformToXMLHex');

  NSStringTransform get NSStringTransformToXMLHex =>
      _NSStringTransformToXMLHex.value;

  set NSStringTransformToXMLHex(NSStringTransform value) =>
      _NSStringTransformToXMLHex.value = value;

  late final ffi.Pointer<NSStringTransform> _NSStringTransformToUnicodeName =
      _lookup<NSStringTransform>('NSStringTransformToUnicodeName');

  NSStringTransform get NSStringTransformToUnicodeName =>
      _NSStringTransformToUnicodeName.value;

  set NSStringTransformToUnicodeName(NSStringTransform value) =>
      _NSStringTransformToUnicodeName.value = value;

  late final ffi.Pointer<NSStringTransform>
      _NSStringTransformStripCombiningMarks =
      _lookup<NSStringTransform>('NSStringTransformStripCombiningMarks');

  NSStringTransform get NSStringTransformStripCombiningMarks =>
      _NSStringTransformStripCombiningMarks.value;

  set NSStringTransformStripCombiningMarks(NSStringTransform value) =>
      _NSStringTransformStripCombiningMarks.value = value;

  late final ffi.Pointer<NSStringTransform> _NSStringTransformStripDiacritics =
      _lookup<NSStringTransform>('NSStringTransformStripDiacritics');

  NSStringTransform get NSStringTransformStripDiacritics =>
      _NSStringTransformStripDiacritics.value;

  set NSStringTransformStripDiacritics(NSStringTransform value) =>
      _NSStringTransformStripDiacritics.value = value;

  late final ffi.Pointer<NSStringEncodingDetectionOptionsKey>
      _NSStringEncodingDetectionSuggestedEncodingsKey =
      _lookup<NSStringEncodingDetectionOptionsKey>(
          'NSStringEncodingDetectionSuggestedEncodingsKey');

  NSStringEncodingDetectionOptionsKey
      get NSStringEncodingDetectionSuggestedEncodingsKey =>
          _NSStringEncodingDetectionSuggestedEncodingsKey.value;

  set NSStringEncodingDetectionSuggestedEncodingsKey(
          NSStringEncodingDetectionOptionsKey value) =>
      _NSStringEncodingDetectionSuggestedEncodingsKey.value = value;

  late final ffi.Pointer<NSStringEncodingDetectionOptionsKey>
      _NSStringEncodingDetectionDisallowedEncodingsKey =
      _lookup<NSStringEncodingDetectionOptionsKey>(
          'NSStringEncodingDetectionDisallowedEncodingsKey');

  NSStringEncodingDetectionOptionsKey
      get NSStringEncodingDetectionDisallowedEncodingsKey =>
          _NSStringEncodingDetectionDisallowedEncodingsKey.value;

  set NSStringEncodingDetectionDisallowedEncodingsKey(
          NSStringEncodingDetectionOptionsKey value) =>
      _NSStringEncodingDetectionDisallowedEncodingsKey.value = value;

  late final ffi.Pointer<NSStringEncodingDetectionOptionsKey>
      _NSStringEncodingDetectionUseOnlySuggestedEncodingsKey =
      _lookup<NSStringEncodingDetectionOptionsKey>(
          'NSStringEncodingDetectionUseOnlySuggestedEncodingsKey');

  NSStringEncodingDetectionOptionsKey
      get NSStringEncodingDetectionUseOnlySuggestedEncodingsKey =>
          _NSStringEncodingDetectionUseOnlySuggestedEncodingsKey.value;

  set NSStringEncodingDetectionUseOnlySuggestedEncodingsKey(
          NSStringEncodingDetectionOptionsKey value) =>
      _NSStringEncodingDetectionUseOnlySuggestedEncodingsKey.value = value;

  late final ffi.Pointer<NSStringEncodingDetectionOptionsKey>
      _NSStringEncodingDetectionAllowLossyKey =
      _lookup<NSStringEncodingDetectionOptionsKey>(
          'NSStringEncodingDetectionAllowLossyKey');

  NSStringEncodingDetectionOptionsKey
      get NSStringEncodingDetectionAllowLossyKey =>
          _NSStringEncodingDetectionAllowLossyKey.value;

  set NSStringEncodingDetectionAllowLossyKey(
          NSStringEncodingDetectionOptionsKey value) =>
      _NSStringEncodingDetectionAllowLossyKey.value = value;

  late final ffi.Pointer<NSStringEncodingDetectionOptionsKey>
      _NSStringEncodingDetectionFromWindowsKey =
      _lookup<NSStringEncodingDetectionOptionsKey>(
          'NSStringEncodingDetectionFromWindowsKey');

  NSStringEncodingDetectionOptionsKey
      get NSStringEncodingDetectionFromWindowsKey =>
          _NSStringEncodingDetectionFromWindowsKey.value;

  set NSStringEncodingDetectionFromWindowsKey(
          NSStringEncodingDetectionOptionsKey value) =>
      _NSStringEncodingDetectionFromWindowsKey.value = value;

  late final ffi.Pointer<NSStringEncodingDetectionOptionsKey>
      _NSStringEncodingDetectionLossySubstitutionKey =
      _lookup<NSStringEncodingDetectionOptionsKey>(
          'NSStringEncodingDetectionLossySubstitutionKey');

  NSStringEncodingDetectionOptionsKey
      get NSStringEncodingDetectionLossySubstitutionKey =>
          _NSStringEncodingDetectionLossySubstitutionKey.value;

  set NSStringEncodingDetectionLossySubstitutionKey(
          NSStringEncodingDetectionOptionsKey value) =>
      _NSStringEncodingDetectionLossySubstitutionKey.value = value;

  late final ffi.Pointer<NSStringEncodingDetectionOptionsKey>
      _NSStringEncodingDetectionLikelyLanguageKey =
      _lookup<NSStringEncodingDetectionOptionsKey>(
          'NSStringEncodingDetectionLikelyLanguageKey');

  NSStringEncodingDetectionOptionsKey
      get NSStringEncodingDetectionLikelyLanguageKey =>
          _NSStringEncodingDetectionLikelyLanguageKey.value;

  set NSStringEncodingDetectionLikelyLanguageKey(
          NSStringEncodingDetectionOptionsKey value) =>
      _NSStringEncodingDetectionLikelyLanguageKey.value = value;

  void _objc_msgSend_129(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    NSRange range,
    ffi.Pointer<ObjCObject> aString,
  ) {
    return __objc_msgSend_129(
      obj,
      sel,
      range,
      aString,
    );
  }

  late final __objc_msgSend_129Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSRange, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_129 = __objc_msgSend_129Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, NSRange,
          ffi.Pointer<ObjCObject>)>();

  late final ffi.Pointer<NSExceptionName> _NSCharacterConversionException =
      _lookup<NSExceptionName>('NSCharacterConversionException');

  NSExceptionName get NSCharacterConversionException =>
      _NSCharacterConversionException.value;

  set NSCharacterConversionException(NSExceptionName value) =>
      _NSCharacterConversionException.value = value;

  late final ffi.Pointer<NSExceptionName> _NSParseErrorException =
      _lookup<NSExceptionName>('NSParseErrorException');

  NSExceptionName get NSParseErrorException => _NSParseErrorException.value;

  set NSParseErrorException(NSExceptionName value) =>
      _NSParseErrorException.value = value;

  ffi.Pointer<ObjCObject> _objc_msgSend_130(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> a,
    ffi.Pointer<ObjCObject> b,
  ) {
    return __objc_msgSend_130(
      obj,
      sel,
      a,
      b,
    );
  }

  late final __objc_msgSend_130Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_130 = __objc_msgSend_130Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>)>();
}

abstract class NSComparisonResult {
  static const int NSOrderedAscending = -1;
  static const int NSOrderedSame = 0;
  static const int NSOrderedDescending = 1;
}

abstract class NSEnumerationOptions {
  static const int NSEnumerationConcurrent = 1;
  static const int NSEnumerationReverse = 2;
}

abstract class NSSortOptions {
  static const int NSSortConcurrent = 1;
  static const int NSSortStable = 16;
}

abstract class NSQualityOfService {
  static const int NSQualityOfServiceUserInteractive = 33;
  static const int NSQualityOfServiceUserInitiated = 25;
  static const int NSQualityOfServiceUtility = 17;
  static const int NSQualityOfServiceBackground = 9;
  static const int NSQualityOfServiceDefault = -1;
}

typedef NSInteger = pkg_ffi.Long;

class __CFString extends ffi.Opaque {}

abstract class CFComparisonResult {
  static const int kCFCompareLessThan = -1;
  static const int kCFCompareEqualTo = 0;
  static const int kCFCompareGreaterThan = 1;
}

typedef CFIndex = pkg_ffi.Long;

class CFRange extends ffi.Struct {
  @CFIndex()
  external int location;

  @CFIndex()
  external int length;
}

class __CFNull extends ffi.Opaque {}

typedef CFNullRef = ffi.Pointer<__CFNull>;

class __CFAllocator extends ffi.Opaque {}

typedef CFAllocatorRef = ffi.Pointer<__CFAllocator>;

class CFAllocatorContext extends ffi.Struct {
  @CFIndex()
  external int version;

  external ffi.Pointer<ffi.Void> info;

  external CFAllocatorRetainCallBack retain;

  external CFAllocatorReleaseCallBack release;

  external CFAllocatorCopyDescriptionCallBack copyDescription;

  external CFAllocatorAllocateCallBack allocate;

  external CFAllocatorReallocateCallBack reallocate;

  external CFAllocatorDeallocateCallBack deallocate;

  external CFAllocatorPreferredSizeCallBack preferredSize;
}

typedef CFAllocatorRetainCallBack = ffi.Pointer<
    ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>)>>;
typedef CFAllocatorReleaseCallBack
    = ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>;
typedef CFAllocatorCopyDescriptionCallBack = ffi
    .Pointer<ffi.NativeFunction<CFStringRef Function(ffi.Pointer<ffi.Void>)>>;
typedef CFStringRef = ffi.Pointer<__CFString>;
typedef CFAllocatorAllocateCallBack = ffi.Pointer<
    ffi.NativeFunction<
        ffi.Pointer<ffi.Void> Function(
            CFIndex, CFOptionFlags, ffi.Pointer<ffi.Void>)>>;
typedef CFOptionFlags = pkg_ffi.UnsignedLong;
typedef CFAllocatorReallocateCallBack = ffi.Pointer<
    ffi.NativeFunction<
        ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>, CFIndex,
            CFOptionFlags, ffi.Pointer<ffi.Void>)>>;
typedef CFAllocatorDeallocateCallBack = ffi.Pointer<
    ffi.NativeFunction<
        ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>>;
typedef CFAllocatorPreferredSizeCallBack = ffi.Pointer<
    ffi.NativeFunction<
        CFIndex Function(CFIndex, CFOptionFlags, ffi.Pointer<ffi.Void>)>>;

ffi.Pointer<ObjCSel> _registerName(StringTestObjCLibrary _lib, String name) {
  final cstr = name.toNativeUtf8();
  final sel = _lib._sel_registerName(cstr.cast());
  pkg_ffi.calloc.free(cstr);
  return sel;
}

ffi.Pointer<ObjCObject> _getClass(StringTestObjCLibrary _lib, String name) {
  final cstr = name.toNativeUtf8();
  final clazz = _lib._objc_getClass(cstr.cast());
  pkg_ffi.calloc.free(cstr);
  return clazz;
}

class _ObjCWrapper {
  final ffi.Pointer<ObjCObject> _id;
  final StringTestObjCLibrary _lib;
  _ObjCWrapper._(this._id, this._lib);
}

class NSValue extends NSObject {
  NSValue._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSValue castFrom<T extends _ObjCWrapper>(T other) {
    return NSValue._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_getValue_size;
  void getValue_size(ffi.Pointer<ffi.Void> value, int size) {
    _sel_getValue_size ??= _registerName(_lib, "getValue:size:");
    _lib._objc_msgSend_28(_id, _sel_getValue_size!, value, size);
  }

  static ffi.Pointer<ObjCSel>? _sel_objCType;
  ffi.Pointer<pkg_ffi.Char> get objCType {
    _sel_objCType ??= _registerName(_lib, "objCType");
    return _lib._objc_msgSend_29(_id, _sel_objCType!);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithBytes_objCType;
  NSValue initWithBytes_objCType(
      ffi.Pointer<ffi.Void> value, ffi.Pointer<pkg_ffi.Char> type) {
    _sel_initWithBytes_objCType ??=
        _registerName(_lib, "initWithBytes:objCType:");
    final _ret =
        _lib._objc_msgSend_30(_id, _sel_initWithBytes_objCType!, value, type);
    return NSValue._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithCoder;
  NSValue initWithCoder(NSObject coder) {
    _sel_initWithCoder ??= _registerName(_lib, "initWithCoder:");
    final _ret = _lib._objc_msgSend_31(_id, _sel_initWithCoder!, coder._id);
    return NSValue._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSValue new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSValue");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSValue._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSValue alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSValue");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSValue._(_ret, _lib);
  }
}

class NSObject extends _ObjCWrapper {
  NSObject._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSObject castFrom<T extends _ObjCWrapper>(T other) {
    return NSObject._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_load;
  static void load(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_load ??= _registerName(_lib, "load");
    _lib._objc_msgSend_0(_class!, _sel_load!);
  }

  static ffi.Pointer<ObjCSel>? _sel_initialize;
  static void initialize(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_initialize ??= _registerName(_lib, "initialize");
    _lib._objc_msgSend_0(_class!, _sel_initialize!);
  }

  static ffi.Pointer<ObjCSel>? _sel_init;
  NSObject init() {
    _sel_init ??= _registerName(_lib, "init");
    final _ret = _lib._objc_msgSend_1(_id, _sel_init!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSObject new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_allocWithZone;
  static NSObject allocWithZone(
      StringTestObjCLibrary _lib, ffi.Pointer<_NSZone> zone) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_allocWithZone ??= _registerName(_lib, "allocWithZone:");
    final _ret = _lib._objc_msgSend_2(_class!, _sel_allocWithZone!, zone);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSObject alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_dealloc;
  void dealloc() {
    _sel_dealloc ??= _registerName(_lib, "dealloc");
    _lib._objc_msgSend_0(_id, _sel_dealloc!);
  }

  static ffi.Pointer<ObjCSel>? _sel_finalize;
  void finalize() {
    _sel_finalize ??= _registerName(_lib, "finalize");
    _lib._objc_msgSend_0(_id, _sel_finalize!);
  }

  static ffi.Pointer<ObjCSel>? _sel_copy;
  NSObject copy() {
    _sel_copy ??= _registerName(_lib, "copy");
    final _ret = _lib._objc_msgSend_3(_id, _sel_copy!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_mutableCopy;
  NSObject mutableCopy() {
    _sel_mutableCopy ??= _registerName(_lib, "mutableCopy");
    final _ret = _lib._objc_msgSend_4(_id, _sel_mutableCopy!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_copyWithZone;
  static NSObject copyWithZone(
      StringTestObjCLibrary _lib, ffi.Pointer<_NSZone> zone) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_copyWithZone ??= _registerName(_lib, "copyWithZone:");
    final _ret = _lib._objc_msgSend_5(_class!, _sel_copyWithZone!, zone);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_mutableCopyWithZone;
  static NSObject mutableCopyWithZone(
      StringTestObjCLibrary _lib, ffi.Pointer<_NSZone> zone) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_mutableCopyWithZone ??= _registerName(_lib, "mutableCopyWithZone:");
    final _ret = _lib._objc_msgSend_6(_class!, _sel_mutableCopyWithZone!, zone);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_instancesRespondToSelector;
  static bool instancesRespondToSelector(
      StringTestObjCLibrary _lib, ffi.Pointer<ObjCSel> aSelector) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_instancesRespondToSelector ??=
        _registerName(_lib, "instancesRespondToSelector:");
    return _lib._objc_msgSend_7(
        _class!, _sel_instancesRespondToSelector!, aSelector);
  }

  static ffi.Pointer<ObjCSel>? _sel_conformsToProtocol;
  static bool conformsToProtocol(
      StringTestObjCLibrary _lib, NSObject protocol) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_conformsToProtocol ??= _registerName(_lib, "conformsToProtocol:");
    return _lib._objc_msgSend_8(
        _class!, _sel_conformsToProtocol!, protocol._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_methodForSelector;
  IMP methodForSelector(ffi.Pointer<ObjCSel> aSelector) {
    _sel_methodForSelector ??= _registerName(_lib, "methodForSelector:");
    return _lib._objc_msgSend_9(_id, _sel_methodForSelector!, aSelector);
  }

  static ffi.Pointer<ObjCSel>? _sel_instanceMethodForSelector;
  static IMP instanceMethodForSelector(
      StringTestObjCLibrary _lib, ffi.Pointer<ObjCSel> aSelector) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_instanceMethodForSelector ??=
        _registerName(_lib, "instanceMethodForSelector:");
    return _lib._objc_msgSend_10(
        _class!, _sel_instanceMethodForSelector!, aSelector);
  }

  static ffi.Pointer<ObjCSel>? _sel_doesNotRecognizeSelector;
  void doesNotRecognizeSelector(ffi.Pointer<ObjCSel> aSelector) {
    _sel_doesNotRecognizeSelector ??=
        _registerName(_lib, "doesNotRecognizeSelector:");
    _lib._objc_msgSend_11(_id, _sel_doesNotRecognizeSelector!, aSelector);
  }

  static ffi.Pointer<ObjCSel>? _sel_forwardingTargetForSelector;
  NSObject forwardingTargetForSelector(ffi.Pointer<ObjCSel> aSelector) {
    _sel_forwardingTargetForSelector ??=
        _registerName(_lib, "forwardingTargetForSelector:");
    final _ret = _lib._objc_msgSend_12(
        _id, _sel_forwardingTargetForSelector!, aSelector);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_forwardInvocation;
  void forwardInvocation(NSObject anInvocation) {
    _sel_forwardInvocation ??= _registerName(_lib, "forwardInvocation:");
    _lib._objc_msgSend_13(_id, _sel_forwardInvocation!, anInvocation._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_methodSignatureForSelector;
  NSMethodSignature methodSignatureForSelector(ffi.Pointer<ObjCSel> aSelector) {
    _sel_methodSignatureForSelector ??=
        _registerName(_lib, "methodSignatureForSelector:");
    final _ret =
        _lib._objc_msgSend_14(_id, _sel_methodSignatureForSelector!, aSelector);
    return NSMethodSignature._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_instanceMethodSignatureForSelector;
  static NSMethodSignature instanceMethodSignatureForSelector(
      StringTestObjCLibrary _lib, ffi.Pointer<ObjCSel> aSelector) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_instanceMethodSignatureForSelector ??=
        _registerName(_lib, "instanceMethodSignatureForSelector:");
    final _ret = _lib._objc_msgSend_15(
        _class!, _sel_instanceMethodSignatureForSelector!, aSelector);
    return NSMethodSignature._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_allowsWeakReference;
  bool allowsWeakReference() {
    _sel_allowsWeakReference ??= _registerName(_lib, "allowsWeakReference");
    return _lib._objc_msgSend_16(_id, _sel_allowsWeakReference!);
  }

  static ffi.Pointer<ObjCSel>? _sel_retainWeakReference;
  bool retainWeakReference() {
    _sel_retainWeakReference ??= _registerName(_lib, "retainWeakReference");
    return _lib._objc_msgSend_16(_id, _sel_retainWeakReference!);
  }

  static ffi.Pointer<ObjCSel>? _sel_isSubclassOfClass;
  static bool isSubclassOfClass(StringTestObjCLibrary _lib, NSObject aClass) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_isSubclassOfClass ??= _registerName(_lib, "isSubclassOfClass:");
    return _lib._objc_msgSend_17(_class!, _sel_isSubclassOfClass!, aClass._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_resolveClassMethod;
  static bool resolveClassMethod(
      StringTestObjCLibrary _lib, ffi.Pointer<ObjCSel> sel) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_resolveClassMethod ??= _registerName(_lib, "resolveClassMethod:");
    return _lib._objc_msgSend_18(_class!, _sel_resolveClassMethod!, sel);
  }

  static ffi.Pointer<ObjCSel>? _sel_resolveInstanceMethod;
  static bool resolveInstanceMethod(
      StringTestObjCLibrary _lib, ffi.Pointer<ObjCSel> sel) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_resolveInstanceMethod ??=
        _registerName(_lib, "resolveInstanceMethod:");
    return _lib._objc_msgSend_19(_class!, _sel_resolveInstanceMethod!, sel);
  }

  static ffi.Pointer<ObjCSel>? _sel_hash;
  static int hash(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_hash ??= _registerName(_lib, "hash");
    return _lib._objc_msgSend_20(_class!, _sel_hash!);
  }

  static ffi.Pointer<ObjCSel>? _sel_superclass;
  static NSObject superclass(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_superclass ??= _registerName(_lib, "superclass");
    final _ret = _lib._objc_msgSend_21(_class!, _sel_superclass!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_class1;
  static NSObject class1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_class1 ??= _registerName(_lib, "class");
    final _ret = _lib._objc_msgSend_22(_class!, _sel_class1!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_description;
  static NSString description(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_description ??= _registerName(_lib, "description");
    final _ret = _lib._objc_msgSend_27(_class!, _sel_description!);
    return NSString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_debugDescription;
  static NSString debugDescription(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_debugDescription ??= _registerName(_lib, "debugDescription");
    final _ret = _lib._objc_msgSend_27(_class!, _sel_debugDescription!);
    return NSString._(_ret, _lib);
  }
}

typedef instancetype = ffi.Pointer<ObjCObject>;

class ObjCObject extends ffi.Opaque {}

class _NSZone extends ffi.Opaque {}

class ObjCSel extends ffi.Opaque {}

typedef IMP = ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>;

class NSMethodSignature extends _ObjCWrapper {
  NSMethodSignature._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSMethodSignature castFrom<T extends _ObjCWrapper>(T other) {
    return NSMethodSignature._(other._id, other._lib);
  }
}

typedef NSUInteger = pkg_ffi.UnsignedLong;

class NSString extends NSObject {
  NSString._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSString castFrom<T extends _ObjCWrapper>(T other) {
    return NSString._(other._id, other._lib);
  }

  factory NSString(StringTestObjCLibrary _lib, String str) {
    final cstr = str.toNativeUtf8();
    final nsstr = stringWithCString_encoding(_lib, cstr.cast(), 4 /* UTF8 */);
    pkg_ffi.calloc.free(cstr);
    return nsstr;
  }

  @override
  String toString() => UTF8String().cast<pkg_ffi.Utf8>().toDartString();

  static ffi.Pointer<ObjCSel>? _sel_length;
  int get length {
    _sel_length ??= _registerName(_lib, "length");
    return _lib._objc_msgSend_20(_id, _sel_length!);
  }

  static ffi.Pointer<ObjCSel>? _sel_characterAtIndex;
  int characterAtIndex(int index) {
    _sel_characterAtIndex ??= _registerName(_lib, "characterAtIndex:");
    return _lib._objc_msgSend_23(_id, _sel_characterAtIndex!, index);
  }

  static ffi.Pointer<ObjCSel>? _sel_init;
  @override
  NSString init() {
    _sel_init ??= _registerName(_lib, "init");
    final _ret = _lib._objc_msgSend_1(_id, _sel_init!);
    return NSString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithCoder;
  NSString initWithCoder(NSObject coder) {
    _sel_initWithCoder ??= _registerName(_lib, "initWithCoder:");
    final _ret = _lib._objc_msgSend_24(_id, _sel_initWithCoder!, coder._id);
    return NSString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_stringWithCString_encoding;
  static NSString stringWithCString_encoding(
      StringTestObjCLibrary _lib, ffi.Pointer<pkg_ffi.Char> cString, int enc) {
    _class ??= _getClass(_lib, "NSString");
    _sel_stringWithCString_encoding ??=
        _registerName(_lib, "stringWithCString:encoding:");
    final _ret = _lib._objc_msgSend_25(
        _class!, _sel_stringWithCString_encoding!, cString, enc);
    return NSString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_UTF8String;
  ffi.Pointer<pkg_ffi.Char> UTF8String() {
    _sel_UTF8String ??= _registerName(_lib, "UTF8String");
    return _lib._objc_msgSend_26(_id, _sel_UTF8String!);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSString new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSString");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSString alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSString");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSString._(_ret, _lib);
  }
}

extension StringToNSString on String {
  NSString toNSString(StringTestObjCLibrary lib) => NSString(lib, this);
}

typedef unichar = pkg_ffi.UnsignedShort;

class NSNumber extends NSValue {
  NSNumber._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSNumber castFrom<T extends _ObjCWrapper>(T other) {
    return NSNumber._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithCoder;
  @override
  NSNumber initWithCoder(NSObject coder) {
    _sel_initWithCoder ??= _registerName(_lib, "initWithCoder:");
    final _ret = _lib._objc_msgSend_32(_id, _sel_initWithCoder!, coder._id);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithChar;
  NSNumber initWithChar(int value) {
    _sel_initWithChar ??= _registerName(_lib, "initWithChar:");
    final _ret = _lib._objc_msgSend_33(_id, _sel_initWithChar!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithUnsignedChar;
  NSNumber initWithUnsignedChar(int value) {
    _sel_initWithUnsignedChar ??= _registerName(_lib, "initWithUnsignedChar:");
    final _ret = _lib._objc_msgSend_34(_id, _sel_initWithUnsignedChar!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithShort;
  NSNumber initWithShort(int value) {
    _sel_initWithShort ??= _registerName(_lib, "initWithShort:");
    final _ret = _lib._objc_msgSend_35(_id, _sel_initWithShort!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithUnsignedShort;
  NSNumber initWithUnsignedShort(int value) {
    _sel_initWithUnsignedShort ??=
        _registerName(_lib, "initWithUnsignedShort:");
    final _ret = _lib._objc_msgSend_36(_id, _sel_initWithUnsignedShort!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithInt;
  NSNumber initWithInt(int value) {
    _sel_initWithInt ??= _registerName(_lib, "initWithInt:");
    final _ret = _lib._objc_msgSend_37(_id, _sel_initWithInt!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithUnsignedInt;
  NSNumber initWithUnsignedInt(int value) {
    _sel_initWithUnsignedInt ??= _registerName(_lib, "initWithUnsignedInt:");
    final _ret = _lib._objc_msgSend_38(_id, _sel_initWithUnsignedInt!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithLong;
  NSNumber initWithLong(int value) {
    _sel_initWithLong ??= _registerName(_lib, "initWithLong:");
    final _ret = _lib._objc_msgSend_39(_id, _sel_initWithLong!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithUnsignedLong;
  NSNumber initWithUnsignedLong(int value) {
    _sel_initWithUnsignedLong ??= _registerName(_lib, "initWithUnsignedLong:");
    final _ret = _lib._objc_msgSend_40(_id, _sel_initWithUnsignedLong!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithLongLong;
  NSNumber initWithLongLong(int value) {
    _sel_initWithLongLong ??= _registerName(_lib, "initWithLongLong:");
    final _ret = _lib._objc_msgSend_41(_id, _sel_initWithLongLong!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithUnsignedLongLong;
  NSNumber initWithUnsignedLongLong(int value) {
    _sel_initWithUnsignedLongLong ??=
        _registerName(_lib, "initWithUnsignedLongLong:");
    final _ret =
        _lib._objc_msgSend_42(_id, _sel_initWithUnsignedLongLong!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithFloat;
  NSNumber initWithFloat(double value) {
    _sel_initWithFloat ??= _registerName(_lib, "initWithFloat:");
    final _ret = _lib._objc_msgSend_43(_id, _sel_initWithFloat!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithDouble;
  NSNumber initWithDouble(double value) {
    _sel_initWithDouble ??= _registerName(_lib, "initWithDouble:");
    final _ret = _lib._objc_msgSend_44(_id, _sel_initWithDouble!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithBool;
  NSNumber initWithBool(bool value) {
    _sel_initWithBool ??= _registerName(_lib, "initWithBool:");
    final _ret = _lib._objc_msgSend_45(_id, _sel_initWithBool!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithInteger;
  NSNumber initWithInteger(int value) {
    _sel_initWithInteger ??= _registerName(_lib, "initWithInteger:");
    final _ret = _lib._objc_msgSend_46(_id, _sel_initWithInteger!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithUnsignedInteger;
  NSNumber initWithUnsignedInteger(int value) {
    _sel_initWithUnsignedInteger ??=
        _registerName(_lib, "initWithUnsignedInteger:");
    final _ret =
        _lib._objc_msgSend_47(_id, _sel_initWithUnsignedInteger!, value);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_charValue;
  int get charValue {
    _sel_charValue ??= _registerName(_lib, "charValue");
    return _lib._objc_msgSend_48(_id, _sel_charValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_unsignedCharValue;
  int get unsignedCharValue {
    _sel_unsignedCharValue ??= _registerName(_lib, "unsignedCharValue");
    return _lib._objc_msgSend_49(_id, _sel_unsignedCharValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_shortValue;
  int get shortValue {
    _sel_shortValue ??= _registerName(_lib, "shortValue");
    return _lib._objc_msgSend_50(_id, _sel_shortValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_unsignedShortValue;
  int get unsignedShortValue {
    _sel_unsignedShortValue ??= _registerName(_lib, "unsignedShortValue");
    return _lib._objc_msgSend_51(_id, _sel_unsignedShortValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_intValue;
  int get intValue {
    _sel_intValue ??= _registerName(_lib, "intValue");
    return _lib._objc_msgSend_52(_id, _sel_intValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_unsignedIntValue;
  int get unsignedIntValue {
    _sel_unsignedIntValue ??= _registerName(_lib, "unsignedIntValue");
    return _lib._objc_msgSend_53(_id, _sel_unsignedIntValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_longValue;
  int get longValue {
    _sel_longValue ??= _registerName(_lib, "longValue");
    return _lib._objc_msgSend_54(_id, _sel_longValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_unsignedLongValue;
  int get unsignedLongValue {
    _sel_unsignedLongValue ??= _registerName(_lib, "unsignedLongValue");
    return _lib._objc_msgSend_55(_id, _sel_unsignedLongValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_longLongValue;
  int get longLongValue {
    _sel_longLongValue ??= _registerName(_lib, "longLongValue");
    return _lib._objc_msgSend_56(_id, _sel_longLongValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_unsignedLongLongValue;
  int get unsignedLongLongValue {
    _sel_unsignedLongLongValue ??= _registerName(_lib, "unsignedLongLongValue");
    return _lib._objc_msgSend_57(_id, _sel_unsignedLongLongValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_floatValue;
  double get floatValue {
    _sel_floatValue ??= _registerName(_lib, "floatValue");
    return _lib._objc_msgSend_58(_id, _sel_floatValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_doubleValue;
  double get doubleValue {
    _sel_doubleValue ??= _registerName(_lib, "doubleValue");
    return _lib._objc_msgSend_59(_id, _sel_doubleValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_boolValue;
  bool get boolValue {
    _sel_boolValue ??= _registerName(_lib, "boolValue");
    return _lib._objc_msgSend_16(_id, _sel_boolValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_integerValue;
  int get integerValue {
    _sel_integerValue ??= _registerName(_lib, "integerValue");
    return _lib._objc_msgSend_60(_id, _sel_integerValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_unsignedIntegerValue;
  int get unsignedIntegerValue {
    _sel_unsignedIntegerValue ??= _registerName(_lib, "unsignedIntegerValue");
    return _lib._objc_msgSend_20(_id, _sel_unsignedIntegerValue!);
  }

  static ffi.Pointer<ObjCSel>? _sel_stringValue;
  NSObject get stringValue {
    _sel_stringValue ??= _registerName(_lib, "stringValue");
    final _ret = _lib._objc_msgSend_61(_id, _sel_stringValue!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_compare;
  int compare(NSObject otherNumber) {
    _sel_compare ??= _registerName(_lib, "compare:");
    return _lib._objc_msgSend_62(_id, _sel_compare!, otherNumber._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_isEqualToNumber;
  bool isEqualToNumber(NSObject number) {
    _sel_isEqualToNumber ??= _registerName(_lib, "isEqualToNumber:");
    return _lib._objc_msgSend_63(_id, _sel_isEqualToNumber!, number._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_descriptionWithLocale;
  NSString descriptionWithLocale(NSObject locale) {
    _sel_descriptionWithLocale ??=
        _registerName(_lib, "descriptionWithLocale:");
    final _ret =
        _lib._objc_msgSend_64(_id, _sel_descriptionWithLocale!, locale._id);
    return NSString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSNumber new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSNumber");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSNumber._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSNumber alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSNumber");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSNumber._(_ret, _lib);
  }
}

class _NSRange extends ffi.Struct {
  @NSUInteger()
  external int location;

  @NSUInteger()
  external int length;
}

class NSFastEnumerationState extends ffi.Struct {
  @pkg_ffi.UnsignedLong()
  external int state;

  external ffi.Pointer<ffi.Pointer<ObjCObject>> itemsPtr;

  external ffi.Pointer<pkg_ffi.UnsignedLong> mutationsPtr;

  @ffi.Array.multi([5])
  external ffi.Array<pkg_ffi.UnsignedLong> extra;
}

class NSEnumerator extends NSObject {
  NSEnumerator._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSEnumerator castFrom<T extends _ObjCWrapper>(T other) {
    return NSEnumerator._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_nextObject;
  NSObject nextObject() {
    _sel_nextObject ??= _registerName(_lib, "nextObject");
    final _ret = _lib._objc_msgSend_65(_id, _sel_nextObject!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSEnumerator new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSEnumerator");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSEnumerator._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSEnumerator alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSEnumerator");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSEnumerator._(_ret, _lib);
  }
}

abstract class NSCollectionChangeType {
  static const int NSCollectionChangeInsert = 0;
  static const int NSCollectionChangeRemove = 1;
}

class NSOrderedCollectionChange extends NSObject {
  NSOrderedCollectionChange._(
      ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSOrderedCollectionChange castFrom<T extends _ObjCWrapper>(T other) {
    return NSOrderedCollectionChange._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_object;
  NSObject get object {
    _sel_object ??= _registerName(_lib, "object");
    final _ret = _lib._objc_msgSend_66(_id, _sel_object!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_changeType;
  int get changeType {
    _sel_changeType ??= _registerName(_lib, "changeType");
    return _lib._objc_msgSend_67(_id, _sel_changeType!);
  }

  static ffi.Pointer<ObjCSel>? _sel_index;
  int get index {
    _sel_index ??= _registerName(_lib, "index");
    return _lib._objc_msgSend_20(_id, _sel_index!);
  }

  static ffi.Pointer<ObjCSel>? _sel_associatedIndex;
  int get associatedIndex {
    _sel_associatedIndex ??= _registerName(_lib, "associatedIndex");
    return _lib._objc_msgSend_20(_id, _sel_associatedIndex!);
  }

  static ffi.Pointer<ObjCSel>? _sel_init;
  @override
  NSObject init() {
    _sel_init ??= _registerName(_lib, "init");
    final _ret = _lib._objc_msgSend_68(_id, _sel_init!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithObject_type_index;
  NSOrderedCollectionChange initWithObject_type_index(
      NSObject anObject, int type, int index) {
    _sel_initWithObject_type_index ??=
        _registerName(_lib, "initWithObject:type:index:");
    final _ret = _lib._objc_msgSend_69(
        _id, _sel_initWithObject_type_index!, anObject._id, type, index);
    return NSOrderedCollectionChange._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithObject_type_index_associatedIndex;
  NSOrderedCollectionChange initWithObject_type_index_associatedIndex(
      NSObject anObject, int type, int index, int associatedIndex) {
    _sel_initWithObject_type_index_associatedIndex ??=
        _registerName(_lib, "initWithObject:type:index:associatedIndex:");
    final _ret = _lib._objc_msgSend_70(
        _id,
        _sel_initWithObject_type_index_associatedIndex!,
        anObject._id,
        type,
        index,
        associatedIndex);
    return NSOrderedCollectionChange._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSOrderedCollectionChange new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSOrderedCollectionChange");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSOrderedCollectionChange._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSOrderedCollectionChange alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSOrderedCollectionChange");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSOrderedCollectionChange._(_ret, _lib);
  }
}

class NSIndexSet extends NSObject {
  NSIndexSet._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSIndexSet castFrom<T extends _ObjCWrapper>(T other) {
    return NSIndexSet._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexSet;
  static NSIndexSet indexSet(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSIndexSet");
    _sel_indexSet ??= _registerName(_lib, "indexSet");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_indexSet!);
    return NSIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexSetWithIndex;
  static NSIndexSet indexSetWithIndex(StringTestObjCLibrary _lib, int value) {
    _class ??= _getClass(_lib, "NSIndexSet");
    _sel_indexSetWithIndex ??= _registerName(_lib, "indexSetWithIndex:");
    final _ret = _lib._objc_msgSend_71(_class!, _sel_indexSetWithIndex!, value);
    return NSIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexSetWithIndexesInRange;
  static NSIndexSet indexSetWithIndexesInRange(
      StringTestObjCLibrary _lib, NSRange range) {
    _class ??= _getClass(_lib, "NSIndexSet");
    _sel_indexSetWithIndexesInRange ??=
        _registerName(_lib, "indexSetWithIndexesInRange:");
    final _ret =
        _lib._objc_msgSend_72(_class!, _sel_indexSetWithIndexesInRange!, range);
    return NSIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithIndexesInRange;
  NSIndexSet initWithIndexesInRange(NSRange range) {
    _sel_initWithIndexesInRange ??=
        _registerName(_lib, "initWithIndexesInRange:");
    final _ret =
        _lib._objc_msgSend_72(_id, _sel_initWithIndexesInRange!, range);
    return NSIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithIndexSet;
  NSIndexSet initWithIndexSet(NSObject indexSet) {
    _sel_initWithIndexSet ??= _registerName(_lib, "initWithIndexSet:");
    final _ret =
        _lib._objc_msgSend_73(_id, _sel_initWithIndexSet!, indexSet._id);
    return NSIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithIndex;
  NSIndexSet initWithIndex(int value) {
    _sel_initWithIndex ??= _registerName(_lib, "initWithIndex:");
    final _ret = _lib._objc_msgSend_71(_id, _sel_initWithIndex!, value);
    return NSIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_isEqualToIndexSet;
  bool isEqualToIndexSet(NSObject indexSet) {
    _sel_isEqualToIndexSet ??= _registerName(_lib, "isEqualToIndexSet:");
    return _lib._objc_msgSend_74(_id, _sel_isEqualToIndexSet!, indexSet._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_count;
  int get count {
    _sel_count ??= _registerName(_lib, "count");
    return _lib._objc_msgSend_20(_id, _sel_count!);
  }

  static ffi.Pointer<ObjCSel>? _sel_firstIndex;
  int get firstIndex {
    _sel_firstIndex ??= _registerName(_lib, "firstIndex");
    return _lib._objc_msgSend_20(_id, _sel_firstIndex!);
  }

  static ffi.Pointer<ObjCSel>? _sel_lastIndex;
  int get lastIndex {
    _sel_lastIndex ??= _registerName(_lib, "lastIndex");
    return _lib._objc_msgSend_20(_id, _sel_lastIndex!);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexGreaterThanIndex;
  int indexGreaterThanIndex(int value) {
    _sel_indexGreaterThanIndex ??=
        _registerName(_lib, "indexGreaterThanIndex:");
    return _lib._objc_msgSend_75(_id, _sel_indexGreaterThanIndex!, value);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexLessThanIndex;
  int indexLessThanIndex(int value) {
    _sel_indexLessThanIndex ??= _registerName(_lib, "indexLessThanIndex:");
    return _lib._objc_msgSend_75(_id, _sel_indexLessThanIndex!, value);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexGreaterThanOrEqualToIndex;
  int indexGreaterThanOrEqualToIndex(int value) {
    _sel_indexGreaterThanOrEqualToIndex ??=
        _registerName(_lib, "indexGreaterThanOrEqualToIndex:");
    return _lib._objc_msgSend_75(
        _id, _sel_indexGreaterThanOrEqualToIndex!, value);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexLessThanOrEqualToIndex;
  int indexLessThanOrEqualToIndex(int value) {
    _sel_indexLessThanOrEqualToIndex ??=
        _registerName(_lib, "indexLessThanOrEqualToIndex:");
    return _lib._objc_msgSend_75(_id, _sel_indexLessThanOrEqualToIndex!, value);
  }

  static ffi.Pointer<ObjCSel>? _sel_getIndexes_maxCount_inIndexRange;
  int getIndexes_maxCount_inIndexRange(ffi.Pointer<NSUInteger> indexBuffer,
      int bufferSize, NSRangePointer range) {
    _sel_getIndexes_maxCount_inIndexRange ??=
        _registerName(_lib, "getIndexes:maxCount:inIndexRange:");
    return _lib._objc_msgSend_76(_id, _sel_getIndexes_maxCount_inIndexRange!,
        indexBuffer, bufferSize, range);
  }

  static ffi.Pointer<ObjCSel>? _sel_countOfIndexesInRange;
  int countOfIndexesInRange(NSRange range) {
    _sel_countOfIndexesInRange ??=
        _registerName(_lib, "countOfIndexesInRange:");
    return _lib._objc_msgSend_77(_id, _sel_countOfIndexesInRange!, range);
  }

  static ffi.Pointer<ObjCSel>? _sel_containsIndex;
  bool containsIndex(int value) {
    _sel_containsIndex ??= _registerName(_lib, "containsIndex:");
    return _lib._objc_msgSend_78(_id, _sel_containsIndex!, value);
  }

  static ffi.Pointer<ObjCSel>? _sel_containsIndexesInRange;
  bool containsIndexesInRange(NSRange range) {
    _sel_containsIndexesInRange ??=
        _registerName(_lib, "containsIndexesInRange:");
    return _lib._objc_msgSend_79(_id, _sel_containsIndexesInRange!, range);
  }

  static ffi.Pointer<ObjCSel>? _sel_containsIndexes;
  bool containsIndexes(NSObject indexSet) {
    _sel_containsIndexes ??= _registerName(_lib, "containsIndexes:");
    return _lib._objc_msgSend_80(_id, _sel_containsIndexes!, indexSet._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_intersectsIndexesInRange;
  bool intersectsIndexesInRange(NSRange range) {
    _sel_intersectsIndexesInRange ??=
        _registerName(_lib, "intersectsIndexesInRange:");
    return _lib._objc_msgSend_79(_id, _sel_intersectsIndexesInRange!, range);
  }

  static ffi.Pointer<ObjCSel>? _sel_enumerateIndexesUsingBlock;
  void enumerateIndexesUsingBlock(NSObject block) {
    _sel_enumerateIndexesUsingBlock ??=
        _registerName(_lib, "enumerateIndexesUsingBlock:");
    _lib._objc_msgSend_81(_id, _sel_enumerateIndexesUsingBlock!, block._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_enumerateIndexesWithOptions_usingBlock;
  void enumerateIndexesWithOptions_usingBlock(int opts, NSObject block) {
    _sel_enumerateIndexesWithOptions_usingBlock ??=
        _registerName(_lib, "enumerateIndexesWithOptions:usingBlock:");
    _lib._objc_msgSend_82(
        _id, _sel_enumerateIndexesWithOptions_usingBlock!, opts, block._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_enumerateIndexesInRange_options_usingBlock;
  void enumerateIndexesInRange_options_usingBlock(
      NSRange range, int opts, NSObject block) {
    _sel_enumerateIndexesInRange_options_usingBlock ??=
        _registerName(_lib, "enumerateIndexesInRange:options:usingBlock:");
    _lib._objc_msgSend_83(_id, _sel_enumerateIndexesInRange_options_usingBlock!,
        range, opts, block._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexPassingTest;
  int indexPassingTest(NSObject predicate) {
    _sel_indexPassingTest ??= _registerName(_lib, "indexPassingTest:");
    return _lib._objc_msgSend_84(_id, _sel_indexPassingTest!, predicate._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexWithOptions_passingTest;
  int indexWithOptions_passingTest(int opts, NSObject predicate) {
    _sel_indexWithOptions_passingTest ??=
        _registerName(_lib, "indexWithOptions:passingTest:");
    return _lib._objc_msgSend_85(
        _id, _sel_indexWithOptions_passingTest!, opts, predicate._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexInRange_options_passingTest;
  int indexInRange_options_passingTest(
      NSRange range, int opts, NSObject predicate) {
    _sel_indexInRange_options_passingTest ??=
        _registerName(_lib, "indexInRange:options:passingTest:");
    return _lib._objc_msgSend_86(_id, _sel_indexInRange_options_passingTest!,
        range, opts, predicate._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexesPassingTest;
  NSIndexSet indexesPassingTest(NSObject predicate) {
    _sel_indexesPassingTest ??= _registerName(_lib, "indexesPassingTest:");
    final _ret =
        _lib._objc_msgSend_87(_id, _sel_indexesPassingTest!, predicate._id);
    return NSIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexesWithOptions_passingTest;
  NSIndexSet indexesWithOptions_passingTest(int opts, NSObject predicate) {
    _sel_indexesWithOptions_passingTest ??=
        _registerName(_lib, "indexesWithOptions:passingTest:");
    final _ret = _lib._objc_msgSend_88(
        _id, _sel_indexesWithOptions_passingTest!, opts, predicate._id);
    return NSIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexesInRange_options_passingTest;
  NSIndexSet indexesInRange_options_passingTest(
      NSRange range, int opts, NSObject predicate) {
    _sel_indexesInRange_options_passingTest ??=
        _registerName(_lib, "indexesInRange:options:passingTest:");
    final _ret = _lib._objc_msgSend_89(_id,
        _sel_indexesInRange_options_passingTest!, range, opts, predicate._id);
    return NSIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_enumerateRangesUsingBlock;
  void enumerateRangesUsingBlock(NSObject block) {
    _sel_enumerateRangesUsingBlock ??=
        _registerName(_lib, "enumerateRangesUsingBlock:");
    _lib._objc_msgSend_90(_id, _sel_enumerateRangesUsingBlock!, block._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_enumerateRangesWithOptions_usingBlock;
  void enumerateRangesWithOptions_usingBlock(int opts, NSObject block) {
    _sel_enumerateRangesWithOptions_usingBlock ??=
        _registerName(_lib, "enumerateRangesWithOptions:usingBlock:");
    _lib._objc_msgSend_91(
        _id, _sel_enumerateRangesWithOptions_usingBlock!, opts, block._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_enumerateRangesInRange_options_usingBlock;
  void enumerateRangesInRange_options_usingBlock(
      NSRange range, int opts, NSObject block) {
    _sel_enumerateRangesInRange_options_usingBlock ??=
        _registerName(_lib, "enumerateRangesInRange:options:usingBlock:");
    _lib._objc_msgSend_92(_id, _sel_enumerateRangesInRange_options_usingBlock!,
        range, opts, block._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSIndexSet new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSIndexSet");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSIndexSet alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSIndexSet");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSIndexSet._(_ret, _lib);
  }
}

typedef NSRange = _NSRange;
typedef NSRangePointer = ffi.Pointer<NSRange>;

class NSMutableIndexSet extends NSIndexSet {
  NSMutableIndexSet._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSMutableIndexSet castFrom<T extends _ObjCWrapper>(T other) {
    return NSMutableIndexSet._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_addIndexes;
  void addIndexes(NSObject indexSet) {
    _sel_addIndexes ??= _registerName(_lib, "addIndexes:");
    _lib._objc_msgSend_93(_id, _sel_addIndexes!, indexSet._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_removeIndexes;
  void removeIndexes(NSObject indexSet) {
    _sel_removeIndexes ??= _registerName(_lib, "removeIndexes:");
    _lib._objc_msgSend_94(_id, _sel_removeIndexes!, indexSet._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_removeAllIndexes;
  void removeAllIndexes() {
    _sel_removeAllIndexes ??= _registerName(_lib, "removeAllIndexes");
    _lib._objc_msgSend_0(_id, _sel_removeAllIndexes!);
  }

  static ffi.Pointer<ObjCSel>? _sel_addIndex;
  void addIndex(int value) {
    _sel_addIndex ??= _registerName(_lib, "addIndex:");
    _lib._objc_msgSend_95(_id, _sel_addIndex!, value);
  }

  static ffi.Pointer<ObjCSel>? _sel_removeIndex;
  void removeIndex(int value) {
    _sel_removeIndex ??= _registerName(_lib, "removeIndex:");
    _lib._objc_msgSend_95(_id, _sel_removeIndex!, value);
  }

  static ffi.Pointer<ObjCSel>? _sel_addIndexesInRange;
  void addIndexesInRange(NSRange range) {
    _sel_addIndexesInRange ??= _registerName(_lib, "addIndexesInRange:");
    _lib._objc_msgSend_96(_id, _sel_addIndexesInRange!, range);
  }

  static ffi.Pointer<ObjCSel>? _sel_removeIndexesInRange;
  void removeIndexesInRange(NSRange range) {
    _sel_removeIndexesInRange ??= _registerName(_lib, "removeIndexesInRange:");
    _lib._objc_msgSend_96(_id, _sel_removeIndexesInRange!, range);
  }

  static ffi.Pointer<ObjCSel>? _sel_shiftIndexesStartingAtIndex_by;
  void shiftIndexesStartingAtIndex_by(int index, int delta) {
    _sel_shiftIndexesStartingAtIndex_by ??=
        _registerName(_lib, "shiftIndexesStartingAtIndex:by:");
    _lib._objc_msgSend_97(
        _id, _sel_shiftIndexesStartingAtIndex_by!, index, delta);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexSet;
  static NSMutableIndexSet indexSet(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSMutableIndexSet");
    _sel_indexSet ??= _registerName(_lib, "indexSet");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_indexSet!);
    return NSMutableIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexSetWithIndex;
  static NSMutableIndexSet indexSetWithIndex(
      StringTestObjCLibrary _lib, int value) {
    _class ??= _getClass(_lib, "NSMutableIndexSet");
    _sel_indexSetWithIndex ??= _registerName(_lib, "indexSetWithIndex:");
    final _ret = _lib._objc_msgSend_71(_class!, _sel_indexSetWithIndex!, value);
    return NSMutableIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_indexSetWithIndexesInRange;
  static NSMutableIndexSet indexSetWithIndexesInRange(
      StringTestObjCLibrary _lib, NSRange range) {
    _class ??= _getClass(_lib, "NSMutableIndexSet");
    _sel_indexSetWithIndexesInRange ??=
        _registerName(_lib, "indexSetWithIndexesInRange:");
    final _ret =
        _lib._objc_msgSend_72(_class!, _sel_indexSetWithIndexesInRange!, range);
    return NSMutableIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSMutableIndexSet new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSMutableIndexSet");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSMutableIndexSet._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSMutableIndexSet alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSMutableIndexSet");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSMutableIndexSet._(_ret, _lib);
  }
}

abstract class NSOrderedCollectionDifferenceCalculationOptions {
  static const int NSOrderedCollectionDifferenceCalculationOmitInsertedObjects =
      1;
  static const int NSOrderedCollectionDifferenceCalculationOmitRemovedObjects =
      2;
  static const int NSOrderedCollectionDifferenceCalculationInferMoves = 4;
}

class NSOrderedCollectionDifference extends NSObject {
  NSOrderedCollectionDifference._(
      ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSOrderedCollectionDifference castFrom<T extends _ObjCWrapper>(
      T other) {
    return NSOrderedCollectionDifference._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithChanges;
  NSOrderedCollectionDifference initWithChanges(NSObject changes) {
    _sel_initWithChanges ??= _registerName(_lib, "initWithChanges:");
    final _ret = _lib._objc_msgSend_98(_id, _sel_initWithChanges!, changes._id);
    return NSOrderedCollectionDifference._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>?
      _sel_initWithInsertIndexes_insertedObjects_removeIndexes_removedObjects_additionalChanges;
  NSOrderedCollectionDifference
      initWithInsertIndexes_insertedObjects_removeIndexes_removedObjects_additionalChanges(
          NSObject inserts,
          NSObject insertedObjects,
          NSObject removes,
          NSObject removedObjects,
          NSObject changes) {
    _sel_initWithInsertIndexes_insertedObjects_removeIndexes_removedObjects_additionalChanges ??=
        _registerName(_lib,
            "initWithInsertIndexes:insertedObjects:removeIndexes:removedObjects:additionalChanges:");
    final _ret = _lib._objc_msgSend_99(
        _id,
        _sel_initWithInsertIndexes_insertedObjects_removeIndexes_removedObjects_additionalChanges!,
        inserts._id,
        insertedObjects._id,
        removes._id,
        removedObjects._id,
        changes._id);
    return NSOrderedCollectionDifference._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>?
      _sel_initWithInsertIndexes_insertedObjects_removeIndexes_removedObjects;
  NSOrderedCollectionDifference
      initWithInsertIndexes_insertedObjects_removeIndexes_removedObjects(
          NSObject inserts,
          NSObject insertedObjects,
          NSObject removes,
          NSObject removedObjects) {
    _sel_initWithInsertIndexes_insertedObjects_removeIndexes_removedObjects ??=
        _registerName(_lib,
            "initWithInsertIndexes:insertedObjects:removeIndexes:removedObjects:");
    final _ret = _lib._objc_msgSend_100(
        _id,
        _sel_initWithInsertIndexes_insertedObjects_removeIndexes_removedObjects!,
        inserts._id,
        insertedObjects._id,
        removes._id,
        removedObjects._id);
    return NSOrderedCollectionDifference._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_insertions;
  NSObject get insertions {
    _sel_insertions ??= _registerName(_lib, "insertions");
    final _ret = _lib._objc_msgSend_101(_id, _sel_insertions!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_removals;
  NSObject get removals {
    _sel_removals ??= _registerName(_lib, "removals");
    final _ret = _lib._objc_msgSend_102(_id, _sel_removals!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_hasChanges;
  bool get hasChanges {
    _sel_hasChanges ??= _registerName(_lib, "hasChanges");
    return _lib._objc_msgSend_16(_id, _sel_hasChanges!);
  }

  static ffi.Pointer<ObjCSel>? _sel_inverseDifference;
  NSOrderedCollectionDifference inverseDifference() {
    _sel_inverseDifference ??= _registerName(_lib, "inverseDifference");
    final _ret = _lib._objc_msgSend_1(_id, _sel_inverseDifference!);
    return NSOrderedCollectionDifference._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSOrderedCollectionDifference new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSOrderedCollectionDifference");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSOrderedCollectionDifference._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSOrderedCollectionDifference alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSOrderedCollectionDifference");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSOrderedCollectionDifference._(_ret, _lib);
  }
}

class NSArray extends NSObject {
  NSArray._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSArray castFrom<T extends _ObjCWrapper>(T other) {
    return NSArray._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_count;
  int get count {
    _sel_count ??= _registerName(_lib, "count");
    return _lib._objc_msgSend_20(_id, _sel_count!);
  }

  static ffi.Pointer<ObjCSel>? _sel_objectAtIndex;
  NSObject objectAtIndex(int index) {
    _sel_objectAtIndex ??= _registerName(_lib, "objectAtIndex:");
    final _ret = _lib._objc_msgSend_103(_id, _sel_objectAtIndex!, index);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_init;
  @override
  NSArray init() {
    _sel_init ??= _registerName(_lib, "init");
    final _ret = _lib._objc_msgSend_1(_id, _sel_init!);
    return NSArray._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithObjects_count;
  NSArray initWithObjects_count(
      ffi.Pointer<ffi.Pointer<ObjCObject>> objects, int cnt) {
    _sel_initWithObjects_count ??=
        _registerName(_lib, "initWithObjects:count:");
    final _ret =
        _lib._objc_msgSend_104(_id, _sel_initWithObjects_count!, objects, cnt);
    return NSArray._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithCoder;
  NSArray initWithCoder(NSObject coder) {
    _sel_initWithCoder ??= _registerName(_lib, "initWithCoder:");
    final _ret = _lib._objc_msgSend_105(_id, _sel_initWithCoder!, coder._id);
    return NSArray._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSArray new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSArray");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSArray._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSArray alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSArray");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSArray._(_ret, _lib);
  }
}

abstract class NSBinarySearchingOptions {
  static const int NSBinarySearchingFirstEqual = 256;
  static const int NSBinarySearchingLastEqual = 512;
  static const int NSBinarySearchingInsertionIndex = 1024;
}

class NSMutableArray extends NSArray {
  NSMutableArray._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSMutableArray castFrom<T extends _ObjCWrapper>(T other) {
    return NSMutableArray._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_addObject;
  void addObject(NSObject anObject) {
    _sel_addObject ??= _registerName(_lib, "addObject:");
    _lib._objc_msgSend_106(_id, _sel_addObject!, anObject._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_insertObject_atIndex;
  void insertObject_atIndex(NSObject anObject, int index) {
    _sel_insertObject_atIndex ??= _registerName(_lib, "insertObject:atIndex:");
    _lib._objc_msgSend_107(
        _id, _sel_insertObject_atIndex!, anObject._id, index);
  }

  static ffi.Pointer<ObjCSel>? _sel_removeLastObject;
  void removeLastObject() {
    _sel_removeLastObject ??= _registerName(_lib, "removeLastObject");
    _lib._objc_msgSend_0(_id, _sel_removeLastObject!);
  }

  static ffi.Pointer<ObjCSel>? _sel_removeObjectAtIndex;
  void removeObjectAtIndex(int index) {
    _sel_removeObjectAtIndex ??= _registerName(_lib, "removeObjectAtIndex:");
    _lib._objc_msgSend_95(_id, _sel_removeObjectAtIndex!, index);
  }

  static ffi.Pointer<ObjCSel>? _sel_replaceObjectAtIndex_withObject;
  void replaceObjectAtIndex_withObject(int index, NSObject anObject) {
    _sel_replaceObjectAtIndex_withObject ??=
        _registerName(_lib, "replaceObjectAtIndex:withObject:");
    _lib._objc_msgSend_108(
        _id, _sel_replaceObjectAtIndex_withObject!, index, anObject._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_init;
  @override
  NSMutableArray init() {
    _sel_init ??= _registerName(_lib, "init");
    final _ret = _lib._objc_msgSend_1(_id, _sel_init!);
    return NSMutableArray._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithCapacity;
  NSMutableArray initWithCapacity(int numItems) {
    _sel_initWithCapacity ??= _registerName(_lib, "initWithCapacity:");
    final _ret = _lib._objc_msgSend_71(_id, _sel_initWithCapacity!, numItems);
    return NSMutableArray._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithCoder;
  @override
  NSMutableArray initWithCoder(NSObject coder) {
    _sel_initWithCoder ??= _registerName(_lib, "initWithCoder:");
    final _ret = _lib._objc_msgSend_109(_id, _sel_initWithCoder!, coder._id);
    return NSMutableArray._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSMutableArray new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSMutableArray");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSMutableArray._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSMutableArray alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSMutableArray");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSMutableArray._(_ret, _lib);
  }
}

abstract class NSItemProviderRepresentationVisibility {
  static const int NSItemProviderRepresentationVisibilityAll = 0;
  static const int NSItemProviderRepresentationVisibilityTeam = 1;
  static const int NSItemProviderRepresentationVisibilityGroup = 2;
  static const int NSItemProviderRepresentationVisibilityOwnProcess = 3;
}

abstract class NSItemProviderFileOptions {
  static const int NSItemProviderFileOptionOpenInPlace = 1;
}

class NSItemProvider extends NSObject {
  NSItemProvider._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSItemProvider castFrom<T extends _ObjCWrapper>(T other) {
    return NSItemProvider._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_init;
  @override
  NSItemProvider init() {
    _sel_init ??= _registerName(_lib, "init");
    final _ret = _lib._objc_msgSend_1(_id, _sel_init!);
    return NSItemProvider._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>?
      _sel_registerDataRepresentationForTypeIdentifier_visibility_loadHandler;
  void registerDataRepresentationForTypeIdentifier_visibility_loadHandler(
      NSObject typeIdentifier, int visibility, NSObject loadHandler) {
    _sel_registerDataRepresentationForTypeIdentifier_visibility_loadHandler ??=
        _registerName(_lib,
            "registerDataRepresentationForTypeIdentifier:visibility:loadHandler:");
    _lib._objc_msgSend_110(
        _id,
        _sel_registerDataRepresentationForTypeIdentifier_visibility_loadHandler!,
        typeIdentifier._id,
        visibility,
        loadHandler._id);
  }

  static ffi.Pointer<ObjCSel>?
      _sel_registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler;
  void
      registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler(
          NSObject typeIdentifier,
          int fileOptions,
          int visibility,
          NSObject loadHandler) {
    _sel_registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler ??=
        _registerName(_lib,
            "registerFileRepresentationForTypeIdentifier:fileOptions:visibility:loadHandler:");
    _lib._objc_msgSend_111(
        _id,
        _sel_registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler!,
        typeIdentifier._id,
        fileOptions,
        visibility,
        loadHandler._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_registeredTypeIdentifiers;
  NSObject get registeredTypeIdentifiers {
    _sel_registeredTypeIdentifiers ??=
        _registerName(_lib, "registeredTypeIdentifiers");
    final _ret = _lib._objc_msgSend_112(_id, _sel_registeredTypeIdentifiers!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_hasItemConformingToTypeIdentifier;
  bool hasItemConformingToTypeIdentifier(NSObject typeIdentifier) {
    _sel_hasItemConformingToTypeIdentifier ??=
        _registerName(_lib, "hasItemConformingToTypeIdentifier:");
    return _lib._objc_msgSend_113(
        _id, _sel_hasItemConformingToTypeIdentifier!, typeIdentifier._id);
  }

  static ffi.Pointer<ObjCSel>?
      _sel_hasRepresentationConformingToTypeIdentifier_fileOptions;
  bool hasRepresentationConformingToTypeIdentifier_fileOptions(
      NSObject typeIdentifier, int fileOptions) {
    _sel_hasRepresentationConformingToTypeIdentifier_fileOptions ??=
        _registerName(
            _lib, "hasRepresentationConformingToTypeIdentifier:fileOptions:");
    return _lib._objc_msgSend_114(
        _id,
        _sel_hasRepresentationConformingToTypeIdentifier_fileOptions!,
        typeIdentifier._id,
        fileOptions);
  }

  static ffi.Pointer<ObjCSel>?
      _sel_loadDataRepresentationForTypeIdentifier_completionHandler;
  NSProgress loadDataRepresentationForTypeIdentifier_completionHandler(
      NSObject typeIdentifier, NSObject completionHandler) {
    _sel_loadDataRepresentationForTypeIdentifier_completionHandler ??=
        _registerName(
            _lib, "loadDataRepresentationForTypeIdentifier:completionHandler:");
    final _ret = _lib._objc_msgSend_115(
        _id,
        _sel_loadDataRepresentationForTypeIdentifier_completionHandler!,
        typeIdentifier._id,
        completionHandler._id);
    return NSProgress._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>?
      _sel_loadFileRepresentationForTypeIdentifier_completionHandler;
  NSProgress loadFileRepresentationForTypeIdentifier_completionHandler(
      NSObject typeIdentifier, NSObject completionHandler) {
    _sel_loadFileRepresentationForTypeIdentifier_completionHandler ??=
        _registerName(
            _lib, "loadFileRepresentationForTypeIdentifier:completionHandler:");
    final _ret = _lib._objc_msgSend_116(
        _id,
        _sel_loadFileRepresentationForTypeIdentifier_completionHandler!,
        typeIdentifier._id,
        completionHandler._id);
    return NSProgress._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>?
      _sel_loadInPlaceFileRepresentationForTypeIdentifier_completionHandler;
  NSProgress loadInPlaceFileRepresentationForTypeIdentifier_completionHandler(
      NSObject typeIdentifier, NSObject completionHandler) {
    _sel_loadInPlaceFileRepresentationForTypeIdentifier_completionHandler ??=
        _registerName(_lib,
            "loadInPlaceFileRepresentationForTypeIdentifier:completionHandler:");
    final _ret = _lib._objc_msgSend_117(
        _id,
        _sel_loadInPlaceFileRepresentationForTypeIdentifier_completionHandler!,
        typeIdentifier._id,
        completionHandler._id);
    return NSProgress._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_suggestedName;
  NSObject get suggestedName {
    _sel_suggestedName ??= _registerName(_lib, "suggestedName");
    final _ret = _lib._objc_msgSend_118(_id, _sel_suggestedName!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_suggestedName1;
  set suggestedName(NSObject value) {
    _sel_suggestedName1 ??= _registerName(_lib, "setSuggestedName:");
    _lib._objc_msgSend_119(_id, _sel_suggestedName1!, value._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithObject;
  NSItemProvider initWithObject(NSObject object) {
    _sel_initWithObject ??= _registerName(_lib, "initWithObject:");
    final _ret = _lib._objc_msgSend_120(_id, _sel_initWithObject!, object._id);
    return NSItemProvider._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_registerObject_visibility;
  void registerObject_visibility(NSObject object, int visibility) {
    _sel_registerObject_visibility ??=
        _registerName(_lib, "registerObject:visibility:");
    _lib._objc_msgSend_121(
        _id, _sel_registerObject_visibility!, object._id, visibility);
  }

  static ffi.Pointer<ObjCSel>?
      _sel_registerObjectOfClass_visibility_loadHandler;
  void registerObjectOfClass_visibility_loadHandler(
      NSObject aClass, int visibility, NSObject loadHandler) {
    _sel_registerObjectOfClass_visibility_loadHandler ??=
        _registerName(_lib, "registerObjectOfClass:visibility:loadHandler:");
    _lib._objc_msgSend_122(
        _id,
        _sel_registerObjectOfClass_visibility_loadHandler!,
        aClass._id,
        visibility,
        loadHandler._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_canLoadObjectOfClass;
  bool canLoadObjectOfClass(NSObject aClass) {
    _sel_canLoadObjectOfClass ??= _registerName(_lib, "canLoadObjectOfClass:");
    return _lib._objc_msgSend_123(_id, _sel_canLoadObjectOfClass!, aClass._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_loadObjectOfClass_completionHandler;
  NSProgress loadObjectOfClass_completionHandler(
      NSObject aClass, NSObject completionHandler) {
    _sel_loadObjectOfClass_completionHandler ??=
        _registerName(_lib, "loadObjectOfClass:completionHandler:");
    final _ret = _lib._objc_msgSend_124(
        _id,
        _sel_loadObjectOfClass_completionHandler!,
        aClass._id,
        completionHandler._id);
    return NSProgress._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithItem_typeIdentifier;
  NSItemProvider initWithItem_typeIdentifier(
      NSObject item, NSObject typeIdentifier) {
    _sel_initWithItem_typeIdentifier ??=
        _registerName(_lib, "initWithItem:typeIdentifier:");
    final _ret = _lib._objc_msgSend_125(
        _id, _sel_initWithItem_typeIdentifier!, item._id, typeIdentifier._id);
    return NSItemProvider._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_initWithContentsOfURL;
  NSItemProvider initWithContentsOfURL(NSObject fileURL) {
    _sel_initWithContentsOfURL ??=
        _registerName(_lib, "initWithContentsOfURL:");
    final _ret =
        _lib._objc_msgSend_126(_id, _sel_initWithContentsOfURL!, fileURL._id);
    return NSItemProvider._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_registerItemForTypeIdentifier_loadHandler;
  void registerItemForTypeIdentifier_loadHandler(
      NSObject typeIdentifier, NSItemProviderLoadHandler loadHandler) {
    _sel_registerItemForTypeIdentifier_loadHandler ??=
        _registerName(_lib, "registerItemForTypeIdentifier:loadHandler:");
    _lib._objc_msgSend_127(_id, _sel_registerItemForTypeIdentifier_loadHandler!,
        typeIdentifier._id, loadHandler);
  }

  static ffi.Pointer<ObjCSel>?
      _sel_loadItemForTypeIdentifier_options_completionHandler;
  void loadItemForTypeIdentifier_options_completionHandler(
      NSObject typeIdentifier,
      NSObject options,
      NSItemProviderCompletionHandler completionHandler) {
    _sel_loadItemForTypeIdentifier_options_completionHandler ??= _registerName(
        _lib, "loadItemForTypeIdentifier:options:completionHandler:");
    _lib._objc_msgSend_128(
        _id,
        _sel_loadItemForTypeIdentifier_options_completionHandler!,
        typeIdentifier._id,
        options._id,
        completionHandler);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSItemProvider new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSItemProvider");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSItemProvider._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSItemProvider alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSItemProvider");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSItemProvider._(_ret, _lib);
  }
}

class NSProgress extends _ObjCWrapper {
  NSProgress._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSProgress castFrom<T extends _ObjCWrapper>(T other) {
    return NSProgress._(other._id, other._lib);
  }
}

typedef NSItemProviderLoadHandler = ffi.Pointer<ObjCObject>;
typedef NSItemProviderCompletionHandler = ffi.Pointer<ObjCObject>;

abstract class NSItemProviderErrorCode {
  static const int NSItemProviderUnknownError = -1;
  static const int NSItemProviderItemUnavailableError = -1000;
  static const int NSItemProviderUnexpectedValueClassError = -1100;
  static const int NSItemProviderUnavailableCoercionError = -1200;
}

abstract class NSStringCompareOptions {
  static const int NSCaseInsensitiveSearch = 1;
  static const int NSLiteralSearch = 2;
  static const int NSBackwardsSearch = 4;
  static const int NSAnchoredSearch = 8;
  static const int NSNumericSearch = 64;
  static const int NSDiacriticInsensitiveSearch = 128;
  static const int NSWidthInsensitiveSearch = 256;
  static const int NSForcedOrderingSearch = 512;
  static const int NSRegularExpressionSearch = 1024;
}

abstract class NSStringEncodingConversionOptions {
  static const int NSStringEncodingConversionAllowLossy = 1;
  static const int NSStringEncodingConversionExternalRepresentation = 2;
}

abstract class NSStringEnumerationOptions {
  static const int NSStringEnumerationByLines = 0;
  static const int NSStringEnumerationByParagraphs = 1;
  static const int NSStringEnumerationByComposedCharacterSequences = 2;
  static const int NSStringEnumerationByWords = 3;
  static const int NSStringEnumerationBySentences = 4;
  static const int NSStringEnumerationByCaretPositions = 5;
  static const int NSStringEnumerationByDeletionClusters = 6;
  static const int NSStringEnumerationReverse = 256;
  static const int NSStringEnumerationSubstringNotRequired = 512;
  static const int NSStringEnumerationLocalized = 1024;
}

typedef NSStringTransform = ffi.Pointer<ObjCObject>;
typedef NSStringEncodingDetectionOptionsKey = ffi.Pointer<ObjCObject>;

class NSMutableString extends NSString {
  NSMutableString._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSMutableString castFrom<T extends _ObjCWrapper>(T other) {
    return NSMutableString._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_replaceCharactersInRange_withString;
  void replaceCharactersInRange_withString(NSRange range, NSObject aString) {
    _sel_replaceCharactersInRange_withString ??=
        _registerName(_lib, "replaceCharactersInRange:withString:");
    _lib._objc_msgSend_129(
        _id, _sel_replaceCharactersInRange_withString!, range, aString._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_stringWithCString_encoding;
  static NSString stringWithCString_encoding(
      StringTestObjCLibrary _lib, ffi.Pointer<pkg_ffi.Char> cString, int enc) {
    _class ??= _getClass(_lib, "NSMutableString");
    _sel_stringWithCString_encoding ??=
        _registerName(_lib, "stringWithCString:encoding:");
    final _ret = _lib._objc_msgSend_25(
        _class!, _sel_stringWithCString_encoding!, cString, enc);
    return NSString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSMutableString new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSMutableString");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSMutableString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSMutableString alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSMutableString");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSMutableString._(_ret, _lib);
  }
}

typedef NSExceptionName = ffi.Pointer<ObjCObject>;

class NSSimpleCString extends NSString {
  NSSimpleCString._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSSimpleCString castFrom<T extends _ObjCWrapper>(T other) {
    return NSSimpleCString._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_stringWithCString_encoding;
  static NSString stringWithCString_encoding(
      StringTestObjCLibrary _lib, ffi.Pointer<pkg_ffi.Char> cString, int enc) {
    _class ??= _getClass(_lib, "NSSimpleCString");
    _sel_stringWithCString_encoding ??=
        _registerName(_lib, "stringWithCString:encoding:");
    final _ret = _lib._objc_msgSend_25(
        _class!, _sel_stringWithCString_encoding!, cString, enc);
    return NSString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSSimpleCString new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSSimpleCString");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSSimpleCString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSSimpleCString alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSSimpleCString");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSSimpleCString._(_ret, _lib);
  }
}

class NSConstantString extends NSSimpleCString {
  NSConstantString._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSConstantString castFrom<T extends _ObjCWrapper>(T other) {
    return NSConstantString._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_stringWithCString_encoding;
  static NSString stringWithCString_encoding(
      StringTestObjCLibrary _lib, ffi.Pointer<pkg_ffi.Char> cString, int enc) {
    _class ??= _getClass(_lib, "NSConstantString");
    _sel_stringWithCString_encoding ??=
        _registerName(_lib, "stringWithCString:encoding:");
    final _ret = _lib._objc_msgSend_25(
        _class!, _sel_stringWithCString_encoding!, cString, enc);
    return NSString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSConstantString new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSConstantString");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSConstantString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSConstantString alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSConstantString");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSConstantString._(_ret, _lib);
  }
}

class StringUtil extends NSObject {
  StringUtil._(ffi.Pointer<ObjCObject> id, StringTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static StringUtil castFrom<T extends _ObjCWrapper>(T other) {
    return StringUtil._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_strConcat_with;
  static NSString strConcat_with(
      StringTestObjCLibrary _lib, NSObject a, NSObject b) {
    _class ??= _getClass(_lib, "StringUtil");
    _sel_strConcat_with ??= _registerName(_lib, "strConcat:with:");
    final _ret =
        _lib._objc_msgSend_130(_class!, _sel_strConcat_with!, a._id, b._id);
    return NSString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static StringUtil new1(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "StringUtil");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return StringUtil._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static StringUtil alloc(StringTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "StringUtil");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return StringUtil._(_ret, _lib);
  }
}

const int NSScannedOption = 1;

const int NSCollectorDisabledOption = 2;

const int NSASCIIStringEncoding = 1;

const int NSNEXTSTEPStringEncoding = 2;

const int NSJapaneseEUCStringEncoding = 3;

const int NSUTF8StringEncoding = 4;

const int NSISOLatin1StringEncoding = 5;

const int NSSymbolStringEncoding = 6;

const int NSNonLossyASCIIStringEncoding = 7;

const int NSShiftJISStringEncoding = 8;

const int NSISOLatin2StringEncoding = 9;

const int NSUnicodeStringEncoding = 10;

const int NSWindowsCP1251StringEncoding = 11;

const int NSWindowsCP1252StringEncoding = 12;

const int NSWindowsCP1253StringEncoding = 13;

const int NSWindowsCP1254StringEncoding = 14;

const int NSWindowsCP1250StringEncoding = 15;

const int NSISO2022JPStringEncoding = 21;

const int NSMacOSRomanStringEncoding = 30;

const int NSUTF16StringEncoding = 10;

const int NSUTF16BigEndianStringEncoding = 2415919360;

const int NSUTF16LittleEndianStringEncoding = 2483028224;

const int NSUTF32StringEncoding = 2348810496;

const int NSUTF32BigEndianStringEncoding = 2550137088;

const int NSUTF32LittleEndianStringEncoding = 2617245952;

const int NSProprietaryStringEncoding = 65536;

const int NS_BLOCKS_AVAILABLE = 1;

const int __COREFOUNDATION_CFAVAILABILITY__ = 1;

const int __CF_ENUM_FIXED_IS_AVAILABLE = 1;

const double NSFoundationVersionNumber10_0 = 397.4;

const double NSFoundationVersionNumber10_1 = 425.0;

const double NSFoundationVersionNumber10_1_1 = 425.0;

const double NSFoundationVersionNumber10_1_2 = 425.0;

const double NSFoundationVersionNumber10_1_3 = 425.0;

const double NSFoundationVersionNumber10_1_4 = 425.0;

const double NSFoundationVersionNumber10_2 = 462.0;

const double NSFoundationVersionNumber10_2_1 = 462.0;

const double NSFoundationVersionNumber10_2_2 = 462.0;

const double NSFoundationVersionNumber10_2_3 = 462.0;

const double NSFoundationVersionNumber10_2_4 = 462.0;

const double NSFoundationVersionNumber10_2_5 = 462.0;

const double NSFoundationVersionNumber10_2_6 = 462.0;

const double NSFoundationVersionNumber10_2_7 = 462.7;

const double NSFoundationVersionNumber10_2_8 = 462.7;

const double NSFoundationVersionNumber10_3 = 500.0;

const double NSFoundationVersionNumber10_3_1 = 500.0;

const double NSFoundationVersionNumber10_3_2 = 500.3;

const double NSFoundationVersionNumber10_3_3 = 500.54;

const double NSFoundationVersionNumber10_3_4 = 500.56;

const double NSFoundationVersionNumber10_3_5 = 500.56;

const double NSFoundationVersionNumber10_3_6 = 500.56;

const double NSFoundationVersionNumber10_3_7 = 500.56;

const double NSFoundationVersionNumber10_3_8 = 500.56;

const double NSFoundationVersionNumber10_3_9 = 500.58;

const double NSFoundationVersionNumber10_4 = 567.0;

const double NSFoundationVersionNumber10_4_1 = 567.0;

const double NSFoundationVersionNumber10_4_2 = 567.12;

const double NSFoundationVersionNumber10_4_3 = 567.21;

const double NSFoundationVersionNumber10_4_4_Intel = 567.23;

const double NSFoundationVersionNumber10_4_4_PowerPC = 567.21;

const double NSFoundationVersionNumber10_4_5 = 567.25;

const double NSFoundationVersionNumber10_4_6 = 567.26;

const double NSFoundationVersionNumber10_4_7 = 567.27;

const double NSFoundationVersionNumber10_4_8 = 567.28;

const double NSFoundationVersionNumber10_4_9 = 567.29;

const double NSFoundationVersionNumber10_4_10 = 567.29;

const double NSFoundationVersionNumber10_4_11 = 567.36;

const double NSFoundationVersionNumber10_5 = 677.0;

const double NSFoundationVersionNumber10_5_1 = 677.1;

const double NSFoundationVersionNumber10_5_2 = 677.15;

const double NSFoundationVersionNumber10_5_3 = 677.19;

const double NSFoundationVersionNumber10_5_4 = 677.19;

const double NSFoundationVersionNumber10_5_5 = 677.21;

const double NSFoundationVersionNumber10_5_6 = 677.22;

const double NSFoundationVersionNumber10_5_7 = 677.24;

const double NSFoundationVersionNumber10_5_8 = 677.26;

const double NSFoundationVersionNumber10_6 = 751.0;

const double NSFoundationVersionNumber10_6_1 = 751.0;

const double NSFoundationVersionNumber10_6_2 = 751.14;

const double NSFoundationVersionNumber10_6_3 = 751.21;

const double NSFoundationVersionNumber10_6_4 = 751.29;

const double NSFoundationVersionNumber10_6_5 = 751.42;

const double NSFoundationVersionNumber10_6_6 = 751.53;

const double NSFoundationVersionNumber10_6_7 = 751.53;

const double NSFoundationVersionNumber10_6_8 = 751.62;

const double NSFoundationVersionNumber10_7 = 833.1;

const double NSFoundationVersionNumber10_7_1 = 833.1;

const double NSFoundationVersionNumber10_7_2 = 833.2;

const double NSFoundationVersionNumber10_7_3 = 833.24;

const double NSFoundationVersionNumber10_7_4 = 833.25;

const double NSFoundationVersionNumber10_8 = 945.0;

const double NSFoundationVersionNumber10_8_1 = 945.0;

const double NSFoundationVersionNumber10_8_2 = 945.11;

const double NSFoundationVersionNumber10_8_3 = 945.16;

const double NSFoundationVersionNumber10_8_4 = 945.18;

const int NSFoundationVersionNumber10_9 = 1056;

const int NSFoundationVersionNumber10_9_1 = 1056;

const double NSFoundationVersionNumber10_9_2 = 1056.13;

const double NSFoundationVersionNumber10_10 = 1151.16;

const double NSFoundationVersionNumber10_10_1 = 1151.16;

const double NSFoundationVersionNumber10_10_2 = 1152.14;

const double NSFoundationVersionNumber10_10_3 = 1153.2;

const double NSFoundationVersionNumber10_10_4 = 1153.2;

const int NSFoundationVersionNumber10_10_5 = 1154;

const int NSFoundationVersionNumber10_10_Max = 1199;

const int NSFoundationVersionNumber10_11 = 1252;

const double NSFoundationVersionNumber10_11_1 = 1255.1;

const double NSFoundationVersionNumber10_11_2 = 1256.1;

const double NSFoundationVersionNumber10_11_3 = 1256.1;

const int NSFoundationVersionNumber10_11_4 = 1258;

const int NSFoundationVersionNumber10_11_Max = 1299;

const int __COREFOUNDATION_CFBASE__ = 1;

const int TRUE = 1;

const int FALSE = 0;

const double kCFCoreFoundationVersionNumber10_0 = 196.4;

const double kCFCoreFoundationVersionNumber10_0_3 = 196.5;

const double kCFCoreFoundationVersionNumber10_1 = 226.0;

const double kCFCoreFoundationVersionNumber10_1_1 = 226.0;

const double kCFCoreFoundationVersionNumber10_1_2 = 227.2;

const double kCFCoreFoundationVersionNumber10_1_3 = 227.2;

const double kCFCoreFoundationVersionNumber10_1_4 = 227.3;

const double kCFCoreFoundationVersionNumber10_2 = 263.0;

const double kCFCoreFoundationVersionNumber10_2_1 = 263.1;

const double kCFCoreFoundationVersionNumber10_2_2 = 263.1;

const double kCFCoreFoundationVersionNumber10_2_3 = 263.3;

const double kCFCoreFoundationVersionNumber10_2_4 = 263.3;

const double kCFCoreFoundationVersionNumber10_2_5 = 263.5;

const double kCFCoreFoundationVersionNumber10_2_6 = 263.5;

const double kCFCoreFoundationVersionNumber10_2_7 = 263.5;

const double kCFCoreFoundationVersionNumber10_2_8 = 263.5;

const double kCFCoreFoundationVersionNumber10_3 = 299.0;

const double kCFCoreFoundationVersionNumber10_3_1 = 299.0;

const double kCFCoreFoundationVersionNumber10_3_2 = 299.0;

const double kCFCoreFoundationVersionNumber10_3_3 = 299.3;

const double kCFCoreFoundationVersionNumber10_3_4 = 299.31;

const double kCFCoreFoundationVersionNumber10_3_5 = 299.31;

const double kCFCoreFoundationVersionNumber10_3_6 = 299.32;

const double kCFCoreFoundationVersionNumber10_3_7 = 299.33;

const double kCFCoreFoundationVersionNumber10_3_8 = 299.33;

const double kCFCoreFoundationVersionNumber10_3_9 = 299.35;

const double kCFCoreFoundationVersionNumber10_4 = 368.0;

const double kCFCoreFoundationVersionNumber10_4_1 = 368.1;

const double kCFCoreFoundationVersionNumber10_4_2 = 368.11;

const double kCFCoreFoundationVersionNumber10_4_3 = 368.18;

const double kCFCoreFoundationVersionNumber10_4_4_Intel = 368.26;

const double kCFCoreFoundationVersionNumber10_4_4_PowerPC = 368.25;

const double kCFCoreFoundationVersionNumber10_4_5_Intel = 368.26;

const double kCFCoreFoundationVersionNumber10_4_5_PowerPC = 368.25;

const double kCFCoreFoundationVersionNumber10_4_6_Intel = 368.26;

const double kCFCoreFoundationVersionNumber10_4_6_PowerPC = 368.25;

const double kCFCoreFoundationVersionNumber10_4_7 = 368.27;

const double kCFCoreFoundationVersionNumber10_4_8 = 368.27;

const double kCFCoreFoundationVersionNumber10_4_9 = 368.28;

const double kCFCoreFoundationVersionNumber10_4_10 = 368.28;

const double kCFCoreFoundationVersionNumber10_4_11 = 368.31;

const double kCFCoreFoundationVersionNumber10_5 = 476.0;

const double kCFCoreFoundationVersionNumber10_5_1 = 476.0;

const double kCFCoreFoundationVersionNumber10_5_2 = 476.1;

const double kCFCoreFoundationVersionNumber10_5_3 = 476.13;

const double kCFCoreFoundationVersionNumber10_5_4 = 476.14;

const double kCFCoreFoundationVersionNumber10_5_5 = 476.15;

const double kCFCoreFoundationVersionNumber10_5_6 = 476.17;

const double kCFCoreFoundationVersionNumber10_5_7 = 476.18;

const double kCFCoreFoundationVersionNumber10_5_8 = 476.19;

const double kCFCoreFoundationVersionNumber10_6 = 550.0;

const double kCFCoreFoundationVersionNumber10_6_1 = 550.0;

const double kCFCoreFoundationVersionNumber10_6_2 = 550.13;

const double kCFCoreFoundationVersionNumber10_6_3 = 550.19;

const double kCFCoreFoundationVersionNumber10_6_4 = 550.29;

const double kCFCoreFoundationVersionNumber10_6_5 = 550.42;

const double kCFCoreFoundationVersionNumber10_6_6 = 550.42;

const double kCFCoreFoundationVersionNumber10_6_7 = 550.42;

const double kCFCoreFoundationVersionNumber10_6_8 = 550.43;

const double kCFCoreFoundationVersionNumber10_7 = 635.0;

const double kCFCoreFoundationVersionNumber10_7_1 = 635.0;

const double kCFCoreFoundationVersionNumber10_7_2 = 635.15;

const double kCFCoreFoundationVersionNumber10_7_3 = 635.19;

const double kCFCoreFoundationVersionNumber10_7_4 = 635.21;

const double kCFCoreFoundationVersionNumber10_7_5 = 635.21;

const double kCFCoreFoundationVersionNumber10_8 = 744.0;

const double kCFCoreFoundationVersionNumber10_8_1 = 744.0;

const double kCFCoreFoundationVersionNumber10_8_2 = 744.12;

const double kCFCoreFoundationVersionNumber10_8_3 = 744.18;

const double kCFCoreFoundationVersionNumber10_8_4 = 744.19;

const double kCFCoreFoundationVersionNumber10_9 = 855.11;

const double kCFCoreFoundationVersionNumber10_9_1 = 855.11;

const double kCFCoreFoundationVersionNumber10_9_2 = 855.14;

const double kCFCoreFoundationVersionNumber10_10 = 1151.16;

const double kCFCoreFoundationVersionNumber10_10_1 = 1151.16;

const int kCFCoreFoundationVersionNumber10_10_2 = 1152;

const double kCFCoreFoundationVersionNumber10_10_3 = 1153.18;

const double kCFCoreFoundationVersionNumber10_10_4 = 1153.18;

const double kCFCoreFoundationVersionNumber10_10_5 = 1153.18;

const int kCFCoreFoundationVersionNumber10_10_Max = 1199;

const int kCFCoreFoundationVersionNumber10_11 = 1253;

const double kCFCoreFoundationVersionNumber10_11_1 = 1255.1;

const double kCFCoreFoundationVersionNumber10_11_2 = 1256.14;

const double kCFCoreFoundationVersionNumber10_11_3 = 1256.14;

const double kCFCoreFoundationVersionNumber10_11_4 = 1258.1;

const int kCFCoreFoundationVersionNumber10_11_Max = 1299;

const int ISA_PTRAUTH_DISCRIMINATOR = 27361;

const int NSMaximumStringLength = 2147483646;

const int NS_UNICHAR_IS_EIGHT_BIT = 0;
