// 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>)>();

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

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

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

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

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

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

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

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

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

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

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

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

  ffi.Pointer<ObjCObject> _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<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_9 = __objc_msgSend_9Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>();

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

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

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

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

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

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

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

  late final __objc_msgSend_13Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_13 = __objc_msgSend_13Ptr.asFunction<
      instancetype 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<pkg_ffi.Char> cString,
    int enc,
  ) {
    return __objc_msgSend_14(
      obj,
      sel,
      cString,
      enc,
    );
  }

  late final __objc_msgSend_14Ptr = _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_14 = __objc_msgSend_14Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<pkg_ffi.Char>, int)>();

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

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

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

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

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

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

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

  late final __objc_msgSend_18Ptr = _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_18 = __objc_msgSend_18Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ffi.Void>, ffi.Pointer<pkg_ffi.Char>)>();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  late final __objc_msgSend_62Ptr = _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_62 = __objc_msgSend_62Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, NSRange, int, ffi.Pointer<ObjCObject>)>();

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

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

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

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

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

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

  instancetype _objc_msgSend_66(
    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_66(
      obj,
      sel,
      inserts,
      insertedObjects,
      removes,
      removedObjects,
      changes,
    );
  }

  late final __objc_msgSend_66Ptr = _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_66 = __objc_msgSend_66Ptr.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_67(
    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_67(
      obj,
      sel,
      inserts,
      insertedObjects,
      removes,
      removedObjects,
    );
  }

  late final __objc_msgSend_67Ptr = _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_67 = __objc_msgSend_67Ptr.asFunction<
      instancetype Function(
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>)>();

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

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

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

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

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

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

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

  late final __objc_msgSend_71Ptr = _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_71 = __objc_msgSend_71Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>, int, ffi.Pointer<ObjCObject>)>();

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

  late final __objc_msgSend_72Ptr = _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_72 = __objc_msgSend_72Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>, int, int, ffi.Pointer<ObjCObject>)>();

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

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

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

  late final __objc_msgSend_74Ptr = _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_74 = __objc_msgSend_74Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCObject>)>();

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

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

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

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

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

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

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

  late final __objc_msgSend_78Ptr = _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_78 = __objc_msgSend_78Ptr.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_79(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    NSRange range,
    ffi.Pointer<ObjCObject> aString,
  ) {
    return __objc_msgSend_79(
      obj,
      sel,
      range,
      aString,
    );
  }

  late final __objc_msgSend_79Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              NSRange, ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_79 = __objc_msgSend_79Ptr.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_80(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> a,
    ffi.Pointer<ObjCObject> b,
  ) {
    return __objc_msgSend_80(
      obj,
      sel,
      a,
      b,
    );
  }

  late final __objc_msgSend_80Ptr = _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_80 = __objc_msgSend_80Ptr.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_17(_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_15(_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_18(_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_13(_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_1(_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_1(_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_2(_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_2(_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_3(
        _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_4(
        _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_5(_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_5(
        _class!, _sel_instanceMethodForSelector!, aSelector);
  }

  static ffi.Pointer<ObjCSel>? _sel_doesNotRecognizeSelector;
  void doesNotRecognizeSelector(ffi.Pointer<ObjCSel> aSelector) {
    _sel_doesNotRecognizeSelector ??=
        _registerName(_lib, "doesNotRecognizeSelector:");
    _lib._objc_msgSend_6(_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_7(_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_8(_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_9(_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_9(
        _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_10(_id, _sel_allowsWeakReference!);
  }

  static ffi.Pointer<ObjCSel>? _sel_retainWeakReference;
  bool retainWeakReference() {
    _sel_retainWeakReference ??= _registerName(_lib, "retainWeakReference");
    return _lib._objc_msgSend_10(_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_4(_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_3(_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_3(_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_11(_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_1(_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_1(_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_16(_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_16(_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_11(_id, _sel_length!);
  }

  static ffi.Pointer<ObjCSel>? _sel_characterAtIndex;
  int characterAtIndex(int index) {
    _sel_characterAtIndex ??= _registerName(_lib, "characterAtIndex:");
    return _lib._objc_msgSend_12(_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_13(_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_14(
        _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_15(_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_13(_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_19(_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_20(_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_21(_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_22(_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_23(_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_24(_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_25(_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_26(_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_27(_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_28(_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_29(_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_30(_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_31(_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_25(_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_26(_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_32(_id, _sel_charValue!);
  }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  static ffi.Pointer<ObjCSel>? _sel_stringValue;
  NSObject get stringValue {
    _sel_stringValue ??= _registerName(_lib, "stringValue");
    final _ret = _lib._objc_msgSend_1(_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_43(_id, _sel_compare!, otherNumber._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_isEqualToNumber;
  bool isEqualToNumber(NSObject number) {
    _sel_isEqualToNumber ??= _registerName(_lib, "isEqualToNumber:");
    return _lib._objc_msgSend_4(_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_44(_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_1(_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_1(_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_45(_id, _sel_changeType!);
  }

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

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

  static ffi.Pointer<ObjCSel>? _sel_init;
  @override
  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_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_46(
        _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_47(
        _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_48(_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_49(_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_49(_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_13(_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_48(_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_4(_id, _sel_isEqualToIndexSet!, indexSet._id);
  }

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

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

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

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

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

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

  static ffi.Pointer<ObjCSel>? _sel_indexLessThanOrEqualToIndex;
  int indexLessThanOrEqualToIndex(int value) {
    _sel_indexLessThanOrEqualToIndex ??=
        _registerName(_lib, "indexLessThanOrEqualToIndex:");
    return _lib._objc_msgSend_50(_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_51(_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_52(_id, _sel_countOfIndexesInRange!, range);
  }

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

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

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

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

  static ffi.Pointer<ObjCSel>? _sel_enumerateIndexesUsingBlock;
  void enumerateIndexesUsingBlock(NSObject block) {
    _sel_enumerateIndexesUsingBlock ??=
        _registerName(_lib, "enumerateIndexesUsingBlock:");
    _lib._objc_msgSend_8(_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_55(
        _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_56(_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_57(_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_58(
        _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_59(_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_60(_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_61(
        _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_62(_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_8(_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_55(
        _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_56(_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_8(_id, _sel_addIndexes!, indexSet._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_removeIndexes;
  void removeIndexes(NSObject indexSet) {
    _sel_removeIndexes ??= _registerName(_lib, "removeIndexes:");
    _lib._objc_msgSend_8(_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_63(_id, _sel_addIndex!, value);
  }

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

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

  static ffi.Pointer<ObjCSel>? _sel_removeIndexesInRange;
  void removeIndexesInRange(NSRange range) {
    _sel_removeIndexesInRange ??= _registerName(_lib, "removeIndexesInRange:");
    _lib._objc_msgSend_64(_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_65(
        _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_48(_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_49(_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_13(_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_66(
        _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_67(
        _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_1(_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_1(_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_10(_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_11(_id, _sel_count!);
  }

  static ffi.Pointer<ObjCSel>? _sel_objectAtIndex;
  NSObject objectAtIndex(int index) {
    _sel_objectAtIndex ??= _registerName(_lib, "objectAtIndex:");
    final _ret = _lib._objc_msgSend_48(_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_68(_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_13(_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_8(_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_69(_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_63(_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_70(
        _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_48(_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_13(_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_71(
        _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_72(
        _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_1(_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_4(
        _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_73(
        _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_74(
        _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_74(
        _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_74(
        _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_1(_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_8(_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_13(_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_75(
        _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_71(
        _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_4(_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_74(
        _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_76(
        _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_13(_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_77(_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_78(
        _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_79(
        _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_14(
        _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_14(
        _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_14(
        _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_80(_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;
